HackTheBox: Writeup — 全実行コマンド・実行結果レポート
Nmap スキャン
22/ssh, 80/http
→
22/ssh, 80/http
robots.txt → /writeup/
CMS Made Simple 2019
→
CMS Made Simple 2019
CVE-2019-9053
time-based blind SQLi
→
time-based blind SQLi
salt + hash抽出
cms_siteprefs / cms_users
→
cms_siteprefs / cms_users
hashcat -m 20
jkr:raykayjay9
→
jkr:raykayjay9
SSH jkr
user.txt ✓
→
user.txt ✓
staff グループ発見
/usr/local/{bin,sbin} 書込可
→
/usr/local/{bin,sbin} 書込可
run-parts PATH hijack
SSHログインmotdでroot実行
→
SSHログインmotdでroot実行
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
BASH
nmap -Pn -p- --min-rate 500 -T4 --max-retries 2 10.129.86.41
RESULT
PORT STATE SERVICE 22/tcp open ssh 80/tcp open http
バージョン・スクリプトスキャン
BASH
nmap -sV -sC -p 22,80 10.129.86.41
RESULT
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u1 (protocol 2.0) 80/tcp open http Apache httpd 2.4.25 ((Debian)) |_http-title: Nothing here yet. | http-robots.txt: 1 disallowed entry |_/writeup/ Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
🚨
トップページは “Nothing here yet.” の空ページだが、
robots.txt に
/writeup/ という disallow エントリが残っており、実際のコンテンツの
在り処を教えてくれている(robots.txt は検索エンジン向けの除外指定であり、アクセス制御ではない点に注意)。
PHASE 2
CMS Made Simple 発見 & DoS保護(fail2ban系)への対処
/writeup/ の内容確認
BASH
curl -s http://10.129.86.41/writeup/
RESULT
<meta name="Generator" content="CMS Made Simple - Copyright (C) 2004-2019. All rights reserved." />
...
<h1>writeup</h1>
<p>After many month of lurking around on HTB I also decided to start writing
about the boxes I hacked...</p>
🚨
CMS Made Simple (2019年版) と判明。この時期のCMSMSには
既知のクリティカル脆弱性 CVE-2019-9053(EDB-ID 46635、time-based blind SQLi)
が存在する。
⚠️ 重要な注意: ディレクトリ・ブルートフォース/積極的スキャンは絶対禁止
NOTE
本ターゲットの Apache には fail2ban 系の DoS/ブルートフォース対策が 設定されており、gobuster によるディレクトリ探索や ffuf による vhost/サブドメイン・フラッディング(数千リクエストのバースト送信)を行うと、 攻撃元IPからの port 80 への接続が長時間(本検証では30分以上)にわたって 不安定化した(nmapのSYNスキャンですら "filtered" と誤判定するほど 接続成功率が1/10〜1/15程度まで低下)。 一度この状態に陥ると、CMS自体への正規のリクエストすら頻繁に失敗するようになり、 その後の全フェーズが大幅に遅延する。 対策: このボックスでは robots.txt から既にCMSのパスが分かっているため、 gobuster等のディレクトリ探索は一切不要。/writeup/ 配下への 最小限のリクエストのみで進めること。
⚠️
既にバーストスキャンで接続不安定化を起こしてしまった場合は、
スキャンを完全に停止し、数分〜数十分待ってから単発の
curl --max-time 8 http://<target>/writeup/ を間隔を空けて
リトライする。接続が1回でも成功すれば、そのセッションで一気に
SQLi以降の手順を進める。
PHASE 3
CVE-2019-9053 time-based blind SQLi で salt + password hash 抽出
脆弱性の原理
NOTE
CMS Made Simple の News モジュール用エンドポイント moduleinterface.php の
パラメータ "m1_idlist" が不十分なサニタイズのままSQLクエリに結合される。
典型的な悪用パターンは、閉じ括弧で元のIN句を終端し、サブクエリで
SLEEP() を条件分岐させる time-based blind SQLi:
GET /writeup/moduleinterface.php?mact=News,m1,default,0&m1_idlist=
a,b,1,5))+and+(select+sleep(1)+from+| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| 情報漏洩 | /robots.txt | 隠されたCMSパスの発見 | Medium | disallowエントリ “/writeup/” からコンテンツの実在位置を特定 |
| CVE-2019-9053 | CMS Made Simple 2.2.9 moduleinterface.php | DB内の任意データ抽出(認証情報窃取) | Critical | m1_idlistパラメータへのtime-based blind SQLiで salt/password hashを1文字ずつ抽出 |
| 弱いパスワード | jkr のCMSアカウント(SSHと共用) | SSH侵入(user.txt) | High | 抽出したMD5(salt+pass)ハッシュをhashcat -m 20でrockyou.txt照合しクラック |
| PATH ハイジャック(staffグループ誤設定) | /usr/local/{bin,sbin} (staffグループ書込可) + motd run-parts | jkr → root への権限昇格 | High | root が毎SSHログイン時にフルパス指定なしで実行するrun-partsをPATH優先順位の高い場所でハイジャックしSUID化 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap + robots.txt確認 | 22/80、CMSパス /writeup/ の発見 |
| 2 | CMS確認 | curl(最小リクエストのみ、dir brute回避) | CMS Made Simple 2019版と確認 |
| 3 | SQLi抽出 | CVE-2019-9053 time-based blind SQLi | salt(16 hex) + jkr パスワードハッシュ(32 hex) |
| 4 | クラック+ログイン | hashcat -m 20 → SSH | user.txt 取得(jkr:raykayjay9)、staffグループ発見 |
| 5 | 権限調査 | ls -la /usr/local + pspy監視 | root motdのrun-parts PATH解決実行を確認 |
| 6 | 権限昇格 | run-parts PATHハイジャック→SUID bash | root.txt 取得 |
トラブルシューティング & 実装上の落とし穴
| 問題 | 原因 / 対策 |
|---|---|
| gobuster等でディレクトリ探索すると、以後port 80への接続が長時間不安定になる | このboxのApacheにはfail2ban系のDoS/ブルートフォース対策があり、バースト的な大量リクエストを検知してIPを遮断する。robots.txtで既にCMSパスが分かっているためディレクトリ探索は不要、最小限のリクエストのみに留める。 |
| time-based blind SQLiの抽出結果が意味不明な値(0埋め等)になる | ネットワークが不安定だとSLEEP由来の遅延と接続タイムアウトを区別できず誤検出する。文字数が正しくなければ抽出失敗と判断し、hashcatでのクラック(既知ワードリスト)に懸けるフォールバック運用が実用的。 |
| run-partsを/usr/local/binだけに置いても権限昇格が発火しない場合がある | root PATHは/usr/local/sbinが/usr/local/binより先に解決される。両方のディレクトリに同じハイジャックファイルを配置すると確実。 |
| run-parts配置後、即座にrootシェルが来ない | ハイジャックはSSHログイン時のmotd表示(/etc/update-motd.d)のタイミングでのみ発火する。配置後に新規ログインをもう一度行う必要がある(既存セッションでは発火しない)。 |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| robots.txtが非公開コンテンツのパスを事実上公開してしまっている | robots.txtはアクセス制御の手段ではないことを理解し、本当に非公開にしたいパスは認証やIP制限等の実アクセス制御で保護する。 |
| CMS Made Simpleの既知クリティカルSQLi(CVE-2019-9053)が未パッチ | CMSソフトウェアは速やかにパッチ適用・バージョン更新する。WAFで既知PoCパターンを検知・遮断する。 |
| CMSアカウントのパスワードがシステムのSSHログインと共用かつ辞書に載る弱いパスワード | サービス間でパスワードを共用しない。NIST等が推奨する強力なパスワードポリシーを適用し、rockyou.txt等の既知辞書で破られない長さ・複雑さを要求する。 |
| 一般ユーザーが非標準のstaffグループ経由で/usr/local配下に書込可能、かつrootがフルパス指定なしでrun-partsを実行 | 最小権限の原則を徹底し、不要なグループ付与を避ける。root権限で実行するスクリプトは必ずフルパス指定にし、相対PATH解決に依存しない。/usr/local配下への書込権限は管理者のみに限定する。 |

