Nic PalmerAdrian Chen

自动运行 GOAD 和实时恶意软件实验室

使用 Ludus 和 Elastic 将网络范围视为代码

22 分钟阅读启用
自动运行 GOAD 和实时恶意软件实验室

导言:需要可扩展的自动仿真范围

在现代安全操作中,检测工程不再是一门 "设置好就不用管 "的学科。任何安全团队面临的核心挑战--也是整个紫色团队方法的基础问题--都很简单:你如何知道你的检测规则是否真正有效?现在,针对不断变化的对手工具包持续验证检测逻辑是一项基本要求。

可以说,这项工作的最大障碍一直是建立实验室。手动配置多域 Active Directory 林、根据特定漏洞对其进行配置,以及部署单独的、包含恶意软件的分析环境是一个复杂而耗时的过程。这种重复性的设置工作极大地消耗了企业最宝贵的资源:高级安全分析师的时间。社区讨论也反映了这种挫折感,强调了在运行一次测试之前,手动设置所造成的时间损失。

本博客详细介绍了一种现代解决方案,它将快速基础架构自动化与统一的安全分析平台相结合,从而消除了这一瓶颈。该解决方案利用了两个关键组件:

  1. Ludus:开源自动化叠加器,只需一条命令即可部署和配置复杂的多虚拟机网络范围。
  2. Elastic 安全:统一安全信息事件管理 (SIEM)、扩展检测和响应 (XDR) 以及云安全的平台,提供了一个综合解决方案,用于摄取、检测和响应威胁。它为"提供了观察模拟环境中每一个动作所需的无限可视性" 。

本指南的目标是为建立这一集成系统提供一个明确的、循序渐进的蓝图。它将展示如何从缓慢、手动和不一致的实验室测试转变为持续、自动和可扩展的检测工程工作流程,超越Elastic Cortado所提供的功能。

解决方案架构:Ludus + Elastic

该架构是对现代混合企业的高保真模拟。Ludus 系列作为"on-prem" 或 IaaS 数据中心,而 Elastic Cloud 部署则代表"SaaS" 安全堆栈。这种模式完美地反映了 Elastic Security 旨在保护的混合和多云环境,使测试的架构与攻击本身一样有价值。

构建由以下核心组件组成。

组件技术函数
基金会(基础设施)Ludus(Proxmox/Ansible)通过单个 YAML 配置部署虚拟机范围。
目标身份识别 - GOAD(Windows 服务器)供应链 - XZbot(Debian)多域 AD 森林存在故意漏洞(Kerberoasting、打印噩梦)。供应链模拟的 Linux 主机感染了 CVE-2024-3094。
传感器网格(可见度)Elastic Agent统一遥测采集(EDR + 日志)。
大脑(分析)Elastic 安全SIEM/XDR 平台,用于相关性和人工智能驱动的调查。

组成部分 1:基础(Ludus)

Ludus 是基础设施即服务(IaaS)层。它可在 Proxmox 8/9 或 Debian 12/13 上运行,使用 YAML 配置文件定义复杂的虚拟网络,支持多达 255 个不同的 VLAN。在幕后,Ludus 可轻松利用 Packer 和 Ansible 从单一文件中构建、配置和部署虚拟机模板。
查看并遵循 Ludus快速入门中的安装步骤和硬件要求。

组成部分 2:目标(实验室)

本指南将两种不同的 Ludus 环境合并为一个单一的综合环境,以测试更广泛的威胁:

  • 活动目录游戏 (GOAD):Orange Cyberdefense 的安全研究人员设计的专用 Active Directory 实验室。它预先配置了模拟常见身份攻击路径(如 Kerberoasting、NTLM 中继和 Active Directory 证书服务 (ADCS) 滥用)所需的特定错误配置和漏洞。
  • XZbot 恶意软件实验室:高风险、高保真恶意软件环境。本实验室包含实际的功能性CVE-2024-3094 后门。这为复杂的软件供应链攻击提供了一个完美的现代测试案例。

重要免责声明

处理实时恶意软件,即使是用于研究,也可能违反 ISP 或云提供商的可接受使用政策 (AUP)。确保您拥有基础设施(Ludus 是内部部署的),并确保您的上游 ISP 允许进行此类研究,或通过 VPN 路由流量。

组件 3:传感器网格(弹性代理& Defend)

为了获得可视性,GOAD 和 XZbot 实验室中 Ludus 系列的每台虚拟机都将安装Elastic Agent,这是一个用于数据收集和保护(通过 Elastic Defend)的单一、统一的代理。

该仪器通过badsectorlabs/ludus_elastic_agentAnsible 角色实现自动化。这个角色是关键的关键,它以编程方式将基础架构配置阶段(Ludus/Ansible)与安全仪表化阶段(Elastic)连接起来,实现了真正的"基础架构即代码" 工作流程。

最重要的是,Elastic Agent 策略将与Elastic Defend集成一起配置。这将代理从简单的日志收集器提升为功能全面的端点检测& Response (EDR)/eXtended Detection& Response (XDR) 解决方案,提供基于主机的检测(包括机器学习 (ML) 驱动的恶意软件和勒索软件检测)以及检测所必需的深度内核级遥测。

注:对于本博客中概述的紫色团队方法,请将策略设置为检测模式。

组件 4:大脑(弹性云托管/弹性无服务器)

