11 junio 2014

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 :

anon dijo...

Ojo con la ortografía: # TODO anyadir urls de otros scanners

m8l8th dijo...

"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...

Jandro dijo...

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.

minsq dijo...

Pues estoy deseando darle uso después de leer esto!!

Jose Selvi dijo...

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).