viernes, 28 de noviembre de 2014

LFI - un rápido vistazo a diferentes trucos

     Mucho se ha escrito acerca de esta vulnerabilidad y de cómo se puede realizar su explotación. Este post no es más que un intento de recopilación resumida de las diferentes técnicas que he ido aprendiendo con el tiempo, de tal forma que al tenerlas todas agrupadas en un mismo punto podamos usarla como cheat sheet. En caso de que conozcais alguna maś que aquí no está presente, por favor añadidla en los comentarios y procederé a editar este post para incluirla.

Leer archivos del servidor


    Para leer ficheros, en caso de no poder poner acceder directamente (lfi.php?page=/etc/passwd), podemos utilizar los php
wrappers. Haciendo un "lfi.php?page=php://filter/convert.base64-encode/resource=/etc/passwd", podremos obtener el contenido de /etc/passwd en base64.


Subiendo archivos

    Si la web que posee en LFI permite la subida de algún tipo de fichero, podemos usar esta característica para embeber código PHP (una webshell pequeña, por ejemplo) dentro del archivo y posteriormente ejecutarlo desde el LFI. En el caso de foros, blogs, o cualquier otra web grande que permita la subida de imágenes por parte de los usuarios, podemos añadir el código malicioso al final de la imagen (o crear un archivo con el PHP precedido por la cabecera de un formato de imagen) o incluso dentro de los metadatos de las imágenes.

    El problema de las imágenes procede cuando se ejecutan sobre ellas operaciones que puedan eliminar el código malicioso que habíamos incluido. Es muy común utilizar PHP-GD para ello. En estos casos podemos codificar la webshell dentro del PNG, tal y como describe este post (https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/).


Sin subir archivos

    De no existir posibilidad de que podamos subir un fichero, quizás podamos inyectar código en logs. Para ello deberemos de generar un error (intentar acceder a una url inexistente, por ejemplo) en cuya petición introduzcamos el código malicioso (por ejemplo, en el user-agent o cualquier otro dato que quede almacenado en el log); posteriormente incluimos con el LFI el fichero de logs. No debemos de cerrarnos en banda y únicamente probar con los logs generados por el servidor web: si hemos detectado otros servicios corriendo en la máquina que generen logs, podemos usarlos.


    Otra opción que podemos intentar es colocar el código malicioso dentro de User-Agent e incluir /proc/self/environ. Tanto ésta como la anterior son dependientes de los permisos, por lo que su potencial uso es bastante reducido. Pero nunca está de más tenerlas en cuenta (CTFs, servidores mal configurados...).

    En otros escenarios, es posible la utilización del wrapper "data:" para realizar un RCE directamente. En el cybercamp, por ejemplo, uno de los retos web se podían resolver de esta forma ("?page=data:,").


---------------------------------------------------------------


Quería hacer un post bastante más largo, pero entre los CTFs, el máster y la uni no he podido sacar tiempo. A raiz de que Longinos me metiera prisa, he sacado este post rápido. También tengo algunos posts pendientes de pasar retos con radare2 que quiero publicar cuando tenga un hueco.








Byt3z
5 0verl0ad Labs: LFI - un rápido vistazo a diferentes trucos      Mucho se ha escrito acerca de esta vulnerabilidad y de cómo se puede realizar su explotación. Este post no es más que un intento de rec...

1 comentario:

Anónimo dijo...

Muy útil, gracias.

< >