Evadiendo WAFs mediante cifrados SSL no soportados

Hoy en día los WAFs (Web Application Firewalls) son un medio muy utilizado para proteger las aplicaciones web de los ataques más comunes. Eso sí, siempre han de verse como una medida de seguridad más, no como la única. Por ejemplo, si hay un fallo de la aplicación que permite una inyección de cualquier tipo hay que corregirlo en el código, no vale solo (o no debería valer) tener un WAF como única barrera porque, como veremos a continuación, pueden ser bypasseados mediante distintas técnicas. Una de ellas y de la que hablaremos en este post es la que plantea 0x09AL...

Los WAFs son como firewalls de nivel 7 o IPSs que inspeccionan el tráfico (y lo bloquean si es necesario) hacia la aplicación. El investigador 0x09AL recibió una alerta cuando accedió por primera vez a uno de estos WAF del tipo 'Unsupported SSL Ciphers', es decir, el WAF no soportaba ciertos algoritmos de cifrado en una conexión SSL... y en seguida comprendió que, si la aplicación que hay detrás soportaba un cifrado SSL que NO soportaba el WAF, una técnica fácil y eficaz sería comunicarse hacia el mismo usando uno de esos algoritmos. Es decir, el tráfico SSL que atravesara el WAF hacia la aplicación no podría ser inspeccionado, con lo que un atacante podría evadir el WAF... así de sencillo.

Basta con comparar los algoritmos que acepta uno y otro, el WAF y el servidor web respectivamente. Imaginar por ej. que el servidor web soporta TLSv1 de 256 bits ECDHE-RSA-AES256-SHA y el WAF no:

$ sslscan http://target/ | grep Accept

Accepted TLSv1 256 bits ECDHE-RSA-AES256-SHA

Herramienta: https://github.com/rbsec/sslscan

El atacante simplemente tendría que especificar ese algoritmo y el WAF no podría inspeccionar el tráfico:

$ curl --ciphers ECDHE-RSA-AES256-SHA https://waf-test.lab.local/ssl-cipher-test
<html lang=en>
  <title>HELLO </title>
  <p>Bypass worked</p>

En base a esta técnica, 0x09AL ha publicado también una herramienta llamada WAF_buster que nos facilita la tarea de bypassear los WAFs abusando de las suites de cifrado SSL. Primero busca todos los cifrados admitidos durante la negociación de SSL/TLS en el servidor web mediante SslScan y luego los prueba con un simple curl. Si encuentra cualquier cifrado no soportado por el WAF pero si por el Web Server nos mostrará un mensaje que dice "Firewall bypass".

$ git clone https://github.com/viperbluff/WAF_buster.git
$ cd WAF_buster

$ python2 WAF_buster.py --input


Repositorio: https://github.com/viperbluff/WAF_buster

Comentarios