- 概述
DoH(DNS over HTTPS)是一种通过HTTPS协议加密传输DNS查询的信道,将DNS请求封装在HTTP/2或HTTP/3中,DoH没有标准端口,部分服务沿用TLS的443端口。传统DNS明文传输易被拦截或篡改,而DoH通过加密提升了隐私性和安全性。部分木马C2服务器可通过DoH信道,将恶意通信流量伪装成普通HTTPS流量,能有效规避防火墙和IDS检测,增加了检测难度,同时利用公共DoH解析器(如Google、Cloudflare),可进一步降低暴露风险。本文通过使用CobaltStrike配置相关插件,使木马和C2通信时,使用DoH信道进行通信,通过分析通信流量行为特征,结合正常使用时DoH的流量特征,对DoH恶意流量进行检测。
- 木马上线流程

DoH信道C2通信
木马beacon中需配置公共DoH服务,本文中使用doh.pub公共DoH,上线流程同CS DNS信道相似。上图中C2信道使用双向虚线箭头标识。
- 受害机执行木马文件,木马首先会发送一条明文dns A类查询,获取doh.pub域名对应ip。
- 木马向公共doh.pub发送恶意域名查询,查询内容使用https加密,对应端口443,查询发送到公共DoH服务器后,DoH服务器进行递归查询,最终查询到配置的C2服务器中,C2服务器收到请求后,进行查询响应,木马完成上线。
- 受害机上线后,会持续发送心跳包,等待接收C2指令,整个过程可以很好的隐藏C2服务器位置,从受害机抓包查看木马通信流量,看到的仅是,木马同公共DoH服务的加密通信,流量中涉及到的域名为公共DoH域名,恶意域名被很好的隐藏在了https加密流量中。

- 指令和流量分析
通过对TLS流量进行解密,详细分析,指令内容对应流量,从而总结行为特征。
木马上线后,如果没有指令下发,受害主机会一直向外发送DNS请求,域名前缀为长度为8的加密字符(每次上线时,长度会发生变化),查询类型为A查询,该查询数据中,不包含主机信息,C2接收到该心跳后,响应结果为0.0.0.0,如果有任务需要执行,会响应0.0.0.242或0.0.0.243,受害主机收到0.0.0.243响应后,会发送以api为前缀,查询类型为A的域名查询,C2服务器会返回以0.0.0开头的ip标识任务类型,之后会再发起一个以api为前缀,查询类型为txt的域名查询,来获取任务。

图一心跳包
攻击者下发第一条执行命令后,受害主机在执行指令前,会先将受害主机信息进行加密,拼接到域名前缀中发送到C2服务器,该查询请求中,最后一个域名前缀为www,默认配置下,www前缀的查询域名中,包含有受害主机的主机信息,查询响应均为0.0.0.0

图二 包含主机信息
攻击者下发shell指令whoami,受害主机会发送以api为前缀,查询类型为TXT的域名查询,查询结果即为待执行的任务,拿到任务后进行执行,执行获取到的结果加密后,拼接到前缀为post的域名中,通过A类查询,将结果发送到C2服务器。

图三 执行shell命令
攻击者如果向受害主机上传文件,在流量中会看到频繁的域名查询,查询前缀为api,查询类型为txt;攻击者如果从受害主机中拖取文件,在流量中也可看到频繁的域名查询,查询前缀为post,查询类型为A,因为dns隧道可携带的数据量较小,从受害主机中拖取文件,会持续非常长时间,在拖取过程中,受害主机会持续发送post前缀的域名查询。
虽然整个通信过程采用https加密通信,但通过对不同行为进行分析,可以发现特殊的指令执行和心跳流量等系列行为在加密后,所对应的长度变化模式不变,例如,心跳包中,DoH查询对应两个包,长度是相对固定的值周期重复,查询响应长度也是周期重复的固定值,每一组查询和响应的时间间隔呈现心跳特征,默认为1分钟1次,不过,心跳间隔攻击者可以修改。

图四 加密心跳包
- 工具检测
目前,观成瞰云-加密威胁智能检测系统已经支持对使用该DoH信道的远程控制木马进行有效检出,检测告警见下图。

图五 告警详情
- 总结
通过对cs木马使用DoH信道通信的研究,发现使用该信道虽然可以很好的对通信流量进行加密,且不直接同C2服务器通信,但同C2通信的多种行为模式没有发生变化,在加密流量中,可以进行识别。这仅为一类通过DoH信道进行木马回连的例子,后续观成科技安全研究团队将持续跟踪木马利用DNS over HTTPS信道通信的动态,并积极研究更新检测手段,检测此类网络攻击。