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
1 comentario:
Muy útil, gracias.
Publicar un comentario