红队基础设施多云自动化部署工具
探索更多Tricks »
🧐如何使用
·
⬇️下载程序
·
❔反馈Bug
·
🍭提交需求
中文 | English
Redc 基于 Terraform 封装,将红队基础设施的完整生命周期(创建、配置、销毁)进一步简化。
Redc 不仅仅是开机工具,更是对云资源的自动化调度器!
- 一条命令交付,从购买机器到服务跑起来一条龙,无需人工干预
- 多云部署支持,适配阿里云、腾讯云、AWS 等主流云厂商
- 场景预制封装,红队环境 ”预制菜“,再也不用到处找资源
- 状态资源管理,本地保存资源状态,随时销毁环境,杜绝资源费用浪费
REDC 下载地址:https://github.com/wgpsec/redc/releases
下载系统对应的压缩文件,解压后在命令行中运行即可。
安装
brew tap wgpsec/tap
brew install wgpsec/tap/redc更新
brew update
brew upgrade redc场景名称 - 对应模板仓库 https://github.com/wgpsec/redc-template
放到你 redc-templates 路径下,对应的 "文件夹名称" 就是部署时的场景名称
每个场景的具体使用和命令请查看模板仓库 https://github.com/wgpsec/redc-template 里具体场景的 readme
默认下 redc 会读取当前路径的 config.yaml 配置文件,格式如下
# 多云身份凭证与默认区域
providers:
aws:
access_key: "AKIDXXXXXXXXXXXXXXXX"
secret_key: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"
region: "us-east-1"
aliyun:
access_key: "AKIDXXXXXXXXXXXXXXXX"
secret_key: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"
region: "cn-hangzhou"
tencentcloud:
access_key: "AKIDXXXXXXXXXXXXXXXX"
secret_key: "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"
region: "ap-guangzhou"在配置文件加载失败的情况下,会尝试读取系统环境变量,使用前请配置好
redc设计为docker like命令设计
使用 redc -h 可以查看常用命令帮助
初始化模版
首次使用模版需要运行。为了加快模版部署速度,在修改 redc-templates 内容后建议运行 init 选项加快后续部署速度
redc init默认只有 阿里云 ecs 单台机器场景,请自行添加模板至 redc-templates 路径下
列出模版列表
redc image ls创建实例并启动
ecs 为模版文件名称
redc create --name boring_sheep_ecs [模版名称] # 创建一个实例并plan(该过程不会创建实例,只是检查信息)
# create创建完成后会返回caseid 可使用start命令启动
redc start [caseid]
redc start [casename]直接创建模版名称为 ecs 的 case 并启动
redc run ecs
开启后会给出 case id ,这是标识场景唯一性的识别 id,后续操作都需要用到 case id 例如 8a57078ee8567cf2459a0358bc27e534cb87c8a02eadc637ce8335046c16cb3c 可以用 8a57078ee856 效果一样
使用-e 参数可配置变量
redc run -e xxx=xxx ecs
停止实例
redc stop [caseid] # 停止实例
redc rm [caseid] # 删除实例(删除前确认实例是否已经停止)
redc kill [caseid] # init模版后停止实例并删除查看case情况
redc ps
执行命令
直接执行命令并返回结果
redc exec [caseid] whoami
进入交互式命令
redc exec -t [caseid] bash
复制文件到服务器
redc cp test.txt [caseid]:/root/
下载文件到本地
redc cp [caseid]:/root/test.txt ./
更改服务
这个需要模版支持更改,可实现更换弹性公网ip
redc change [caseid]
redc 提供了一个编排服务
启动编排服务
redc compose up
关闭compose
redc compose down
文件名称:redc-compose.yaml
compose 模版
version: "3.9"
# ==============================================================================
# 1. Configs: 全局配置中心
# 作用: 定义可复用的静态资源,redc 会将其注入到 Terraform 变量中
# ==============================================================================
configs:
# [文件型] SSH 公钥
admin_ssh_key:
file: ~/.ssh/id_rsa.pub
# [结构型] 安全组白名单 (将被序列化为 JSON 传递)
global_whitelist:
rules:
- port: 22
cidr: 1.2.3.4/32
desc: "Admin Access"
- port: 80
cidr: 0.0.0.0/0
desc: "HTTP Listener"
- port: 443
cidr: 0.0.0.0/0
desc: "HTTPS Listener"
# ==============================================================================
# 2. Plugins: 插件服务 (非计算资源)
# 作用: 独立于服务器的云资源,如 DNS 解析、对象存储、VPC 对等连接等
# ==============================================================================
plugins:
# 插件 A: 阿里云 DNS 解析
# 场景: 基础设施启动后,自动将域名指向 Teamserver IP
dns_record:
image: plugin-dns-aliyun
# 引用外部定义的 provider 名称
provider: ali_hk_main
environment:
- domain=redteam-ops.com
- record=cs
- type=A
- value=${teamserver.outputs.public_ip}
# 插件 B: AWS S3 存储桶 (Loot Box)
# 场景: 仅在生产环境 ('prod') 启用,用于存放回传数据
loot_bucket:
image: plugin-s3
profiles:
- prod
provider: aws_us_east
environment:
- bucket_name=rt-ops-2026-logs
- acl=private
# ==============================================================================
# 3. Services: Case场景
# ==============================================================================
services:
# ---------------------------------------------------------------------------
# Service A: 核心控制端 (Teamserver)
# 特性: 总是启动 (无 profile),包含完整生命周期钩子和文件流转
# ---------------------------------------------------------------------------
teamserver:
image: ecs
provider: ali_hk_main
container_name: ts_leader
# [Configs] 注入全局配置 (tf_var=config_key)
configs:
- ssh_public_key=admin_ssh_key
- security_rules=global_whitelist
environment:
- password=StrongPassword123!
- region=ap-southeast-1
# [Volumes] 文件上传 (Local -> Remote)
# 机器 SSH 连通后立即执行
volumes:
- ./tools/cobaltstrike.jar:/root/cs/cobaltstrike.jar
- ./profiles/amazon.profile:/root/cs/c2.profile
- ./scripts/init_server.sh:/root/init.sh
# [Command] 实例内部自启动
command: |
chmod +x /root/init.sh
/root/init.sh start --profile /root/cs/c2.profile
# [Downloads] 文件回传 (Remote -> Local)
# 启动完成后抓取凭证
downloads:
- /root/cs/.cobaltstrike.beacon_keys:./loot/beacon.keys
- /root/cs/teamserver.prop:./loot/ts.prop
# ---------------------------------------------------------------------------
# Service B: 全球代理矩阵 (Global Redirectors)
# 特性: 矩阵部署 (Matrix Deployment) + Profiles
# ---------------------------------------------------------------------------
global_redirectors:
image: nginx-proxy
# [Profiles] 仅在指定模式下启动 (e.g., redc up --profile prod)
profiles:
- prod
# [Matrix] 多 Provider 引用
# redc 会自动裂变出:
# 1. global_redirectors_aws_us_east
# 2. global_redirectors_tencent_sg
# 3. global_redirectors_ali_jp (假设 providers.yaml 里有这个)
provider:
- aws_us_east
- tencent_sg
- ali_jp
depends_on:
- teamserver
configs:
- ingress_rules=global_whitelist
# 注入当前 provider 的别名
environment:
- upstream_ip=${teamserver.outputs.public_ip}
- node_tag=${provider.alias}
command: docker run -d -p 80:80 -e UPSTREAM=${teamserver.outputs.public_ip} nginx-proxy
# ---------------------------------------------------------------------------
# Service C: 攻击/扫描节点
# 特性: 攻击模式专用
# ---------------------------------------------------------------------------
scan_workers:
image: aws-ec2-spot
profiles:
- attack
deploy:
replicas: 5
provider: aws_us_east
command: /app/run_scan.sh
# ==============================================================================
# 4. Setup: 联合编排 (Post-Deployment Hooks)
# 作用: 基础设施全部 Ready 后,执行跨机器的注册/交互逻辑
# 注意: redc 会根据当前激活的 Profile 自动跳过未启动服务的相关任务
# ==============================================================================
setup:
# 任务 1: 基础检查 (总是执行)
- name: "检查 Teamserver 状态"
service: teamserver
command: ./ts_cli status
# 任务 2: 注册 AWS 代理 (仅 prod 模式有效)
# 引用裂变后的实例名称: {service}_{provider}
- name: "注册 AWS 代理节点"
service: teamserver
command: >
./aggressor_cmd listener_create
--name aws_http
--host ${global_redirectors_aws_us_east.outputs.public_ip}
--port 80
# 任务 3: 注册 Tencent 代理 (仅 prod 模式有效)
- name: "注册 Tencent 代理节点"
service: teamserver
command: >
./aggressor_cmd listener_create
--name tencent_http
--host ${global_redirectors_tencent_sg.outputs.public_ip}
--port 80
# 任务 4: 注册 Aliyun 代理 (仅 prod 模式有效)
- name: "注册 Aliyun 代理节点"
service: teamserver
command: >
./aggressor_cmd listener_create
--name ali_http
--host ${global_redirectors_ali_jp.outputs.public_ip}
--port 80
仅配置缓存地址:
echo 'plugin_cache_dir = "$HOME/.terraform.d/plugin-cache"' > ~/.terraformrc配置阿里云加速 修改 /.terraformrc 文件
plugin_cache_dir = "$HOME/.terraform.d/plugin-cache"
disable_checkpoint = true
provider_installation {
network_mirror {
url = "https://mirrors.aliyun.com/terraform/"
# 限制只有阿里云相关 Provider 从国内镜像源下载
include = ["registry.terraform.io/aliyun/alicloud",
"registry.terraform.io/hashicorp/alicloud",
]
}
direct {
# 声明除了阿里云相关Provider, 其它Provider保持原有的下载链路
exclude = ["registry.terraform.io/aliyun/alicloud",
"registry.terraform.io/hashicorp/alicloud",
]
}
}
- 先创建新项目
- 指定项目下要创建场景会从场景库复制一份场景文件夹到项目文件夹下
- 不同项目下创建同一场景互不干扰
- 同一项目下创建同一场景互不干扰
- 多用户操作互不干扰(本地有做鉴权,但这个实际上要在平台上去做)
- redc 配置文件 (.redc.ini)
- 项目1 (./project1)
- 场景1 (./project1/[uuid1])
- main.tf
- version.tf
- output.tf
- 场景2 (./project1/[uuid2])
- main.tf
- version.tf
- output.tf
- 项目状态文件 (project.ini)
- 场景1 (./project1/[uuid1])
- 项目2 (./project2)
- 场景1 (./project2/[uuid1])
- main.tf
- version.tf
- output.tf
- 场景2 (./project2/[uuid2])
- ...
- 项目状态文件 (project.ini)
- 场景1 (./project2/[uuid1])
- 项目3 (./project3)
- ...


![redc stop [caseid]](/wgpsec/redc/raw/master/img/image7.png)

![redc exec [caseid] whoami](/wgpsec/redc/raw/master/img/image3.png)
![redc exec -t [caseid] bash](/wgpsec/redc/raw/master/img/image4.png)
![redc cp test.txt [caseid]:/root/](/wgpsec/redc/raw/master/img/image5.png)
![redc cp [caseid]:/root/test.txt ./](/wgpsec/redc/raw/master/img/image6.png)