基于Caddy实现的C2前置代理 - RedCaddy

简介: 发觉每次部署CS,尤其是,都挺麻烦,于是就萌生了写一款能够一键部署好前置代理的工具。

0x01 Intro

起因:

  • • 发觉每次部署CS,尤其是,都挺麻烦,于是就萌生了写一款能够一键部署好前置代理的工具。
  • • 期间尝试过RedGuard,RedWarden,其中的话,RedGuard一使用自个的profile就报错了,应该是parser没弄好,而RedWarden的话,写得很完美了,但是beacon一多,就会有很大延时(性能下降),但是两款工具都非常好了,RedGuard有自动配置假ssl证书,但是看上去不支持多个端口,作者的思路是通过假host头去进行流量转发,配置依旧不够灵活;RedWarden的话,配置很详细,性能问题除外,其他都很好。
  • • 后面看到了c2modrewrite,该项目的思路就是用apache和nginx这种成熟的http服务去一键生成针对proifle的流量转发配置(主要是识别uri path)就不用像上述两款项目一样重写一个转发器。
  • • 结合上述三款项目的思路,于是就有了现在这个项目.


0x02 设计思路

主要围绕以下5点

  • • Core
  • • Basic blacklists (UA & IP)
  • • Header matcher & Reverse proxy (main)
  • • GeoIP
  • • SSL

扩展围绕以下2点

  • • Teamserver端口保护
  • • 真白名单上线

0x001 First: core

1、首先的话,我们就不手撸一个http服务作为核心了(作者也没那本事),我们可以选中已有的开源http服务作为核心,这里选中了caddy作为核心,主要是配置挺方便,性能也高

2、Caddy需要修改一下tls部分,使其支持老系统(win7 / windows2008)https上线(但是可惜的是,2003只支持SSL2.0,而caddy本身不支持SSL2.0),以下两个commit是必须

3、个人经过多次实战测试发现,Caddy的配置文件还需要加上这一段算法支持,才能完全支持老系统上线

4、为了实现GEOIP和后面的扩展,需要添加两个外部模块(包含在了上述commit中)

0x002 Second: Basic blacklists

1、基本黑名单是给我们普通模式下防护用的,防止恶意IP,沙箱IP,防止沙箱以及空间测绘之类的,黑名单IP用的是RedGuard + 自己实战抓的沙箱ip,一点点的补充上去

2、UA头黑名单,这个思路是来自以下文章 [🇬🇧 Carrying the Tortellini’s golf sticks | APT::WTF - APTortellini’s blog (aptw.tf)]https://aptw.tf/2021/11/25/c2-redirectors-using-caddy.html

3、还有基本安全配置

4、结合上述三点,在Caddy配置文件里面可以这样呈现

0x003 GEOIP

1、从RedWarden学来的思路,我们还可以用GEOIP来限制国家IP上线,本人的话就限制只能CN上线即可

2、记得要在caddy添加GEOIP模块

0x004 Header matcher & reverse proxy

1、使用严格的转发策略,要headers完全匹配了,才能上线,caddy对于这块处理,不吃性能;对于用了CDN的,可以把来源头带有x-forwarded-for继续转发给CS,让CS识别为来源IP,没使用CDN的话,就把x-forwarded-for填入来源IP转发给CS即可

这也意味着CS profile的set trust_x_forwarded_for "true";必须一直开着

2、对于Host头伪造,只能伪造证书SAN里面有的域名,星号则意味着你能随便伪造xxx.jd.com之类的host头,因为caddy会对host头去认证回你自己的证书

0x005 SSL证书伪造

1、原先是用carboncopy的思路,使用python库去伪造SSL证书,后面在实战过程中遇到了很多奇奇怪怪的问题,上不了线,Caddy提示证书有问题之类的情况(mkcert项目也一样的情况)

2、后面使用了这个帖子,使用openssl生成一张假的证书即可 [How to create an HTTPS certificate for localhost domains (github.com)]https://gist.github.com/cecilemuller/9492b848eb8fe46d462abeb26656c4f8

3、self-signed-cert.py

4、同时会生成store文件,直接在cs用就可以了

0x006 扩展1:Teamserver Guard

1、善用CGI模块,即可做出一个白名单模式去保护Teamserver后端,使用特殊头 + 特殊链接访问触发添加iptables接受来源ip流量,才能访问到teamserver连接端口

2、特殊URL可以随机生成,给自己的队友知道就好了,得益于反向代理的强大,我们可以把它放在和cs回连的端口,如图,443也是CS上线交互的端口

3、后端脚本

4、效果如下,触发之前无法访问到teamserver,之后就可以,有效防止爆破,如图当前是不能访问到50050

After

0x007 扩展2:真白名单上线模式

1、实现:目标机器触发请求到前置代理,前置代理执行脚本发送信息到钉钉机器人问你是否上线,期间会有60秒冗余时间让你选择,60秒内,目标机器的流量将会进入拒绝模式,防止蓝队人员进行扫描,爆破,在60秒内,你在钉钉将会收到上线信息,如果超过60秒,该IP的流量将不会继续拦截(依旧不能上线CS),意味着你还能继续发送上线申请

