HackTheBox: Reset
偵察 — nmap ポートスキャン → Rservices 発見
ポートスキャン
22 (SSH), 80 (HTTP Apache 2.4.52), 512 (rexecd), 513 (rlogind), 514 (rshd) がオープン。Rservices (Berkeley r-commands) が稼働しており、古い認証メカニズムの悪用が期待できる。
Web アプリケーション確認
ブラウザで http://10.129.234.130/ にアクセスすると “Admin Login” 画面が表示される。ログインフォームの下部に “Forgot Password?” リンクがあり、パスワードリセット機能が存在することが確認できる。
パスワードリセット API 情報漏洩 — JSON レスポンスに平文パスワード
パスワードリセットエンドポイントの調査
API レスポンスが JSON 形式で新しいパスワードを平文返却している。サーバ側でパスワードを生成・更新した後、クライアントにその値を直接送信しており、盗聴・ログ漏洩・MITM 攻撃で認証情報が流出する致命的な実装ミスである。
取得パスワードでログイン
dashboard.php へリダイレクトされてログイン成功。セッション Cookie が発行される。
取得認証情報
admin : 616e6bec
LFI + Apache ログポイズニング — www-data として RCE → user.txt
dashboard.php の LFI 脆弱性確認
dashboard.php の file= POST パラメータで任意ファイルを読み込める。ホワイトリストとして /var/log/syslog、/var/log/auth.log が許可されているが、パストラバーサルで /var/log/apache2/access.log も読込可能。Apache の access.log にはリクエストの User-Agent が記録される。
PHP webshell を User-Agent に埋め込む (Log Poisoning)
Apache は User-Agent 内のダブルクォート (") をエスケープして \" として access.log に記録する。PHP がそのままパースすると構文エラーになる。シングルクォートを使うことでエスケープされずに記録され、PHP コードとして正常に動作する。
LFI 経由で access.log を PHP として include → RCE
dashboard.php は include() + output buffering + htmlspecialchars() の組み合わせで実装されている。KCSTART / KCEND マーカーで挟むことで、HTML エスケープされた周辺テキストの中からコマンド出力だけを識別・抽出できる。
user.txt 取得
user.txt
19ba954c8ba8400cbfc0277f5f1669a4
Rservices rlogin 横断移動 — /etc/hosts.equiv + tmux セッション盗聴
/etc/hosts.equiv の内容確認
+ sadm エントリはすべてのホストからユーザ sadm がパスワードなしで rlogin できることを意味する。Kali 側にローカルユーザ sadm を作成し、rlogin で接続すれば認証をバイパスできる。
Kali に sadm ユーザを作成して rlogin 接続
パスワード入力なしで sadm@reset としてターゲットにログイン成功。/etc/hosts.equiv の + sadm エントリが Kali からの接続を信頼している。
tmux セッションで sadm パスワードを取得
tmux セッションの履歴に sadm がパスワードを echo ... | sudo -S パターンで入力したコマンドが残っていた。sudo -S は stdin からパスワードを読み込む形式であり、コマンドラインに平文パスワードが記録されてしまっている。
取得認証情報
sadm : 7lE2PAfVHfjz4HpE
nano GTFOBin → root シェル取得 → root.txt
sudo 権限の確認
sudo nano /etc/firewall.sh を任意のユーザとして実行できる。nano は GTFOBins に掲載されているエディタであり、内部からシェルコマンドを実行できる。
nano GTFOBin で root シェル取得
echo 7lE2PAfVHfjz4HpE | sudo -S nano /etc/firewall.sh は stdin を pipe に奪われるため nano が正常に起動しない。正しくは sudo nano /etc/firewall.sh を実行し、プロンプトに手動でパスワードを入力する。
Ctrl+R (Read File) から Ctrl+X (Execute Command) を選ぶと nano が任意コマンドを実行できる。reset; bash 1>&0 2>&0 でターミナルをリセットしつつ bash を root 権限で起動する。1>&0 は stdout を stdin (nano のファイル記述子) にリダイレクトして対話シェルを確保するための操作。
root.txt 取得
root.txt
7ad6951bcb5a2edaffd7908b013d29b0
全体まとめと防御側の学び
攻撃チェーンの全体像
| 段階 | 使った脆弱性 / 手法 | 取得したもの |
|---|---|---|
| 1 | パスワードリセット API 情報漏洩 (JSON 平文返却) | admin:616e6bec → dashboard.php アクセス |
| 2 | LFI + Apache ログポイズニング (User-Agent PHP 埋め込み) | www-data として RCE → user.txt 19ba954c8ba8400cbfc0277f5f1669a4 |
| 3 | Rservices rlogin (/etc/hosts.equiv + sadm) + tmux 盗聴 | sadm:7lE2PAfVHfjz4HpE |
| 4 | nano GTFOBin (sudo PASSWD → Ctrl+R → Ctrl+X) | root シェル → root.txt 7ad6951bcb5a2edaffd7908b013d29b0 |
防御側の学び
- パスワードリセット API の設計: リセット後のパスワードをレスポンスに含めない。代わりにメールや SMS で安全なチャネルを通じてユーザに通知する。
- LFI の根本対策:
include()へのユーザ入力を直接渡さない。ファイルパスは内部マッピング (allowlist ID) で管理し、パストラバーサルを完全に防ぐ。 - Apache ログポイズニング対策: PHP で外部ログファイルを include しない。ログ表示が必要な場合は
readfile()/file_get_contents()を使い、PHP 実行を伴わない形で出力する。 - Rservices の廃止: rlogin/rsh/rexec は認証が脆弱な古いプロトコルであり、現代的なシステムでは SSH に置き換えるべき。
/etc/hosts.equivの+エントリは特に危険。 - sudo コマンドのスコープ制限: テキストエディタ (nano, vi, vim 等) を sudo で許可すると GTFOBins 経由でシェル昇格が可能。NOEXEC オプションも完全な対策にはならないため、エディタへの sudo 権限付与は避ける。
- tmux / screen セッション管理: 共有セッションやデタッチされたセッションにパスワードを含むコマンドを残さない。
sudo -Sパターンはコマンド履歴にパスワードが残るため使用しない。

