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启动参数位置自定义。
自定义header正确的请求

自定义header错误的请求

其他也更新了一些小功能,比如logid的显示,dnslog界面显示payload等。

环境搭建

启动参数可以参考帮助信息或项目readme

这里有一个有意思的地方:在网上看过几片文章,有些写着需要两个域名来实现自定义解析的功能,这里试验了一下,其实使用一个域名服务就可以实现。

首先我们看下两个域名的一个解析流程
两个域名的解析流程

实际上,一个域名也可以配置
-w1001

这样的解析过程就可以依靠一个域名、一个vps完成。
一个域名的解析过程
从dns解析的trace也可以清晰的看到解析路径。
dnstrace
-w1144

搭建完了才发现,原作者也是一个域名。。。

end

  还有一个小思路,现在很多dnslog平台,在返回解析记录时,将所有解析记录都指向127.0.0.1,对于安全监控来说,完全可以在针对dns流量的审计中,增加判断,当检测到存在127.0.0.1的response返回包时,触发告警疑似dnslog请求。所以在搭建的时候,配置平台默认返回的解析结果尽量指定一个可信的公网ip。

项目源代码上传至:https://github.com/ninefiger/dnslogPt
感谢原版作者:https://github.com/SPuerBRead/Bridge