dnslog平台探索
在蓝军防守过程中,遇到一些告警的流量中,出现很明显的dnslog平台的痕迹,比如:验证fastjson时,payload时xxx.dnslog.cn,这种流量会直接触发反序列化攻击的攻击,那么对于这个攻击的防护算检测到了,但是如果使用一些编码绕过了流量的识别呢?实际上越来越多的安全监控将dnslog.cn、ceye.io加入到针对dns流量的分析中;一次真实的溯源工作中,我们通过ceye.io的id找到了真实的攻击者,这表示公用的dnslog平台已经不能用来做更加隐蔽攻击探测。
实际上很多的团队已经自己搭建dnslog平台,或将dnlog功能加入到自建的安全攻击平台中。
一个简单、实用、安全的dnslog平台有哪些需求呢?
- 方便启动
- 账号分权
- 管理端的安全性
- 域名更隐蔽
…
选取一套合适的开源代码
有精力的话,可以自己从开始编写代码,但是这样有点耗费时间,github上已经有很多开源的项目,这里挑出来3个。
java版本:
https://github.com/SPuerBRead/Bridge
python版本:
https://github.com/BugScanTeam/DNSLog
golang版本:
https://github.com/chennqqi/godnslog
我选择了SPuerBRead的Bridge,功能介绍可以参考该项目的readme。
修改代码
SPuerBRead的这台平台已经可以做到很方便的启动、dnslog、httplog的记录功能了,但是对于自己使用起来,还有一些小需求,于是做了一些的修改。
如下是一些想法和作出的改动
Q1:启动后登录,注册的用户会生成logid字段,该字段是数字类型,值是1、2、3、4 。。。,这样导致用户的dnslog验证的payload地址是这样的:
xxx.1.dnslog.com
这样对于监控来说,很可能会觉得如果有内网解析这样的dns请求是很奇怪的。
A:修改了用户logid字段类型为varchar类型,在注册用户是生成为随机的4位字符。
Q2:原程序中任何子域的解析请求都会响应并记录到数据库中,这样一旦遇到爆破dns记录的情况,会导致数据库中大量垃圾数据。
A2:在返回解析结果时检查库中是否有request对应logid,如果不存在则不响应任何内容
Q3:对web访问做限制,只有自己或小伙伴可以访问管理端。
A2:自定义header字段的判断,只放过自定义header验证正确的请求,有关Header-Signal的值,可以指定springboot启动参数位置自定义。
其他也更新了一些小功能,比如logid的显示,dnslog界面显示payload等。
环境搭建
启动参数可以参考帮助信息或项目readme
这里有一个有意思的地方:在网上看过几片文章,有些写着需要两个域名来实现自定义解析的功能,这里试验了一下,其实使用一个域名服务就可以实现。
首先我们看下两个域名的一个解析流程
实际上,一个域名也可以配置
这样的解析过程就可以依靠一个域名、一个vps完成。
从dns解析的trace也可以清晰的看到解析路径。
搭建完了才发现,原作者也是一个域名。。。
end
还有一个小思路,现在很多dnslog平台,在返回解析记录时,将所有解析记录都指向127.0.0.1,对于安全监控来说,完全可以在针对dns流量的审计中,增加判断,当检测到存在127.0.0.1的response返回包时,触发告警疑似dnslog请求。所以在搭建的时候,配置平台默认返回的解析结果尽量指定一个可信的公网ip。
项目源代码上传至:https://github.com/ninefiger/dnslogPt
感谢原版作者:https://github.com/SPuerBRead/Bridge