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.
5 comments :
Ojo con la ortografía: # TODO anyadir urls de otros scanners
"Al final, nada sustituye el análisis manual que haga un hacker experimentado"..Muy de acuerdo. Hoy en día, muchos consultores de Seguridad made in Google utilizan técnicas automatizadas para "ahorrar" tiempo en las evaluaciones de seguridad. Yo agradezco a mis mentores que me inculcaron como la vieja escuela...Revisiones manuales formulario por formulario...
Totalmente de acuerdo. Es más, conozco alguna empresa (muy grande), que planta el scan tal cual sale del programa, y te lo da como entregable (falsos positivos incluído).
Al final, hay que saber interpretar los datos, descartar falsos positivos, ver por donde puede haber una ruta de ataque, y para todo esto, una revisión manual por parte de un auditor experimentado es lo mejor que se puede hacer.
Pues estoy deseando darle uso después de leer esto!!
Yo opino que no hay que irse a los extremos. IMHO hay un montón de cosas que se pueden automatizar sin un decremento de la calidad, y otras muchas cosas que hay que hacerlas a mano si quieres buenos resultados. Hay veces que la gente automatiza en exceso, bien porque no saben hacerlo a mano (como dice @m8l8th), o bien porque sus clientes compran a unos precios que les resulta imposible ejecutar el trabajo manualmente (que de esto también hay mucho).
Publicar un comentario