Caldera实战指南:基于ATTCK框架的自动化红队与主动防御平台

📅 2026/6/16 3:00:14
Caldera实战指南:基于ATTCK框架的自动化红队与主动防御平台
1. 项目概述从“火山口”到主动防御的进化如果你在网络安全领域摸爬滚打超过五年那么对“红蓝对抗”这个词一定不会陌生。从早期的渗透测试报告到如今常态化、实战化的攻防演练防守方的思路也在不断进化。我们不再满足于被动地修补漏洞、更新规则而是开始思考如何能像攻击者一样思考甚至提前预判他们的行动如何构建一个能够持续运行、自我演化的“数字免疫系统”这就是我今天想和大家深入聊聊的Caldera。Caldera这个词直译是“火山口”但在网络安全圈它特指由MITRE公司开发并开源的一款自动化红队Adversary Emulation与主动防御平台。简单来说它不是一个简单的漏洞扫描器或攻击工具集而是一个模拟高级持续性威胁APT攻击全生命周期的“导演台”。你可以把它想象成一个高度智能化的“攻击剧本”编排与执行系统它内置了基于MITRE ATTCK框架的数百个攻击技术TTPs能够自动化、可重复地模拟真实世界攻击者的行为从初始访问、执行、持久化到横向移动、数据渗出一气呵成。它的核心价值在于为蓝队防守方提供了一个可度量、可重复、可扩展的自我检验工具。通过Caldera安全团队可以定期“攻击”自己的网络验证现有安全控制措施如EDR、防火墙、SIEM告警规则的有效性发现防御体系中的盲点和薄弱环节。这比等待真实攻击发生或者依赖一年一度的外部攻防演练要主动和高效得多。对于安全运营中心SOC的分析师、威胁狩猎团队以及安全架构师而言Caldera是一个不可或缺的“陪练”和“压力测试”工具。2. 核心设计理念与架构拆解2.1 为什么是ATTCK框架驱动Caldera的灵魂在于其与MITRE ATTCK框架的深度集成。ATTCK框架是一个基于真实世界观察的、描述攻击者战术和技术的知识库。Caldera没有重新发明轮子而是将ATTCK中的抽象技术转化为了可执行的“原子”操作。设计考量传统的渗透测试工具如Metasploit侧重于利用单个漏洞达成目标其攻击链是点状的、工具导向的。而APT攻击是过程性的、目标导向的更注重在受害环境中的隐蔽行动和长期控制。Caldera选择ATTCK作为蓝图正是为了模拟这种“行为模式”而非“工具利用”。例如它不关心你用Cobalt Strike还是Empire的哪个模块实现了“远程服务会话劫持”T1563.002它关心的是“在环境中建立持久性后通过何种技术进行横向移动”这一行为本身是否被你的防御体系检测到。架构优势这种设计使得Caldera的测试用例在Caldera中称为“能力” - Abilities与具体的攻击工具解耦。一个“能力”只描述要做什么如“收集系统信息”而具体通过哪个命令whoami、systeminfo等来实现则由不同的“插件”如54ndc47一个用Go编写的轻量级代理去适配。这带来了极大的灵活性你可以轻松扩展新的攻击技术而无需改动核心框架。2.2 核心组件交互逻辑Caldera采用了一种典型的“服务端-代理”架构但它的设计比传统的C2框架更侧重于流程编排和知识管理。服务端Server这是Caldera的大脑。它运行着一个Web界面用于操作和可视化和多个后台服务。核心服务包括调度器Scheduler负责按照预设的“攻击剧本”Adversary Profile和“行动”Operation计划向已上线的代理Agents下发任务。知识库Knowledge Service存储所有“能力”Abilities的定义、执行条件前提条件、以及从已执行操作中收集到的事实Facts。例如在一次行动中如果某个代理执行了“发现域控”的能力并成功那么“域控主机名DC01”就会作为一个“事实”被存入知识库后续的能力如“从域控提取哈希”可以依赖这个事实作为执行前提。决策引擎Planner这是Caldera智能化的关键。它根据当前行动的目标、已收集到的事实以及攻击剧本中技术TTPs的依赖关系动态决定下一步该执行哪个“能力”发给哪个代理。这模拟了攻击者在遇到障碍时的路径选择。代理Agent这是Caldera在目标系统上的“手和脚”。它是一个轻量级的可执行程序负责接收服务端下发的命令并执行然后将结果回传。Caldera默认自带一个名为“54ndc47”Sandcat的Go语言编写的代理它支持多种通信协议HTTP/S, DNS, TCP和混淆方式体积小免杀性相对较好。你也可以集成其他C2框架的代理如Manx类似Sliver或Mythic代理。插件Plugin这是Caldera的扩展机制。核心功能如代理通信、能力存储、可视化等都以插件形式存在。更重要的是你可以开发自定义插件来集成内部工具、对接第三方威胁情报、或者实现特殊的报告格式。例如你可以写一个插件在每次攻击模拟结束后自动将结果推送到JIRA创建一个待处理的防御工单。注意Caldera的“原子”化能力设计意味着一次完整的攻击模拟是由数十甚至上百个离散的“能力”按逻辑顺序执行完成的。蓝队分析的重点不应只看最终是否“被打穿”而应关注在攻击链的每一个环节你的安全产品是否产生了应有的日志、告警是否被有效触发、SOC分析师能否根据这些信息串联起攻击故事线。3. 从零开始Caldera实战部署与基础配置3.1 环境准备与一键部署Caldera的部署非常友好官方推荐使用Docker Compose这能避免复杂的Python环境依赖问题。以下是基于Linux环境的部署步骤假设你有一台干净的Ubuntu 20.04 LTS服务器。步骤一系统基础准备# 更新系统并安装必要工具 sudo apt update sudo apt upgrade -y sudo apt install -y git curl wget # 安装Docker和Docker Compose curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER # 注销并重新登录使docker组生效 sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose步骤二获取Caldera并配置# 克隆官方仓库建议使用稳定版本分支 git clone https://github.com/mitre/caldera.git --recursive --branch stable cd caldera # 关键配置修改默认密码和密钥 # Caldera的Docker Compose文件会使用.env文件中的环境变量 cp .env.example .env # 使用你喜欢的文本编辑器如nano或vim编辑.env文件 nano .env在.env文件中必须修改以下关键项# 管理后台的登录密码默认是admin务必修改 ADMIN_PASSWORDYourStrongPasswordHere123! # 用于加密通信的密钥务必使用一个强随机字符串替换 API_KEYGenerateARandomStringHereUsingopenssl rand -hex 32保存并退出。步骤三启动Caldera# 使用Docker Compose启动所有服务 docker-compose up -d等待几分钟所有容器包括Caldera主服务、MongoDB数据库等启动完成后在浏览器中访问https://你的服务器IP:8888注意是HTTPS。首次访问会提示证书不安全因为是自签名证书点击“高级”-“继续前往”即可。使用用户名admin和你刚才在.env中设置的密码登录。实操心得生产环境部署时强烈建议将Caldera服务器部署在一个独立的、与测试环境网络隔离的VPC或网段中。通过配置防火墙规则只允许测试环境的代理出站连接到Caldera服务器的特定端口默认8888而Caldera服务器本身不应有任何到测试环境的入站规则。这符合最小权限原则即使代理被反制攻击者也无法直接访问Caldera控制端。3.2 核心概念初探与第一个攻击模拟登录后你会看到Caldera的仪表盘。在开始模拟前需要理解几个核心对象代理Agents在“代理”页面你可以看到当前在线的代理。初始状态是空的。能力Abilities在“能力”页面可以看到所有内置的攻击技术原子操作每个都关联了ATTCK ID。攻击组Adversaries这是“攻击剧本”它是一系列“能力”的集合并定义了执行的阶段Phase和可能的顺序。行动Operations这是一次具体的攻击模拟任务。你需要为它选择一个“攻击组”、一个“代理池”、并设置计划。让我们发起第一次模拟部署第一个代理在测试目标机器一台Windows 10虚拟机上我们需要部署一个Sandcat代理。在Caldera Web界面的“代理”页面点击“部署代理”。选择“Sandcat (54ndc47)”类型根据目标系统选择对应的可执行文件如Windows选.exe。Caldera会生成一个带有一串唯一链接的下载命令。在目标机器上以管理员权限打开PowerShell或CMD执行这个命令。稍等片刻你将在Caldera的“代理”页面看到一个新代理上线显示其主机名、IP、权限等信息。选择一个攻击剧本转到“攻击组”页面。Caldera内置了许多预定义的剧本如“猎户座”Orion模拟初始访问和发现、“窃密者”Thief模拟数据渗出。对于首次测试我推荐选择“猎户座”它包含了一些基础的发现和信息收集技术攻击性不强适合验证通信和基础检测能力。创建并运行一次行动转到“行动”页面点击“新建行动”。名称填写如“First-Test-202405”。攻击组选择“猎户座”。代理选择“我的代理”会自动包含所有已上线的代理。计划选择“运行一次”并设置立即开始。其他选项保持默认。“自动关闭”可以勾选当行动达到目标或无法继续时会自动结束。点击“开始”按钮。观察与学习行动开始后你可以进入该行动的详情页。在这里你可以实时看到链路图以图形化方式展示攻击链的执行过程哪些能力成功了绿色哪些失败了红色哪些被忽略了灰色。时间线按时间顺序列出所有执行的能力命令及其结果。事实展示在此次行动中收集到的所有信息如用户名、主机名、网络共享等。这次模拟可能只持续几分钟。你的目标不是“攻破”什么而是验证整个流程代理能否正常上线、通信是否加密、能力能否成功执行、结果能否回传。同时在你的测试机器的安全软件如Windows Defender和网络监控设备上观察是否产生了相应的日志和告警。4. 深度定制构建符合自身环境的攻击剧本4.1 剖析与自定义“能力”内置的“能力”虽然丰富但可能不完全匹配你的内部工具或特定环境。自定义“能力”是让Caldera发挥最大价值的关键。一个“能力”由几个关键部分组成我们以一个自定义的“通过WMI查询安装软件列表”的能力为例能力元数据名称Query Installed Software via WMI描述通过WMI命令收集目标主机上已安装的软件列表。战术TacticDiscovery(发现)技术TechniqueT1012 - Query Registry(也可以归为T1082 - System Information Discovery)执行器Executor指定代理在什么环境下执行。对于Windows常用powershell、cmd、psh(Powershell Empire兼容)。命令Command这是核心即要执行的具体命令。支持变量替换。command: | Get-WmiObject -Class Win32_Product | Select-Object Name, Version, Vendor | Format-List或者为了更隐蔽可以使用wmicwmic product get name, version, vendor /format:csv有效载荷Payload可选。如果需要上传文件到目标执行可以在这里指定。解析器Parser用于从命令输出中提取结构化“事实”。这是Caldera非常强大的功能。例如我们可以写一个解析器来提取软件名称和版本。# 这是一个简化的解析器逻辑示例实际在Caldera中是以特定格式配置 # 假设命令输出是CSV格式 import csv from io import StringIO def parse(output): facts [] f StringIO(output) reader csv.DictReader(f) for row in reader: # 创建事实软件名称 facts.append({ trait: host.software.name, value: row.get(Name, ).strip() }) # 创建事实软件版本 facts.append({ trait: host.software.version, value: row.get(Version, ).strip() }) return facts在Caldera UI中你可以在“能力”编辑页面的“解析器”部分通过编写Jinja2模板或引用内置解析模块来实现类似功能。前提条件Requirements定义执行此能力前必须满足的条件。例如可以要求目标必须是Windows系统 (host.os.typewindows)或者要求之前已经收集到了管理员权限 (host.user.admintrue)。创建自定义能力在Caldera UI的“能力”页面点击“新建能力”按照上述结构填写表单。更高级的做法是直接编辑Caldera服务器上的YAML能力文件这便于批量导入和管理。4.2 编排复杂的“攻击组”一个真实的APT攻击是分阶段、多路径的。在Caldera中通过精心编排“攻击组”来模拟这一点。阶段Phase每个能力都属于一个数字阶段如1,2,3...。Caldera的调度器会尽量按阶段顺序执行能力但也会根据“前提条件”动态调整。通常阶段1放初始发现和侦察能力阶段2放权限提升和持久化阶段3放横向移动阶段4放数据渗出。依赖关系通过能力的“前提条件”来实现。例如“使用Mimikatz转储LSASS内存”这个能力其前提条件可以设置为host.os.typewindows和host.user.admintrue。只有当之前有某个能力如“通过UAC绕过提权”运行成功并产生了host.user.admintrue这个事实后转储LSASS的能力才会被加入待执行队列。构建一个内部威胁模拟剧本假设你想模拟一个拥有普通域账号的内部人员窃取数据。阶段1能力包括发现网络共享、查询当前用户权限、收集Outlook邮件列表通过COM对象。阶段2能力搜索敏感文件基于关键字前提条件是host.share.foundtrue来自阶段1的事实。阶段3能力压缩找到的文件、通过Web上传到外部服务器模拟外传前提条件是host.file.sensitive.foundtrue。 将这个剧本保存为一个新的“攻击组”如“内部人员-数据窃取”。通过这种编排Caldera的每一次“行动”都是一次动态的、有逻辑的渗透测试而不是一系列随机命令的堆砌。蓝队可以通过复盘行动链路图清晰地看到攻击者是如何一步步达成目标的从而针对性加固防御链条中的每一个环节。5. 蓝队视角如何利用Caldera输出提升防御效能5.1 从“行动报告”到“防御工单”一次Caldera行动结束后最重要的产出不是“我们被打穿了”而是详细的行动报告。报告里包含了所有执行过的能力命令。每个能力的执行结果成功/失败/忽略。收集到的所有事实。整个攻击链的可视化图谱。蓝队工作流集成示例告警验证在SOC中针对EDR或防火墙产生的每一个可疑告警都可以尝试在隔离的测试环境中使用Caldera复现触发该告警的精确TTP。这能验证告警的有效性并帮助分析师理解告警背后的真实攻击意图。检测规则调优例如Caldera模拟了“T1059.003 - Windows命令脚本”技术使用了powershell -enc的方式执行编码后的命令。你的SIEM规则如果没检测到就需要优化规则使其能识别这种混淆方式。如果产生了告警但误报率高则可以分析Caldera执行的上下文优化规则条件减少噪音。生成修复工单利用Caldera的插件系统可以开发一个插件当行动中某个特定技术如“T1543.003 - Windows服务”成功执行时自动在JIRA或ServiceNow中创建一个工单标题为“加固XX主机服务权限配置”并将相关的技术详情、主机信息、执行命令作为工单描述。这样就将安全测试结果直接转化为了可跟踪的运维任务。5.2 建立持续的安全度量基线Caldera的核心价值在于“持续”和“可度量”。建议建立以下例行机制每周/每月的自动化红队演练针对关键业务系统设置定时任务在业务低峰期自动运行指定的“攻击组”。将每次演练的结果如成功执行的技术数量、突破的防御层、平均检测时间MTTD、平均响应时间MTTR记录并可视化。这能形成一个清晰的安全防御效能趋势图。紫队协同演练在可控环境下让红队使用Caldera和蓝队使用真实的安全运营工具进行对抗演练。红队的目标是尽可能隐蔽地达成行动目标蓝队的目标是尽快发现并阻断攻击。演练后双方一起复盘红队分享绕过检测的技巧蓝队分享分析溯源的过程。这是提升整体安全能力最快的方式。新安全策略上线前的验证在部署新的防火墙规则、EDR策略或SIEM检测规则前先用Caldera模拟该策略意图防御的TTP验证策略是否按预期生效避免出现规则冲突或意外阻断业务的情况。6. 进阶技巧与避坑指南6.1 隐蔽通信与免杀对抗在生产环境进行测试代理的存活至关重要。Sandcat代理虽然轻量但其默认的HTTP/S通信特征可能被高级别的EDR或网络IPS识别。通信协议与混淆DNS隧道Sandcat支持DNS通信。在部署代理时可以选择DNS通信方式并将Caldera服务器配置为具有权威DNS解析的服务器。这能有效绕过基于HTTP代理的流量监控。自定义头部与URI在Caldera服务器配置和代理部署命令中可以修改默认的HTTP请求头、User-Agent和通信URI使其看起来更像正常的业务流量。分段与延迟在“行动”设置中可以配置“代理睡眠时间”Jitter和“每次下载的能力数量”让代理的行为更加“人性化”避免规律的、高频的通信被识别。代理免杀源码编译从GitHub获取Sandcat的Go源码修改其中的字符串常量、函数名等特征然后在自己环境中重新编译。这能改变文件的静态哈希值绕过基于哈希的黑名单。加壳与混淆对编译好的代理可执行文件使用商业或开源的加壳工具进行保护。但要注意一些过于激进的加壳工具本身就会被安全软件标记。分离式加载不直接部署完整的代理EXE而是先部署一个极小的下载器Loader其唯一功能是从远程下载加密的代理Shellcode到内存中执行实现无文件落地。这需要较强的开发能力但隐蔽性极高。重要警告所有免杀和隐蔽通信技术都应在合法授权和隔离的测试环境中使用。未经授权对他方系统使用这些技术是非法行为。同时要意识到“道高一尺魔高一丈”没有永久的免杀这些技术只是为了延长测试窗口核心目的仍是检验检测和响应能力。6.2 性能调优与大规模部署当需要在成百上千台主机上进行大规模自动化测试时Caldera的性能和稳定性成为关键。数据库优化Caldera默认使用MongoDB。确保MongoDB运行在有足够内存的服务器上。定期清理旧的“行动”日志和“事实”数据避免数据库无限膨胀。可以编写定时任务自动归档超过一定时间的操作数据。调度策略在“行动”设置中合理设置“批次大小”一次下发多少个能力和“代理睡眠时间”。过大的批次和过短的睡眠时间会导致服务器和代理负载过高网络流量异常明显容易被发现。建议从小批次开始逐步调整。分布式部署对于超大规模网络可以考虑部署多个Caldera“卫星节点”。每个卫星节点负责一个网络区域它们从中央Caldera服务器同步能力和攻击组配置但独立管理自己区域内的代理和执行行动。这可以分散负载也符合网络分区管理的原则。资源监控监控Caldera服务器和数据库的CPU、内存、磁盘IO和网络连接数。使用docker stats命令或集成PrometheusGrafana进行监控。当代理数量超过500时需要特别关注MongoDB的索引性能和连接池设置。6.3 常见问题排查实录在实际使用中你肯定会遇到各种问题。以下是一些典型问题的排查思路问题一代理部署成功但在Caldera界面显示“离线”或从未上线。排查网络连通性在目标机器上使用curl -k https://CALDERA_SERVER_IP:8888测试是否能访问Caldera服务器。检查防火墙是否放行了8888端口的出站连接。检查代理命令确保部署代理时使用的命令完整无误特别是下载链接中的API_KEY和服务器地址。可以在目标机器上手动运行一遍命令观察输出有无报错。查看容器日志在Caldera服务器上运行docker-compose logs --tail100 app查看Caldera主服务的日志看是否有代理注册的请求记录。问题二行动启动后能力长时间处于“已指派”状态不执行。检查代理状态确认接收任务的代理是“活跃”状态并且其“可用执行器”包含了该能力所需的执行器如powershell,cmd。检查前提条件这是最常见的原因。该能力可能设置了某个前提条件如需要特定的文件存在、特定的用户权限而当前“事实库”中尚未满足该条件。在行动详情页的“事实”标签下查看已收集到的事实。检查调度器在Caldera UI的“配置”-“插件”中确认“调度器”插件已启用并且没有错误。问题三能力执行失败返回“超时”或“连接中断”。命令本身问题首先手动到目标机器上以相同的用户身份在相同的路径下执行该能力对应的命令看是否能成功。可能是命令语法问题、路径问题或权限问题。代理进程被终止检查目标机器的安全软件如AV/EDR日志看是否将代理进程或它执行的命令终止了。这恰恰是测试的目的——发现哪些安全控制拦截了攻击行为。输出过长有些命令如dir /s遍历整个大磁盘可能产生巨量输出导致回传超时。对于这类命令应在自定义能力时使用更精确的命令或添加过滤条件。问题四如何重置Caldera或清理测试数据清理单个行动在“行动”页面可以删除已完成的行动。重置事实库事实存储在MongoDB中。可以通过重启MongoDB容器并挂载空数据卷来彻底清理但这会丢失所有数据。更安全的方式是通过Caldera的REST API或编写插件在每次新行动开始前清理旧事实。完全重置最彻底的方法是停止容器删除相关的Docker卷和镜像然后重新克隆代码库、配置.env文件并启动。注意这会丢失所有配置、能力和攻击组请提前备份caldera/conf目录下的自定义文件。Caldera不是一个“开箱即用一键破解”的炫技工具而是一个需要安全团队投入时间去理解、定制和融入现有流程的安全工程平台。它的威力不在于使用了多么高深的漏洞而在于它将复杂的攻击行为标准化、自动化、可度量化为“以攻促防”的主动安全理念提供了坚实的实践基础。从我个人的使用经验来看最大的收获不是发现了多少个漏洞而是整个团队对ATTCK框架的理解变得无比具象防御体系的短板和告警的盲点变得清晰可见。安全运营从此不再是疲于奔命的救火而是有了一个可以持续对标和优化的标尺。