如图所示,超时了没有点击上线的,提示链接过期

允许

拒绝

2、可以使用go写一个敲门的东西触发请求(用完记得删),落地到受害者机器上执行

3、同时这几种状态的IP地址,都会被记录下来,deny和others的,一般都是蓝队人员的ip了,意味着他们抓到了你的敲门工具

4、后端脚本,bash脚本负责初始化,然后后面交给python脚本处理,60秒过后放行(依旧不能上线CS)

5、Python脚本,在进入60秒内,会起一个随机端口 + 随机uri的链接用作接收信号,发送到钉钉(本人不会用钉钉的outgoing方法,临时想到这种歪门邪道)

6、flask端收到信号后,会立即关闭服务

7、钉钉提醒(机器人关键字whitelist)

8、IP记录

9、白名单模式并不是万能的,如果你需要套CDN的话,那就没得办法了,因为来源ip都是随机的

0x03 封装

1、要封装成一键生成Caddy配置文件的脚本,首先用到的是来自RedWarden的CobaltStrike Malleable Parser,用来读取CS Profile,获取http-stager / get /post (默认),但是我自己用的profile还合并了 http-get / post (geacon),应对这种复杂的profile,只有RedWarden的parser写得很好

2、指定转发链文件,流量从哪进来,转发到哪,如下图所示,流量从443进来,转发到192.168.128.64:10001(c2 backend,默认的话一般写你 ifconfig看到的ip),同时关键字warden表示该端口同时用作Teamserver端口保护的开关(反向代理),50050表示你的teamserver端口

白名单模式下的转发链,https后面直接接入关键字warden不接IP,表示这个端口将会是作为Teamserver + beacon上线的白名单开关

3、封装脚本如下(vps ip填写你真实的vps ip)

黑名单模式(默认)(适用来钓鱼之类的冲锋动作)

白名单模式

同时会在当前目录生成teamserver-guard文件夹,放在协作平台给队友就好了

4、生成的caddyfile在core目录下即可看到了,还有假证书也在core目录下

0x05 演示

1、生成假证书,复制store和pass文件到cs目录

2、获取本地ip,并且配置转发链(这边演示用的是白名单模式)

3、生成配置文件,指定好vps真实的外部IP,还有dingtalk的bot token

4、运行

5、去到cs,修改profile里面的store文件密码,还有teamserver脚本

pass.txt 获取 keystore密码

修改profile

修改teamserver 端口和keystore的密码

6、启动CS

7、没触发teamserver添加白名单前

8、触发后

9、cs配置

10、白名单模式下,你需要手动查看 caddyfile获取到白名单敲门的信息

request-go.exe

11、没触发白名单请求之前

12、触发

13、Linux同理,如图,1443使用的是geacon的profile,用来给geacon上线用

0x04 Outro

  • • 项目链接:https://github.com/XiaoliChan/RedCaddy 希望有看完的大哥觉得还不错的话可以给小弟我点个star
  • • 目前白名单模式只支持DingTalk机器人提醒,后续的话也许会添加TG Bot
  • • 基本上,如果你有一个调好的Profile,配置一个CS(单IP),也挺快的,5到6分钟左右就搞定了,IP黑了就立马换,也懒得去想那么多
  • • 黑名单模式(默认)下,本人还没有测过合法域名 + 证书上线,有需要的可以自行测一测


相关文章
|
6月前
|
应用服务中间件 nginx
nginx代理使用步骤
nginx代理使用步骤
|
6月前
|
前端开发 JavaScript 应用服务中间件
Vite配置Proxy代理解决跨域问题
Vite配置Proxy代理解决跨域问题
650 0
|
6月前
|
Cloud Native Java Go
gPRC代理方式详细介绍
gPRC代理方式详细介绍
56 0
|
8月前
|
JavaScript 前端开发 应用服务中间件
Vue 前端接口跨域,本地 Nginx 代理配置
Vue 前端接口跨域,本地 Nginx 代理配置
310 0
|
12月前
SoapUI 访问代理设置
SoapUI 访问代理设置
128 0
|
存储 缓存 应用服务中间件
Nginx代理服务 - 代理缓冲区、代理重新定义请求头、代理连接超时
1. 代理缓冲区 代理服务器可以缓存一些响应数据,来减少I/O损耗,数据默认存储在内存中,当内存不够时,会存储到硬盘上。
|
JavaScript 前端开发 网络安全
BurpSuite2021 -- 代理模块(Proxy)
BurpSuite2021 -- 代理模块(Proxy)
120 0
BurpSuite2021 -- 代理模块(Proxy)
|
JavaScript 前端开发 安全
Burpsuite系列 -- proxy模块介绍
Burpsuite系列 -- proxy模块介绍
145 0
Burpsuite系列 -- proxy模块介绍
|
Java
Springboot配置全局跨域未生效,接口访问报错解决方法
Springboot配置全局跨域未生效,接口访问报错解决方法
1093 0
|
Kubernetes Docker 容器
代理配置
代理配置
146 0