ousachev28/Threat-Hunting-Port-of-Entry
GitHub: ousachev28/Threat-Hunting-Port-of-Entry
基于 Microsoft Defender 端点日志的威胁狩猎实战教程,通过 20 个攻击标志点完整还原企业入侵事件的分析过程与检测方法。
Stars: 0 | Forks: 0
# 威胁狩猎:Port of Entry
# 目录
- [威胁狩猎:"Port of Entry"](#threat-hunt-port-of-entry)
- [平台与工具](#platforms-and-tools)
- [发现总结(Flags)](#summary-of-findings-flags)
- [Flag 1:初始访问 - 远程访问源](#flag-1--initial-access-remote-access-source)
- [Flag 2:初始访问 - 被入侵的用户账户](#flag-2--initial-access-compromised-user-account)
- [Flag 3:发现 - 网络侦察](#flag-3--discovery-network-reconnaissance)
- [Flag 4:防御规避 - 恶意软件暂存目录](#flag-4--defense-evasion-malware-staging-directory)
- [Flag 5:防御规避 - 文件扩展名排除项](#flag-5--defense-evasion-file-extension-exclusions)
- [Flag 6:防御规避 - 临时文件夹排除项](#flag-6--defense-evasion-temporary-folder-exclusion)
- [Flag 7:防御规避 - 下载实用程序滥用](#flag-7--defense-evasion-download-utility-abuse)
- [Flag 8:持久化 - 计划任务名称](#flag-8--persistence-scheduled-task-name)
- [Flag 9:持久化 - 计划任务目标](#flag-9--persistence-scheduled-task-target)
- [Flag 10:命令与控制 - C2 服务器地址](#flag-10--command--control-c2-server-address)
- [Flag 11:命令与控制 - C2 通信端口](#flag-11--command--control-c2-communication-port)
- [Flag 12:凭据访问 - 凭据窃取工具](#flag-12--credential-access-credential-theft-tool)
- [Flag 13:凭据访问 - 内存提取模块](#flag-13--credential-access-memory-extraction-module)
- [Flag 14:收集 - 数据暂存归档](#flag-14--collection-data-staging-archive)
- [Flag 15:渗出 - 渗出通道](#flag-15--exfiltration-exfiltration-channel)
- [Flag 16:反取证 - 日志篡改](#flag-16--anti-forensics-log-tampering)
- [Flag 17:影响 - 持久化账户](#flag-17--impact-persistence-account)
- [Flag 18:执行 - 恶意脚本](#flag-18--execution-malicious-script)
- [Flag 19:横向移动 - 次要目标](#flag-19--lateral-movement-secondary-target)
- [Flag 20:横向移动 - 远程访问工具](#flag-20--lateral-movement-remote-access-tool)
- [MITRE ATT&CK 技术映射](#mitre-attck-technique-mapping)
- [结论](#conclusion)
- [经验教训](#lessons-learned)
- [修复建议](#recommendations-for-remediation)
# 威胁狩猎:"Port of Entry"
## 场景
**事件简报 — Azuki Import/Export **
竞争对手以精确 3% 的差价抢占了我们 6 年的航运合同。我们的供应商合同和定价数据出现在地下论坛上。
| 字段 | 详情 |
|---|---|
| **公司** | Azuki Import/Export Trading Co. — 23 名员工,日本/东南亚航运物流 |
| **被入侵系统** | `AZUKI-SL`(IT 管理员工作站) |
| **可用证据** | Microsoft Defender for Endpoint 日志 |
**日志查询范围:**
```
DeviceProcessEvents
| where DeviceName == "azuki-sl"
| where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20))
```
本报告包括:
- 对设备 `azuki-sl` 上的审计、侦察和 attempted exfiltration of data 的时间线重建
- 使用 Microsoft Defender Advanced Hunting (KQL) 的详细查询
- MITRE ATT&CK 映射以了解 TTP 对齐情况
- 基于证据的摘要,支持发现的每个 flag 和行为
## 平台与工具
**分析环境:**
- Microsoft Defender for Endpoint
- Log Analytics Workspace
- Azure
**使用的技术:**
- Kusto Query Language (KQL)
- 端点日志的行为分析(`DeviceLogonEvents`、`DeviceProcessEvents`、`DeviceNetworkEvents`、`DeviceRegistryEvents`)
## 发现总结(Flags)
| Flag | 目标 | 发现 | 时间戳 |
|---|---|---|---|
| 1 | 识别 RDP 连接的源 IP 地址 | `88.97.178.12` 是访问受损账户的 IP 地址 | `2025-11-19T18:36:18.503997Z` |
| 2 | 识别用于初始访问的被入侵用户账户 | 账户 `kenji.sato` 已被入侵 | `2025-11-19T00:57:18Z` |
| 3 | 识别用于枚举网络邻居的命令和参数 | 执行了 `ARP.EXE -a` 进行枚举 | `2025-11-19T19:04:01Z` |
| 4 | 识别存储恶意软件的主要暂存目录 | 发现 `C:\ProgramData\WindowsCache` 是主要暂存目录 | `2025-11-19T19:05:33Z` |
| 5 | 多少个文件扩展名被排除在 Windows Defender 扫描之外? | 排除了 3 个文件扩展名 | `2025-11-19T18:49:27Z` |
| 6 | 哪个临时文件夹路径被排除在 Windows Defender 扫描之外? | `C:\Users\KENJI~1.SAT\AppData\Local\Temp` 被排除 | `2025-11-19T18:49:27Z` |
| 7 | 识别攻击者滥用以下载文件的 Windows 原生二进制文件 | `certutil.exe` 被用于下载恶意软件 | `2025-11-19T19:06:58Z` |
| 8 | 识别为持久化而创建的计划任务名称 | 发现 `Windows Update Check` 是伪装的计划任务 | `2025-11-19T19:07:46Z` |
| 9 | 识别计划任务中配置的可执行路径 | `C:\ProgramData\WindowsCache\svchost.exe` | `2025-11-19T19:07:46Z` |
| 10 | 识别命令和控制服务器的 IP 地址 | 发现 `78.141.196.6` 是 C2 服务器 | `2025-11-19T18:37:26Z` |
| 11 | 识别用于 C2 通信的目标端口 | 端口 `443` 是使用的目标端口 | `2025-11-19T19:11:04Z` |
| 12 | 识别凭据转储工具的文件名 | `mm.exe` 被识别为凭据转储工具 | `2025-11-19T19:07:22Z` |
| 13 | 识别用于从内存中提取登录密码的模块 | 使用了 `sekurlsa::logonpasswords` 模块 | `2025-11-19T19:08:26Z` |
| 14 | 识别用于数据渗出的压缩归档文件名 | 创建了 `export-data.zip` 用于数据渗出 | `2025-11-19T19:08:58Z` |
| 15 | 识别用于渗出被盗数据的云服务 | 使用 Discord 渗出数据 | `2025-11-19T19:09:21Z` |
| 16 | 识别攻击者清除的第一个 Windows 事件日志 | `Security` 是第一个被清除的事件日志 | `2025-11-19T19:11:39Z` |
| 17 | 识别攻击者创建的后门账户用户名 | `support` 是创建的账户名称 | `2025-11-19T19:09:53Z` |
| 18 | 识别用于自动化攻击链的 PowerShell 脚本文件 | `wupdate.ps1` 是自动化脚本 | `2025-11-19T18:49:48Z` |
| 19 | 横向移动的目标 IP 地址是什么? | `10.1.0.188` | `2025-11-19T19:10:42Z` |
| 20 | 识别用于横向移动的远程访问工具 | `mstsc.exe` 被识别为 RAT | `2025-11-19T19:10:41Z` |
## Flag 详情
### Flag 1 — INITIAL ACCESS:远程访问源
**目标:** 识别 Remote Desktop Protocol 连接的源 IP 地址。
**Flag 值:** `88.97.178.12` — `2025-11-19T18:36:18.503997Z`
**检测策略:** 查询事件时间范围内来自外部源的交互式会话的登录事件。使用 `DeviceLogonEvents` 并按 `DeviceName` 和指示远程访问的 `ActionType` 值进行过滤。
**KQL 查询:**
```
//Public Remote IP that successfully logged on to "azuki-si"
DeviceLogonEvents
| where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20))
| where DeviceName == "azuki-sl"
| where isnotempty(RemoteIP) and RemoteIPType == "Public"
| where ActionType == "LogonSuccess"
| project TimeGenerated, AccountName, DeviceName, ActionType, RemoteIP, RemoteIPType
```
**证据**
### Flag 2 — INITIAL ACCESS:被入侵的用户账户 **目标:** 识别用于初始访问的被入侵用户账户。 **Flag 值:** `kenji.sato` — `2025-11-19T00:57:18Z` **检测策略:** `RemoteIP` 被显示通过 RDP 访问了被入侵的账户。 ``` DeviceLogonEvents | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where LogonType == "RemoteInteractive" | project Timestamp, AccountName, RemoteIP, AdditionalFields | sort by AccountName ``` ### Flag 3 — DISCOVERY:网络侦察 **目标:** 识别用于枚举网络邻居的命令和参数。 **Flag 值:** `ARP.EXE -a` — `2025-11-19T19:04:01Z` **检测策略:** 寻找揭示本地网络设备和硬件地址的命令。检查 `DeviceProcessEvents` 中初始访问后执行的网络枚举实用程序。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("whoami", "hostname", "systeminfo", "ipconfig", "ipconfig /all", "net user", "net localgroup", "query user", "quser", "qwinsta", "wmic", "Get-ComputerInfo", "Get-CimInstance", "Get-WmiObject", "Get-NetIPConfiguration", "Get-NetAdapter", "Get-NetIPAddress", "Get-Process", "tasklist", "netstat -ano", "reg query", "Get-Service", "Get-LocalUser", "Get-ChildItem Env:") or FileName in~ ("netsh.exe", "ipconfig.exe", "systeminfo.exe", "whoami.exe", "dsquery.exe", "dsget.exe", "nltest.exe", "nbtstat.exe", "arp.exe", "tracert.exe", "quser.exe", "qwinsta.exe") | project Timestamp, DeviceName, FileName, ProcessCommandLine, InitiatingProcessFileName, AccountName | order by Timestamp asc ``` ### Flag 4 — DEFENSE EVASION:恶意软件暂存目录 **目标:** 找到存储恶意软件的主要暂存目录。 **Flag 值:** `C:\ProgramData\WindowsCache` — `2025-11-19T19:05:33Z` **检测策略:** 搜索系统文件夹中随后被隐藏的新创建目录。寻找 `mkdir` 或 `New-Item` 命令,随后是修改文件夹属性的 `attrib` 命令。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("mkdir", "New-Item", "attrib") | project Timestamp, DeviceName, InitiatingProcessAccountName, FolderCreated=ProcessCommandLine, InitiatingProcessFolderPath | order by Timestamp asc ``` ### Flag 5 — DEFENSE EVASION:文件扩展名排除项 **目标:** 查找有多少文件扩展名被排除在 Windows Defender 扫描之外。 **Flag 值:** `3` — `2025-11-19T18:49:27Z` **检测策略:** 搜索 `DeviceRegistryEvents` 中对 Windows Defender 排除设置的注册表修改。计算添加到 `Exclusions\Extensions` 注册表键的唯一文件扩展名数量。 ``` DeviceRegistryEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ActionType == "RegistryValueSet" | where RegistryKey startswith "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Defender\\Exclusions\\Extensions" | project Timestamp, DeviceName, RegistryKey, RegistryValueData, RegistryValueName ``` ### Flag 6 — DEFENSE EVASION:临时文件夹排除项 **目标:** 哪个临时文件夹路径被排除在 Windows Defender 扫描之外? **Flag 值:** `C:\Users\KENJI~1.SAT\AppData\Local\Temp` — `2025-11-19T18:49:27Z` **检测 Strategy:** 搜索 `DeviceRegistryEvents` 中添加到 Windows Defender 配置的文件夹路径排除项。关注 `RegistryValueName` 字段中的临时文件夹路径。 ``` DeviceRegistryEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ActionType == "RegistryValueSet" | where RegistryKey startswith "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Defender\\Exclusions\\Paths" | project Timestamp, DeviceName, RegistryKey, RegistryValueData, RegistryValueName, InitiatingProcessFolderPath, InitiatingProcessFileName ``` ### Flag 7 — DEFENSE EVASION:下载实用程序滥用 **目标:** 识别攻击者滥用以下载文件的 Windows 原生二进制文件。 **Flag 值:** `certutil.exe` — `2025-11-19T19:06:58Z` **检测策略:** 寻找具有网络下载功能的内置 Windows 工具。在 `DeviceProcessEvents` 中搜索命令行包含 URL 和输出文件路径的进程。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("http://", "https://") | project Timestamp, DeviceName, InitiatingProcessAccountName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ### Flag 8 — PERSISTENCE:计划任务名称 **目标:** 识别为持久化而创建的计划任务名称。 **Flag 值:** `Windows Update Check` — `2025-11-19T19:07:46Z` **检测策略:** 搜索计划任务创建命令。在 `DeviceProcessEvents` 中查找带有 `/create` 参数的 `schtasks.exe`。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("create", "task") | project Timestamp, DeviceName, InitiatingProcessAccountName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ### Flag 9 — PERSISTENCE:计划任务目标 **目标:** 识别计划任务中配置的可执行路径。 **Flag 值:** `C:\ProgramData\WindowsCache\svchost.exe` — `2025-11-19T19:07:46Z` **检测策略:** 从计划任务创建命令行中提取任务操作。在 `schtasks` 命令中查找 `/tr` 参数值。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("create", "task") | project Timestamp, DeviceName, InitiatingProcessAccountName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ### Flag 10 — COMMAND & CONTROL:C2 服务器地址 **目标:** 识别命令和控制服务器的 IP 地址。 **Flag 值:** `78.141.196.6` — `2025-11-19T18:37:26Z` **检测策略:** 分析可疑可执行文件下载后不久发起的网络连接。使用 `DeviceNetworkEvents` 查找到外部 IP 地址的出站连接。 ``` DeviceNetworkEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where RemoteIPType == "Public" | where InitiatingProcessFileName !in~ ("chrome.exe", "msedge.exe", "firefox.exe", "teams.exe", "outlook.exe") | project Timestamp, LocalIP, RemoteIP, RemotePort, Protocol, ActionType, InitiatingProcessAccountName, InitiatingProcessCommandLine, InitiatingProcessRemoteSessionDeviceName | order by Timestamp asc ``` ### Flag 11 — COMMAND & CONTROL:C2 通信端口 **目标:** 识别用于命令和控制通信的目标端口。 **Flag 值:** `443` — `2025-11-19T19:11:04Z` **检测策略:** 检查来自恶意可执行文件的出站连接的目标端口。检查 `DeviceNetworkEvents` 中与 C2 流量关联的 `RemotePort` 字段。 ``` DeviceNetworkEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where RemoteIP == "78.141.196.6" | project Timestamp, LocalIP, RemoteIP, RemotePort, Protocol, ActionType, InitiatingProcessAccountName, InitiatingProcessCommandLine, InitiatingProcessRemoteSessionDeviceName | order by Timestamp asc ``` ### Flag 12 — CREDENTIAL ACCESS:凭据窃取工具 **目标:** 识别凭据转储的文件名。 **Flag 值:** `mm.exe` — `2025-11-19T19:07:22Z` **检测策略:** 寻找下载到暂存目录的具有短文件名的可执行文件。搜索在 LSASS 内存访问事件之前不久创建的文件。 ``` DeviceFileEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where FileName endswith ".exe" | project Timestamp, DeviceName, FileName, ActionType, InitiatingProcessFileName, FolderPath | order by Timestamp desc ``` ### Flag 13 — CREDENTIAL ACCESS:内存提取模块 **目标:** 识别用于从内存中提取登录密码的模块。 **Flag 值:** `sekurlsa::logonpasswords` — `2025-11-19T19:08:26Z` **检测策略:** 检查传递给凭据转储工具的命令行参数。在进程命令行或输出重定向中寻找 `module::command` 语法。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("cls", "exit") | project Timestamp, DeviceName, InitiatingProcessAccountName, FileName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ### Flag 14 — COLLECTION:数据暂存归档 **目标:** 识别用于数据渗出的压缩归档文件名。 **Flag 值:** `export-data.zip` — `2025-11-19T19:08:58Z` **检测策略:** 在收集阶段搜索暂存目录中 ZIP 文件的创建。寻找 `Compress-Archive` 命令或检查渗出活动之前创建的文件。 ``` DeviceFileEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where FileName endswith ".zip" | project Timestamp, DeviceName, FileName, ActionType, InitiatingProcessFileName, FolderPath | order by Timestamp desc ``` ### Flag 15 — EXFILTRATION:渗出通道 **目标:** 识别用于渗出被盗数据的云服务。 **Flag 值:** `Discord` — `2025-11-19T19:09:21Z` **检测策略:** 分析渗出阶段的出站 HTTPS 连接和文件上传操作。检查 `DeviceNetworkEvents` 中与常见文件共享或通信平台的连接。 ``` DeviceNetworkEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where InitiatingProcessCommandLine has_any ("https") | project Timestamp, LocalIP, RemoteIP, RemotePort, Protocol, ActionType, InitiatingProcessAccountName, InitiatingProcessCommandLine, InitiatingProcessRemoteSessionDeviceName, AdditionalFields | order by Timestamp asc ``` ### Flag 16 — ANTI-FORENSICS:日志篡改 **目标:** 识别攻击者清除的第一个 Windows 事件日志。 **Flag 值:** `Security` — `2025-11-19T19:11:39Z` **检测策略:** 在攻击时间线接近尾声时搜索事件日志清除命令。寻找 `wevtutil.exe` 执行并确定首先清除了哪个日志。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where FileName =~ "wevtutil.exe" | project Timestamp, DeviceName, InitiatingProcessAccountName, FileName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ### Flag 17 — IMPACT:持久化账户 **目标:** 识别攻击者创建的后门账户用户名。 **Flag 值:** `support` — `2025-11-19T19:09:53Z` **检测策略:** 在影响阶段搜索账户创建命令。寻找带有 `/add` 参数的命令,随后是管理员组添加。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("net user", "/add", "useradd", "username") | project Timestamp, DeviceName, InitiatingProcessAccountName, FileName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ### Flag 18 — EXECUTION:恶意脚本 **目标:** 识别用于自动化攻击链的 PowerShell 脚本文件。 **Flag 值:** `wupdate.ps1` — `2025-11-19T18:49:48Z` **检测策略:** 在初始入侵阶段搜索 `DeviceFileEvents` 中在临时目录创建的脚本文件。寻找初始访问后不久从外部源下载的 PowerShell 或批处理脚本文件。 ``` DeviceFileEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where FileName endswith ".ps1" or FileName endswith ".bat" | project Timestamp, DeviceName, FileName, ActionType, InitiatingProcessFileName, FolderPath | order by Timestamp desc ``` ### Flag 19 — LATERAL MOVEMENT:次要目标 **目标:** 横向移动的目标 IP 地址是什么? **Flag 值:** `10.1.0.188` — `2025-11-19T19:10:42Z` **检测策略:** 检查横向移动期间远程访问命令中指定的目标系统。寻找攻击时间线接近尾声时与 `cmdkey` 或 `mstsc` 命令一起使用的 IP 地址。 ``` DeviceNetworkEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where InitiatingProcessCommandLine has_any ("cmdkey", "mstsc") | project Timestamp, LocalIP, RemoteIP, RemotePort, Protocol, ActionType, InitiatingProcessAccountName, InitiatingProcessCommandLine, InitiatingProcessRemoteSessionDeviceName, AdditionalFields | order by Timestamp asc ``` ### Flag 20 — LATERAL MOVEMENT:远程访问工具 **目标:** 识别用于横向移动的远程访问工具。 **Flag 值:** `mstsc.exe` — `2025-11-19T19:10:41Z` **检测策略:** 搜索攻击时间线接近尾声时执行的远程桌面连接实用程序。寻找以远程系统名称或 IP 地址作为参数启动的进程。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine matches regex @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" | project Timestamp, DeviceName, InitiatingProcessAccountName, FileName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ## MITRE ATT&CK 技术映射 | Flag | 描述 | MITRE ATT&CK 技术 | |---|---|---| | 1 | 远程桌面 / 外部连接作为入口点 | `T1078.004` – Valid Accounts: Remote Desktop Protocol
`T1190` – Exploit Public-Facing Application | | 2 | 被入侵的凭据用于访问主机 | `T1078` – Valid Accounts | | 3 | 枚举网络邻居、IP、ARP 表、拓扑 | `T1016` – System Network Configuration Discovery
`T1087.002` – Account Discovery: Domain/Local Accounts | | 4 | 为 Payload 创建隐藏或不寻常的暂存目录 | `T1221` – Template Injection
`T1564.001` – Hide Artifacts: Hidden Files and Directories | | 5 | 从杀毒软件扫描中排除某些扩展名 | `T1562.004` – Impair Defenses: Disable or Modify Tools | | 6 | 从扫描中排除 Temp 文件夹 | `T1562.004` – Impair Defenses | | 7 | 使用原生 Windows 实用程序下载 Payload | `T1218` – System Binary Proxy Execution
`T1105` – Ingress Tool Transfer | | 8 | 创建计划任务以维持持久化 | `T1053.005` – Scheduled Task / Job | | 9 | 配置计划任务以运行攻击者 Payload | `T1053.005` – Scheduled Task / Job | | 10 | 到攻击者控制的 C2 服务器的出站连接 | `T1071.001` – Application Layer Protocol: Web Protocol
`T1043` – Commonly Used Port | | 11 | 使用端口 443 进行 C2 通信 | `T1043` – Commonly Used Port | | 12 | 使用凭据转储工具 | `T1003` – OS Credential Dumping | | 13 | 使用基于内存的提取模块 | `T1003.001` – OS Credential Dumping: LSASS Memory | | 14 | 归档数据 (zip) 以进行渗出 | `T1560.001` – Archive Collected Data: Zip | | 15 | 到外部主机的出站数据移动 | `T1041` – Exfiltration Over C2 Channel
`T1071.001` – Application Layer Protocol | | 16 | 清除 Windows 事件日志 | `T1070.001` – Indicator Removal on Host: Clear Windows Event Logs | | 17 | 创建后门本地账户 | `T1136.001` – Create Account: Local Account | | 18 | 执行脚本以自动化攻击链 | `T1059.001` – Command and Scripting Interpreter: PowerShell | | 19 | 使用远程访问工具移动到另一台主机 | `T1021.001` – Remote Services: Remote Desktop Protocol | | 20 | 使用原生远程访问工具进行横向扩散 | `T1021` – Remote Services | ## 结论 此次威胁狩猎揭示了一次结构化的多阶段入侵,该入侵严重依赖 **living-off-the-land 技术**、隐蔽的持久化机制、系统侦察和分阶段的数据渗出。攻击者利用合法的远程访问点,将恶意活动与正常的 Windows 进程混合,并创建欺骗性工件以掩盖意图。 每个 flag 代表入侵的一个不同阶段,展示了清晰的进展: 1. 通过受损凭据或暴露的服务进行 **初始访问** 2. **侦察** 以确定用户环境、系统配置和网络姿态 3. **防御规避**,包括 AV 排除项和受信任系统二进制文件的使用 4. **持久化**,通过计划任务和注册表 Run 键 5. **数据暂存和渗出测试**,准备出站传输通道 6. **掩盖踪迹**,通过植入叙事性工件来误导调查 这次狩猎展示了即使轻量级的攻击者活动也会在 Windows 遥测数据中留下可检测的足迹。通过关联微小的异常——意外的文件创建、计划任务工件、异常连接和欺骗性文件——完整的攻击链变得可见。 ## 经验教训 **1. 即使是简单的攻击者技术也会留下多遥测足迹。** 操作者主要使用内置的 Windows 工具(`PowerShell`、`explorer.exe`、`schtasks.exe`)。尽管隐蔽性低,攻击链仍然可以通过相关的时间戳、目录活动、注册表工件和进程执行日志进行追踪。 **2. 持久化通常具有冗余性。** 攻击者很少依赖单一的持久化渠道。计划任务 supplemented by 备用的 Run 键——展示了典型的现实世界行为。 **3. 暂存和渗出准备发生在实际渗出之前。** 早期的出站连接检查、DNS 查找和端口验证发生在实际渗出尝试之前。这些预检查提供了强有力的早期预警信号。 **4. 叙事性工件在内部人员或 MFA 绕过场景中很常见。** 丢弃误导性文件反映了为异常活动辩解的企图。分析人员应关联意图、时间和周围操作——而不是文本本身。 **5. 端点可见性至关重要。** 此次狩猎强调了以下内容的重要性: - 文件创建遥测 - PowerShell 日志记录 - 注册表修改 - 计划任务记录 - Defender 配置更改 如果没有这些数据源,识别攻击者的序列将会困难得多。 ## 修复建议 ### 1. 强化远程访问 - 对所有远程访问工具(RDP、VPN、远程协助)强制执行 MFA - 将入站 RDP 限制为仅限 VPN 网络 - 在端点上禁用不必要的远程访问服务 - 监控所有成功的 RDP 登录是否有异常(不可能的旅行、时间偏差) ### 2. 加强凭据保护 - 轮换入侵期间观察到的任何账户的凭据 - 强制执行强密码长度和轮换策略 - 部署本地管理员密码随机化 (LAPS / LAPS NG) - 在不必要的情况下减少用户权限 ### 3. 增加日志覆盖范围 - 启用 PowerShell 模块、脚本块和转录日志 - 启用 Microsoft Defender 篡改保护,防止非管理员编辑策略 - 确保 Defender AV 排除事件受到监控(高严重性指标) - 对以下情况发出警报: - 计划任务创建/修改 - Run 键注册表添加 - 敏感目录中的归档创建 ### 4. 阻止 Living-off-the-Land Binary (LOLBin) 滥用 限制或监控以下二进制文件: | 二进制文件 | 风险 | |---|---| | `certutil.exe` | 文件下载滥用 | | `powershell.exe` / `pwsh.exe` | 脚本执行 | | `bitsadmin.exe` | 后台传输滥用 | | `rundll32.exe` | DLL 执行代理 | | `wscript.exe` / `cscript.exe` | 脚本宿主滥用 | 应用 WDAC / AppLocker 以控制脚本执行路径。 ### 5. 监控数据暂存和渗出指标 - 当大型归档文件(`*.zip`、`*.7z`、`*.rar`)出现在临时或用户配置文件目录中时发出警报 - 监控到未知 IP/域的异常出站 HTTP/S 连接 - 标记对新注册或未分类域的 DNS 查找 ### 6. 改进行为检测与威胁狩猎 为以下情况实施检测用例: - 管理通道之外的计划任务创建 - AV 排除项修改 - 注册表 Run 键持久化 - 异常的 `explorer.exe` 发起的文件访问 - 非 IT 用户的大量 PowerShell 执行 - 首次到新目标的出站连接 ### 7. 事件响应强化 - 为凭据重置、横向移动遏制和持久化移除制定剧本 - 进行模拟此确切入侵模式的例行桌面推演 - 应用持续的威胁狩猎周期,而不是被动调查
# 目录
- [威胁狩猎:"Port of Entry"](#threat-hunt-port-of-entry)
- [平台与工具](#platforms-and-tools)
- [发现总结(Flags)](#summary-of-findings-flags)
- [Flag 1:初始访问 - 远程访问源](#flag-1--initial-access-remote-access-source)
- [Flag 2:初始访问 - 被入侵的用户账户](#flag-2--initial-access-compromised-user-account)
- [Flag 3:发现 - 网络侦察](#flag-3--discovery-network-reconnaissance)
- [Flag 4:防御规避 - 恶意软件暂存目录](#flag-4--defense-evasion-malware-staging-directory)
- [Flag 5:防御规避 - 文件扩展名排除项](#flag-5--defense-evasion-file-extension-exclusions)
- [Flag 6:防御规避 - 临时文件夹排除项](#flag-6--defense-evasion-temporary-folder-exclusion)
- [Flag 7:防御规避 - 下载实用程序滥用](#flag-7--defense-evasion-download-utility-abuse)
- [Flag 8:持久化 - 计划任务名称](#flag-8--persistence-scheduled-task-name)
- [Flag 9:持久化 - 计划任务目标](#flag-9--persistence-scheduled-task-target)
- [Flag 10:命令与控制 - C2 服务器地址](#flag-10--command--control-c2-server-address)
- [Flag 11:命令与控制 - C2 通信端口](#flag-11--command--control-c2-communication-port)
- [Flag 12:凭据访问 - 凭据窃取工具](#flag-12--credential-access-credential-theft-tool)
- [Flag 13:凭据访问 - 内存提取模块](#flag-13--credential-access-memory-extraction-module)
- [Flag 14:收集 - 数据暂存归档](#flag-14--collection-data-staging-archive)
- [Flag 15:渗出 - 渗出通道](#flag-15--exfiltration-exfiltration-channel)
- [Flag 16:反取证 - 日志篡改](#flag-16--anti-forensics-log-tampering)
- [Flag 17:影响 - 持久化账户](#flag-17--impact-persistence-account)
- [Flag 18:执行 - 恶意脚本](#flag-18--execution-malicious-script)
- [Flag 19:横向移动 - 次要目标](#flag-19--lateral-movement-secondary-target)
- [Flag 20:横向移动 - 远程访问工具](#flag-20--lateral-movement-remote-access-tool)
- [MITRE ATT&CK 技术映射](#mitre-attck-technique-mapping)
- [结论](#conclusion)
- [经验教训](#lessons-learned)
- [修复建议](#recommendations-for-remediation)
# 威胁狩猎:"Port of Entry"
## 场景
**事件简报 — Azuki Import/Export **
竞争对手以精确 3% 的差价抢占了我们 6 年的航运合同。我们的供应商合同和定价数据出现在地下论坛上。
| 字段 | 详情 |
|---|---|
| **公司** | Azuki Import/Export Trading Co. — 23 名员工,日本/东南亚航运物流 |
| **被入侵系统** | `AZUKI-SL`(IT 管理员工作站) |
| **可用证据** | Microsoft Defender for Endpoint 日志 |
**日志查询范围:**
```
DeviceProcessEvents
| where DeviceName == "azuki-sl"
| where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20))
```
本报告包括:
- 对设备 `azuki-sl` 上的审计、侦察和 attempted exfiltration of data 的时间线重建
- 使用 Microsoft Defender Advanced Hunting (KQL) 的详细查询
- MITRE ATT&CK 映射以了解 TTP 对齐情况
- 基于证据的摘要,支持发现的每个 flag 和行为
## 平台与工具
**分析环境:**
- Microsoft Defender for Endpoint
- Log Analytics Workspace
- Azure
**使用的技术:**
- Kusto Query Language (KQL)
- 端点日志的行为分析(`DeviceLogonEvents`、`DeviceProcessEvents`、`DeviceNetworkEvents`、`DeviceRegistryEvents`)
## 发现总结(Flags)
| Flag | 目标 | 发现 | 时间戳 |
|---|---|---|---|
| 1 | 识别 RDP 连接的源 IP 地址 | `88.97.178.12` 是访问受损账户的 IP 地址 | `2025-11-19T18:36:18.503997Z` |
| 2 | 识别用于初始访问的被入侵用户账户 | 账户 `kenji.sato` 已被入侵 | `2025-11-19T00:57:18Z` |
| 3 | 识别用于枚举网络邻居的命令和参数 | 执行了 `ARP.EXE -a` 进行枚举 | `2025-11-19T19:04:01Z` |
| 4 | 识别存储恶意软件的主要暂存目录 | 发现 `C:\ProgramData\WindowsCache` 是主要暂存目录 | `2025-11-19T19:05:33Z` |
| 5 | 多少个文件扩展名被排除在 Windows Defender 扫描之外? | 排除了 3 个文件扩展名 | `2025-11-19T18:49:27Z` |
| 6 | 哪个临时文件夹路径被排除在 Windows Defender 扫描之外? | `C:\Users\KENJI~1.SAT\AppData\Local\Temp` 被排除 | `2025-11-19T18:49:27Z` |
| 7 | 识别攻击者滥用以下载文件的 Windows 原生二进制文件 | `certutil.exe` 被用于下载恶意软件 | `2025-11-19T19:06:58Z` |
| 8 | 识别为持久化而创建的计划任务名称 | 发现 `Windows Update Check` 是伪装的计划任务 | `2025-11-19T19:07:46Z` |
| 9 | 识别计划任务中配置的可执行路径 | `C:\ProgramData\WindowsCache\svchost.exe` | `2025-11-19T19:07:46Z` |
| 10 | 识别命令和控制服务器的 IP 地址 | 发现 `78.141.196.6` 是 C2 服务器 | `2025-11-19T18:37:26Z` |
| 11 | 识别用于 C2 通信的目标端口 | 端口 `443` 是使用的目标端口 | `2025-11-19T19:11:04Z` |
| 12 | 识别凭据转储工具的文件名 | `mm.exe` 被识别为凭据转储工具 | `2025-11-19T19:07:22Z` |
| 13 | 识别用于从内存中提取登录密码的模块 | 使用了 `sekurlsa::logonpasswords` 模块 | `2025-11-19T19:08:26Z` |
| 14 | 识别用于数据渗出的压缩归档文件名 | 创建了 `export-data.zip` 用于数据渗出 | `2025-11-19T19:08:58Z` |
| 15 | 识别用于渗出被盗数据的云服务 | 使用 Discord 渗出数据 | `2025-11-19T19:09:21Z` |
| 16 | 识别攻击者清除的第一个 Windows 事件日志 | `Security` 是第一个被清除的事件日志 | `2025-11-19T19:11:39Z` |
| 17 | 识别攻击者创建的后门账户用户名 | `support` 是创建的账户名称 | `2025-11-19T19:09:53Z` |
| 18 | 识别用于自动化攻击链的 PowerShell 脚本文件 | `wupdate.ps1` 是自动化脚本 | `2025-11-19T18:49:48Z` |
| 19 | 横向移动的目标 IP 地址是什么? | `10.1.0.188` | `2025-11-19T19:10:42Z` |
| 20 | 识别用于横向移动的远程访问工具 | `mstsc.exe` 被识别为 RAT | `2025-11-19T19:10:41Z` |
## Flag 详情
### Flag 1 — INITIAL ACCESS:远程访问源
**目标:** 识别 Remote Desktop Protocol 连接的源 IP 地址。
**Flag 值:** `88.97.178.12` — `2025-11-19T18:36:18.503997Z`
**检测策略:** 查询事件时间范围内来自外部源的交互式会话的登录事件。使用 `DeviceLogonEvents` 并按 `DeviceName` 和指示远程访问的 `ActionType` 值进行过滤。
**KQL 查询:**
```
//Public Remote IP that successfully logged on to "azuki-si"
DeviceLogonEvents
| where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20))
| where DeviceName == "azuki-sl"
| where isnotempty(RemoteIP) and RemoteIPType == "Public"
| where ActionType == "LogonSuccess"
| project TimeGenerated, AccountName, DeviceName, ActionType, RemoteIP, RemoteIPType
```
**证据**
### Flag 2 — INITIAL ACCESS:被入侵的用户账户 **目标:** 识别用于初始访问的被入侵用户账户。 **Flag 值:** `kenji.sato` — `2025-11-19T00:57:18Z` **检测策略:** `RemoteIP` 被显示通过 RDP 访问了被入侵的账户。 ``` DeviceLogonEvents | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where LogonType == "RemoteInteractive" | project Timestamp, AccountName, RemoteIP, AdditionalFields | sort by AccountName ``` ### Flag 3 — DISCOVERY:网络侦察 **目标:** 识别用于枚举网络邻居的命令和参数。 **Flag 值:** `ARP.EXE -a` — `2025-11-19T19:04:01Z` **检测策略:** 寻找揭示本地网络设备和硬件地址的命令。检查 `DeviceProcessEvents` 中初始访问后执行的网络枚举实用程序。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("whoami", "hostname", "systeminfo", "ipconfig", "ipconfig /all", "net user", "net localgroup", "query user", "quser", "qwinsta", "wmic", "Get-ComputerInfo", "Get-CimInstance", "Get-WmiObject", "Get-NetIPConfiguration", "Get-NetAdapter", "Get-NetIPAddress", "Get-Process", "tasklist", "netstat -ano", "reg query", "Get-Service", "Get-LocalUser", "Get-ChildItem Env:") or FileName in~ ("netsh.exe", "ipconfig.exe", "systeminfo.exe", "whoami.exe", "dsquery.exe", "dsget.exe", "nltest.exe", "nbtstat.exe", "arp.exe", "tracert.exe", "quser.exe", "qwinsta.exe") | project Timestamp, DeviceName, FileName, ProcessCommandLine, InitiatingProcessFileName, AccountName | order by Timestamp asc ``` ### Flag 4 — DEFENSE EVASION:恶意软件暂存目录 **目标:** 找到存储恶意软件的主要暂存目录。 **Flag 值:** `C:\ProgramData\WindowsCache` — `2025-11-19T19:05:33Z` **检测策略:** 搜索系统文件夹中随后被隐藏的新创建目录。寻找 `mkdir` 或 `New-Item` 命令,随后是修改文件夹属性的 `attrib` 命令。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("mkdir", "New-Item", "attrib") | project Timestamp, DeviceName, InitiatingProcessAccountName, FolderCreated=ProcessCommandLine, InitiatingProcessFolderPath | order by Timestamp asc ``` ### Flag 5 — DEFENSE EVASION:文件扩展名排除项 **目标:** 查找有多少文件扩展名被排除在 Windows Defender 扫描之外。 **Flag 值:** `3` — `2025-11-19T18:49:27Z` **检测策略:** 搜索 `DeviceRegistryEvents` 中对 Windows Defender 排除设置的注册表修改。计算添加到 `Exclusions\Extensions` 注册表键的唯一文件扩展名数量。 ``` DeviceRegistryEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ActionType == "RegistryValueSet" | where RegistryKey startswith "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Defender\\Exclusions\\Extensions" | project Timestamp, DeviceName, RegistryKey, RegistryValueData, RegistryValueName ``` ### Flag 6 — DEFENSE EVASION:临时文件夹排除项 **目标:** 哪个临时文件夹路径被排除在 Windows Defender 扫描之外? **Flag 值:** `C:\Users\KENJI~1.SAT\AppData\Local\Temp` — `2025-11-19T18:49:27Z` **检测 Strategy:** 搜索 `DeviceRegistryEvents` 中添加到 Windows Defender 配置的文件夹路径排除项。关注 `RegistryValueName` 字段中的临时文件夹路径。 ``` DeviceRegistryEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ActionType == "RegistryValueSet" | where RegistryKey startswith "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Defender\\Exclusions\\Paths" | project Timestamp, DeviceName, RegistryKey, RegistryValueData, RegistryValueName, InitiatingProcessFolderPath, InitiatingProcessFileName ``` ### Flag 7 — DEFENSE EVASION:下载实用程序滥用 **目标:** 识别攻击者滥用以下载文件的 Windows 原生二进制文件。 **Flag 值:** `certutil.exe` — `2025-11-19T19:06:58Z` **检测策略:** 寻找具有网络下载功能的内置 Windows 工具。在 `DeviceProcessEvents` 中搜索命令行包含 URL 和输出文件路径的进程。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("http://", "https://") | project Timestamp, DeviceName, InitiatingProcessAccountName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ### Flag 8 — PERSISTENCE:计划任务名称 **目标:** 识别为持久化而创建的计划任务名称。 **Flag 值:** `Windows Update Check` — `2025-11-19T19:07:46Z` **检测策略:** 搜索计划任务创建命令。在 `DeviceProcessEvents` 中查找带有 `/create` 参数的 `schtasks.exe`。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("create", "task") | project Timestamp, DeviceName, InitiatingProcessAccountName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ### Flag 9 — PERSISTENCE:计划任务目标 **目标:** 识别计划任务中配置的可执行路径。 **Flag 值:** `C:\ProgramData\WindowsCache\svchost.exe` — `2025-11-19T19:07:46Z` **检测策略:** 从计划任务创建命令行中提取任务操作。在 `schtasks` 命令中查找 `/tr` 参数值。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("create", "task") | project Timestamp, DeviceName, InitiatingProcessAccountName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ### Flag 10 — COMMAND & CONTROL:C2 服务器地址 **目标:** 识别命令和控制服务器的 IP 地址。 **Flag 值:** `78.141.196.6` — `2025-11-19T18:37:26Z` **检测策略:** 分析可疑可执行文件下载后不久发起的网络连接。使用 `DeviceNetworkEvents` 查找到外部 IP 地址的出站连接。 ``` DeviceNetworkEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where RemoteIPType == "Public" | where InitiatingProcessFileName !in~ ("chrome.exe", "msedge.exe", "firefox.exe", "teams.exe", "outlook.exe") | project Timestamp, LocalIP, RemoteIP, RemotePort, Protocol, ActionType, InitiatingProcessAccountName, InitiatingProcessCommandLine, InitiatingProcessRemoteSessionDeviceName | order by Timestamp asc ``` ### Flag 11 — COMMAND & CONTROL:C2 通信端口 **目标:** 识别用于命令和控制通信的目标端口。 **Flag 值:** `443` — `2025-11-19T19:11:04Z` **检测策略:** 检查来自恶意可执行文件的出站连接的目标端口。检查 `DeviceNetworkEvents` 中与 C2 流量关联的 `RemotePort` 字段。 ``` DeviceNetworkEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where RemoteIP == "78.141.196.6" | project Timestamp, LocalIP, RemoteIP, RemotePort, Protocol, ActionType, InitiatingProcessAccountName, InitiatingProcessCommandLine, InitiatingProcessRemoteSessionDeviceName | order by Timestamp asc ``` ### Flag 12 — CREDENTIAL ACCESS:凭据窃取工具 **目标:** 识别凭据转储的文件名。 **Flag 值:** `mm.exe` — `2025-11-19T19:07:22Z` **检测策略:** 寻找下载到暂存目录的具有短文件名的可执行文件。搜索在 LSASS 内存访问事件之前不久创建的文件。 ``` DeviceFileEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where FileName endswith ".exe" | project Timestamp, DeviceName, FileName, ActionType, InitiatingProcessFileName, FolderPath | order by Timestamp desc ``` ### Flag 13 — CREDENTIAL ACCESS:内存提取模块 **目标:** 识别用于从内存中提取登录密码的模块。 **Flag 值:** `sekurlsa::logonpasswords` — `2025-11-19T19:08:26Z` **检测策略:** 检查传递给凭据转储工具的命令行参数。在进程命令行或输出重定向中寻找 `module::command` 语法。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("cls", "exit") | project Timestamp, DeviceName, InitiatingProcessAccountName, FileName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ### Flag 14 — COLLECTION:数据暂存归档 **目标:** 识别用于数据渗出的压缩归档文件名。 **Flag 值:** `export-data.zip` — `2025-11-19T19:08:58Z` **检测策略:** 在收集阶段搜索暂存目录中 ZIP 文件的创建。寻找 `Compress-Archive` 命令或检查渗出活动之前创建的文件。 ``` DeviceFileEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where FileName endswith ".zip" | project Timestamp, DeviceName, FileName, ActionType, InitiatingProcessFileName, FolderPath | order by Timestamp desc ``` ### Flag 15 — EXFILTRATION:渗出通道 **目标:** 识别用于渗出被盗数据的云服务。 **Flag 值:** `Discord` — `2025-11-19T19:09:21Z` **检测策略:** 分析渗出阶段的出站 HTTPS 连接和文件上传操作。检查 `DeviceNetworkEvents` 中与常见文件共享或通信平台的连接。 ``` DeviceNetworkEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where InitiatingProcessCommandLine has_any ("https") | project Timestamp, LocalIP, RemoteIP, RemotePort, Protocol, ActionType, InitiatingProcessAccountName, InitiatingProcessCommandLine, InitiatingProcessRemoteSessionDeviceName, AdditionalFields | order by Timestamp asc ``` ### Flag 16 — ANTI-FORENSICS:日志篡改 **目标:** 识别攻击者清除的第一个 Windows 事件日志。 **Flag 值:** `Security` — `2025-11-19T19:11:39Z` **检测策略:** 在攻击时间线接近尾声时搜索事件日志清除命令。寻找 `wevtutil.exe` 执行并确定首先清除了哪个日志。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where FileName =~ "wevtutil.exe" | project Timestamp, DeviceName, InitiatingProcessAccountName, FileName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ### Flag 17 — IMPACT:持久化账户 **目标:** 识别攻击者创建的后门账户用户名。 **Flag 值:** `support` — `2025-11-19T19:09:53Z` **检测策略:** 在影响阶段搜索账户创建命令。寻找带有 `/add` 参数的命令,随后是管理员组添加。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine has_any ("net user", "/add", "useradd", "username") | project Timestamp, DeviceName, InitiatingProcessAccountName, FileName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ### Flag 18 — EXECUTION:恶意脚本 **目标:** 识别用于自动化攻击链的 PowerShell 脚本文件。 **Flag 值:** `wupdate.ps1` — `2025-11-19T18:49:48Z` **检测策略:** 在初始入侵阶段搜索 `DeviceFileEvents` 中在临时目录创建的脚本文件。寻找初始访问后不久从外部源下载的 PowerShell 或批处理脚本文件。 ``` DeviceFileEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where FileName endswith ".ps1" or FileName endswith ".bat" | project Timestamp, DeviceName, FileName, ActionType, InitiatingProcessFileName, FolderPath | order by Timestamp desc ``` ### Flag 19 — LATERAL MOVEMENT:次要目标 **目标:** 横向移动的目标 IP 地址是什么? **Flag 值:** `10.1.0.188` — `2025-11-19T19:10:42Z` **检测策略:** 检查横向移动期间远程访问命令中指定的目标系统。寻找攻击时间线接近尾声时与 `cmdkey` 或 `mstsc` 命令一起使用的 IP 地址。 ``` DeviceNetworkEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where InitiatingProcessCommandLine has_any ("cmdkey", "mstsc") | project Timestamp, LocalIP, RemoteIP, RemotePort, Protocol, ActionType, InitiatingProcessAccountName, InitiatingProcessCommandLine, InitiatingProcessRemoteSessionDeviceName, AdditionalFields | order by Timestamp asc ``` ### Flag 20 — LATERAL MOVEMENT:远程访问工具 **目标:** 识别用于横向移动的远程访问工具。 **Flag 值:** `mstsc.exe` — `2025-11-19T19:10:41Z` **检测策略:** 搜索攻击时间线接近尾声时执行的远程桌面连接实用程序。寻找以远程系统名称或 IP 地址作为参数启动的进程。 ``` DeviceProcessEvents | where DeviceName == "azuki-sl" | where Timestamp between (datetime(2025-11-19) .. datetime(2025-11-20)) | where ProcessCommandLine matches regex @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" | project Timestamp, DeviceName, InitiatingProcessAccountName, FileName, ProcessCommandLine, InitiatingProcessFolderPath, AdditionalFields, InitiatingProcessCommandLine | order by Timestamp asc ``` ## MITRE ATT&CK 技术映射 | Flag | 描述 | MITRE ATT&CK 技术 | |---|---|---| | 1 | 远程桌面 / 外部连接作为入口点 | `T1078.004` – Valid Accounts: Remote Desktop Protocol
`T1190` – Exploit Public-Facing Application | | 2 | 被入侵的凭据用于访问主机 | `T1078` – Valid Accounts | | 3 | 枚举网络邻居、IP、ARP 表、拓扑 | `T1016` – System Network Configuration Discovery
`T1087.002` – Account Discovery: Domain/Local Accounts | | 4 | 为 Payload 创建隐藏或不寻常的暂存目录 | `T1221` – Template Injection
`T1564.001` – Hide Artifacts: Hidden Files and Directories | | 5 | 从杀毒软件扫描中排除某些扩展名 | `T1562.004` – Impair Defenses: Disable or Modify Tools | | 6 | 从扫描中排除 Temp 文件夹 | `T1562.004` – Impair Defenses | | 7 | 使用原生 Windows 实用程序下载 Payload | `T1218` – System Binary Proxy Execution
`T1105` – Ingress Tool Transfer | | 8 | 创建计划任务以维持持久化 | `T1053.005` – Scheduled Task / Job | | 9 | 配置计划任务以运行攻击者 Payload | `T1053.005` – Scheduled Task / Job | | 10 | 到攻击者控制的 C2 服务器的出站连接 | `T1071.001` – Application Layer Protocol: Web Protocol
`T1043` – Commonly Used Port | | 11 | 使用端口 443 进行 C2 通信 | `T1043` – Commonly Used Port | | 12 | 使用凭据转储工具 | `T1003` – OS Credential Dumping | | 13 | 使用基于内存的提取模块 | `T1003.001` – OS Credential Dumping: LSASS Memory | | 14 | 归档数据 (zip) 以进行渗出 | `T1560.001` – Archive Collected Data: Zip | | 15 | 到外部主机的出站数据移动 | `T1041` – Exfiltration Over C2 Channel
`T1071.001` – Application Layer Protocol | | 16 | 清除 Windows 事件日志 | `T1070.001` – Indicator Removal on Host: Clear Windows Event Logs | | 17 | 创建后门本地账户 | `T1136.001` – Create Account: Local Account | | 18 | 执行脚本以自动化攻击链 | `T1059.001` – Command and Scripting Interpreter: PowerShell | | 19 | 使用远程访问工具移动到另一台主机 | `T1021.001` – Remote Services: Remote Desktop Protocol | | 20 | 使用原生远程访问工具进行横向扩散 | `T1021` – Remote Services | ## 结论 此次威胁狩猎揭示了一次结构化的多阶段入侵,该入侵严重依赖 **living-off-the-land 技术**、隐蔽的持久化机制、系统侦察和分阶段的数据渗出。攻击者利用合法的远程访问点,将恶意活动与正常的 Windows 进程混合,并创建欺骗性工件以掩盖意图。 每个 flag 代表入侵的一个不同阶段,展示了清晰的进展: 1. 通过受损凭据或暴露的服务进行 **初始访问** 2. **侦察** 以确定用户环境、系统配置和网络姿态 3. **防御规避**,包括 AV 排除项和受信任系统二进制文件的使用 4. **持久化**,通过计划任务和注册表 Run 键 5. **数据暂存和渗出测试**,准备出站传输通道 6. **掩盖踪迹**,通过植入叙事性工件来误导调查 这次狩猎展示了即使轻量级的攻击者活动也会在 Windows 遥测数据中留下可检测的足迹。通过关联微小的异常——意外的文件创建、计划任务工件、异常连接和欺骗性文件——完整的攻击链变得可见。 ## 经验教训 **1. 即使是简单的攻击者技术也会留下多遥测足迹。** 操作者主要使用内置的 Windows 工具(`PowerShell`、`explorer.exe`、`schtasks.exe`)。尽管隐蔽性低,攻击链仍然可以通过相关的时间戳、目录活动、注册表工件和进程执行日志进行追踪。 **2. 持久化通常具有冗余性。** 攻击者很少依赖单一的持久化渠道。计划任务 supplemented by 备用的 Run 键——展示了典型的现实世界行为。 **3. 暂存和渗出准备发生在实际渗出之前。** 早期的出站连接检查、DNS 查找和端口验证发生在实际渗出尝试之前。这些预检查提供了强有力的早期预警信号。 **4. 叙事性工件在内部人员或 MFA 绕过场景中很常见。** 丢弃误导性文件反映了为异常活动辩解的企图。分析人员应关联意图、时间和周围操作——而不是文本本身。 **5. 端点可见性至关重要。** 此次狩猎强调了以下内容的重要性: - 文件创建遥测 - PowerShell 日志记录 - 注册表修改 - 计划任务记录 - Defender 配置更改 如果没有这些数据源,识别攻击者的序列将会困难得多。 ## 修复建议 ### 1. 强化远程访问 - 对所有远程访问工具(RDP、VPN、远程协助)强制执行 MFA - 将入站 RDP 限制为仅限 VPN 网络 - 在端点上禁用不必要的远程访问服务 - 监控所有成功的 RDP 登录是否有异常(不可能的旅行、时间偏差) ### 2. 加强凭据保护 - 轮换入侵期间观察到的任何账户的凭据 - 强制执行强密码长度和轮换策略 - 部署本地管理员密码随机化 (LAPS / LAPS NG) - 在不必要的情况下减少用户权限 ### 3. 增加日志覆盖范围 - 启用 PowerShell 模块、脚本块和转录日志 - 启用 Microsoft Defender 篡改保护,防止非管理员编辑策略 - 确保 Defender AV 排除事件受到监控(高严重性指标) - 对以下情况发出警报: - 计划任务创建/修改 - Run 键注册表添加 - 敏感目录中的归档创建 ### 4. 阻止 Living-off-the-Land Binary (LOLBin) 滥用 限制或监控以下二进制文件: | 二进制文件 | 风险 | |---|---| | `certutil.exe` | 文件下载滥用 | | `powershell.exe` / `pwsh.exe` | 脚本执行 | | `bitsadmin.exe` | 后台传输滥用 | | `rundll32.exe` | DLL 执行代理 | | `wscript.exe` / `cscript.exe` | 脚本宿主滥用 | 应用 WDAC / AppLocker 以控制脚本执行路径。 ### 5. 监控数据暂存和渗出指标 - 当大型归档文件(`*.zip`、`*.7z`、`*.rar`)出现在临时或用户配置文件目录中时发出警报 - 监控到未知 IP/域的异常出站 HTTP/S 连接 - 标记对新注册或未分类域的 DNS 查找 ### 6. 改进行为检测与威胁狩猎 为以下情况实施检测用例: - 管理通道之外的计划任务创建 - AV 排除项修改 - 注册表 Run 键持久化 - 异常的 `explorer.exe` 发起的文件访问 - 非 IT 用户的大量 PowerShell 执行 - 首次到新目标的出站连接 ### 7. 事件响应强化 - 为凭据重置、横向移动遏制和持久化移除制定剧本 - 进行模拟此确切入侵模式的例行桌面推演 - 应用持续的威胁狩猎周期,而不是被动调查
标签:asyncio, ATT&CK 框架, DAST, EDR, IP 地址批量处理, PE 加载器, RFI远程文件包含, Sysmon, Windows 安全, 初始访问, 反取证, 命令控制, 嗅探欺骗, 威胁情报, 子域名变形, 安全报告, 安全评估, 开发者工具, 恶意软件分析, 插件系统, 数字取证, 数据渗出, 数据采集, 权限维持, 私有化部署, 端口入侵, 网络信息收集, 网络攻防, 脆弱性评估, 自动化脚本, 防御规避, 项目化管理