来自 Ludus 范围内的 Elastic 代理的所有安全遥测和警报都将流式传输到集中式Elastic Cloud Hosted (ECH)Elastic Serverless部署。这正是统一平台分析能力的体现。使用云原生平台不仅仅是为了托管,它还能释放 Elastic 最先进的倍增功能,包括 "攻击发现"和 "人工智能助手"。单击此处开始试用 Elastic Cloud

下图为基于GOAD 实验室的构建概述。

第 1 阶段:建造靶场并安装仪器

本节提供了配置和部署自动范围的技术性分步指南。该流程遵循明确的"基础设施即代码" (IaC) 模型,其中安全工具与基础设施本身一起定义,确保每次部署都有一致且可重复的监控态势。Elastic Cloud 实例及其配置可通过Elastic CloudElastic StackTerraform 提供商进行管理,以实现范围和 SIEM 的完全 IaC 模型。

3.1 配置弹性代理策略(在 Kibana 中)

在运行 Ludus 范围部署之前,必须在弹性云实例中创建代理策略。正是这一策略实现了强大的 EDR/XDR 遥测功能。

操作流程如下

  1. 登录弹性云 (ECH) 或弹性无服务器 Kibana 实例。
  2. 导航至管理> Fleet
  3. 创建一个新的Agent 策略(如"ludus-range-policy" )。ludus_elastic_agent 角色会将代理注册到您在虚拟机级自定义中指定的策略或与全局变量链接的默认策略中。
  4. Elastic Defend集成添加到此策略。
  5. 配置 Elastic Defend 集成,使其在检测模式下运行。这将激活全套 EDR 遥测功能。
  6. 保存策略并单击"添加代理。"这将提供 ludus.yml 文件所需的注册令牌(用于 ludus_elastic_enrollment_token)和舰队服务器 URL(用于 ludus_elastic_fleet_server)。
  7. (可选)重复步骤 3-6,创建与主机功能和能力相匹配的自定义策略,以便对策略进行虚拟机级自定义。

创建该策略并将令牌粘贴到 ludus.yml 文件后,运行 Ludus range deploy 将执行完整的自动化工作流程。Ludus 部署虚拟机,Ansible 安装 Elastic Agent,然后注册 Fleet 并自动下拉包含 Elastic Defend 集成的策略。这样,从实验室诞生的那一刻起,就能提供丰富的 EDR 遥测数据--内核级进程、文件、网络和注册表事件。

3.2 Ludus YAML 配置 (ludus.yml)

Ludus在此提供了部署 GOAD 系列的步骤。范围的配置存储在 ludus.yml 配置文件中。GOAD 范围位于ad/GOAD/providers/ludus/config.yml
附录中的完整配置是一个示例,基于将完整的 GOAD 实验室(在 VLAN 10 上)与 XZbot 实验室(在 VLAN 20 上)合并的运行配置示例。

要在安装过程中部署自定义版本,请在运行步骤 2 中的goad.sh 脚本之前更新ad/GOAD/providers/ludus/config.yml 文件。

git clone https://github.com/Orange-Cyberdefense/GOAD.git
cd GOAD
sudo apt install python3.11-venv
export LUDUS_API_KEY='myapikey'  # put your Ludus admin api key here nano ad/GOAD/providers/ludus/config.yml # customize the configuration here
./goad.sh -p ludus
GOAD/ludus/local > check
GOAD/ludus/local > set_lab GOAD # GOAD/GOAD-Light/NHA/SCCM
GOAD/ludus/local > install

两个关键配置选项可用于定制量程:

  1. 全局变量:为简化配置并避免重复,Elastic Agent 变量在全局 Ansible.vars 块的顶层定义一次,并由所有虚拟机继承。

    注册令牌决定所使用的弹性代理策略。

# ludus.yml
---
# --- GLOBAL ANSIBLE VARS (Simplification) ---
# Define Elastic agent vars once and apply globally
global_role_vars:
  ludus_elastic_fleet_server: "<your-fleet.example.com:443>" # Use 443 for cloud
  ludus_elastic_enrollment_token: "<your_enrollment_token>"
  ludus_elastic_agent_version: "9.2.1"
  1. 虚拟机级变量:可在虚拟机级别配置 Elastic Agent 变量,以自定义所应用的策略。这些变量可以与全局变量结合使用,例如,通过全局变量设置代理版本和 fleet_server,在虚拟机级别设置注册令牌,以便对虚拟机应用不同的策略。
# --- VM DEFINITIONS ---
vms:
  # --- GOAD LAB (VLAN 10) ---
  - name: "{{ range_id }}-GOAD-DC01"
    hostname: "{{ range_id }}-DC01"
    template: win2019-server-x64-template
    vlan: 10
    ip_last_octet: 10
    ram_gb: 4
    cpus: 2
    windows: { sysprep: true }
    ansible:
      roles:
        - badsectorlabs.ludus_elastic_agent
      role_vars:
        ludus_elastic_enrollment_token: "<your_enrollment_token>" # different token for different policies
  # (Definitions for GOAD-DC02, GOAD-DC03, GOAD-SRV02, GOAD-SRV03 
  #  would follow, all inheriting the global ansible vars)

自动部署弹性代理

上面的 ludus.yml 代码段演示了自动化。通过在每个虚拟机定义的 ansible.roles 部分添加badsectorlabs.ludus_elastic_agent 角色,Ludus 会在部署过程中自动安装和配置代理。

这个单一的 Ansible 角色兼容我们异构实验室的所有操作系统,包括 Windows(用于 GOAD)、Kali 和 Debian(用于 XZbot)。

