开头

在网上查阅资料,目前Cobalt Strike的隐藏主要通过CDN和Nginx反代来实现,但是查阅了很多资料没有看见有将两者结合起来实现的情况,所以就想尝试一下,最开始确实失败了,但是后面瞎折腾,也还是实现了cloudflare cdn和Nginx反向代理两种方法相结合的方式使目标上线,所以这里大致记录一下,过程中没有太多技术含量。

纯当过程记录。

准备工作

申请域名

这里使用了Freenom来注册了一个免费的域名,但是注册免费域名使用加密邮箱好像没注册成功,所以就用自己小号qq邮箱注册了一个免费的域名。

Freenom注册域名的教程其他地方有很多详细的,就不记录了。

绑定cloudflare

域名注册成功后,去cloudflare注册一个账号,并将域名绑定到cloudflare进行托管。

登录cloudflare后,添加站点的时候cloudflare会提供两个ns记录,回到Freenom平台,将ns记录替换即可成功绑定,网络上也有很多详细教程。

Nginx

过程中要搭配cdn和Nginx反代方式,所以需要用到Nginx,直接在vps上面安装一个Nginx即可,并进行绑定域名、安装证书、以及添加相关配置等操作。

  • 绑定域名

因为Freenom平台注册的域名以及交给了cloudflare,所以添加解析需要到cloudflare上面去添加域名解析。

  • 安装证书

安装证书使用acme进行,反正都是现成的直接用就行,使用如下命令进行证书的安装(适用于Nginx):

curl https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh -o acme.sh

chmod +x acme.sh

# 邮箱不清楚用什么,我使用的是我注册域名的邮箱。
acme.sh --register-account -m [email protected]

# -d那里更改为自己的域名,虽然说支持多个域名,但是我使用多个域名的时候一直失败。
# webroot不要更改。
acme.sh --issue -d www.xxx.com --webroot /usr/share/nginx/html/

# 证书文件的位置,自己想放哪放哪,后面Nginx配置路径配置对即可。
acme.sh --install-cert -d www.xxx.com \
--cert-file      /home/ssl/xxx_cert.pem  \
--key-file       /home/ssl/xxx_key.pem  \
--fullchain-file /home/ssl/xxx_fullchain.pem \
--reloadcmd     "nginx -s reload"

执行完上面这几条命令,那么网站的证书也基本安装完成了,如果中途出现错误,自行根据错误来解决。

  • 添加配置

默认的配置可以不用管,建议不用修改,因为修改后会麻烦,安装HTTPS证书的时候也必须要使用默认的Nginx配置文件才能安装成功。

先新增相关的Nginx配置文,可以放置于:**/etc/nginx/conf.d/** 目录下,Nginx会自动识别配置。

相关配置如下:

server{

    listen 80;

    listen www.xxx.xx;

    server_name www.xxx.xx;

    # 自己的网站目录;

    root /usr/share/nginx/web;

    index index.html;

    # 如果访问的网站目录为: abcdefg/123或者123456/abc时则将请求转发给c2服务器。

    location ~ ^(/abcdefg/123|/123456/abc)$ {

        proxy_pass http://127.0.0.1:8080;

        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;

    }

            

    location ~ /.well-know/acme-challenge {

        allow all;

        root /usr/src/acme-web/;

    }

    location = /.well-know/acme-challenge/ {

        return 404;

    }

    location = /update/ {

        return 404;

    }

}

server {

    listen 443 ssl;

    server_name www.xxx.xx;

    root /usr/share/nginx/web;

    ssl on;

    ssl_certificate /home/ssl/xxx_fullchain.pem;

    ssl_certificate_key /home/ssl/xxx_key.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

    ssl_prefer_server_ciphers on;

    ssl_session_timeout 10m;

    #SSL-END

    # 如果访问的网站目录为: abcdefg/123或者123456/abc时则将请求转发给c2服务器。 

    location ~ ^(/abcdefg/123|/123456/abc)$ {

        proxy_pass https://127.0.0.1:8443;

        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;

    }

    location = /update {

        return 404;

    }

    location = /viessys/ {

        return 404;

    }

}

将配置文件后缀更改为conf后放于/etc/nginx/conf.d/目录下,然后启动Nginx服务,并测试Nginx配置文件是否有错:

测试配置文件是否出错:nginx -t

重载Nginx配置:nginx -s reload

CS配置文件

上面都准备完后还是要定制一个C2的配置文件,以配合上一步中的Nginx配置使用。

关于cobalt strike malleable C2配置文件在github上面也有很多,自己找一个下来稍微修改修改即可,但是要把里面get请求和post请求的地址配置为和Nginx里面的代理地址一样,如:

# 截取get请求和post请求的地方,其他自行根据需要修改。

# 这是get请求的网站路径,自行修改。

http-get {

    set uri "/abcdefg/123";

    xxxxx;

    }

# 这是post请求的网站路径,自行修改。

http-post {

    set uri "/123456/abc";

    xxxxx;

    }

也有很多一建生成的工具,只是一键生成的工具特征可能比较明显。C2的配置文件设置完毕后,验证一下配置文件是否出错:

./c2lint test.profile

都没出错的话就准备往下继续。

CS证书

证书的修改另一篇文章写了,就不赘述。

开始配置

上面所有东西都配置完毕后,使用域名访问自己的网站正常,ping自己的域名IP也不是自己的,但是在CS还未设置监听的情况下,访问www.xxx.xx/abcdefg/123

的时候cloudflare会出错,样式如下:

所以需要登录CS配置监听器,按照下图的样式开启四个监听器:

由于访问 www.xx.xx/abcdefg/123 这个地址后,Nginx会把请求转发给Local_的本地监听器上,所以就实现了cdn+Nginx反代的方式,但是初次设置的话可能会出现上面502的类似错误,具体解决方式如下:

  • 编辑一下Local本地监听器,并添加自己的公网IP为HTTP Hosts。

  • 临时关闭一下vps的防火墙

  • 使用公网IP访问一下C2的地址,如:1.2.3.4:8080/abcdefg/123 这时访问返回的信息会和自己C2配置的返回信息一样。

  • 然后将IP更改为域名重复上一步骤的操作,看看能否正常访问到CS的地址,如果这样还是访问不到那我就不知道了,毕竟我也是瞎折腾才弄出来的;突然想起来可能也和cloudflare上面的缓存有关,这个未测试。

  • 这时候使用如: www.xx.xx/abcdefg/123 已经能正常访问到CS的地址了,然后再去vps上把防火墙打开,只放通80,443,ssh以及cs的连接端口即可。

  • 都能正常访问了后,将cs上面Local本地监听器上面的公网IP去掉,HTTP和HTTPS也是一样的操作。

  • 只实验了我自己,实际工作中未使用过该方式。

  • 最终实现CDN+Nginx反代方式实现目标机器上线。

这种方式我觉得更加的隐蔽了,使蓝队更加难以发现我们的C2服务器。

效果对比

使用这种方式后,去VT平台上查自己的域名,甚至连IP都查不到,再对比自己的博客,虽然我的博客也有cdn,但是能查到很多IP信息:

![C

最终,一台CS服务器,真实IP得不到,而且就开了80,443,ssh还有一个c2连接端口,看起来完全不像是一个C2服务器。