GL1T0H/Red2Blue
GitHub: GL1T0H/Red2Blue
一个手把手教你搭建家庭 SOC 实验室的教程项目,通过模拟真实攻击场景并使用 Splunk 进行日志分析和检测,帮助学习者掌握红队攻击技术与蓝队检测工程的实战技能。
Stars: 1 | Forks: 0
我有六位忠实的仆人,他们教会了我所知道的一切,他们的名字是“What(什么)、Why(为什么)、When(何时)、Where(何地)、Who(谁)和 How(如何)” Rudyard Kipling
本项目目前正处于积极开发中 🚧
# 介绍 本文档提供了从零开始构建 SOC 实验室的详细分步指南——从设置基础设施,到设计和运行攻击场景,最后学习如何使用 Splunk 等工具检测和分析它们。 ## 目录 - [介绍](#introduction) - [目录](#table-of-contents) - [项目概述](#project-overview) - [什么是 Red2Blue?](#what-is-red2blue) - [你将学到什么](#what-you-will-learn) - [实验室架构](#lab-architecture) - [实验室要求](#lab-requirements) - [基础设施](#infrastructure) - [基础设施图表(架构模式)](#infrastructure-diagram-architecture-schema) - [SIEM 服务器(Windows 10 主机)](#siem-server-windows-10-host) - [Splunk Enterprise 设置与安装](#splunk-enterprise-setup--installation) - [Splunk 初始配置](#initial-splunk-configuration) - [插件与应用配置](#add-ons--apps-configuration) - [端点(Windows 10 VM)](#endpoint-windows-10-vm) - [在 VMware 上设置 Windows 10](#setting-up-windows-10-on-vmware) - [Sysmon 安装与配置](#sysmon-installation--configuration) - [Splunk Universal Forwarder 设置与安装](#splunk-universal-forwarder-setup--installation) - [Splunk Universal Forwarder 配置](#splunk-universal-forwarder-configuration) - [测试与日志验证](#testing--log-verification) <---- - [用例](#Use-Cases) - [用例 1:基础信标(脚本小子)](#Use-Case-1:-The-Basic-Beacon-(Script-Kiddie)) - [概述](#overview) - [攻击流程](#attack-flow) - [MITRE ATT&CK 映射](#mitre-attck-mapping) - [环境与恶意软件设置](#Environment-&-Malware-Setup) - [恶意软件源代码 (C++)](#Malware-Source-Code-(C++)) - [在 Kali Linux 上设置 C2 服务器 (Python)](#Set-Up-the-C2-Server-on-Kali-Linux-(Python)) - [检测与分析](#detection--analysis) - [背景概念](#context-concepts) - [告警与检测](#alerts-and-detection) - [用例 1:基础信标(脚本小子)](#The-Basic-Beacon-(Script-Kiddie)) - [用例 2:通过恶意 Word 附件进行网络钓鱼](###Use-Case-2:-Phishing-via-Malicious-Word-Attachment) # 项目概述 ## 什么是 Red2Blue? **Red2Blue** 是一个家庭 SOC 实验室,旨在演示常见的攻击技术如何生成日志和遥测数据,以及防御者如何使用 **Splunk** 检测、调查和响应这些攻击。 该项目弥合了 **红队攻击模拟** 和 **蓝队检测工程** 之间的差距,重点关注攻击者的行为而非工具。 ## 你将学到什么 通过完成本实验室,你将学到如何: - 使用 Splunk 在家构建完整的 SOC 实验室 - 在受控环境中模拟真实的攻击场景 - 分析攻击者生成的遥测数据 - 编写有效的基于 SPL 的检测规则 - 像 SOC 分析师和检测工程师一样思考 ## 实验室架构 在我们深入技术步骤之前,先快速了解一下架构: - Windows 10 主机(SOC 分析师) - 运行 Splunk Enterprise - 充当 SIEM 服务器 - Windows 10 虚拟机(端点) - 运行 Splunk Universal Forwarder - 生成日志(Windows 事件 + Sysmon) - 通信 - 日志通过 TCP 端口(例如 9997)从 VM 发送到主机
## 实验室要求
### 硬件
- 至少 16 GB 内存(8 GB 也可以,但有限制)
- 100+ GB 可用磁盘空间
- CPU 支持并已启用虚拟化
## 主机操作系统
- Windows 10 或 11
## 虚拟化
- VMware Workstation(推荐)
- VirtualBox(替代方案)
## 软件
- Splunk Enterprise
- Splunk Universal Forwarder
- Windows 10 ISO
- Sysmon
- Splunk Enterprise 的一些插件
# 基础设施
## 基础设施图表(架构模式)
#### 该基础设施图表展示了一个简单的 SOC 实验室架构,其中 Windows 10 端点使用 Sysmon 和 Windows 事件日志生成安全遥测数据。这些遥测数据由 Splunk Universal Forwarder 收集,并通过 TCP 端口 9997 转发到集中的 Splunk Enterprise SIEM 服务器。SIEM 服务器对传入的日志进行索引、存储和分析,从而实现检测和告警用例。
## SIEM 服务器(Windows 10 主机)
### Splunk Enterprise 设置与安装
首先,在我们的 **Windows 10(主机)** 上访问 splunk.com,如果你还没有账户,请创建一个免费账户,并下载最新版本的 Splunk Enterprise
(
2. 在下一步中,我们将设置访问 Splunk Web GUI 所需的用户名和密码
3. 点击安装按钮,然后完成
此时,Splunk Enterprise 已安装,但尚未配置为接收日志。
### Splunk 初始配置
Splunk Enterprise 通过其 Web 界面进行管理,称为 Splunk Web。
1. 打开浏览器并访问:http://localhost:8000
2. 使用你在安装期间创建的凭据登录。
#### 配置接收端口
要允许从 Forwarder 接收日志:
1. 转到 -> Settings(设置) -> Forwarding and Receiving(转发和接收)
将端口 9997 设置为传入日志的监听端口。
#### 配置索引
在 Splunk 中,索引是存储位置,传入的数据在这里被组织和保存,以便进行搜索和分析。它们帮助 Splunk 快速检索并高效管理大量日志或事件数据。
我们将配置 4 个索引
- windows_system
- windows_security
- windows_application
- sysmon
我将演示如何操作一次,你可以对这 4 个索引执行相同的操作
1. 转到 -> Settings(设置) -> Indexes(索引)
2. 在索引窗口中点击 **New Index(新建索引)**
3. 在新窗口中输入索引名称(例如 sysmon),其他保持默认,然后点击 **Save(保存)**
对其余 3 个索引执行相同操作
#### 配置 Windows 防火墙
确保端口可访问:
1. 打开 Windows Defender 防火墙
点击入站规则 -> 新建规则 -> 端口,然后点击下一步
选择 TCP 和我们在 Splunk 中设置的端口 (9997)
下一步 -> “允许连接” -> 下一步 -> 下一步 -> 选择一个名称(如 "Splunk Port")并点击完成
### 插件与应用配置
Splunk Add-on 是一个软件包,允许 Splunk 从特定来源收集、解析和规范化数据。它扩展了 Splunk 的功能,而不会增加仪表板或可视化。
我们将使用 Microsoft Sysmon Add-on 和 Splunk Add-on for Microsoft Windows
让我们从 **Microsoft Sysmon Add-on** 开始,要安装它,请访问 https://splunkbase.splunk.com/app/5709
登录并点击下载
你会在下载文件夹中找到 .gtz 文件
现在回到 Splunk GUI,从主页点击 Apps 和 Manage Apps(管理应用)
在 Apps 窗口中点击 **Install App From File(从文件安装应用)**
拖放 .gtz 文件或直接选择它,然后点击 **Upload(上传)**
之后你需要像这样重启 Splunk `Splunk.exe restart`
重启后回到 **Apps** 窗口,搜索 sysmon,你会看到它
你可以对 **Splunk Add-on for Microsoft Windows** 执行相同操作
## 端点(Windows 10 VM)
### 在 VMware 上设置 Windows 10
在本节中,我们不会深入探讨 VMware 上的 Windows 10 安装过程。
为了保持文章简洁和专注,我们将跳过分步安装细节。
相反,你可以观看此视频教程:https://www.youtube.com/watch?v=C-avnck74gs。
如果你不熟悉在 VMware 上安装 Windows 10,该视频将指导你完成整个过程。
一旦 Windows 10 VM 正常安装并运行,我们将进入下一步。
### Sysmon 安装与配置
Sysmon (System Monitor) 是一个 Windows 系统服务,提供对端点上发生情况的详细可见性。
它帮助我们跟踪重要的活动,如进程创建、网络连接、文件创建和注册表更改。
简而言之,Sysmon 为我们提供了高质量的日志,这对于 Splunk 内部的检测和分析非常有用。
#### 下载 Sysmon
首先,在端点 (Win 10 VM) 上从官方 Microsoft Sysinternals 网站下载 Sysmon\
(
将 .ZIP 文件复制到 **C** 目录并解压文件
#### 下载 Sysmon 配置
默认情况下,Sysmon 不会记录太多内容,除非正确配置。
为了解决这个问题,我们将使用 **SwiftOnSecurity** 创建的流行 Sysmon 配置,
它在可见性和噪音之间提供了良好的平衡。
下载配置文件并将其保存在 C 分区 (C:\sysmon\) [SwiftOnSecurity](https://github.com/SwiftOnSecurity/sysmon-config/blob/master/sysmonconfig-export.xml)
之后,以**管理员身份打开命令提示符**,然后运行以下命令:`Sysmon64.exe -i sysmonconfig.xml`
此命令安装 Sysmon 并同时应用配置。
#### 验证与测试
要确认 Sysmon 正常工作:
- 从之前的 cmd 中输入:`calc.exe`
- 打开 **事件查看器**
- 导航到:应用程序和服务日志 → Microsoft → Windows → Sysmon → Operational。
现在检查是否正在生成事件(例如 **calc.exe** 的进程创建)
一旦 Sysmon 事件可见,我们就准备好继续并将这些日志转发到 Splunk。
### Splunk Universal Forwarder 设置与安装
#### 什么是 Splunk Universal Forwarder?
Splunk Universal Forwarder (UF) 是安装在端点上的轻量级代理,用于收集日志并将其转发到 Splunk 实例。
它本身不对数据进行索引或搜索。
它唯一的工作是从系统收集日志并将其安全地发送到 SIEM 服务器。
在我们的实验室中,Universal Forwarder 将安装在 Windows 10 VM 上,并转发到运行在主机上的 Splunk Enterprise:
- Windows 事件日志
- Sysmon 日志
#### 下载 Splunk Universal Forwarder
从官方 Splunk 网站下载 Splunk Universal Forwarder。(https://www.splunk.com/en_us/download/universal-forwarder.html)
下载后,将安装程序移动到 Windows 10 VM。
#### 设置与安装
以管理员身份运行 Universal Forwarder 安装程序。
- 接受许可协议
- 由于我们没有使用任何 SSL 证书,因此我们将跳过该步骤:
- 选择 **Local System** 作为服务账户
- 选择你需要发送到 Splunk EP 的内容
- 创建用户名和密码并记下来
- 输入你的 Splunk Enterprise 服务器的 IP 地址(Windows 10 主机)
安装完成后,Universal Forwarder 服务应自动启动。
尝试这个:`sc query SplunkForwarder` 你应该看到 STATE: 4 RUNNING。像这样
这是我机器的主机名,将在下一步用于确认日志成功接收:
现在,我们将验证 Splunk正在接收日志。转到 **Search(搜索)** 选项卡:
点击“Data Summary(数据摘要)”按钮后,将出现一个新的弹出窗口,我们将能够看到我们的 Windows 机器主机名,以及我们在安装过程中选择的源类型/日志类型:
好的,让我们进入配置部分
### Splunk Universal Forwarder 配置
在这个阶段,我们确切地定义要从端点收集哪些日志并转发到 Splunk Enterprise。
| 文件路径 | 用途 |
| ----------------------------------------------------- | --------------------------------------------------------------------- |
| `etc\apps\SplunkUniversalForwarder\local\inputs.conf` | 控制**如何从 Windows 收集日志** |
| `etc\system\local\inputs.conf` | 控制**日志存储位置以及它们在 Splunk 中的标记方式** |
#### 配置 C:\Program Files\SplunkUniversalForwarder\etc\system\local\inputs.conf
在 Windows 10 VM 上导航到以下目录:`C:\Program Files\SplunkUniversalForwarder\etc\system\local`。
如果 `inputs.conf` 文件不存在,请手动创建它。
此配置指定:
- Splunk 中显示的主机名
- 要收集哪些 Windows 日志
- 每种日志类型发送到哪个索引
- 应用哪个 sourcetype
创建文件后设置此配置
```
[default]
host = Endpoint-1
[WinEventLog://Security]
disabled = false
index = windows_security
[WinEventLog://System]
disabled = false
index = windows_system
[WinEventLog://Application]
disabled = false
index = windows_application
[WinEventLog://Microsoft-Windows-Sysmon/Operational]
disabled = false
index = sysmon
sourcetype = XmlWinEventLog:Microsoft-Windows-Sysmon/Operational
```
#### 配置 C:\Program Files\SplunkUniversalForwarder\etc\apps\SplunkUniversalForwarder\local\inputs.conf
在 Windows 10 VM 上导航到以下目录:`C:\Program Files\SplunkUniversalForwarder\etc\apps\SplunkUniversalForwarder\local\`。
如果 `inputs.conf` 文件不存在,请手动创建它。
此配置指定:
- 如何从 Windows 读取日志
- 从哪个时间点开始收集日志
- 收集行为(检查点、历史记录、实时)
设置此配置
```
[WinEventLog://Application]
checkpointInterval = 5
current_only = 0
disabled = 0
start_from = oldest
[WinEventLog://Security]
checkpointInterval = 5
current_only = 0
disabled = 0
start_from = oldest
[WinEventLog://System]
checkpointInterval = 5
current_only = 0
disabled = 0
start_from = oldest
[WinEventLog://Microsoft-Windows-Sysmon/Operational]
checkpointInterval = 5
current_only = 0
disabled = 0
start_from = oldest
```
保存文件后,重启 Splunk Universal Forwarder 服务以应用更改\
重启后,端点将根据此配置开始向 Splunk Enterprise 发送日志。
## 测试与日志验证
现在让我们验证日志是否正确生成、转发并在 Splunk 中建立索引
1. 确保 Splunk Universal Forwarder 服务正在运行 -> `sc query splunkforwarder`
2. 要确认日志收集,请在端点上生成一些测试事件:
3. 回到 Splunk,在搜索框中输入 `index=* host="Endpoint-1"`。
你会看到 sysmon 日志源生成了 3 条日志:
- 1 Dns Query
- 2 Process Create
# 用例
在本节中,我们将开始构建真实的攻击场景,以更好地了解攻击在真实环境中是如何发生的。
主要目标不是利用本身,而是学习攻击者如何思考和运作,即使是在基本层面上。
通过模拟这些场景,我们将在环境中生成真实的日志和事件。
这些日志将帮助我们了解攻击从防御视角看是什么样子的,它们如何在 SIEM 中呈现,以及我们如何检测、调查和确认此类活动是否发生在我们的环境中。
每个攻击场景稍后将映射到 MITRE ATT&CK,并用于构建检测用例和告警。
## 用例 1:基础信标(脚本小子)
### 场景概述
在这个场景中,我们模拟一个常见的入门级恶意软件感染。攻击者提供一个独立的可执行文件(`WindowsUpdate.exe`),一旦执行,它会确保在系统重启后存活,并与 Command and Control (C2) 服务器建立持久的通信通道,以渗出基本的主机信息。
### 攻击流程
1. **初始访问:** 用户手动执行恶意二进制文件。
2. **规避:** 恶意软件立即隐藏其控制台窗口,以在后台静默运行。
3. **持久化:** 恶意软件修改 Windows 注册表 `Run` 键,以确保每次用户登录时自动启动。
4. **发现:** 它查询操作系统以获取计算机名、当前用户名和操作系统版本。
5. **C2 与渗出:** 它每 30 秒启动一次周期性的“Beaconing”过程,通过 HTTP POST 请求将收集的数据发送到攻击者的服务器。
### MITRE ATT&CK 映射
| 阶段 | 动作 | MITRE ATT&CK ID | 工件 / 日志 |
| --- | --- | --- | --- |
| **初始执行** | 用户手动运行 `.exe`。 | **User Execution (T1204.002)** | Sysmon Event ID 1 (Process Creation) |
| **持久化** | 将二进制路径添加到 `HKCU\..\Run` 键。 | **Boot or Logon Autostart (T1547.001)** | Sysmon Event ID 13 (Registry Value Set) |
| **发现** | 收集主机名、用户名和操作系统信息。 | **System Information Discovery (T1082)** | API Monitoring / EDR Telemetry |
| **C2 通道** | 建立 HTTP 通信(端口 8080)。 | **Application Layer Protocol (T1071.001)** | Sysmon Event ID 3 (Network Connection) |
| **渗出** | 在 HTTP Body 中发送系统信息。 | **Exfiltration Over C2 Channel (T1041)** | Network Traffic / PCAP Analysis |
### 环境与恶意软件设置
#### 恶意软件源代码 (C++)
```
#include
#### C2 服务器设置
```
# 在 Attacker Machine 上将其保存为 C2.py
# 用法:python3 C2.py
import os
from http.server import BaseHTTPRequestHandler, HTTPServer
from datetime import datetime
LOG_FILE = "C2_Exfiltrated_Data.txt"
class MegaC2Handler(BaseHTTPRequestHandler):
def log_to_file(self, client_ip, data):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(LOG_FILE, "a", encoding="utf-8") as f:
f.write(f"--- New Beacon ---\n")
f.write(f"Time: {timestamp}\n")
f.write(f"From: {client_ip}\n")
f.write(f"Data: {data}\n")
f.write("-" * 20 + "\n")
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length).decode('utf-8')
client_ip = self.client_address[0]
print(f"\n\033[92m[+] Received Beacon from {client_ip}\033[0m")
print(f"\033[94m[!] Data: {post_data}\033[0m")
self.log_to_file(client_ip, post_data)
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
self.wfile.write(b"OK")
def log_message(self, format, *args):
return
def run_server():
server_address = ('', 8080)
httpd = HTTPServer(server_address, MegaC2Handler)
print("\033[91m" + "="*40 + "\033[0m")
print("\033[1m RED2BLUE - C2 LISTENER STARTED \033[0m")
print(f"\033[93m Listening on port 8080... \033[0m")
print(f"\033[93m Logs will be saved to: {LOG_FILE} \033[0m")
print("\033[91m" + "="*40 + "\033[0m")
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("\n[!] Server Stopping...")
httpd.server_close()
if __name__ == "__main__":
run_server()
```
这是恶意软件执行时的情况
# 检测与分析
## 背景概念
blblblbllblblbllblblblbllblblbllblblblbllblblbllblblblbllblblbll
## 告警与检测
blblblbllblblbllblblblbllblblbllblblblbllblblbllblblblbllblblbll
## 用例 1:基础信标(脚本小子)
在这个场景中,我们模拟一个常见的入门级恶意软件感染。攻击者提供一个独立的可执行文件(`WindowsUpdate.exe`),一旦执行,它会确保在系统重启后存活,并与 Command and Control (C2) 服务器建立持久的通信通道,以渗出基本的主机信息。
### 日志分析
现在场景已经执行,我们转到 Splunk 分析攻击生成的日志。
这里的目标是:
- 了解攻击从防御角度看是什么样子的
- 分步跟踪攻击时间线
- 识别关键工件和行为
- 提取有用的失陷指标
#### 起点:原始日志可见性
我们从一个广泛的查询开始,以获得对端点活动的完全可见性:
`index=* host="DESKTOP-MOPLS2N" | search NOT Image="*splunk-*.exe*"`
为什么这很重要:
我们从广泛开始以避免遗漏任何重要内容
按主机过滤可以隔离受害机器
排除与 Splunk 相关的进程可以减少噪音并提高清晰度
在这个阶段,我们还不是在狩猎——我们只是在观察发生了什么。
#### 文件投放证据
将恶意软件传输到系统中(通过复制/粘贴或拖放)后,我们观察到以下内容:
EventCode = 11 → 文件已创建
EventCode = 2 → 文件时间已修改
分析:
这些事件确认一个新文件被引入系统。
- Event 11:为我们提供了确切的文件路径和创建详细信息
- Event 2:表示时间戳修改,这在文件传输过程中自然发生
虽然这些事件是正常的,但当与可疑的文件名或位置相关联时,它们就变得重要了。
#### Payload 跟踪与 Pivot
要从一般观察转向 focused 调查,我们使用恶意软件名称进行 pivot:
`index=* host="DESKTOP-MOPLS2N" "WindowsUpdate.exe"`
为什么 pivot 很重要:
- 它隔离了与 payload 相关的所有活动
- 有助于构建清晰的攻击者行动时间线
- 显着减少噪音
从这时起,我们分析的每个事件都与恶意软件直接相关。
#### 初始执行 (EventCode 1)
此事件确认恶意软件已执行。
**映射到:User Execution (T1204.002)**
关键见解:
WindowsUpdate.exe 作为正在运行的进程存在确认了执行
父进程数据有助于识别它是如何启动的
命令行参数可能会揭示其他行为
这是攻击变为活跃的确切时刻。
从受害者方面,你可以在任务管理器中看到该进程
#### 持久化机制 (EventCode 13)
此事件表明恶意软件修改了 Windows 注册表。
映射到:Boot or Logon Autostart Execution (T1547.001)
发生了什么:
**恶意软件将自己添加到以下键:**
`HKCU\Software\Microsoft\Windows\CurrentVersion\Run`
为什么这很关键:
- 确保恶意软件在每次登录时自动运行
- 在系统重启后存活
- 攻击者常用的技术
我们可以检查 **regedit**,你会看到注册表键确实被添加了
#### C2 通信通道 (EventCode 3)
此事件显示由恶意软件发起的出站网络通信。
映射到:Application Layer Protocol (T1071.001)
观察到的行为:
- 源 IP:192.168.200.128(受害者)
- 目标 IP:192.168.200.129(C2 服务器)
- 端口:8080
- 进程:WindowsUpdate.exe
分析:
- 发起连接的进程是恶意软件本身目标是外部的并由攻击者控制通信通过 HTTP 进行
这确认了 Command & Control (C2) 通道的建立。
通过分析重复网络事件的时间戳,我们观察到:
- 对同一 IP 的多次连接
- 30 秒的一致间隔
#### 攻击重构
通过关联所有观察到的事件,我们可以重构完整的攻击:
- 恶意软件 被引入系统
- 用户手动执行了该文件
- 恶意软件通过注册表 Run 键建立了持久化
- 它向攻击者的 C2 服务器发起了出站通信
- 它开始周期性的 beaconing 以渗出数据
**失陷指标**
- WindowsUpdate.exe
- 192.168.200.129:8080
- DESKTOP-MPLS2N\GLITCH
为什么 IOC 很重要:
可用于检测规则
帮助识别整个环境中的类似感染
作为告警和威胁搜寻的基础
## 用例 2:通过恶意 Word 附件进行网络钓鱼标签:Red2Blue, RFI远程文件包含, Sysmon, VMware, Windows 安全, 后渗透, 威胁 hunting, 安全运营中心, 实验环境搭建, 家庭实验室, 插件系统, 攻击模拟, 数据展示, 无线安全, 红队, 网络安全, 网络安全审计, 网络映射, 逆向工具, 隐私保护, 驱动签名利用