如简化的 YAML 所示,顶层的 ansible.vars 块将关键参数传递给角色:

  • ludus_elastic_fleet_server:弹性云部署的舰队服务器 URL 和端口(例如,your-fleet.example.com:443)。
  • ludus_elastic_enrollment_token:注册代理的令牌。
    完整示例在虚拟机级别设置了 ludus_elastic_enrollment_token,以展示使用不同策略的能力。
  • ludus_elastic_agent_version:要安装的特定代理版本(如 9.2.1)。

注意:Kali 主机还将部署 Elastic Defend 来监控攻击者的行为,这在实际场景中是不可能的。

安全第一:隔离、OPSEC 和实时恶意软件

本节包含重要的安全和操作安全(OPSEC)警告。这种配置涉及重大的、非同小可的风险,必须加以专业管理。

4.1 威胁:这不是模拟

必须明确指出:Ludus XZbot 实验指南及其相关的 Ansible 角色安装了实际的功能性 CVE-2024-3094 后门。这不是良性的模拟代码。实验室自己的文件规定"危险:此角色包含恶意软件(故意为之)。"

虽然被描述为"被动后门" (这意味着它需要攻击者主动触发),但任何运行该代码并开放互联网连接的虚拟机都会带来灾难性的后果。它可能会被扫描,被未知行为者利用,或被用作攻击其他网络的支点。

4.2 矛盾:隔离与云连接

这种结构造成了直接和关键的业务冲突:

  1. 要求 1 (安全):恶意软件实验室必须与公共互联网隔离,以防止泄露或外泄。
  2. 要求 2 (功能):Elastic Agent必须具备出站互联网连接,以便与 Elastic Cloud Hosted / Elastic Serverless 端点连接,进行注册和数据流。

新手用户在这方面会失败,要么将受感染的实验室暴露给全世界,要么将其完全隔离,无法收集到任何安全遥测数据。

4.3 解决方案:通过 Ludus 测试模式实现针孔出口

冲突可通过 Ludus 内置的"测试" 模式解决,该模式可对网络出口进行细粒度控制。该功能用于针孔出口,可实现代理控制、遥测和日志输出。

# 1. Start the isolated testing session
ludus testing start # Note external DNS resolvers may also need to be added # ludus testing allow -i 1.1.1.1,8.8.8.8

# 2. Allow Elastic Fleet Server (Control Plane)
# Replace <id> with your specific deployment ID # Note the endpoint will differ based on the cloud providers
ludus testing allow -d <your-deployment-id>.fleet.us-central1.gcp.cloud.es.io

# 3. Allow Elasticsearch Ingest (Data Plane) # Note the endpoint will differ based on the cloud providers
ludus testing allow -d <your-deployment-id>.es.us-central1.gcp.cloud.es.io

这种配置提供了专家级解决方案:恶意软件被安全地控制住,而弹性代理只被授予进行策略更新(通过与fleet 端点的通信)和摄取数据(通过与ES 端点的通信)所需的最低限度的连接。

4.4 在测试模式下访问量程(WireGuard)

一旦测试模式激活,标准路由选择将失效。您不能简单地从本地局域网 SSH 进入 Kali VM,因为路由器会丢弃流量。Ludus 利用 WireGuard 提供带外管理通道。

Ludus 会在路由器虚拟机(198.51.100.1)上配置一个 WireGuard 接口 (wg0),并为您分配一个静态客户端 IP(如 198.51.100.2)。

  • 持久允许规则:路由器的防火墙配置包括 LUDUS_DEFAULTS 链中的特定规则。这些规则明确接受来自或目的地为 WireGuard 子网 (198.51.100.0/24) 的流量。
  • 优先级:由于这些规则存在于 LUDUS_DEFAULTS 链中,因此它们优先于测试模式应用的 DROP 规则。

如何连接

  1. 生成配置: ludus 用户 wireguard> ludus.conf
  2. 将其导入本地的 WireGuard 客户端并激活隧道。
  3. 通过隧道直接连接到虚拟机的私有 IP(如 10.10.10.11)。

第 2 阶段:实施攻击

随着高保真、全仪器范围的部署,"红队" 阶段就可以开始了。这包括登录到专用的攻击者虚拟机(如附带的 Kali 虚拟机或 remnux-analyzer 虚拟机)并执行攻击。这种活动会产生丰富的恶意遥测数据,Elastic Defend 将捕获这些数据。

这种组合范围允许测试针对两种主要的宏观威胁载体的防御:基于身份的"living-off-the-land" (LotL) 攻击和基于漏洞的供应链入侵。

