LFI2RCE via Nginx temp files
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Kwetsbare konfigurasie
Example from bierbaumer.net het getoon dat selfs die volgende eenreĂ«l genoeg is wanneer PHP agter ân nginx reverse proxy loop wat request bodies na die skyf buffert:
<?php
$action = $_GET['action'] ?? 'read';
$path = $_GET['file'] ?? 'index.php';
$action === 'read' ? readfile($path) : include $path;
Die nginx-kant hou tipies standaard-temp-paaie soos /var/lib/nginx/body en /var/lib/nginx/fastcgi. Wanneer ân request body of upstream response groter is as die in-memory buffer (â8âŻKB standaard), skryf nginx deursigtig die data na ân temp-lĂȘer, hou die file descriptor oop, en ontkoppel slegs die lĂȘernaam. Enige PHP include wat simboliese skakels volg (soos /proc/<pid>/fd/<fd>) kan steeds die ontkoppelde inhoud uitvoer, wat jou RCE deur LFI gee.
Waarom nginx temp-lĂȘers misbruikbaar is
- Request bodies wat die buffer-drempel oorskry word na
client_body_temp_pathgeskryf (standaard na/tmp/nginx/client-bodyof/var/lib/nginx/body). - Die lĂȘernaam is ewekansig, maar die file descriptor bly bereikbaar onder
/proc/<nginx_pid>/fd/<fd>. Solank die request body nie voltooi is nie (of jy hou die TCP-stream hangend), hou nginx die descriptor oop selfs al is die padinskrywing ontkoppel. - PHPâs include/require los daardie
/proc/.../fd/...symlinks op, so ân aanvaller met LFI kan deur procfs hop om die gebufferde temp-lĂȘer uit te voer selfs nadat nginx dit verwyder het.
Klassieke uitbuiting-workflow (opsomming)
- Enumereer worker PIDs. Haal
/proc/<pid>/cmdlinevia die LFI op totdat jy stringe soosnginx: worker processvind. Die aantal workers oorskry selde die CPU-telling, so jy hoef slegs die laer PID-ruimte te skandeer. - Forceer nginx om die temp-lĂȘer te skep. Stuur baie groot POST/PUT bodies (of proxied responses) sodat nginx na
/var/lib/nginx/body/XXXXXXXXuitloop. Maak seker die backend lees nooit die hele body nie â bv. hou die upload-thread keep-alive sodat nginx die descriptor oop hou. - Koppel descriptors aan lĂȘers. Met die PID-lys, genereer traverseringskettings soos
/proc/<pidA>/cwd/proc/<pidB>/root/proc/<pidC>/fd/<fd>om enigerealpath()-normalisering te omseil voordat PHP die finale/proc/<victim_pid>/fd/<interesting_fd>teiken oplos. Brute-forcing van file descriptors 10â45 is gewoonlik genoeg omdat nginx daardie reeks hergebruik vir body temp-lĂȘers. - Include vir uitvoering. Wanneer jy die descriptor tref wat steeds na die gebufferde body wys, voer ân enkele
includeofrequire-oproep jou payload uit â selfs al is die oorspronklike lĂȘernaam reeds ontkoppel. As jy net lĂȘerlees benodig, skakel oor nareadfile()om die tydelike inhoud te eksfiltreer in plaas van dit uit te voer.
Moderne variasies (2024â2025)
Ingress controllers en service meshes stel nou gereeld nginx-instansies bloot met ân groter aanval-oppervlak. CVE-2025-1974 (âIngressNightmareâ) is ân goeie voorbeeld van hoe die klassieke temp-lĂȘer-truuk ontwikkel:
- Aanvallers druk ân kwaadwillige shared object as ân request body. Omdat die body >8âŻKB is, buffer nginx dit na
/tmp/nginx/client-body/cfg-<random>. Deur doelbewus te lieg in dieContent-Lengthheader (bv. te beweer 1âŻMB en nooit die laaste deel te stuur nie) bly die temp-lĂȘer ongeveer 60 sekondes vasgehou. - Die kwesbare ingress-nginx template code het toegelaat om direktiewe in die gegenereerde nginx-config te injekteer. Dit gekombineer met die langblywende temp-lĂȘer het dit moontlik gemaak om
/proc/<pid>/fd/<fd>-skakels te brute-forseer totdat die aanvaller die gebufferde shared object ontdek het. - Deur
ssl_engine /proc/<pid>/fd/<fd>;te inject, is nginx gedwing om die gebufferde.sote laai. Constructors binne die shared object het onmiddellike RCE binne die ingress controller pod veroorsaak, wat op sy beurt Kubernetes secrets blootgestel het.
ân Versmalde verkenningssnippet vir hierdie styl van aanval lyk soos:
Vinnige procfs-skandeerder
```python #!/usr/bin/env python3 import osdef find_tempfds(pid_range=range(100, 4000), fd_range=range(10, 80)): for pid in pid_range: fd_dir = fâ/proc/{pid}/fdâ if not os.path.isdir(fd_dir): continue for fd in fd_range: try: path = os.readlink(fâ{fd_dir}/{fd}â) if âclient-bodyâ in path or ânginxâ in path: yield pid, fd, path except OSError: continue
for pid, fd, path in find_tempfds(): print(fâuse ?file=/proc/{pid}/fd/{fd} # {path}â)
</details>
Voer dit uit vanaf enige primitive (command injection, template injection, ens.) wat jy reeds het. Voer die ontdekte `/proc/<pid>/fd/<fd>`-paaie terug in jou LFI-parameter om die gebufferde payload in te sluit.
## Praktiese wenke
* Wanneer nginx buffering deaktiveer (`proxy_request_buffering off`, `client_body_buffer_size` tuned high, or `proxy_max_temp_file_size 0`), word die tegniek veel moeiliker â tel daarom altyd konfigurasielĂȘers en response headers om te kyk of buffering nog aangeskakel is.
* Hangende uploads is luidrugtig maar effektief. Gebruik meerdere prosesse om workers te oorstroom sodat ten minste een temp-lĂȘer lank genoeg bly vir jou LFI brute force om dit te vang.
* In Kubernetes of ander orkestreerders kan privilege-grense anders lyk, maar die primitive is dieselfde: vind 'n manier om bytes in nginx-buffers neer te sit, en loop dan deur `/proc` van waar jy lĂȘerlees-operasies kan uitvoer.
## 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/)
## Verwysings
- [https://bierbaumer.net/security/php-lfi-with-nginx-assistance/](https://bierbaumer.net/security/php-lfi-with-nginx-assistance/)
- [https://www.opswat.com/blog/ingressnightmare-cve-2025-1974-remote-code-execution-vulnerability-remediation](https://www.opswat.com/blog/ingressnightmare-cve-2025-1974-remote-code-execution-vulnerability-remediation)
> [!TIP]
> Leer en oefen AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Leer en oefen GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Leer en oefen Azure Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Ondersteun HackTricks</summary>
>
> - Kyk na die [**subskripsie planne**](https://github.com/sponsors/carlospolop)!
> - **Sluit aan by die** đŹ [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** đŠ [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Deel hacking truuks deur PRs in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>
HackTricks

