一文搞明白域前置(Domain Fronting)技术

Posted 思源湖的鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文搞明白域前置(Domain Fronting)技术相关的知识,希望对你有一定的参考价值。

前言

最近开始研究隧道相关,如前做了个整理——内网渗透系列:内网穿透(隧道)学习,现在学下比较新比较前沿的技术,本篇是Domain Fronting,即域前置技术

Domain Fronting 是 Fifield David 等研究人员在2015年提出的一种基于CDN的隐蔽通信方法,该方法至今仍被广泛应用于真实APT攻击和红蓝对抗中

一些资料:

一、概述

1、简介

域前置(Domain fronting):一种隐藏连接真实端点来规避互联网审查的技术。在应用层上运作时,域前置使用户能通过HTTPS连接到被屏蔽的服务,而表面上像在与另一个完全不同的站点通信

此技术的原理为在不同通信层使用不同的域名:

  • 在明文的DNS请求和TLS服务器名称指示(SNI)中使用无害的域名来初始化连接、公布给审查者
  • 实际要连接的“敏感”域名仅在建立加密的HTTPS连接后发出,使其不以明文暴露给网络审查者

这种举动在被封锁的站点与无害站点为同一个大型服务提供商时较为可行,例如由内容分发网络提供的服务。此时审查者通常很难区分被伪装流量与合法流量的特点,迫使审查者选择放行所有看似无害的流量,或者选择彻底封锁此域的流量。而彻底封锁可能带来显著的附加损害。

2、简单示例

(1)使用 curl 演示域前置

# curl DNS 查询 fastly.net 并和其建立 HTTPS 连接,服务器名称指示当然是 fastly.net,
# 但是 HTTP 头 的 Host 是 www.bbc.com。
# 这里 www.bbc.com 被 fastly.net 前置,屏蔽 www.bbc.com 而允许 fastly.net,
# 这种审查可以被域前置绕过。
curl https://fastly.net -H "Host: www.bbc.com" -s | grep -o '<title>.*</title>'
# curl 向维基媒体服务器 91.198.174.192 建立 HTTPS 连接,使用 www.mediawiki.org 作为服务器名称指示,
# 但是 HTTP 头的 Host 是 zh.wikipedia.org。
# 这里 zh.wikipedia.org 被 www.mediawiki.org 前置,屏蔽 zh.wikipedia.org 而允许 www.mediawiki.org,
# 这种审查可以被域前置绕过。
curl https://www.mediawiki.org/wiki/域前置 --connect-to ::91.198.174.192 -H "Host: zh.wikipedia.org" -s | grep -o '<title>.*</title>'

(2)使用 wget演示域前置

$ wget -q -O - https://www.google.com/ --header 'Host: maps.google.com' | grep -o '<title>.*</title>' 
# 结果如下
<title>Google Maps</title>

3、影响范围

不完全统计,有以下这些:

  • 目前兼容域前置的CDN有 Automattic、Fastly、Incapsula、Microsoft Azure、StackPath。

  • 不少网站未使用CDN,但是其HTTP服务器接受无SNI或不同SNI连接,因此使用者也可以使用域前置绕过对于它们的检测SNI的屏蔽。

  • 谷歌网页服务器也兼容域前置

二、原理

Domain Fronting的工作原理如下图所示:

  • 用户用合法的域名allow.com向DNS请求CDN的IP,然后向CDN发起请求,这一步自然是没有任何问题的
  • 因为在处理HTTPS请求时,CDN会首先将它解密,并根据HTTP Host的值做请求转发,所以用户想要访问一个非法网站forbidden.com,可以使用一个CDN上的合法的域名allow.com作为SNI,然后使用forbidden.com作为HTTP Host与CDN进行HTTPS通信
  • 由于HTTP Host只能被转发看到,而审查者是看不到的,故CDN会放过这条请求,并将HTTP请求根据HTTP Host重新封装,发往forbidden.com的服务器
  • 这种情况下,客户端实际通信的对象是forbidden.com,但在流量监控设备看来,客户端是在与allow.com通信,即客户端将流量成功伪装成了与allow.com通信的流量

1、挑战与应对

基于代理的规避主要面临三个挑战:按内容阻塞、按地址阻塞和主动探测

(1)按内容阻塞

有时称为深度包检查(deep packet inspection,DPI),检查数据包和payload,例如查找被禁止的协议或关键字