5.1 活动目录模拟 (GOAD)

  • 初始访问(证书填充)
    1. 攻击者的目标是外部边界。使用被攻破的凭证列表,对 Essos.local 域执行密码填充攻击。您成功验证了用户 khal.drogo 的证书。
    2. 示例工具:kerbrute 或 smartbrute
    3. 结果:低权限域用户的有效凭证。
  • 权限升级(打印噩梦)
    1. khal.drogo 的权限有限。要在 CastelBlack 服务器上获得立足点,您需要利用 PrintNightmare (CVE-2021-34527)。Windows 打印多工器服务中的这个漏洞允许任何经过验证的用户安装恶意打印驱动程序。您上传了一个驱动程序,为盒子添加了一个新的本地管理员用户。
    2. 示例工具:CVE-2021-34527.py 漏洞利用脚本
    3. 结果:本地 SYSTEM 访问 CastelBlack。
  • 证书转储(DCSync 准备工作)
    1. 现在,你以 SYSTEM/Admin 的身份在 CastelBlack 上运行,检查机器是否有缓存的凭据。运行 Impacket 的 secretsdump,从 SAM 数据库和 LSASS 内存中提取哈希值。您发现了内置管理员账户的 NTLM 哈希值,该值是上一次支持会话遗留在内存中的。
    2. 示例工具: impacket-secretsdump
    3. 结果:域管理员或高权限帐户的 NTLM 哈希值。
  • Kerberoasting
    1. 有了有效的域凭据,您就可以转到内部网络。您需要为环境中的服务主名 (SPN) 申请 Kerberos 服务票据 (TGS)。您的目标是 MSSQLSvc 账户。您将加密票据离线并破解,以显示 SQL 服务账户的明文密码。
    2. 示例工具:Rubeus 或 GetUserSPNs.py
    3. 结果:MSSQL 服务账户的明文密码。
  • MSSQL 攻击
    1. 您可以使用破解的 SQL 凭据直接验证 Braavos SQL 服务器。由于服务账户具有系统管理员权限,因此可以滥用 xp_cmdshell 存储过程。该功能允许您直接从 SQL 查询生成 Windows 命令 shell,从而有效地在数据库服务器上执行远程代码 (RCE)。
    2. 示例工具:mssqlclient.py
    3. 结果:数据库服务器上的 RCE。
  • 持久性(计划任务)
    1. 为确保在 SQL 密码更改时不会丢失访问权限,需要建立持久性。在被入侵的 SQL 服务器上创建 Windows 计划任务。该任务被配置为每天执行信标二进制,以 SYSTEM 身份运行。
    2. 示例工具:schtasks.exe 或 PowerShell
    3. 结果:长期坚持。

5.2 恶意软件实验室模拟(XZbot)

  • 步骤 7:供应链支点(XZ 后门)
  • 同时,您还可以将 DMZ 中的 Linux 基础架构作为目标。您在 xz-backdoor-dect 虚拟机上触发了预先植入的 XZ 后门 (CVE-2024-3094)。通过使用特定加密密钥操纵 SSH 握手,就能完全绕过身份验证,以 root 身份执行命令,而不会留下标准 SSH 日志。
  • 工具:xzbot
  • 结果:通过供应链漏洞对 Linux 基础设施进行 Root 访问。
  • 攻击者使用 Ludus 实验室提供的 xzbot 客户端。
  • 在攻击者虚拟机上运行以下命令,即可在易受攻击的 Debian 主机上触发后门:
    xzbot --ssh-addr '10.X.X.X:22' -cmd 'setsid sh -c"echo test"' 2>& 1
  • 此操作会导致目标上的 sshd 进程异常生成一个 shell,并以 root 用户身份执行命令,从而创建明确的执行证明。

第 3 阶段:统一检测& 调查与弹性安全

这是"Blue Team" 的回报。 2 阶段生成的遥测和警报现在可在统一的 Elastic Security 平台内进行分析。

6.1"强大的 SIEM" :集中可视性& 预置检测

Elastic SIEM 的强大之处不仅在于其被动收集日志的能力。它的威力来自于对 Elastic Defend 提供的深度上下文数据进行的主动分析。Defend 的"Complete Endpoint Visibility" 不仅提供基本日志,还提供内核级遥测,包括进程创建、文件修改、网络连接和注册表更改。

这些丰富的数据全部按照 Elastic 通用模式 (ECS) 进行了规范化处理,为 Elastic 广泛的预构建 MITRE 映射检测规则库提供了约 1500 多条数据。这些规则由 Elastic Security Labs 团队研究、开发和维护,可提供开箱即用的检测价值。

Ludus 系列产品是实现这一价值的完美验证平台。在 2 阶段执行的攻击并非理论上的攻击,而是直接映射到具体的预期人工制品 ("smoking gun")。示例中有意将预置规则和自定义规则结合起来使用,以便对特定行为发出警报。

攻击步骤MITRE ATT&CK弹性检测规则预期文物 ("烟枪")
1.塞满证书T1110(蛮力)潜在账户暴力(自定义)跨主机的异常认证成功(事件 4624 和 ssh 登录)。
2.打印噩梦T1068(剥削)异常的打印后台处理程序子进程不正常的打印协作程序服务(spoolsv.exe)子进程。
3.证书转储T1003.006(操作系统凭证转储)Potential Remote Credential Access via Registry对安全帐户管理器 (SAM) 注册表蜂巢的访问异常。
4.KerberoastingT1558.003(开伯尔铸造)可疑的 Kerberos 验证票据请求(自定义)事件 ID 4769 ,请求 0x17 (RC4) 加密。
5.MSSQL 攻击T1505.001(SQL 存储过程)Execution via MSSQL xp_cmdshell Stored Procedure通过 MSSQL xp_cmdshell 存储过程执行
6.持久性T1053.005(预定任务)创建了一个计划任务事件 ID 4698 或 schtasks.exe /create。
7.XZ 后门T1210(利用远程服务)通过 SSH 后门执行的可能性sshd 会产生不寻常的子进程,如 sh 或 bash。

