martes, 23 de junio de 2015

PyZap → Uniendo Python y ZAP



Zap (Zed Attack Proxy) es una herramienta para auditoria de aplicaciones web disponible en OWASP:
https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project

Sin entrar a describir su funcionamiento, en esta entrada veremos como realizar scripts en Python (2) para interactuar con ella. El primer paso será instalar la API de Python, para ello recomiendo no utilizar la versión disponible en pip (pip install python-owasp-zap-v2) pues no trae todas las funcionalidades.

Para instalarla, como recomiendan en su web, descargamos desde SourceForge el código:
http://sourceforge.net/projects/zaproxy/files/client-api/
 Para después instalarlo con:
cd python/api/
python setup.py build
sudo python setup.py install
Una vez instalado, ya podemos empezar a trabajar con la API.

Antes de continuar, necesitaremos lanzar ZAP en modo demonio pues la API actúa como cliente y sigue necesitando que la aplicación se esté ejecutando. Para ello basta con, siendo ZAP_.2.4.0 el directorio donde se encuentra descargada la aplicación, ejecutar:
./ZAP_2.4.0/zap.sh -daemon
 

 Con ZAP funcionando ya podemos probar nuestros scripts en Python.



A partir de la información (en parte desactualizada) disponible en la web del proyecto he creado un script que analiza el sitio objetivo y el cual describiré para explicar el funcionamiento de la API.

El código está disponible en el GitHub de 0verl0ad:


 El código está dividido en 2 clases. Una para gestionar la base de datos (añadido mio externo a la API de ZAP) llamada DataB mientras que la otra clase es la que interactua con ZAP (llamada ZapScanner). Junto a ambas hay <<Un método main para gobernarlas a todas. Un método para encontrarlas, un método para atraerlas a todos y atarlas en las tinieblas en la Tierra de Java donde se extiende ZAP>>.

Antes de continuar aclarar que la clase relacionada con la base de datos la obviaré en la entrada pues no es el objetivo de ésta.


Lo primero que hay que hacer es incluir la clase de ZAP (en la documentación oficial no está actualizado):
from zapv2 import ZAPv2
 Con ello ya podemos trabajar sin problemas. A continuación es necesario inicializar la clase y crear una nueva sesión (esto último no es obligatorio):



A partir de aquí enlazamos la URL con la aplicación mediante el método urlopen y ya se pueden empezar a lanzar los distintos módulos de ZAP:



En esta entrada veremos los módulos Spider, Ajax Spider y Active Scan. Todos tienen un funcionamiento similar aunque veremos cada uno de ellos por separado.

El primero de ellos (Spider), se lanza con la función scan tendiendo como parámetro la URL objetivo. A partir de aquí empezará a "escarbar" por la dirección en busca de las páginas a analizar. El estado de este proceso se muestra con la función status(). Toda la información recabada la guardará ZAP internamente y más adelante veremos como extraerla.



La segunda función, Ajax Spider funciona igual que la anterior con un método scan y la URL como parámetro.


El tercer y último método tratado, Active Scan funciona como los anteriores. Utiliza scan para analizar y status()para mostrar el estado del proceso.

Mención especial a la función z_insertDb() que veremos a continuación.


La función z_insertDb()es la encargada de extraer la información de la sesión de ZAP e insertarla en la base de datos. Vayamos por partes. El primer bucle corresponde al listado de URLs encontradas por la aplicación, para obtener su listado es necesario hacer una llamada al método zap.core.urls. Situación similar ocurre con las alertas, siendo en este caso necesario llamar a la función zap.core.alerts() para obtener su lista.

En el caso del diccionario data, este se encarga de obtener el listado de hosts analizados (zap.core.hosts), el número de alertas (zap.core.number_of_alerts()) y la versión de ZAP (zap.core.version).

Toda la información recogida en esta clase acaba en una base de datos externa a ZAP para si queremos tratar la información con otras aplicaciones o métodos de nuestra cosecha.



Con todo esto, las siguientes imágenes corresponde a una ejecución del script que os he puesto líneas arriba:
python2 pyZap.py -u 192.168.1.21/dvwa


 



El script está por pulir y falta introducir alguna que otra cosa, aunque sirve como muestra de las posibilidades de la API.


Si queréis ampliar información:

Un saludo y nos leemos en "breve" ;)


5 0verl0ad Labs: PyZap → Uniendo Python y ZAP Zap (Zed Attack Proxy) es una herramienta para auditoria de aplicaciones web disponible en OWASP: https://www.owasp.org/index.php/OWAS...

No hay comentarios:

< >