ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PowerShell Empire 痕迹检测实战:脚本块日志、启动器特征与 SIEM 检测规则

PowerShell Empire 痕迹检测实战:脚本块日志、启动器特征与 SIEM 检测规则 PowerShell Empire 痕迹检测实战脚本块日志、启动器特征与 SIEM 检测规则【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-SkillsPowerShell Empire 是一款经典的开源后渗透框架由listener监听器、stager投放器、agent代理三部分组成攻击者在拿到主机权限后常用它维持 C2 通信并执行各种 PowerShell 后渗透模块。它的默认启动器字符串、Base64 载荷中的 WebClient/FromBase64String 特征、固定模块调用名与默认 staging URI都会在 Windows 事件日志中留下可被检索的痕迹。本文以 Anthropic-Cybersecurity-Skills 仓库中的 analyzing-powershell-empire-artifacts 技能 及其 配套检测脚本 为核心完整覆盖日志策略启用Event ID 4104/4103、Empire 默认启动器与模块签名表、Splunk SPL 与 Elastic KQL 检测查询以及 MITRE ATTCK 技术映射读完后可以直接落地一套针对 Empire C2 活动的威胁狩猎流程。一、为什么要在事件日志中检测 PowerShell EmpireEmpire 的 agent 本身是一个无文件的 PowerShell 载荷它由powershell进程直接执行不落盘、不注册服务传统基于文件的杀软很难捕获。但其执行链条中有一环是绕不开的任何 PowerShell 代码在被执行前都会经过 PowerShell 引擎的词法分析阶段。只要提前开启 Script Block Logging脚本块日志与 Module Logging模块日志引擎就会把即将执行的脚本文本与管道细节写入日志攻击者即使隐藏了窗口、绕过了 profile也无法抹除这些由引擎自身产出的审计记录。这正是该技能的核心假设与其逆向样本不如直接在 Windows 事件日志中检索 Empire 框架的出厂默认值。只要攻击者没有为 Empire 的 launcher、stager 与模块做深度定制其默认特征即可作为高价值 IOC失陷指标。二、检测前置条件通过 GPO 启用两类 PowerShell 日志脚本块日志与模块日志默认不开启必须先在组策略中启用检测才有数据来源。参考文档 api-reference.md 给出了标准 GPO 配置路径1. 启用脚本块日志Script Block LoggingComputer Configuration Administrative Templates Windows Components Windows PowerShell Turn on PowerShell Script Block Logging: Enabled对应的注册表项为HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging - EnableScriptBlockLogging 1启用后PowerShell 引擎会记录实际执行过的脚本文本包括编码命令解码后的内容事件写入Microsoft-Windows-PowerShell/Operational日志Event ID 为4104。2. 启用模块日志Module LoggingComputer Configuration Administrative Templates Windows Components Windows PowerShell Turn on Module Logging: Enabled Module Names: *Module Names填入*表示对全部模块记录流水执行细节。模块日志事件同样写入Microsoft-Windows-PowerShell/OperationalEvent ID 为4103用于补充脚本块日志未覆盖的管道级执行信息。注意GPO 配置后建议在测试机验证注册表键值生效并确认 PowerShell 版本支持脚本块日志在 Windows PowerShell 5.0 与 PowerShell 7 中可用。日志量会随启用而增长生产环境需配套日志转发与容量规划。三、关键事件 ID 速查表在 SOC 排查与 SIEM 建规则时以下四个事件 ID 是最常打交道的Event ID日志描述4104Microsoft-Windows-PowerShell/Operational脚本块日志 — 捕获实际执行的脚本文本4103Microsoft-Windows-PowerShell/Operational模块日志 — 捕获管道执行细节4688Security进程创建 — 捕获命令行参数800Windows PowerShell管道执行旧版日志4104是检测的核心Empire 的-enc载荷在解码执行后其完整脚本内容会出现在ScriptBlockText字段中可供正则检索与二次解码。4688用于在未开启脚本块日志的情况下至少捕获到powershell -noP -sta -w 1 -enc ...这种异常命令行形态需开启命令行进程创建审核。800属于旧版Windows PowerShell日志仅在 PowerShell 2.0/3.0 时代或特定配置下产生作为补充线索。四、Empire 默认启动器模式Launcher PatternEmpire 生成的默认 launcher 是一个单行 PowerShell 命令形态固定powershell -noP -sta -w 1 -enc Base64-payload在 agent.py 检测脚本 中这一模式被编译为正则EMPIRE_LAUNCHER_PATTERNEMPIRE_LAUNCHER_PATTERN re.compile( rpowershell\s-noP\s-sta\s-w\s1\s-enc\s, re.IGNORECASE )逐个 flag 的含义如下Flag含义-noPNo profile — 跳过 PowerShell 配置文件脚本规避 profile 中的监控与策略加载-staSingle-threaded apartment — 单线程单元模式-w 1Window style hidden — 隐藏窗口-encEncoded command — 编码命令Base64 UTF-16LE为什么这四个 flag 组合是强特征普通管理脚本极少同时使用禁 profile 单线程 隐藏窗口 Base64 编码命令的完整组合。即使攻击者修改了-enc的载荷只要命令行形态匹配就已经值得告警。匹配到启动器后脚本还会尝试从-enc之后提取 Base64 串并解码预览b64_match re.search(r-enc\s([A-Za-z0-9/]), script_text) if b64_match: decoded decode_base64_payload(b64_match.group(1)) if decoded: findings[-1][decoded_payload_preview] decoded[:500]解码逻辑 decode_base64_payload 先按 UTF-16LE-enc的标准编码尝试失败后回退到 UTF-8从而兼容手工 Base64 化的载荷。解码后的预览前 500 字符会写入 JSON 报告方便研判人员直接阅读原始攻击代码。五、Empire Stager IOC 模式表stager 是负责从 C2 监听器拉取最终 agent 载荷的第一段脚本。Empire 的 PowerShell stager 使用一组固定的 .NET 调用组合任何一个单独出现都可能是误报但多个同时出现则高度可疑。检测脚本定义了 8 条 stager 正则agent.py 第 17-26 行与参考文档完全一致模式上下文System.Net.WebClient从 listener 下载 stager 载荷.DownloadString()从 C2 获取 PowerShell 脚本.DownloadData()从 C2 获取二进制数据[System.Convert]::FromBase64String解码内嵌载荷IEX()/Invoke-Expression执行下载的脚本New-Object System.Net.WebClient创建下载用的 web client在 analyze_script_block 中脚本会统计一个脚本块内命中的 stager 模式数量命中数 ≥ 2 时才产生empire_stager_patterns发现评级 High映射 MITRE T1059.001。这一组合命中策略能显著压低单模式匹配带来的误报。典型命中场景示例New-Object System.Net.WebClient.DownloadString()IEX()三条同时出现几乎就是标准的下载即执行stager 骨架。六、Empire 模块签名表Module SignaturesEmpire 的后渗透能力由一组Invoke-*/Install-*/New-*PowerShell 函数提供这些函数名在 agent 收到任务后必然出现在脚本块日志中。参考文档列出 12 个核心模块及其 MITRE 映射模块MITRE描述Invoke-MimikatzT1003.001通过 Mimikatz 转储凭据Invoke-KerberoastT1558.003请求服务票据用于离线破解Invoke-TokenManipulationT1134访问令牌操作Invoke-PSInjectT1055.012进程镂空注入Invoke-DCOMT1021.003通过 DCOM 横向移动Invoke-SMBExecT1021.002基于 SMB 的横向移动Invoke-WMIExecT1047基于 WMI 的执行Invoke-RunAsT1134.002使用替代令牌创建进程Invoke-SessionGopherT1552.001提取保存的会话凭据Install-SSPT1547.005安全支持提供程序持久化New-GPOImmediateTaskT1484.001滥用 GPO 实现执行检测脚本的EMPIRE_MODULE_SIGNATURESagent.py 第 28-46 行在此基础上扩充到了17 个额外覆盖了Invoke-PSRemoting、Invoke-ReflectivePEInjection、Get-Keystrokes、Get-Screenshot、Get-ClipboardContents、Invoke-Portscan等模块。任一模块名在脚本块中命中即产生empire_module发现评级CriticalMITRE 映射为 T1059.001for module in EMPIRE_MODULE_SIGNATURES: if module.lower() in script_text.lower(): findings.append({ indicator: empire_module, severity: Critical, module_name: module, mitre: T1059.001 })同时在扫描 Event ID 4103模块日志时同一批模块名也会被交叉检索从而捕获 4104 未覆盖的管道执行路径。七、默认 Staging URI 模式Empire 的默认 HTTP listener 使用一组伪装成业务页面的固定 URI 作为 stager/agent 通信路径。参考文档列出的默认值为/login/process.php /admin/get.php /admin/news.php /news.php /login/process.jsp这些 URI 与 agent.py 的EMPIRE_DEFAULT_URIS完全对应。若脚本块文本中出现这些路径判定为empire_staging_uri评级 High映射T1071.001应用层协议Web 协议——因为该特征更多反映的是 C2 通信侧的协议行为而非纯脚本执行。需要说明的是攻击者可以通过修改 listener 配置更换 URI因此该类特征应作为辅助证据与 launcher / stager / 模块签名相互印证而不是唯一判定依据。八、用户代理字符串User-Agent特征脚本还内置了 Empire HTTP listener 的两个默认 User-Agentagent.py 第 56-59 行Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko两者均为伪装 IE 11 / Trident 引擎的固定串与真实浏览器随版本变化的 UA 差异明显。在脚本块文本或网络日志中命中默认 UA 时产生empire_default_useragent发现评级 Medium映射 T1071.001。该特征更适合与网络侧Proxy/IDS/Zeek联动确认 agent 回连行为。九、仓库配套检测脚本的使用方式技能目录下提供了可直接运行的 Python 检测器 scripts/agent.pyPython 3.9仅依赖标准库。它支持三种子命令# 1. 扫描本机 PowerShell 事件日志默认查询 1000 条事件/rd:true 倒序 python agent.py scan-logs python agent.py scan-logs --max-events 5000 # 2. 离线分析一个 PowerShell 脚本文件或导出的日志文本 python agent.py analyze-file suspicious.ps1 # 3. 单独解码一段 Base64 载荷并自动检查其中是否含 Empire 特征 python agent.py decode JABlAGMAbwBkAGUAZAA9ACcARQBsAGUAbQB1AG8AJwA各命令输出均为结构化 JSONscan-logs通过wevtutil qe以 XML 格式查询Microsoft-Windows-PowerShell/Operational日志query_event_log解析出timestamp / computer / user_sid / script_block / event_idparse_script_block_events随后对每个脚本块执行六类特征分析产出suspicious_events列表与critical / high / medium严重度统计scan_event_logs。analyze-file读取本地脚本/日志文件并复用同一套分析逻辑适合处理导出的 EVTX 转储或粘贴的告警文本。decode独立解码入口解码后若命中 stager 模式还会自动标注encoded_empire_payload评级 Critical映射T1027——混淆文件或信息。脚本对编码载荷块的检测值得一提它会用正则[A-Za-z0-9/]{100,}{0,2}抓取脚本块中长度 ≥100 的 Base64 串解码后若发现其中嵌套了 stager 特征即判定为encoded_empire_payloadagent.py 第 184-194 行。这覆盖了内层再套一层 Base64的双层混淆场景对应 ATTCK T1027。整个技能遵循 agentskills.io 标准技能元数据SKILL.md 的 frontmatter中声明的适用场景包括安全事件调查、检测规则/威胁狩猎查询编写、SOC 结构化分析流程、以及相关攻击技术的监控覆盖验证同时声明了 NIST CSFDE.CM-01、DE.AE-02、DE.AE-07、ID.RA-05、MITRE D3FENDExecutable Denylisting、Content Format Conversion、File Content Analysis 等与 NIST AI RMF 的多框架映射可并入统一的合规覆盖视图。技能与配套代码均采用 Apache 2.0 许可LICENSE。十、SIEM 检测查询Splunk SPL 与 Elastic KQL除了本地脚本参考文档还给出两条可直接投放到 SIEM 的检测查询。Splunk SPLindexwineventlog sourceWinEventLog:Microsoft-Windows-PowerShell/Operational EventCode4104 | where match(ScriptBlockText, (?i)system\.net\.webclient) AND match(ScriptBlockText, (?i)frombase64string) | stats count by Computer, UserID, ScriptBlockText要点限定EventCode4104只检索脚本块日志要求同时命中System.Net.WebClient与FromBase64String(?i)忽略大小写等价于检测脚本中组合命中 ≥2的策略以压缩误报stats count by Computer, UserID, ScriptBlockText将相同脚本文本聚合便于按主机与用户维度统计扩散范围。Elastic KQLevent.code: 4104 AND powershell.file.script_block_text: (*System.Net.WebClient* AND *FromBase64String*)要点依赖 Elastic 官方 Windows PowerShell 集成将ScriptBlockText映射为powershell.file.script_block_text字段通配符*...*包裹的子串匹配语义与 Splunk 查询等价实际部署时建议补充时间范围、排除已知白名单脚本哈希或签名主机进一步收敛告警。两条查询都聚焦WebClient FromBase64String这一核心 stager 组合。若要扩大覆盖面可将匹配项扩展为DownloadString、DownloadData、IEX(、Invoke-Expression或在命令行字段上叠加-enc启动器特征对应 Event ID 4688。十一、MITRE ATTCK 技术映射参考文档末尾将整套检测能力归纳到四个 ATTCK 技术这也是该技能在 ATTACK_COVERAGE.md 与 attack-navigator-layer.json 中被引用时的核心覆盖项T1059.001— 命令与脚本解释器PowerShelllauncher、stager、模块执行的共同根基T1071.001— 应用层协议Web 协议staging URI 与默认 UA 特征T1027— 混淆的文件或信息Base64 双层编码载荷T1105— 工具移入Ingress Tool TransferWebClient 下载 agent 载荷结合检测脚本中各发现项的mitre字段可形成一张发现 → 技术 → 严重度的映射表启动器Critical/T1059.001、模块调用Critical/T1059.001、stager 组合High/T1059.001、staging URIHigh/T1071.001、默认 UAMedium/T1071.001、编码载荷Critical/T1027。在做检测覆盖评估时可据此对 T1059.001、T1071.001、T1027、T1105 四条技术逐项核对监控是否到位。十二、检测边界与误报缓解建议最后给出几条实战研判建议避免把该技能当作银弹定制化绕过Empire 的 launcher、stager URI、UA 均可通过配置修改。本技能的 IOC 均为默认值命中即高置信但未命中不代表安全需配合网络侧日志Zeek、Proxy与内存取证验证。误报来源合法运维脚本同样可能使用DownloadStringIEX如内网脚本分发系统单独命中 stager 单模式时价值有限务必采用组合命中 ≥2或启动器 模块签名联合判定。日志覆盖前提所有检测都依赖脚本块/模块日志已启用见第二节 GPO 配置。对存量主机应先核对EnableScriptBlockLogging注册表值再评估检测窗口。分析时序4104 记录的是解码后的脚本文本因此-enc载荷的原始 Base64 与解码内容都会出现在同一事件中——先检索原始串、再解码复核可以还原完整的攻击载荷链路。以参考文档 api-reference.md 为索引、以 agent.py 为落地实现上述日志启用 → 事件识别 → 特征匹配 → SIEM 检索 → 技术映射的完整链条即可在 SOC 环境中快速形成针对 PowerShell Empire 的可复用检测能力。【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表