注:弹性检测规则公开透明。您可以直接在(https://github.com/elastic/detection-rules) 上查看逻辑、投稿或提出问题。

6.2 深入探讨:使用事件分析器跟踪流程链

这两个实验室(GOAD 和 XZbot)为使用 Elastic 的专业调查工具提供了绝佳机会。事件分析器的用户界面旨在将复杂的 JSON 日志抽象为符合安全分析师思维方式的认知模型:流程链。界面由三个主要交互区域组成:图形画布、细节面板和时间线集成。

我们看到了什么?

图形画布(流程树)

中心视图是一个有向无环图,其中

  • 节点(立方体):每个立方体代表一个不同的流程执行。可视化界面区分了"锚点" 事件(用蓝色光晕突出显示)和周围环境。
  • 边(线):线代表父子关系。方向性是隐含的(自上而下或自左向右),显示了执行流程。
  • 可视化徽章:节点不是静态图标,而是动态指示器。
    • 警报徽章:如果特定进程触发了检测规则(如"Malware Detected" ),立方体上就会出现一个彩色徽章。这样,分析人员就能立即确定检测引擎标记了链条中的哪个步骤。
    • 用户上下文:视觉线索可指示进程是否改变了用户上下文(例如,从本地用户变为 SYSTEM),这意味着权限升级。
详细面板(法证元数据)

点击任何节点都会触发详细面板,通常是从右侧滑入。该面板是"的主要来源,您可以看到" 的粒度。它暴露了对验证至关重要的字段:

  • 命令行参数:这可以说是最有价值的取证工具。分析器会显示完整字符串,暴露标记、脚本和编码有效载荷(例如,powershell.exe -w hidden -enc Base64)。
  • 进程路径和散列:完整文件路径有助于识别伪装(例如,svchost.exe 从 C:Temp 运行,而不是 C:\Windows\System32)。文件哈希值(MD5、SHA-1、SHA-256)用于与威胁情报进行交叉比对。
  • 签名者信息:二进制文件的数字签名信息有助于区分可信的微软二进制文件和未签名的恶意软件。
  • 相关事件计数:该节点显示汇总统计数据(例如,"15 文件事件," " 3 网络连接" ),而不是用数以千计的文件修改来干扰图表。点击这些统计数据通常会深入到这些具体操作的列表视图或时间轴。
时间维度(时间过滤器)

分析仪经常被忽视的一个重要方面是对时间的处理。攻击可能有较长的"停留时间。"父进程可能在几周前启动(如合法服务),而恶意子进程则在今天生成。分析器包括一个时间滑块,允许分析人员扩展查询窗口。默认情况下,它可能会查看警报周围的一个狭窄窗口,但扩展后,图表就能"," ,进入暖数据层或冷数据层,找到长期运行的父进程。

工作原理?

事件分析器的运行能力利用了弹性通用模式(ECS)。在异构安全环境中,日志来源多种多样--Windows 终端、Linux 服务器、网络防火墙和云服务提供商--每个来源都有独特的分类标准。CrowdStrike 代理可能会将进程 ID 标记为 TargetProcessId,而 Sysmon 事件则使用 ProcessId。如果不进行归一化处理,就无法通过算法将这些事件关联到一个链中。
ECS 通过执行严格的字段层次结构来解决这个问题。事件分析器依靠特定的高保真 ECS 字段来构建可视化图表:

  • process.entity_id:这是分析仪逻辑的基石。操作系统会循环使用进程 ID(PID)。 1234 的 PID 可能属于09:00 的 svchost.exe 和14:00 的 malware.exe。依靠 PID 进行长期历史分析会产生碰撞,破坏可视化图表,将不相关的事件联系起来。process.entity_id 是由弹性代理(或符合 ECS 标准的节拍)生成的唯一字符串,它在索引中唯一持久存在,确保图形代表一个不同的执行实例,而不受 PID 重用的影响。
  • process.parent.entity_id:该字段在节点之间建立定向边。通过递归查询一个事件的 process.entity_id 与另一个事件的 process.parent.entity_id 相匹配的事件,分析器可以重建事件的脉络。

事件序列在高速环境中,事件发生的顺序(例如,文件修改发生在网络连接之前还是之后?通过 ECS 时间戳和序列号,分析仪可以在视觉节点细节中按时间顺序排列事件。

6.3 深度挖掘:利用会话查看器重构用户活动

对于XZbot(Linux)攻击来说,会话查看器是最优秀的工具。它专门用于"监控和调查 Linux 基础架构上的会话活动"

当通过 XZBackdoor 可能执行的警报触发时,分析员会调查相关的 sshd 进程。会话浏览器采用"高度可读的格式,其灵感来自终端" 。它重建了攻击者的会话,显示了 sshd 进程及其异常子进程 (sh)。

此外,它还会显示执行的确切命令sh -c setsid sh -c "usermod -aG sudo sysadmin_backup" ),甚至可以显示该命令的输出结果。这是权威的"烟枪" ,以简单、人类可读的文本呈现给分析人员,有效地允许他们在事后观看攻击者的 TTY 会话。

我们看到了什么?

会话查看器的用户界面设计明确,旨在缩小抽象日志分析与 Linux 管理员本地终端体验之间的差距。事件分析器的重点是恶意软件进程链,而会话查看器则与之不同,它提供了一种按时间顺序排列的树状可视化图,可重建 shell 会话的线性叙事。

流程树和时间表

视图的核心部分是以分层列表形式显示的有向无环图(DAG)

  • 垂直流程:会话查看器以垂直方式排列进程,模仿终端历史文件的流程,但保留了层次结构。子进程相对于父进程缩进。这样,分析人员就能立即区分用户直接运行的命令(如 curl)和脚本执行产生的进程(如在 setup.sh 脚本内执行的 curl)。
  • 详细模式:通过切换,分析人员可以在过滤视图(显示重要的用户活动)和"Verbose 模式之间切换。"启用后,该模式会显示典型的噪音事件,如 shell 启动脚本(.bashrc 执行)、shell 完成助手和内置命令引起的分叉。这对于检测隐藏在配置文件脚本中的持久性机制至关重要。
视觉徽章和指示器

用户界面采用了复杂的徽章和图标系统,可提供即时的上下文,而无需分析人员深入研究每个节点。这些视觉提示对于快速分流至关重要。

弹性会话查看器中的可视化指标

徽章/图标视觉外观意义对法医的影响
执行用户更改明文徽章用户上下文发生变化(如 su、sudo)。对识别权限升级至关重要。显示标准用户成为 root 的确切时间。
进程警报齿轮图标进程事件触发了检测规则。表明执行了恶意二进制文件或可疑参数(如 whoami)。
文件警报页面图标文件修改触发了一条规则。表明存在篡改、持久性创建(cron/systemd)或外泄暂存。
网络警报页面图标(辅助)网络事件触发规则。表示 C2 通信、横向移动或渗透。
多重警报组合徽章单个事件触发多个规则类型。恶意活动的高可信度指标(例如,进程丢弃文件并执行了该文件)。
警报计数数字(如 (2)与节点相关的警报总数。帮助确定检测逻辑链中哪些步骤最"noisy" 的优先级。
终端输出视图

将鼠标悬停在进程节点上的 "终端输出"按钮上,会显示一个徽章,显示捕获的输出大小。单击此按钮可打开终端输出视图,渲染 process.io.text 数据。这是用于 Linux 调查的"Smoking Gun" 功能。

  • 重放功能:它能让分析人员准确地看到用户所看到的内容。如果攻击者运行 cat /etc/passwd,进程树会显示执行情况;终端输出视图会显示攻击者看到的 passwd 文件内容
  • 输入重构:由于查看器捕获的是 TTY 输入/输出,因此它不仅能捕获命令执行过程,还能捕获键入过程。这可以发现空格、错别字和更正(例如,键入 sdo [backspace] sudo),这些都是人类对手而非自动脚本的有力行为指标。

弹性优势:人工智能驱动的自动寻猎

3 中描述的过程展示了一个强大的、由分析师驱动的调查过程。不过,使用Elastic Cloud Hosted (ECH)Elastic Serverless的主要优势在于可以通过编程访问集成的生成式人工智能堆栈。这种堆栈将人工关联过程提升为人工智能驱动的自动狩猎

注意:Elastic 的人工智能功能可与开箱即用的 Elastic Managed LLM 或使用其中一个可用连接器配置的第三方 LLM配合使用。

7.1 从警报到攻击:自动关联与攻击发现

GOAD + XZbot 实验室将生成多个离散警报,如上表所示。初级分析师将面对一连串的警报:潜在的 Kerberoasting、可疑的证书请求和潜在的 XZBackdoor,必须手动"拼接" 这种复杂的跨域攻击。

这就是 "攻击发现 "所要解决的问题。这一 GenAI 功能可用于企业和无服务器层级,",以大规模方式提供全自动威胁猎杀功能" 。它"AI 分析每个警报,以发现隐藏的威胁" ,自动将来自 Ludus 实验室的不同信号关联到一个单一的高保真"攻击" 调查中。

对于法证分析师来说,攻击发现的主要价值在于压缩时间。它可自动对"进行心理缝合" ,以定义一级和二级分析。

解构"心理缝合"

请看一个没有 "攻击发现 "的调查示例。

  1. 触发器:您看到一个警报:"可疑 PowerShell 执行。"
  2. 查询:转到主机时间轴。
  3. 扫描:您可以回滚 15 分钟。您会看到"File Download" 事件。
  4. 假设: "可能用户下载了一个坏文件,启动了 PowerShell。"
  5. 验证:检查文件名。它就是 invoice.js。
  6. 结论: "确认已下载恶意软件。"

这个过程需要 10 到 30 分钟,取决于分析人员的技能和对环境的熟悉程度。攻击发现 "在几秒钟内就能完成整个序列。它可以查看 PowerShell 警报,在相关上下文中查看文件下载事件,并提供一个 "发现",说明: 用户执行的可疑 PowerShell 脚本可能来自下载的文件 "invoice.js":"用户执行了可能来自下载文件 "invoice.js "的可疑 PowerShell 脚本。"

该功能包括数据持久性(保存结果以进行历史跟踪)和调度& 操作(自动运行并可触发响应或后续的弹性工作流),从而将 SOC 从被动状态转变为主动状态。

示例

在我们的示例中,随着攻击的发生,我们开始看到警报。我们利用 "攻击发现 "进行分流,而不是对警报进行单独分流。
将平均处理时间压缩到几秒钟,并快速识别 2 攻击。

7.2 利用人工智能助手加快分诊速度

Elastic Security Assistant(弹性安全助手)使用生成式人工智能来帮助您发现、修复和了解安全威胁。它直接在 Elastic Security 内部运行。您可以通过聊天界面与它互动,调查警报和编写代码。

在我们的示例中,一旦 "攻击发现 "识别出相关攻击,我们就会使用人工智能助手进行调查。该助手提供两个关键功能:

  1. 自然语言调查:分析师可以提出简单明了的问题,如:"总结这次攻击" ,"这个过程的 MITRE 战术是什么?" 、"" 或 "提供一些补救建议"。

  1. 代理查询验证工作流程:这一高级功能允许人工智能"生成经过验证的定制 ES|QL 查询" 。分析师可以询问:"查找来自 XZbot 警报涉及的主机的所有网络连接" ,助手会编写、验证和自我纠正查询,然后再将其呈现出来,从而大大降低了高端威胁搜索的技能门槛。

运作方式

该助手可将弹性堆栈连接到您选择的 LLM(如 GPT-5、Claude、Gemini)。它使用检索增强生成(RAG)技术从环境中获取相关数据,包括日志、警报和内部文档。您可以对其进行配置,以便在向模型发送提示之前对敏感字段(PII 或主机/IP 元数据)进行匿名处理,从而确保您的数据在模型推理行为模式时保持私密性。

7.3 利用弹性工作流程实现智能自动化

上述攻击会产生复杂的多阶段警报。手动处理这些问题的速度很慢。Elastic 通过收购开源 AIOps 和警报管理平台Keep 解决了这一问题。在Elastic 9.3 技术预览版中,这项技术作为Elastic工作流直接集成到了 Kibana 中。

什么是工作流程?

Elastic Workflows 是内置于 Elasticsearch 平台的自动化引擎。您可以在 YAML 中定义工作流--触发工作流的因素、工作流的步骤、工作流执行的操作--然后由平台负责执行。工作流可以查询环境、转换和丰富安全数据、根据条件分支、调用外部 API,并通过已配置的连接器与 Slack、Jira、PagerDuty 等服务集成。工作流程还可以调用人工智能代理来推理复杂的调查,然后根据代理的发现继续采取响应行动。Elastic Workflows 将脚本自动化与 SIEM 中的人工智能推理相结合,您的安全数据已经存在于 SIEM 中。

工作原理:"警报聚合器& 工作流引擎"

工作流是检测和修复之间的中间件层,通过三种主要机制发挥作用:

  • 多源输入:工作流程超越 Elastic。调入更多数据,用于丰富、分析或初步分流。
  • 工作流即代码(YAML):工作流程是在 YAML 文件中定义的。这样,团队就可以将事件响应程序作为代码进行版本控制。
  • 工作流引擎:当 Elastic(或外部工具)触发警报时,工作流引擎会执行一系列步骤:
    1. 丰富:查询 API(如 VirusTotal 或 Active Directory)以添加上下文。
    2. 逻辑:使用 if/else 语句确定严重程度。
    3. 操作:发送 Slack 消息、创建 Jira 票据或触发 Elastic Defend 响应操作。

请看一个 "警报 "和 "行动 "流程示例。

  • 触发器:您可以将工作流连接到特定规则,如"恶意检测警报" 。
  • 步骤:您可以定义一系列操作。
    1. 分流(Agentic):将警报传递给人工智能助理。提出问题:"我们将如何补救和应对下面的警报?
    2. 丰富:将人工智能助理的回复作为备注附加到警报中。
    3. 响应:创建一个带有警报说明链接的案例。
示例

在我们的示例中,我们的警报触发了我们的工作流 - 警报增强& 案例创建。
我们还将从工作流用户界面直接触发它,以演示各种步骤。

  • 警报上下文作为输入提供给安全人工智能助手
  • 答复将作为说明添加到安全警报中
  • 根据警报的元数据(时间戳、严重程度、规则名称和警报原因)创建案例。
  • 案件链接将作为评论添加到案件中。注意:GIF 中没有显示这一点

总结:从手动设置到连续仿真

本博客提供了一个先进、可扩展、最重要的是安全的模拟范围的完整蓝图。

  1. 我们建造了只需使用 Ludus 下达一个命令,即可部署一个复杂的多实验室范围(GOAD + XZbot)。
  2. 我们使用了仪器:作为自动部署的一部分,使用 ludus_elastic_agent Ansible 角色对整个范围进行了 Elastic Agent 和 Defend 的无缝检测。
  3. 我们确保了安全:利用 Ludus 的粒度"OPSEC" 网络控制,解决了恶意软件隔离与云代理连接之间的关键冲突。
  4. 我们进行了验证:通过验证Elastic 的预构建、开箱即用检测规则与实时已知恶意攻击的对比,证明了该平台强大的 SIEM 功能。
  5. 我们进行了调查:我们使用专门的调查工具 "事件分析器 "和 "会话查看器 "来追踪 Windows 和 Linux 主机上的确切攻击路径。
  6. 我们实现了自动化:我们展示了 Elastic GenAI 堆栈的"force-multiplier" ,其中 "攻击发现 "将不同的警报自动关联为单一的攻击,而 "人工智能助理 "则加速了最终调查。
  7. 我们做出了回应:弹性工作流的强大功能为复杂的响应行动和修复流程提供了大脑和自动化功能。

这种架构并非一次性建造。它是持续检测工程管道的蓝图。"使紫色团队能够按需拆卸、重建和重新测试其防御系统,确保其检测态势与威胁发展同步,从而实现安全运营" 的现代化。

迈出下一步:启用您的安全团队

本博客中的架构不仅是一个技术练习,更是一个持续安全验证的蓝图。通过将此自动范围与 Elastic 的统一 SIEM 和 XDR 平台相结合,您可以从定期测试转变为持续准备状态。

我们邀请您开始自己的试用,利用本指南针对真实世界的威胁对平台进行测试和评估,并为您的安全团队提供领先对手一步的工具。

使用其他 SIEM?

没问题。您可以利用 Elastic Serverless 增强现有 SIEM,然后在使用本机 SIEM 的底层数据时获得上述所有洞察力。立即开始部署 Elastic Serverless弹性人工智能 SOC 引擎(EASE)软件包提供了这些人工智能驱动的功能,使企业能够在全面迁移之前,在现有工具之上快速添加强大的分析功能和人工智能层。

附录

全范围示例

注意:Kali VM VLAN 位于 GOAD 和 XZ 后门主机之外,以模拟分段网络或远程攻击者。Kali VM VLAN 可更改为 10/20,以模拟 "假定入侵 "或内部攻击场景。

global_role_vars:
  ludus_elastic_fleet_server: "https://<fleet_domain>:<fleet_port>" #443 by default for cloud   ## Note on prem fleet server defaults to 8220
  ludus_elastic_agent_version: "9.2.1"
ludus:
  - vm_name: "{{ range_id }}-GOAD-DC01"
    hostname: "{{ range_id }}-DC01"
    template: win2019-server-x64-template
    vlan: 10
    ip_last_octet: 10
    ram_gb: 4
    cpus: 2
    windows:
      sysprep: true
    dns_rewrites:           # Any values in this array will be added to DNS for the range and return an A record for this VM's IP
      - sevenkingdoms.local
      - kingslanding.sevenkingdoms.local
      - kingslanding
    roles:
      - badsectorlabs.ludus_elastic_agent
    role_vars:
      ludus_elastic_enrollment_token: "<goad_policy_enrollment_token>"
  - vm_name: "{{ range_id }}-GOAD-DC02"
    hostname: "{{ range_id }}-DC02"
    template: win2019-server-x64-template
    vlan: 10
    ip_last_octet: 11
    ram_gb: 4
    cpus: 2
    windows:
      sysprep: true
    dns_rewrites:
      - winterfell.north.sevenkingdoms.local
      - north.sevenkingdoms.local
      - winterfell
    roles:
      - badsectorlabs.ludus_elastic_agent
    role_vars:
      ludus_elastic_enrollment_token: "<goad_policy_enrollment_token>"
  - vm_name: "{{ range_id }}-GOAD-DC03"
    hostname: "{{ range_id }}-DC03"
    template: win2016-server-x64-template
    vlan: 10
    ip_last_octet: 12
    ram_gb: 4
    cpus: 2
    windows:
      sysprep: true
    dns_rewrites:
      - essos.local
      - meereen.essos.local
      - meereen
    roles:
      - badsectorlabs.ludus_elastic_agent
    role_vars:
      ludus_elastic_enrollment_token: "<goad_policy_enrollment_token>"
  - vm_name: "{{ range_id }}-GOAD-SRV02"
    hostname: "{{ range_id }}-SRV02"
    template: win2019-server-x64-template
    vlan: 10
    ip_last_octet: 22
    ram_gb: 4
    cpus: 2
    windows:
      sysprep: true
    dns_rewrites:
      - castelblack.north.sevenkingdoms.local
      - castelblack
    roles:
      - badsectorlabs.ludus_elastic_agent
    role_vars:
      ludus_elastic_enrollment_token: "<goad_policy_enrollment_token>"
  - vm_name: "{{ range_id }}-GOAD-SRV03"
    hostname: "{{ range_id }}-SRV03"
    template: win2019-server-x64-template
    vlan: 10
    ip_last_octet: 23
    ram_gb: 4
    cpus: 2
    windows:
      sysprep: true
    dns_rewrites:
      - braavos.essos.local
      - braavos
    roles:
      - badsectorlabs.ludus_elastic_agent
    role_vars:
      ludus_elastic_enrollment_token: "<your_enrollment>"
  - vm_name: "{{ range_id }}-xz-backdoor-dect"
    hostname: "{{ range_id }}-xz-backdoor-dect"
    template: debian-12-x64-server-template
    vlan: 20
    ip_last_octet: 1
    ram_gb: 2
    cpus: 2
    linux:
      packages: # You can define packages to install on Linux hosts
        - ca-certificates
        - netcat-openbsd
        - net-tools
    roles:
      - badsectorlabs.ludus_xz_backdoor
      - badsectorlabs.ludus_elastic_agent
    role_vars:
      ludus_xz_backdoor_install_xzbot: true
      ludus_xz_backdoor_install_backdoor: true
      ludus_elastic_enrollment_token: "<linux_policy_enrollment_token>"
  - vm_name: "{{ range_id }}-kali"
    hostname: "{{ range_id }}-kali"
    template: kali-x64-desktop-template
    vlan: 50
    ip_last_octet: 99
    ram_gb: 8
    cpus: 4
    linux: true
    testing:
      snapshot: false # Snapshot this VM going into testing, and revert it coming out of testing. Default: true
      block_internet: false # Allow internet access for Kali, default is true
    roles:
      - badsectorlabs.ludus_xz_backdoor
      - badsectorlabs.ludus_elastic_agent
    role_vars:
      ludus_xz_backdoor_install_xzbot: true
      ludus_elastic_enrollment_token: "<linux_policy_enrollment_token>"

本博文所描述的任何特性或功能的发布及上市时间均由 Elastic 自行决定。当前尚未发布的任何特性或功能可能无法按时提供或根本无法提供。

分享这篇文章