应对策略:

  • 看起来不像审查员阻止的任何东西:如obfuscatedopenssh及其后续字符串——obfs2、obfs3、scramblessuit和obfs4,都是通过对底层流重新加密来工作的,这样就不存在明文组件,甚至在握手和密钥交换中也不存在明文组件
  • 看起来像审查员允许的东西:fteproxy使用格式转换加密将数据编码为与给定正则表达式匹配的字符串,例如HTTP的正则表达式近似值;StegoTorus使用各种专用编码器将流量转换为覆盖协议;Code Talker Tunnel(前身为SkypeMorph)模拟Skype视频通话;FreeWave将流编码为声音信号,并通过VoIP将其发送给代理;Dust使用加密来隐藏静态字节模式,然后对数据包长度和字节频率等统计特征进行整形,以匹配指定的分布

(2)按地址阻塞

地址阻止审查禁止与某些地址(例如IP地址和域名)的所有通信,这是一个困难的挑战

1、BridgeDB

Tor保留一部分中继作为秘密“桥梁”,其地址不为公众所知。BridgeDB是秘密网桥的数据库,它仔细地分配地址,因此很容易学习一些网桥,但很难列举所有的网桥。BridgeDB使用CAPTCHA和其他速率限制措施,在短时间内,总是将相同的网桥返回给相同的请求者,从而防止通过简单的重复查询进行枚举。BridgeDB还能够分配模糊网桥(目前为obfs3、obfs4、scramblescoit和fteproxy)的地址,从而向其他缺乏IP阻塞的抗DPI系统授予IP阻塞阻力

2、CensorSpoofer

将上游和下游数据通道解耦,客户端通过低带宽的隐蔽通道(如电子邮件)将数据发送给审查代理,代理通过UDP通道发回数据,一直欺骗其源地址,使数据包看起来来自其他“虚拟”主机。于是,审查员没有IP地址可阻止,因为代理的真实地址从未出现在线路上。客户机和服务器面临的挑战是,在一个可靠的隐蔽上行通道上达成一致,该通道必须保持畅通,客户机必须与虚拟主机进行可信的UDP会话,例如VoIP呼叫

3、flashproxy

通过将web用户作为临时代理来抵抗地址阻塞。每个基于javascript的代理只在用户停留在网页上的时间内持续,因此代理池是不断变化的。如果其中一个被阻塞,很快就会有另一个来替换它。flashproxy的地址阻塞方法与域前置相反:flashproxy使用许多廉价的、一次性的、可单独阻塞的代理,域前置只在难以阻塞的网络基础设施上使用几个高价值的前置域。

flashproxy使用浏览器的缺点是客户端必须能够接收TCP连接;特别是它不能落后于网络地址转换(NAT),这限制了flash代理的实用性。flash代理协议的一部分要求客户端在一个名为rendezvous的进程中发送少量不可阻止的数据。自2013年以来,默认的会合机制一直通过google app engine使用域名前置。Flash代理本身并没有做什么来防御DPI。经过审查的客户端和基于浏览器的代理之间的连接使用WebSocket,这是一种在HTTP上运行的元协议,但是在WebSocket框架内部是基于TLS的普通Tor协议

(3)主动探测

主动或按需发送自己的代理请求(主动探测),以响应观察到的流量,并将由此找到的任何代理列入黑名单。主动探测是一种识别代理服务器的精确方法,即使协议在网络上很难被检测到,它也可以被视为减少意外过度锁定的一种方法

2、局限性

Domain Fronting流量的一个显著特点是SNI和Host不相等。企业的防守方可以部署HTTPS流量解密设备,并对比流量中的SNI和Host是否相等,如果不相等则说明是该流量是Domain Fronting流量。这也是MITRE ATT&CK中建议的检测方式。

并且,随着该技术不断在真实网络攻击中被使用,云厂商也逐渐意识到了Domain Fronting的危害,目前Cloudflare、AWS CloudFront、Google Cloud CDN等厂商也都纷纷禁用了这种隐蔽通信方法

三、应用

1、软件

  • 最早使用域名前置进行规避的是GoAgent,这是一个基于google app engine的工具,曾在中国广泛使用。GoAgent的用户将代理代码的个人副本上传到appengine,在appspot.com的子域上运行。为了访问appspot.com,GoAgent通过Google的IP地址,使用没有SNI的“无域”模型。GoAgent不使用额外的通用代理;相反,它直接从appengine服务器获取url。因此,GoAgent不支持HTTP和HTTPS以外的协议,HTTPS的端到端安全性也会丢失,因为web页面在被重新加密回客户端之前以明文形式存在于appengine服务器上
  • Signal加密即时通讯应用程式在 2016-2018 年内置了域前置来规避在埃及,阿曼,卡塔尔和阿拉伯联合酋长国的屏蔽
  • Telegram 为应对 Roskomnadzor的屏蔽曾使用 亚马逊云计算服务 进行域前置
  • Tor浏览器 使用一种称为 meek 网桥的域前置实现来规避审查,如下图所示:

