Zed Attack Proxy o ZAP es un proxy HTTP ampliamente utilizado en los análisis de seguridad web. Nace como fork de paros, otro viejo conocido. Seguro que junto a Burp, es una de las herramientas más utilizadas para llevar a cabo pruebas manuales.
Una de las opciones más interesantes de las que dispone esta utilidad es la del "spidering" de la aplicación, que permite recorrer la página en búsqueda de recursos y sus formularios, sobre los que posteriormente se harán pruebas de seguridad. Estos tests también pueden ser hechos automáticamente por la propia herramienta. Además, tal y como se puede ver en la comparativa de sectoolmarket sus resultados son bastante buenos. Sobre todo si tenemos en cuenta que es una herramienta gratuita.
Una opción poco conocida es la de utilizar ZAP mediante línea de comandos. Para hacer esto hay que arrancarla y posteriormente interactuar con su API.
Para hacerlo aún más sencillo, os dejo por aquí un script que se encarga de arrancar el proxy y lanzar el análisis devolviendo un JSON con los resultados. Tan solo es necesario dejar el script dentro de la ruta de ZAP e invocarla con la URL a analizar como primer argumento.
#!/usr/bin/python import os import subprocess import time from collections import defaultdict from pprint import pprint from random import randrange from zapv2 import ZAPv2 import sys if len(sys.argv) != 3: print 'usage %s <url>' % sys.argv[0] sys.exit() print 'starting ZAP.' proc1 = subprocess.Popen(['./zap.sh', '-daemon'], stdout=open(os.devnull, 'w')) print 'proc1 = ', proc1.pid print 'waiting for ZAP...' time.sleep(20) TARGET = sys.argv[1] print "checking %s with zap" % TARGET zap = ZAPv2() zap = ZAPv2(proxies={'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}) # TODO anyadir urls de otros scanners zap.urlopen(TARGET) time.sleep(2) zap.spider.scan(TARGET) print "spidering" while (int(zap.spider.status) < 100): print 'Spider progress %: ' + zap.spider.status time.sleep(3) print "spider completed" zap.ascan.scan(TARGET) print "spider results:" pprint(zap.spider.results) print "scanning" while (int(zap.ascan.status) < 100): print 'Scanning progress %: ' + zap.ascan.status time.sleep(3) print 'scan completed' zap.core.save_session(sys.argv[2]) print 'hosts: ' + ', '.join(zap.core.hosts) pprint(zap.core.alerts()) print 'shutting down ZAP ...' zap.core.shutdown proc1.kill()
Al final, nada sustituye el análisis manual que haga un hacker experimentado, pero para pruebas concretas, este tipo de soluciones son una buena opción.











