Engañando al WAF con XMP

18:47 1 Comments A+ a-


Me encontraba tratando de acceder a un hosting por X motivos, digamos que había "algo" interesante para llevarlo a uno a meterse donde no lo invitan, probablemente mas adelante le dedique un apartado en este blog a ese "algo", pero por ahora se los dejare picando. Una vez que había logrado evadir el formulario de autentificación que me llevaba a la zona del admin lo demás parecía sencillo, subir shell mediante uno de los uploads. Había dos tipos: de imagenes y de ficheros pdf.


Este ultimo no realizaba ningún tipo de control sobre la extención del archivo que se le pasaba, pero al momento de enviar la shell era redirigido hacia una respuesta 406.


Me suena a WAF!, ¿sera ModSec?

Al comienzo creí que el WAF filtraba funciones peligrosas como popen, system, shell_exec, etc, pero a medida que probaba me fui dando cuenta de que no permitía la inclusión de los tags <? ?> directamente. Cada vez que trataba de evadir las restricciones para colar mi código seguía recibiendo el cachetazo en seco del 406, cuando se me ocurrió que podía desactivar ModSec con un .htaccess fue en vano, el 406 seguía ahí. Así que ya en las ultimas a punto de desistir tuve la idea de embeber codigo php en el EOF de una imagen del tipo png, y si!, finalmente había subido exitosamente la shell!, pero al momento de llamarla no se ejecutaba!, ¿por qué?.


Por lógica no tendría que haber problema, se tendrían que visualizar los caracteres ilegibles seguidos de mi webshell, esto ya me estaba frustrando. Supuse que quizá se trataba de algún tag abierto dentro del source de la imagen, así que me puse a relojear el code para encontrarme con una cadena que llamo poderosamente mi atención.


¿Por que el WAF no saltaba?, si incluía los tags <? ?>

Extensible Metadata Platform (XMP)

XMP es un estándar ISO creado por adobe para el registro de metadatos en formato XML en archivos pdf e imágenes.

Para cerciorarme de que el WAF realmente no restringía el pasaje de la cadena <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> decidí subirla en limpio.


Evidentemente había logrado insertar los tags sin recibir un 406 a cambio!, por supuesto al momento de ejecutar el script aparecía un error de sintaxis debido a que lo que se encontraba entre <? ?> no se trataba de una estructura PHP valida, solo faltaba saber ¿hasta que punto controlaba el WAF la regla de la cabecera XMP?.

Jugando un poco con el string a través de ensayo y error, llegue a la conclusión de que los tags podían incluirse siempre y cuando se respete la siguiente regla.

Código: PHP
  1. <?xpacket ?>

Entonces para disfrazar esta oportunidad y que mi script pasara desapercibido ante ModSec, se me ocurrió crear una función llamada xpacket que iba a contener la instrucción a ejecutar, en este caso descargar una webshell en el servidor.


De esta manera logre hacer a un lado las restricciones para tener una consola de comandos web limpia dentro del hosting.


Probablemente existan muchas otra maneras de saltarse el firewall web, pero esta me pareció de los mas interesante, además de que surgió de la persistencia con un toque de suerte

Autor: [Q]3rv[0]
Fuente: http://www.securitysignal.org/2015/05/enganando-el-waf-con-xmp.html

1 comentarios:

Write comentarios
Unknown
AUTHOR
4 de junio de 2015, 14:16 delete

que buena idea tuviste

Reply
avatar