自主搭建C2基础设施
C2基础设施
配置准备
- 一台VPS
- 一个域名,同时解析到了该VPS
- 配备了自己的C2工具(这里以CobaltStrike为例)
过程
生成Let’s Encrypt证书
需要准备 snapd 这个软件,参考:Certbot Instructions | Certbot (eff.org)
1 | snap install core |
成功画面如下

证书时间问题:Let’s Encrypt证书通常只有90天,续签证书:
cerbot renew --dry-run续签之后,需要重新加载 Apache/nginx 服务
1 | # 将证书复制到Linux下证书保存的位置 |
配置 C2侧写
本文采用 jquery C2侧写文件(JQuery C2侧写),因为CobaltStrike的版本是4.7,所以采用jquery-c2.4.7.profile
编辑该C2侧写,以下是必须要修改的地方
设置Beacon的UserAgent头(会在下面配置nginx转发器中作为过滤条件):set useragent "<自己要用的UserAgent头>"

设置密钥存储内容
为了将证书和密钥导入到CobaltStrike中,需要先将证书和密钥合并成一个pkcs12文件,然后通过Keytool导入到Java的密钥存储(这里会用到Keytool工具)
1 | openssl pkcs12 -inkey /etc/ssl/private/CSprivate.pem -in /etc/ssl/certs/CSpublic.pem -export -out googl.pkcs12 |
利用keytool工具,将证书和密钥导入到CobaltStrike的密钥存储中,先生成store存储文件
1 | keytool -importkeystore -srckeystore googl.pkcs12 -srcstoretype pkcs12 -destkeystore googl.store |
导入存储文件
编辑C2侧写文件:nano jquery-c2.4.7.profille

考虑到避免分发攻击载荷被防守方拉取而导致被识别特征,将Stager监听器关闭,在http-stager 块中如下设置:
1 | http-stager { |
修改 CobaltStrike 的 Server 启动文件,一个是默认端口,一个是证书密钥的存储文件及其对应的密码

利用c2lint工具(CobaltStrike自带的),检查C2侧写是否存在语法问题。
1 | ./c2lint ./C2Profiles/jquery-c2.4.7.profille |

配置nginx转发器
C2侧写对应的Nginx配置文件
利用c2modrewrite工具,自动生成nginx配置文件
1 | python3 ./cs2nginx.py -i jquery.profile -c https://127.0.0.1:8443 -r https://www.baidu.com -H <自己域名> |
- -i 为模板文件,这个固定的,可以不用管。
- -c 为后端CS绑定的端口,这个会在后面CS的配置中有所体现
- -r 为不合要求的访问302重定向去的位置,这里填了百度
- -H 为你的域名,这里就是你配的那个
具体需要修改的内容如下:
配置证书文件
1 | ##################### |
过滤设置,如果不行自己的C2基础设施被情报猎人捕获,就需要设置相应的过滤配置,例如我这里设定了 访问指定的UA头才能获取转发到Beacon
1 | location ~ ^(/jquery-3.3.2.min.js.*|/jquery-3.3.2.slim.min.js.*|/jquery-3.3.1.slim.min.js.*|/jquery-3.3.1.min.js.*)$ { |
重启Nginx服务器 systemctl restart nginx
如果无法重启,可以通过
systemctl status nginx查看报错原因,慢慢调试。
简单的Nginx配置文件
这里默认是生成http的,可以自行更改内容,如果不想更改,可以使用下面简单的转发配置。
修改 Nginx 配置文件:/etc/nginx/nginx.conf,添加如下内容:
1 | server { |
上面if条件中是,如果不是指定的 UA头 ,就会返回 403
重启nginx服务:systemctl restart nginx
问题
Beacon不上线
首先看转发器等是否有问题,可以利用curl工具,看能否正常通信:
1 | curl -k https://<ip或域名>` 和 `curl -k https://<ip或域名> -A "<指定UA>" |

这里测试没有问题,那么就要考虑Beacon和Listener之间的通信了。
先看看Beacon的启动状况,利用ProcessHacker工具,这里Beacon请求的地址有些奇怪。

spcr-11.tutoriaisdeinformatica.com 一个毫不相关的域名
先将证书更换成自签名证书,Beacon 会是会请求这个域名
排查到最后,问题出现在测试机上(http的beacon能上线,https的beacon不能上线)