CiberseguridadOWASP ZAP

OWASP ZAP y Docker, automatizando escaneos de seguridad.

OWASP ZAP es una herramienta open source orientada a los escaneos de vulnerabilidades web. Sus funcionalidades y datos proporcionados, su capacidad para integrarse en flujos de trabajo, así como la facilidad de uso, han hecho de esta herramienta un referente del sector de la ciberseguridad que, además, es gratuita.

En este artículo veremos cómo configurar y utilizar OWASP ZAP desde un contenedor Docker, ejecutándolo en modo sin interfaz gráfica (headless) y lanzando comandos a través de su API REST. Al final del proceso, aprenderemos a generar y analizar informes detallados de vulnerabilidades detectadas.

Preparación del entorno

Necesitaremos contar con lo siguiente:

  • Docker: puede obtenerse de diversas formas dependiendo del sistema operativo, os recomendamos acceder a https://docker.com.
  • La imagen de docker de OWASP-ZAP: podéis ver más información aquí: https://www.zaproxy.org/docs/docker/about/.
  • Un objetivo para escanear: Por motivos éticos, asegúrate de contar con los permisos necesarios para realizar pruebas de seguridad sobre la aplicación web que vayas a escanear.

Para este caso en concreto usaremos la imagen de zaproxy/zap-weekly:latest que se actualiza semanalmente y es la que nos ha parecido más completa.

Podéis encontrar más información en el repositorio de GitHub: https://github.com/h3st4k3r/OWASP-ZAP/.

Descargar la imagen de OWASP ZAP

Para poder descargar la imagen de OWASP ZAP tendremos que poner lo siguiente:

Con esto ya tendremos nuestra imagen descargada y lista para usarse.

Podeis comprobar que realmente disponemos de la máquina si ejecutamos el siguiente comando:

Que devolverá algo así:

Iniciar el contenedor

Antes de arrancar el contenedor, vamos a tener en cuenta una serie de configuraciones. Por un lado nos interesa acceder a la API, por lo que necesitamos conseguir una API KEY. Por otro lado nos interesa poder acceder al contenedor desde cualquier IP de nuestra red, por tanto pondremos el campo host a 0.0.0.0.

Para poder disponer de nuestra API KEY generaremos un código random para ponerlo manualmente, deberemos escribir lo siguiente:

Que en nuestro caso nos ha devuelto: a8df14b272a794e4d1d178b1ebba1bbf.

Ahora ya estamos preparados para arrancar nuestro contenedor. En nuestro caso lo dejamos en el puerto 8080, pero podéis elegir cualquier valor en los parámetros contenidos.

  • -u zap: Ejecuta el contenedor como el usuario zap.
  • -p 8080:8080: Expone el puerto 8080 del contenedor al host para acceder a la API REST.
  • -i -t: Permite la interacción con el contenedor (aunque en este caso es en modo daemon).
  • zap.sh -daemon: Inicia ZAP en modo demonio (sin interfaz gráfica, lo cual mejora bastante el rendimiento de ZAP).
  • -host 0.0.0.0: Permite que ZAP acepte conexiones en todas las interfaces de red.
  • -port 8080: Define el puerto de la API REST.
  • -config api.addrs.addr.name=.*: Permite que la API acepte peticiones desde cualquier dirección.
  • -config api.addrs.addr.regex=true: Activa el uso de expresiones regulares en las configuraciones de direcciones.
  • -config api.key=a8df14b272a794e4d1d178b1ebba1bbf: Nuestra clave de la API que hemos generado anteriormente.

Si navegamos a nuestro localhost:8080 veremos que tenemos la documentación de la API, así como los links de referencia del propio ZAP.

Para ahorraros leer toda la documentación, aunque es algo recomendable, vamos a ver lo que más nos puede interesar, es decir, lanzar escaneos, lanzar el spider, ver el estado del progreso de los mismos y generar el informe (ya sea por defecto o con modificaciones que hagamos para personalizarlo).

Lanzar el spider para rastrear los enlaces de una web:

Ver el progreso del spider:

Lanzar un escaneo activo:

Ver el progreso del escaneo:

Ver las URLs detectadas en el spider:

Obtener alertas generadas:

Generar reporte HTML:

Filtrar contenido de los reportes:

Si os habéis fijado en la petición anterior, estamos generando un reporte con todo lo que salga. En ningún momento hemos puesto algo similar a «sacar reporte del escaneo con ID X». Para poder sacar los informes de los escaneos en específico. Si queremos centrarnos exclusivamente en un escaneo específico, podemos combinar comandos para filtrar resultados o usar herramientas como jq para procesar el JSON devuelto por la API. Podemos escribir por ejemplo:

O podemos sacarlo en formato json ya filtrado y luego postprocesarlo:

Con esto ya tendríamos todo lo necesario para comenzar a automatizar el uso de OWASP ZAP en un entorno Docker a través de su API. Ahora es cuestión de ir ajustando y experimentando para adaptarlo a las necesidades de tus proyectos.

Ahora, como ya sabemos todo esto, podemos automatizarlo todo para que se instale en Debian automáticamente Docker junto con todos los requisitos que necesitamos y luego se ejecute el escaneo mediante un domino dado. Podéis encontrar el código en el repositorio que os hemos compartido al principio.

Si te ha resultado útil o tienes alguna duda, no dudes en compartir tus comentarios o experiencias ¡Nos encantará saber cómo lo estás aplicando!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *