隐藏你的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
访问流程
传统网络访问流程:
- 用户在浏览器中输入目标网站的 URL
- 浏览器向域名解析服务器(DNS,Domain Name System,域名系统,是因特网上域名和 IP 地址相互映射的一个分布式数据库)发出解析请求,获得此域名对应的 IP 地址
- 浏览器得到这个 IP 地址,向其对应的服务器发出访问请求
- 目标服务器对此作出响应,将数据回传至用户浏览器并显示出来
与传统访问方式不同,CDN 网络则是在用户和服务器之间增加 Cache 层,将用户的访问请求引导到 Cache 节点而不是目标服务器站点,要实现这一目的,主要是通过接管 DNS 实现
下图为腾讯 CDN 架构图
- 当用户点击网站页面上的内容 URL,经过本地 DNS 系统解析,DNS 系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器
- CDN 的 DNS 服务器将 CDN 的全局负载均衡设备最佳接入 IP 地址返回用户
- 用户向 CDN 的全局负载均衡设备最佳接入的 IP 地址发起内容URL访问请求
- CDN 全局负载均衡设备根据用户 IP 地址,以及用户请求的内容 URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求
- 区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户 IP 地址,判断哪一台服务器距用户最近;根据用户所请求的 URL 中携带的内容名称(请求头中的 host 字段),判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址
- 全局负载均衡设备把服务器的IP地址返回给用户
- 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地
其中需要注意的是 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 加速平台加速
目标主机可以上线
总结
- 找高信誉域名,申请CDN,加速域名,加速的服务器地址攻击者 VPS IP 地址
- 使用超级 ping 拿到 CDN 的 IP 地址
- 设置 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
修改端口即可
推荐阅读
- 域前置攻击复现 | 域前置水太深,偷学六娃来隐身
- 域前置溯源方法思考
- 暗度陈仓:基于国内某云的 Domain Fronting 技术实践
- 红队攻防基础建设—C2 IP隐匿技术
- 红队实战攻防技术(一)
- 红队实战攻防技术(二)
以上是关于隐藏你的C2(使用域前置技术隐藏C2服务器,以及使用iptables策略来保护服务器)的主要内容,如果未能解决你的问题,请参考以下文章