红队基础设施自动化:redc工具一键部署C2与CDN隐匿实战
1. 项目概述一个红队基础设施的“瑞士军刀”如果你和我一样长期在红队攻防演练或渗透测试的一线摸爬滚打那你一定对“基础设施”这个词又爱又恨。爱的是一套稳定、隐蔽、功能强大的基础设施是行动成功的基石恨的是从域名、CDN、VPS到各种C2框架的部署、配置、维护每一个环节都充满了琐碎和不确定性。很多时候我们花在“搭台子”上的时间甚至比真正“唱戏”的时间还要多。直到我遇到了wgpsec/redc这个被圈内朋友称为“红队基础设施一键部署与管理工具”的项目它彻底改变了我的工作流。简单来说redc是一个用 Go 语言编写的命令行工具它的核心目标是将红队行动中所需的各种基础设施服务——包括但不限于域名前置Domain Fronting、CDN 配置、SSL 证书申请、Cobalt Strike 团队服务器部署、Sliver C2 配置等——的部署与管理过程自动化、标准化。它就像一个经验丰富的“基础设施管家”把那些原本需要手动编写脚本、反复调试配置文件的繁琐工作封装成了几条简单的命令。你只需要告诉它你想要什么比如一个基于 CloudFlare CDN 的域名前置并自动申请 Let‘s Encrypt 证书它就能在几分钟内帮你搞定一切并且生成清晰的部署报告。这个项目特别适合以下几类人独立安全研究员希望快速搭建个人测试环境避免在基础设施上耗费过多精力红队工程师需要在紧张的演练周期内快速、可靠地部署多套、异构的基础设施并确保其隐蔽性和可用性安全团队负责人希望将基础设施的部署流程标准化降低对个人经验的依赖提升团队整体效率。接下来我将结合自己数月的深度使用经验为你彻底拆解redc的设计思路、核心功能、实操细节以及那些官方文档里不会写的“坑”与技巧。2. 核心设计思路与架构解析2.1 为什么需要redc解决红队基础设施的三大痛点在深入代码之前我们必须先理解redc要解决的根本问题。传统手动部署红队基础设施通常面临三个核心痛点流程碎片化与高门槛一个完整的基础设施链路涉及 DNS 解析、CDN 配置、VPS 系统初始化、C2 服务端安装、证书管理、反向代理配置等多个环节。每个环节都需要不同的知识如 CloudFlare API、Nginx 配置、ACME 协议、系统服务管理新手极易在某个步骤卡住导致整体失败。配置易错且难以复用手动编写的 Nginx 配置、系统服务文件、C2 配置文件往往因一个空格、一个路径错误或参数理解偏差而失效。即使这次成功了下次换一个域名、换一台 VPS又得重新来一遍无法形成可复用的“资产”。隐蔽性维护成本高红队基础设施的隐蔽性不是一劳永逸的。你需要定期更换域名、更新证书、调整 CDN 配置以对抗防守方的流量分析和封禁。手动维护这些动态变化不仅工作量大而且容易留下操作痕迹。redc的架构设计正是针对这些痛点。它采用了“模块化”和“声明式配置”的思想。工具本身是一个核心引擎而具体的基础设施服务如 “cloudflare”、“gost”、“cobaltstrike”则以模块的形式存在。用户通过一个统一的 YAML 配置文件声明自己想要的基础设施形态例如使用 cloudflare 模块进行 CDN 转发使用 c2profile 模块加载某个 Malleable C2 配置。redc的核心引擎会解析这个配置然后按正确的顺序调用各个模块的执行器完成从资源申请到服务上线的全过程。2.2 核心架构与工作流程redc的架构可以抽象为三层配置层用户编辑的redc.yaml文件。这里定义了项目的全局参数如工作目录、日志级别和需要部署的服务列表。核心引擎层负责解析配置、管理模块生命周期、处理模块间的依赖关系、执行部署任务。这是redc的“大脑”。模块层一个个独立的功能单元。每个模块都遵循统一的接口包含自己的配置定义、参数校验逻辑和具体的部署/销毁动作。模块之间可以通过配置引用产生依赖例如一个cobaltstrike模块可能依赖于nginx模块提供的反向代理端口。其典型的工作流程如下初始化redc init命令生成一个包含详细注释的模板配置文件redc.yaml。配置用户根据模板填写自己的域名、CloudFlare API Token、VPS IP、C2 监听端口等参数。预检redc plan或redc apply会首先进行“预检”验证配置的合法性、检查 API 连通性、确认资源是否可用。这一步能提前发现大部分配置错误避免在部署中途失败。执行预检通过后redc开始按顺序执行各个模块。例如它可能先调用cloudflare模块创建 DNS 记录并配置 CDN然后调用acme模块申请 SSL 证书接着在 VPS 上通过ssh模块执行命令安装并配置 Nginx最后部署 C2 服务端。输出部署完成后redc会生成一份部署报告列出所有创建的资源如域名、证书路径、服务访问地址和关键配置信息。同时所有操作都有详细的日志记录便于审计和排错。这种设计的好处是显而易见的标准化所有人都按同一套流程走、自动化减少人工干预、可审计所有操作有迹可循。更重要的是它把专家的经验沉淀成了可执行的代码和配置模板。3. 核心模块深度解析与实操要点redc的强大功能依赖于其丰富的模块生态。下面我将挑选几个最常用、也最核心的模块结合我的实操经验进行深度解析。3.1 CloudFlare 模块智能域名与CDN管理这是redc的“门面”模块负责处理一切与域名和 CloudFlare CDN 相关的事务。它的核心能力包括自动创建/更新 DNS 记录A、CNAME、AAAA 记录、配置 CDN 代理橙色云/灰色云、以及为后续的 SSL 证书申请做准备。关键配置参数解析modules: - name: cloudflare config: api_token: “YOUR_CF_API_TOKEN“ # 具有Zone.Zone, Zone.DNS权限的Token zone_name: “yourdomain.com“ # 你的主域名 records: - name: “cdn“ # 将创建 cdn.yourdomain.com type: “A“ content: ““ # 这里通常留空redc会自动获取服务器IP并填充 proxied: true # 关键开启CDN代理橙色云 ttl: 1 # 自动TTLapi_token安全第一。务必在 CloudFlare 面板创建一个权限最小化的 API Token只授予Zone.Zone Read和Zone.DNS Edit权限即可。绝对不要使用全局 API Key。proxied: true这是实现域名前置Domain Fronting或简单 CDN 隐匿的关键。设置为true后访问者的流量会先经过 CloudFlare 的全球网络再到达你的真实服务器。这隐藏了服务器的真实 IP。注意事项某些 C2 流量特征明显的协议在开启代理后可能与 CloudFlare 的防火墙规则冲突需要进行额外的 C2 Profile 调整。content: ““留空时redc会尝试自动探测并在部署时填充。你也可以硬编码一个 IP。自动探测依赖于其他模块如server提供的信息体现了模块间的协作。实操心得子域名策略建议使用无特定意义的随机子域名如a7b3.yourdomain.com而非cdn、mail这类常见名称。redc支持变量你可以结合一个生成随机字符串的简单脚本在部署前动态修改配置。多记录配置你可以为一个域名配置多条记录。例如一条A记录指向团队服务器另一条CNAME记录用作钓鱼页面的分发域名。redc会一并处理。变更与回滚redc具有类似 IaC基础设施即代码工具的状态管理能力。再次执行apply时它会比对当前配置和实际资源状态仅进行必要的更新。理论上也支持destroy来清理资源但在生产红队环境中对线上基础设施执行销毁需极度谨慎。3.2 ACME 模块自动化SSL证书管理没有 HTTPS 的 C2 流量在今天是极其扎眼的。ACME 模块集成了 Let‘s Encrypt实现 SSL/TLS 证书的自动申请、验证和续期。它通常与 CloudFlare 模块协同工作使用 DNS-01 挑战方式进行验证即在你的域名 DNS 中添加一条特定的 TXT 记录。关键配置参数解析- name: acme config: email: “your-emailexample.com“ # 用于接收证书过期提醒 provider: “cloudflare“ # 使用CloudFlare DNS进行验证 cloudflare: api_token: “{{ .cloudflare.api_token }}“ # 引用上面cloudflare模块的token避免重复填写 certificates: - domains: - “cdn.yourdomain.com“ reload_cmd: “systemctl reload nginx“ # 证书续期后自动重载Nginxprovider: “cloudflare“指定使用 CloudFlare 的 API 来完成 DNS-01 挑战。这是最常用的方式因为验证过程完全通过 API 在后台完成无需在服务器上开放任何端口。配置引用{{ .cloudflare.api_token }}是redc的模板语法用于引用其他模块的配置值。这保证了配置的单一事实源也提高了安全性Token 只需在一处填写。reload_cmd证书每90天会自动续期。续期成功后通过这个命令通知 Web 服务如 Nginx重新加载新证书实现零停机更新。这是保障长期隐蔽性的关键避免了因证书过期导致基础设施暴露。注意事项速率限制Let‘s Encrypt 有严格的速率限制每周每个注册域名最多50张证书重复申请相同域名也有限制。在测试阶段频繁销毁和重建基础设施可能导致触发限制。建议在测试时使用--staging参数如果模块支持指向 Let‘s Encrypt 的测试环境。证书存储redc默认会将证书和私钥存储在本地工作目录下的acme子目录中。务必确保该目录的权限安全如 600并考虑将其纳入加密备份流程。私钥泄露意味着整个 TLS 安全形同虚设。3.3 服务器模块与C2部署模块核心载荷投送这是将能力投射到目标服务器的环节。redc通过server模块来定义目标服务器通常是一台 VPS并通过ssh连接在其上执行命令。然后诸如cobaltstrike、sliver或nginx这样的模块会利用这个连接在远程服务器上安装、配置并启动相应的服务。一个典型的 Cobalt Strike 团队服务器部署配置示例modules: - name: server config: host: “203.0.113.1“ # 你的VPS IP port: 22 user: “root“ # 推荐使用ssh-agent或指定私钥路径避免密码在配置文件中 identity_file: “~/.ssh/id_rsa_redteam“ - name: cobaltstrike config: server: “{{ .server }}“ # 引用server模块的连接配置 install_dir: “/opt/cobaltstrike“ license: “{{ file “/path/to/your/license.key“ }}“ # 从文件读取许可证 profile: “{{ file “/path/to/your/malleable_c2_profile.profile“ }}“ # 加载Malleable C2配置 teamserver_port: 50050 password: “YourSuperStrongPassword!“ # 团队服务器密码 # 绑定到本地依赖后续的nginx反代 bind_to: “127.0.0.1“server模块定义了如何连接你的基础设施服务器。安全建议强烈建议为红队服务器使用独立的 SSH 密钥对并禁用密码登录。identity_file指向的私钥应妥善保管。cobaltstrike模块它做了几件关键事1) 将 Cobalt Strike 文件包上传到服务器2) 安装必要的 Java 运行环境3) 根据提供的 Malleable C2 Profile 生成修改后的团队服务器启动脚本4) 配置 systemd 服务实现开机自启和日志管理。bind_to: “127.0.0.1“这是最佳实践。团队服务器本身只监听在本地回环地址对外暴露的是前置的 Nginx 或 Gost 等反向代理。这样即使反向代理层被突破攻击者也无法直接访问到 C2 服务端。Nginx 反向代理模块的衔接- name: nginx config: server: “{{ .server }}“ configs: - name: “c2-proxy“ listen: 443 ssl http2 server_name: “cdn.yourdomain.com“ ssl_certificate: “{{ .acme.certificates[0].cert_file }}“ # 引用ACME模块申请的证书 ssl_certificate_key: “{{ .acme.certificates[0].key_file }}“ location / { proxy_pass http://127.0.0.1:50050; # 转发到本地的Cobalt Strike # 此处可添加大量伪装头模拟正常网站 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; ... }Nginx 模块会根据配置在服务器上生成站点配置文件并重载 Nginx 服务。至此一个通过 CDN 隐匿IP、拥有合法 SSL 证书、并由 Nginx 反向代理的 Cobalt Strike 团队服务器就部署完成了。外部流量访问https://cdn.yourdomain.com会经过 CloudFlare - VPS Nginx(443) - 本地 Cobalt Strike(50050) 的完整链路。4. 完整部署流程实操与现场记录理论说了这么多我们来一次真刀真枪的完整部署。假设我们的目标是部署一个使用 CloudFlare CDN 和自定义 Malleable C2 Profile 的 Cobalt Strike 团队服务器。4.1 前期准备与环境配置资源准备域名准备一个你拥有完全控制权的域名例如redteam-base.com。将其 DNS 托管到 CloudFlare。VPS购买一台位于理想地理位置的 VPS。系统推荐 Ubuntu 22.04 LTS 或 Debian 11。重要确保 VPS 的防火墙如 UFW开放了 SSH(22) 端口并且只允许来自 CloudFlare IP 段的流量访问 443/80 端口这可以通过 CloudFlare 防火墙规则或 VPS 防火墙实现是隐藏真实 IP 的补充措施。CloudFlare API Token登录 CloudFlare在 “My Profile” - “API Tokens” 中创建。模板选择 “Edit zone DNS”权限细化为Zone.Zone: Read,Zone.DNS: Edit。作用域指定你的域名redteam-base.com。Cobalt Strike 资源准备好合法的 Cobalt Strike 安装包、许可证文件以及一个经过测试的 Malleable C2 Profile 文件例如jquery-c2.4.0.profile。安装redc# 从 GitHub 发布页下载最新版本的二进制文件以Linux amd64为例 wget https://github.com/wgpsec/redc/releases/download/vx.x.x/redc_linux_amd64 chmod x redc_linux_amd64 sudo mv redc_linux_amd64 /usr/local/bin/redc redc version # 验证安装4.2 初始化项目与配置编写在你的工作目录下执行mkdir my-red-team-infra cd my-red-team-infra redc init这会生成一个redc.yaml文件。用文本编辑器打开它你会看到一个结构清晰、充满注释的模板。接下来我们填充关键部分。# redc.yaml project: “my-first-red-team-infra“ workdir: “./.redc“ # redc的工作目录存储状态、证书等 modules: # 1. 配置CloudFlare - name: cloudflare config: api_token: “YOUR_CF_API_TOKEN_HERE“ # 替换为你的Token zone_name: “redteam-base.com“ records: - name: ““ # 主域名记录代表 redteam-base.com type: “A“ content: ““ # 自动填充服务器IP proxied: true ttl: 1 - name: “www“ # www.redteam-base.com可选 type: “CNAME“ content: “redteam-base.com“ proxied: true ttl: 1 # 2. 配置目标服务器 - name: server config: host: “YOUR_VPS_IP_HERE“ # 替换为你的VPS IP port: 22 user: “root“ identity_file: “/home/youruser/.ssh/id_rsa_redteam_vps“ # 指向你的私钥 # 3. 申请SSL证书 (依赖cloudflare模块) - name: acme config: email: “notifyexample.com“ provider: “cloudflare“ cloudflare: api_token: “{{ .cloudflare.api_token }}“ # 引用上面的token certificates: - domains: - “redteam-base.com“ - “www.redteam-base.com“ reload_cmd: “systemctl reload nginx“ # 4. 在服务器上安装配置Nginx (依赖server和acme模块) - name: nginx config: server: “{{ .server }}“ configs: - name: “cobaltstrike-proxy“ listen: 443 ssl http2 server_name: “redteam-base.com www.redteam-base.com“ ssl_certificate: “{{ .acme.certificates[0].cert_file }}“ ssl_certificate_key: “{{ .acme.certificates[0].key_file }}“ # 以下是关键的反代和伪装配置 location / { proxy_pass http://127.0.0.1:50050; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection “upgrade“; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 添加一些常见的静态文件缓存头更像一个真实网站 location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 1y; add_header Cache-Control “public, immutable“; } } # 可选的添加一个简单的robots.txt或假首页提升伪装度 location / { return 200 ‘htmlbodyh1Under Maintenance/h1/body/html‘; default_type text/html; } # 5. 部署Cobalt Strike团队服务器 (依赖server模块) - name: cobaltstrike config: server: “{{ .server }}“ install_dir: “/opt/cobaltstrike“ license: “{{ file “/path/to/your/cobaltstrike/license.key“ }}“ profile: “{{ file “/path/to/your/profiles/jquery-c2.4.0.profile“ }}“ teamserver_port: 50050 password: “GenerateAStrongRandomPasswordHere!“ # 使用密码生成器创建 bind_to: “127.0.0.1“ # 只绑定本地 # 可选修改JVM参数例如分配更多内存 java_opts: “-Xmx1024m -XX:AggressiveHeap -XX:UseParallelGC“4.3 执行部署与验证配置预检在运行前先进行预检这是一个好习惯。redc plan这个命令会解析你的 YAML 文件检查语法验证模块依赖并尝试进行一些基本的连通性测试如用 API Token 访问 CloudFlare。它会输出一个执行计划列出将要创建或变更的资源。仔细阅读确认是否符合你的预期。执行部署如果预检通过就可以正式执行了。redc apply接下来你会在终端看到redc开始按顺序执行各个模块。它会显示每个步骤的日志例如 “Creating CloudFlare DNS record...” “Requesting SSL certificate...” “Uploading Cobalt Strike package to server...” “Starting teamserver service...”。整个过程通常会在 3-5 分钟内完成。验证部署结果DNS与CDN登录 CloudFlare 面板检查redteam-base.com的 DNS 记录是否已创建并且是否处于“已代理”橙色云状态。SSL证书使用浏览器或curl -I https://redteam-base.com访问你的域名确认 HTTPS 连接正常证书有效且由 Let‘s Encrypt 签发。服务连通性这是最关键的一步。不要直接用 Cobalt Strike 客户端连接你的域名先进行间接验证# 在你的本地机器上测试Nginx是否响应 curl -k -H “Host: redteam-base.com“ https://YOUR_VPS_IP # 应该返回你设置的“Under Maintenance”页面或502错误因为Cobalt Strike可能未监听或需要特定协议 # 通过CloudFlare测试 curl -v https://redteam-base.com # 观察返回的头部确认经过了CloudFlare会有CF-Ray等头部Cobalt Strike 服务状态通过 SSH 登录你的 VPS检查服务状态。ssh -i ~/.ssh/id_rsa_redteam_vps rootYOUR_VPS_IP systemctl status cobaltstrike-teamserver journalctl -u cobaltstrike-teamserver -f # 查看实时日志确认服务处于active (running)状态且日志中没有明显的 Java 错误或 Profile 解析错误。最终连接测试在确保以上所有环节都正常后才能使用 Cobalt Strike 客户端进行连接。在客户端中输入https://redteam-base.com作为主机端口443以及你设置的强密码。如果一切配置正确你应该能成功连接到团队服务器。5. 常见问题、排查技巧与进阶玩法实录即使有自动化工具在实际操作中依然会遇到各种问题。下面是我在多次使用redc中积累的一些常见问题排查技巧和进阶使用心得。5.1 部署失败问题排查速查表问题现象可能原因排查步骤与解决方案redc plan或apply失败提示 CloudFlare API 错误1. API Token 无效或权限不足。2. 域名未正确托管到 CloudFlare。3. 网络问题导致 API 调用超时。1. 在 CloudFlare 面板重新检查 Token 的权限和作用域。2. 使用curl -X GET “https://api.cloudflare.com/client/v4/zones“ -H “Authorization: Bearer YOUR_TOKEN“手动测试 API 连通性。3. 确认zone_name填写的是根域名如redteam-base.com不是子域名。SSL 证书申请失败1. DNS 记录未生效或未代理。2. ACME 挑战失败TXT 记录未设置成功。3. Let‘s Encrypt 速率限制。1. 等待 DNS 传播或检查 CloudFlare 代理是否开启。2. 查看redc的详细日志 (redc apply -v)或在 CloudFlare DNS 面板检查是否出现了_acme-challenge开头的 TXT 记录。3. 如果是测试在acme模块配置中添加server: “https://acme-staging-v02.api.letsencrypt.org/directory“使用 staging 环境。部署成功但无法通过域名访问1. VPS 防火墙阻止了 443 端口。2. Nginx 配置错误或服务未启动。3. CloudFlare 防火墙规则拦截。1. 登录 VPS检查ufw status或iptables -L确保 443 端口对 CloudFlare IP 范围开放。2. 检查systemctl status nginx查看 Nginx 错误日志tail -f /var/log/nginx/error.log。3. 登录 CloudFlare检查 “Security” - “WAF” 中是否有规则阻止了你的访问。可暂时创建一个允许你 IP 的规则进行测试。Cobalt Strike 服务启动失败1. Java 环境问题。2. Malleable C2 Profile 语法错误。3. 端口被占用或权限不足。1. 在 VPS 上运行java -version确认已安装。redc的cobaltstrike模块通常会尝试安装 Java但可能失败。2. 这是最常见的原因。使用./teamserver本地测试你的 Profile 文件是否能被 Cobalt Strike 正确解析。3. 检查 netstat -tlnp客户端可以连接但 Beacon 无法回连1. Nginx 反代配置未正确传递 Beacon 流量。2. Malleable Profile 的 HTTP 配置与 Nginx 不匹配。3. 出口防火墙或杀软拦截。1. 检查 Nginx 配置中的proxy_set_header部分确保包含了 Cobalt Strike 所需的头部如Upgrade,Connection用于 WebSocket。2. 重点检查 Profile 中的http-get和http-post块的uri、header、metadata部分确保与 Nginx 的location路径匹配且没有冲突的头部处理。3. 在 VPS 上使用tcpdump抓取 443 端口的包看 Beacon 的 HTTP 请求是否正常到达。5.2 进阶技巧与经验分享配置分离与敏感信息管理将redc.yaml中的敏感信息API Token、密码、私钥路径提取到环境变量或单独的加密文件中。可以使用{{ env “CF_API_TOKEN“ }}语法引用环境变量。更安全的方式是使用像HashiCorp Vault或ansible-vault这样的秘密管理工具但这需要更复杂的集成。多环境与配置复用你可以创建多个redc.yaml文件如prod.yaml和test.yaml分别对应生产基础设施和测试基础设施。利用redc -c test.yaml apply来指定配置文件。对于通用的模块配置如server连接信息可以提取为模板通过{{ include “common.yaml“ }}等方式引入。集成其他C2框架redc社区不断贡献新的模块。除了 Cobalt Strike你很可能找到sliver、covenant甚至metasploit的模块。部署流程大同小异核心在于理解该 C2 框架的部署要求和配置文件。部署前务必先在测试环境手动成功部署一次了解其依赖和坑点再转化为redc配置。基础设施监控与告警部署只是开始维护才是常态。建议在 VPS 上配置简单的监控如用systemd监控cobaltstrike-teamserver和nginx服务如果崩溃则自动重启并发送告警可通过 Telegram Bot、ServerChan 等。同时监控 CloudFlare 域名的 SSL 证书有效期虽然 ACME 会自动续期但监控能让你更安心。蓝队视角与对抗思考在使用自动化工具提升效率的同时更要思考如何对抗自动化检测。redc生成的模式可能被防守方总结出指纹。因此需要定制化不要完全使用默认配置和公开的 Malleable Profile。修改 Nginx 的默认错误页面、Server 头定制独特的响应内容。多样化不要所有基础设施都用一个模子。交替使用不同的 CDN 提供商如果redc支持变化端口和路径使用不同的 C2 框架。日志清理redc本身会在服务器上执行命令考虑在server模块中增加部署后清理历史命令 (history -c) 或配置无历史记录 Shell 的步骤。redc是一个强大的效率工具但它不是“银弹”。它封装了复杂性但并未消除红队基础设施固有的对抗性。它让你从繁琐的搭建中解放出来从而将更多精力投入到更核心的战术设计、漏洞利用和内网横向移动上。理解其原理熟练其操作并在此基础上进行创新和对抗性改进才是使用这类工具的正确姿势。