自主搭建C2基础设施

C2基础设施

配置准备

  • 一台VPS
  • 一个域名,同时解析到了该VPS
  • 配备了自己的C2工具(这里以CobaltStrike为例)

过程

生成Let’s Encrypt证书

需要准备 snapd 这个软件,参考:Certbot Instructions | Certbot (eff.org)

1
2
3
4
5
6
7
8
snap install core
##core 16-2.60.4 from Canonical✓ installed
snap refresh core
##snap "core" has no updates available
snap install --classic certbot
##certbot 2.8.0 from Certbot Project (certbot-eff✓) installed
ln -s /snap/bin/certbot /usr/bin/certbot
certbot certonly -d <自己域名> --nginx --register-unsafely-without-email --agree-to

成功画面如下

image

证书时间问题:Let’s Encrypt证书通常只有90天,续签证书:cerbot renew --dry-run

续签之后,需要重新加载 Apache/nginx 服务

1
2
3
# 将证书复制到Linux下证书保存的位置
cp /etc/letsencrypt/live/<域名>/fullchain.pem /etc/ssl/certs/CSpublic.pem
cp /etc/letsencrypt/live/<域名>/privkey.pem /etc/ssl/private/CSprivate.pem

配置 C2侧写

本文采用 jquery C2侧写文件(JQuery C2侧写),因为CobaltStrike的版本是4.7,所以采用jquery-c2.4.7.profile

编辑该C2侧写,以下是必须要修改的地方

设置Beacon的UserAgent头(会在下面配置nginx转发器中作为过滤条件):set useragent "<自己要用的UserAgent头>"

image

设置密钥存储内容

为了将证书和密钥导入到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

image

考虑到避免分发攻击载荷被防守方拉取而导致被识别特征,将Stager监听器关闭,在http-stager 块中如下设置:

1
2
3
4
http-stager {
set host_stage "false"

}

修改 CobaltStrike 的 Server 启动文件,一个是默认端口,一个是证书密钥的存储文件及其对应的密码

image

利用c2lint工具(CobaltStrike自带的),检查C2侧写是否存在语法问题。

1
./c2lint ./C2Profiles/jquery-c2.4.7.profille

image

配置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
2
3
4
5
6
7
8
9
10
11
12
13
#####################
# SSL Configuration
#####################
listen 443 ssl;
listen [::]:443 ssl;
ssl on;

ssl_certificate /etc/ssl/certs/cspublic.pem; # managed by Certbot
ssl_certificate_key /etc/ssl/private/csprivate.pem; # managed by Certbot
ssl_session_cache shared:le_nginx_SSL:1m; # managed by Certbot
ssl_session_timeout 1440m; # managed by Certbot
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # managed by Certbot
ssl_prefer_server_ciphers on; # managed by Certbot

过滤设置,如果不行自己的C2基础设施被情报猎人捕获,就需要设置相应的过滤配置,例如我这里设定了 访问指定的UA头才能获取转发到Beacon

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.*)$ {

if ($http_user_agent != "<自己的UA头>") {
return 302 $REDIRECT_DOMAIN$request_uri;
}
proxy_pass $C2_SERVER;

# If you want to pass the C2 server's "Server" header through then uncomment this line
# proxy_pass_header Server;
expires off;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}

重启Nginx服务器 systemctl restart nginx

如果无法重启,可以通过systemctl status nginx 查看报错原因,慢慢调试。

简单的Nginx配置文件

这里默认是生成http的,可以自行更改内容,如果不想更改,可以使用下面简单的转发配置。

修改 Nginx 配置文件:/etc/nginx/nginx.conf,添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 443;
ssl on;
ssl_certificate /etc/ssl/certs/CSpublic.pem;
ssl_certificate_key /etc/ssl/private/CSprivate.pem;

server_name googlarchives.top;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

location ~*/ {
if ($http_user_agent != "InnocentHack2you") {
return 403;
}
proxy_pass https://localhost:8443;
}
}

上面if条件中是,如果不是指定的 UA头 ,就会返回 403

重启nginx服务:systemctl restart nginx

问题

Beacon不上线

首先看转发器等是否有问题,可以利用curl工具,看能否正常通信:

1
curl -k https://<ip或域名>`  和 `curl -k https://<ip或域名> -A "<指定UA>"

image

这里测试没有问题,那么就要考虑Beacon和Listener之间的通信了。

先看看Beacon的启动状况,利用ProcessHacker工具,这里Beacon请求的地址有些奇怪。

image

spcr-11.tutoriaisdeinformatica.com 一个毫不相关的域名

先将证书更换成自签名证书,Beacon 会是会请求这个域名

排查到最后,问题出现在测试机上(http的beacon能上线,https的beacon不能上线)