Joven hacker sonriendo

Asserts

1. Descripción

Asserts es un motor de automatización de cierre de hallazgos de seguridad sobre ambientes en ejecución (DAST).

Asserts
Figura 1. Caso de uso

2. Ejecución

En un PC

Linux

Para correr un exploit, simplemente ejecuta:

$ pip install -U fluidasserts
$ export FA_STRICT="false"

$ python exploit.py

Windows

Igual que en Linux, simplemente ejecuta:

> pip install -U fluidasserts
> set FA_STRICT="false"

> python exploit.py

En un pipeline de CI

Si tienes una aplicación suscrita a nuestro servicio de Pruebas Concurrentes de Seguridad que incluya el uso de Asserts, puedes agregarlo a tu pipeline de integración continua. Para eso, debes seguir los siguientes pasos:

  • Agregar las variables de entorno USER, PASS, ORG y APP. No te preocupes, ¡los valores serán entregados por nosotros!:

    • USER: Nombre de usuario para obtener la imagen de nuestro registro de contenedores

    • PASS: Contraseña del usuario

    • ORG: Nombre de la compañía

    • APP: Nombre de la aplicación

Variables de entorno
Figura 2. Ejemplo de variables en un ambiente Gitlab CI
  • Agregar un job donde se ejecute el contenedor.

En Gitlab CI, agregar:
fluidasserts:
    script:
        - docker login fluid-docker.jfrog.io -u $USER -p $PASS
        - docker pull fluid-docker.jfrog.io/$ORG:$APP
        - docker run -e ORG=$ORG -e APP=$APP -e USER=$USER -e PASS=$PASS -e FA_STRICT="true" fluid-docker.jfrog.io/$ORG:$APP

NOTA: La variable FA_STRICT debe tener los valores true o false. Si es true y alguna de las vulnerabilidades está abierta, ¡el pipeline se romperá!

3. Requerimientos

Para ejecutar en un PC

  • Sistema operativo:

    • Cualquier SO que soporte Python

  • Red:

    • Acceso al repositorio de artefactos aquí.

  • Dependencias de software:

    • Python 3.6

Para integrar en un pipeline de CI

  • Sistema operativo:

    • Cualquier distribución basada en Linux que soporte DockerCE

    • Windows Server con HyperV y Docker

    • MacOS

  • Red:

    • Acceso al ambiente de integración donde tengas la aplicación o plataforma

  • Dependencias de software:

    • DockerCE 17 ó superior

Comunes

  • CPU: 4 cores @1.8GHz

  • RAM: 4GiB DDR3 @1.6Ghz

  • Espacio en disco: 10GiB

4. Ejemplos de exploits

Inyección SQL

ex1_open.py: Verificar inyección SQL aun presente
1
2
3
4
5
from fluidasserts.proto import http

URL = 'http://testphp.vulnweb.com/AJAX/infoartist.php?id=3%27'

http.has_sqli(URL)
Resultado de ejecución ex1_open.py
# FLUIDAsserts by Fluid Attacks (https://fluidattacks.com)
# All rights reserved.
# Loading attack modules ...
---
check: fluidasserts.proto.http.has_multiple_text
status: OPEN
message: 'A bad text was present: "Warning.*mysql_.*"'
details:
  url: http://testphp.vulnweb.com/AJAX/infoartist.php?id=3%27
when: 2018-05-16 08:41:04.397649
ex1_close.py: Verificar inyección SQL ya solucionada
1
2
3
4
5
from fluidasserts.proto import http

URL = 'http://testphp.vulnweb.com/AJAX/infoartist.php?id=3'

http.has_sqli(URL)
Resultado de ejecución ex1_close.py
# FLUIDAsserts by Fluid Attacks (https://fluidattacks.com)
# All rights reserved.
# Loading attack modules ...
---
check: fluidasserts.proto.http.has_multiple_text
status: CLOSE
message: No bad text was present
details:
  url: http://testphp.vulnweb.com/AJAX/infoartist.php?id=3
when: 2018-05-16 08:42:02.448463

Cross-Site Scripting

ex2_open.py: Verificar XSS aun presente
1
2
3
4
5
6
7
from fluidasserts.proto import http

URL = 'http://testphp.vulnweb.com/guestbook.php'
BAD_TEXT = r"<script>alert\('Hacked by Fluid Attacks'\)</script>"

DATA = 'name=test&text=%3Cscript%3Ealert%28%27Hacked+by+Fluid+Attacks%27%29%3C%2Fscript%3E&submit=add+message'
http.has_xss(URL, BAD_TEXT, data=DATA)
Resultado de ejecución ex2_open.py
# FLUIDAsserts by Fluid Attacks (https://fluidattacks.com)
# All rights reserved.
# Loading attack modules ...
---
check: fluidasserts.proto.http.has_text
status: OPEN
message: 'Bad text present: "<script>alert\(''Hacked by Fluid Attacks''\)</script>"'
details:
  url: http://testphp.vulnweb.com/guestbook.php
when: 2018-05-16 08:43:49.769936
ex2_close.py: Verificar XSS ya solucionado
1
2
3
4
5
6
7
from fluidasserts.proto import http

URL = 'http://testphp.vulnweb.com/guestbook.php'
BAD_TEXT = r"<script>alert\('Hacked by Fluid Attacks'\)</script>"

DATA = 'name=test&text=Hacked+by+Fluid+Attacks&submit=add+message'
http.has_xss(URL, BAD_TEXT, data=DATA)
Resultado de ejecución ex2_close.py
# FLUIDAsserts by Fluid Attacks (https://fluidattacks.com)
# All rights reserved.
# Loading attack modules ...
---
check: fluidasserts.proto.http.has_text
status: CLOSE
message: 'Bad text not present: "<script>alert\(''Hacked by Fluid Attacks''\)</script>"'
details:
  url: http://testphp.vulnweb.com/guestbook.php

Rompiendo el pipeline de Integración Continua

ex1_open.py: Verificar inyección SQL aun presente
1
2
3
4
5
from fluidasserts.proto import http

URL = 'http://testphp.vulnweb.com/AJAX/infoartist.php?id=3%27'

http.has_sqli(URL)
Resultado de ejecución rompiendo el pipeline
$ export FA_STRICT="false"
$ python ex1_open.py
---
# FLUIDAsserts by Fluid Attacks (https://fluidattacks.com)
# All rights reserved.
# Loading attack modules ...
---
check: fluidasserts.proto.http.has_multiple_text
status: OPEN
message: 'A bad text was present: "Warning.*mysql_.*"'
details:
  url: http://testphp.vulnweb.com/AJAX/infoartist.php?id=3%27
when: 2018-05-16 08:46:28.312329
$ echo $?
0
$ export FA_STRICT="true"
$ python ex1_open.py
---
# FLUIDAsserts by Fluid Attacks (https://fluidattacks.com)
# All rights reserved.
# Loading attack modules ...
---
check: fluidasserts.proto.http.has_multiple_text
status: OPEN
message: 'A bad text was present: "Warning.*mysql_.*"'
details:
  url: http://testphp.vulnweb.com/AJAX/infoartist.php?id=3%27
when: 2018-05-16 08:46:45.719005
$ echo $?
1

Estado de los servicios - Términos de Uso