隐藏你的C2(使用域前置技术隐藏C2服务器,以及使用iptables策略来保护服务器)

Posted OceanSec

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了隐藏你的C2(使用域前置技术隐藏C2服务器,以及使用iptables策略来保护服务器)相关的知识,希望对你有一定的参考价值。


之前有一篇文章写过通过 CS 的重定向器来隐藏 C2 服务器, 我是链接,本文将会介绍使用域前置技术隐藏C2服务器,以及使用iptables策略来保护服务器

隐藏C2

CDN域前置

Domain Fronting 域前置指一种用于隐藏真实C2服务器IP且同时能伪装为与高信誉域名通信的技术,其通过CDN节点将流量转发到真实的C2服务器,其中CDN节点 ip 通过识别请求的 Host 头进行流量转发,首先来了解下啥是CDN

CDN

CDN的全称是Content Delivery Network,即内容分发网络,使用户可就近取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度

可以看一下 b 站的视频:https://www.bilibili.com/video/BV1jS4y197zi

访问流程

传统网络访问流程:

  1. 用户在浏览器中输入目标网站的 URL
  2. 浏览器向域名解析服务器(DNS,Domain Name System,域名系统,是因特网上域名和 IP 地址相互映射的一个分布式数据库)发出解析请求,获得此域名对应的 IP 地址
  3. 浏览器得到这个 IP 地址,向其对应的服务器发出访问请求
  4. 目标服务器对此作出响应,将数据回传至用户浏览器并显示出来

与传统访问方式不同,CDN 网络则是在用户和服务器之间增加 Cache 层,将用户的访问请求引导到 Cache 节点而不是目标服务器站点,要实现这一目的,主要是通过接管 DNS 实现

下图为腾讯 CDN 架构图

  1. 当用户点击网站页面上的内容 URL,经过本地 DNS 系统解析,DNS 系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器
  2. CDN 的 DNS 服务器将 CDN 的全局负载均衡设备最佳接入 IP 地址返回用户
  3. 用户向 CDN 的全局负载均衡设备最佳接入的 IP 地址发起内容URL访问请求
  4. CDN 全局负载均衡设备根据用户 IP 地址,以及用户请求的内容 URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求
  5. 区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户 IP 地址,判断哪一台服务器距用户最近;根据用户所请求的 URL 中携带的内容名称(请求头中的 host 字段),判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址
  6. 全局负载均衡设备把服务器的IP地址返回给用户
  7. 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地

其中需要注意的是 CDN 的工作机制中一般情况下,1台 CDN 会同时负责多个网站的加速服务,这时 CDN 通过请求流量中请求头的 host 字段来判断用户所要访问的服务器,这也是 host 请求头存在的意义

如果对于 host 使用有问题的话可以看下这篇文章:[https://www.anquanke.com/post/id/195011#h2-1]

配置CDN

首先需要有自己的域名用来配合 CDN 来隐藏C2服务器,然后再申请一个 CDN 对我们的所申请的域名进行加速,在这个过程中CDN会要求我们在域名的解析配置中设置相应的 CNAME

添加 CDN,我使用的阿里云 CDN,可以看到现在阿里云的加速域名需要验证后才可以使用,且加速区域含中国内地时,加速域名必须备案,数据在8小时左右同步,演示我就用自己的域名了,实际中用自己的域名域前置就没有意义了

验证因为方法一我用不了,是不是阿里云搞得鬼(域名是的在腾讯云买的),用的文件验证

这里需要注意的是,文件验证我这里这里使用的裸域名,在域名解析设置时主机记录选择 @

关于裸域名可以看知乎回答:https://www.zhihu.com/question/20414602

添加之后更换解析记录值

效果

1.配置完毕后,使用 nslookup 命令发现主机 IP 地址已经变化

2.测试:执行以下操作

curl 202.97.231.47  -H "Host: ocean.cn" -v

host 是配置的 CDN 加速域名

访问后可以在 CS web 日志中看到

也能说明 CDN 设置成功

3.使用 ping 检测可以发现各地 IP 地址都不相同

这里选取三个 CDN 地址进行接下来的操作

  • 140.249.61.99
  • 221.181.200.201
  • 202.97.231.47

隐藏C2

配置CS Profile

CDN 申请完成后,就可以开始编辑 Cobalt Strike 要用到的 C2 Profile 文件了,直接使用开源项目 Malleable-C2-Profiles 中的 amazon.profile,但需要把其中的 Host 头改成我们自己在 CDN 中绑定的域名

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

修改以下几处

  • 19行的 host

  • 53行的 host

上线CS

服务器使用命令开启 TeamServer

./teamserver xxx.xxx.xxx.xxx password amazon.profile

配置监听器

配置HTTPS Hosts为之前获取的CDN IP,HTTP Host(Stager)为 ocean888.cn,也就是我们配置的加速域名,端口80不能换,开启监听器

生成一个后门

触发后门文件,使用 wireshark 抓取流量

可以发现这里的 host 已经变成了 CDN 域名,在实际攻击中我们需要找一个高信誉域名在 CDN 加速平台加速

目标主机可以上线

总结

  1. 找高信誉域名,申请CDN,加速域名,加速的服务器地址攻击者 VPS IP 地址
  2. 使用超级 ping 拿到 CDN 的 IP 地址
  3. 设置 CS profile,设置监听器,上线 CS,隐藏了真实 VPS 地址

利用 Domain Fronting 技术,在目标主机上只能看到系统是在和一个高信誉域名通信,并且不会产生任何与我们真实C2服务器的直接通信流量,伪装的同时还极佳地隐藏了我们的C2服务器,利用此技术,我们可以有效地躲避各种IDS,实施渗透测试

iptables保护C2

有时候使用socat进行转发的时候其稳定性以及速率可能不是那么好,对于流量比较多的情况也许可以使用iptables进行此操作,同时对cs服务器设定一些访问策略,对真实的cs服务器起到一定保护作用

流量转发

iptables中的“四表五链”及“拥堵策略”

“四表”是指,iptables的功能——filter, nat, mangle, raw

  • filter:控制数据包是否允许进出及转发(INPUT、OUTPUT、FORWARD),可以控制的链路 有input, forward, output
  • nat:控制数据包中地址转换,可以控制的链路有prerouting(路由前), input, output, postrouting
  • mangle:修改数据包中的原数据,可以控制的链路有prerouting), input, forward, output, postrouting
  • raw:控制nat表中连接追踪机制的启用状况,可以控制的链路有prerouting, output