2、事件

  • Cloudflare在2016年的一些修改让基于其CDN的域前置不再工作

  • Google于2018年4月宣布将在Google应用服务引擎禁用域前置,称这从未是Google有意支持的一项功能。亚马逊公司也在不久后决定停用CloudFront上的域前置兼容,表示这已被视为违反亚马逊网路服务系统(AWS)服务条款

  • Tor早前也使用Google和亚马逊的云服务进行域前置以保护用户活动,在两者相继关闭域前置兼容后,Tor将域前置服务转移到尚未决定关闭该兼容的Microsoft Azure服务

  • FireEye曾报道称,与俄罗斯相关的黑客组织APT29使用该技术从目标网络中窃取数据。Cyber​​Ark等公司则详细介绍了恶意软件如何利用该技术控制僵尸网络。

  • 在2018年7月左右的互联网工程任务组(IETF)会议上,苹果公司、Cloudflare和Mozilla的工程师在一项名为“加密服务器名称指示(ESNI)”的新协议上取得了进展,该协议将能解决TLS SNI暴露给窃听者的问题。但是,该协议的定稿和部署可能仍需数年

3、实践:使用Cobalt Strike上线powershell

需要资源:

  • Cobalt Strike 4.0
  • VPS(cs服务器)
  • 域名
  • CDN
  • 国外代理

(1)域名

https://www.freenom.com/


要挂代理,然后把个人信息的地址设置成代理的地址,要不可能申请不成功

(2)CDN

https://dash.cloudflare.com/


登陆CDN,添加站点为刚刚申请的域名


添加A记录,指向VPS的IP地址

类型  	名称   	内容            		TTL  	代理状态    
A    	test 	10.1.1.111(VPS地址)   	自动   	已代理

那么这个地址就是 test.xxxxx.tk


找到自己的域名——管理域名——nameservers

选择使用自己的域名解析:Use custom nameservers (enter below)

Nameserver 1、2 都写CDN提供的地址


为了实时受到我们的命令的响应:我们需要修改缓存规则:

(3)C2证书


下载证书,生成成功保存下来


在VPS上生成CS可用的配置文件,使用以下命令重新生成cobalstrike.store:

openssl pkcs12 -export -in server.pem -inkey server.key -out spoofdomain.p12 -name 域名 -passout pass:密码

例子:

openssl pkcs12 -export -in com.pem -inkey com.key -out spoofdomain.p12 -name test.xxxxx.tk -passout pass:zzz123456

使用以下命令创建证书:

keytool -importkeystore -deststorepass 密码 -destkeypass 密码 -destkeystore new.store -srckeystore spoofdomain.p12 -srcstoretype PKCS12 -srcstorepass 密码 -alias 域名

例子

keytool -importkeystore -deststorepass zzz123456 -destkeypass zzz123456 -destkeystore new.store -srckeystore spoofdomain.p12 -srcstoretype PKCS12 -srcstorepass zzz123456 -alias test.xxxxx.tk

最终生成 new.store 文件,(为cobalstrike.store的替代品)

(4)C2.profile配置

github.com/FortyNorthSecurity/C2concealer


将生成的这个随机数.profile复制到cs目录下

(5)启动C2

用c2lint 检查下,下面这样就是通过:

./c2lint ca730a6d.profile


修改teamserver配置

vim teamserver

修改最后一行的内容

javax.net.ssl.keyStore=./new.store (证书生成的new.store文件地址)   -Djavax.net.ssl.keyStorePassword=zzz123456(上面证书的那个密码)


启动

./teamserver 192.168.1.1 password123456 ./C2.profile

(6)配置CS

监听器


配置一个powershell上线,注意要勾选SSL

成功

结语

过了遍域前置技术,不是很新了,但是还是能用

参考:

以上是关于一文搞明白域前置(Domain Fronting)技术的主要内容,如果未能解决你的问题,请参考以下文章

一文搞明白 Domain Borrowing

一文搞明白 Domain Borrowing

一文搞懂跨域问题

一文搞懂跨域问题

一文搞懂跨域问题

流媒体服务器(16)—— 一文搞明白直播和点播的区别