有关iptables具体介绍可以看下面这篇文章

https://www.cnblogs.com/vathe/p/6973656.html

使用示例:

iptables –[A|I] [-i|o 网络接口] [-p 协议] [-s 来源ip/网域] [-d 目标ip/网域] –j[ACCEPT|DROP]

Iptables设置

首先我需要在跳板机A上使用以下命令将8081端口接收到的流量转发至CS服务器的80端口 (协议和端口可自由替换)

iptables -I INPUT -p tcp -m tcp --dport 8081 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 8081 -j DNAT --to-destination xxx.xxx.xxx.xxx:8081//这个45323是我的teamserver连接端口,我也给转发到跳板机上去了,以后都从跳板机进行登录了
iptables -I INPUT -p tcp -m tcp --dport 45323 -j ACCEPT iptables -t nat -A PREROUTING -p tcp --dport 45323 -j DNAT --to-destination xxx.xxx.xxx.xxx:45323 iptables -t nat -A POSTROUTING -j MASQUERADE sysctl net.ipv4.ip_forward=1
使用iptables -nL --line-number -t 表名 查看当前设置好的规则

然后我们在cs服务器上设置对8081端口,以及45323端口的访问控制,以及在cs服务器上设置 对整个服务器(全部ip)禁止9100端口

iptables -I INPUT -p tcp --dport 8081 -j DROPiptables -I INPUT -p tcp --dport 45323 -j DROP //只允许跳板机访问这些端口端口 iptables -I INPUT -s xxx.xxx.xxx.xxx -p tcp --dport 8081 -j ACCEPTiptables -I INPUT -s xxx.xxx.xxx.xxx -p tcp --dport 45323 -j ACCEPT
iptables -I INPUT -p tcp --dport 8081 -j DROP
iptables -I INPUT -p tcp --dport 45323 -j DROP //只允许跳板机访问这些端口端口 
iptables -I INPUT -s xxx.xxx.xxx.xxx -p tcp --dport 8081 -j ACCEPT
iptables -I INPUT -s xxx.xxx.xxx.xxx -p tcp --dport 45323 -j ACCEPT

同意来自xxxx访问45323,8081端口,拒绝了其他地址对45323以及8081端口的访问,iptables的策略设置完成,把服务器地址改成跳板机的ip

然后我们建立一个http的监听器看看,host和stager都填写跳板机

之后简单生成一个后门,运行上线,可以看到cs的web日志显示出我的跳板机访问了 checksum8算法生成的url

一些文章通过URL的生成算法,以及对Beacon stage的解析来寻找Beacon staging server

https://mp.weixin.qq.com/s/WUf96myUi8F3X_eNWPRTdw

对于如何Bypass cs beacon的扫描,各位可以看下这篇文章

https://mp.weixin.qq.com/s/fhcTTWV4Ddz4h9KxHVRcnw

访问跳板机的此目录可下载 stage 文件,直接访问真实的cs服务器则无法下载。当然这种办法治标不治本,只能对真实的cs服务器起到那么一点保护作用,cs服务器的一些前期隐藏工作和检测规避手段网上有很多

转载链接:设置iptables规则来保护CS服务器

修改默认端口

Cs Teamserver50050端口太过瞩目,可能被蓝队溯源或者被 IDS 检测,所以需要更换成比较隐蔽的端口

vim teamserver

修改端口即可

推荐阅读

以上是关于隐藏你的C2(使用域前置技术隐藏C2服务器,以及使用iptables策略来保护服务器)的主要内容,如果未能解决你的问题,请参考以下文章

云函数隐藏c2服务器

【防溯源】如何通过域名 + CDN 完美隐藏你的 C2

利用域前置隐藏cs流量和ip,增加溯源难度

红队-C2 Server基础构建

红队-C2 Server基础构建

域前置Cobalt Strike逃避IDS审计