​GODNSLOG | 开源一个新鲜的DNSLOG
2020-09-01 11:25:58 Author: www.secpulse.com(查看原文) 阅读量:423 收藏

banner.png

背景动机

之前有一段工作是跟漏扫相关的,在开发漏扫时有DNSLOG这么一个需求,当时考虑到时间成本没有自己做。虽然现有市面上DNSLOG不少,我还是重复造了一个轮子, 有多个原因。现有的开源DNSLOG体验没有一些知名闭源的DNSLOG平台好,站在甲方的立场自建的服务总归是比使用公共服务好一些,毕竟没有多少人愿意把自己的漏洞情况让第三方知道。此外现有DNSLOG平台IP已经上了威胁情报名单,在不少环境这些IP直接就被干掉了,特别是在公有云环境下。所以甲方自建DNSLOG服务非常有必要。现有的开源DNSLOG python项目居多,也有个别golang的,在我看来安全开发的技术架构方向一定是微服务化、SaaS化,python程序封装成docker体积确实有点大。刚好最近看了一点vue,想写个东西练练手,就把这个事情捡起来。GODNSLOG前端是套了ant design vue pro,后端用golang开发。

功能特性 & 用法简介

  • 1. DNSLOG
每个用户分配一个唯一的三级域名,该域名或其子域名的所有解析记录均会被记录。
请求记录超过设置的最长时间会被自动清理,自动清理时间设置范围是1-48小时
dig `/sbin/ifconfig eth0|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`.ktqlujjpgc4j.godns.vip

系统生成域名为{$variable}.ktqlujjpgc4j.godns.vip,其中ktqlujjpgc4j是用户唯一shortId,{$variable}为用户自定义变量

dnslog.png

  • 2. HTTPLOG

HTTPLOG也需要用到唯一分配的域名,HTTPLOG地址格式如下,所有访问以下地址的请求会被记录。
请求记录超过设置的最长时间会被自动清理,自动清理时间设置范围是1-48小时
curl http://100.100.100.100/log/ktqlujjpgc4j/`/sbin/ifconfig eth0|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`

除了只能用DNSLOG检测的情况,HTTPLOG都比DNSLOG好用一些,在内网环境中配合主动推送可以让检出更有效率,代码也相对简单一些。

httplog-2.png

  • 3. DNS Rebinding

这是河马安全团队的另一位成员提的需求。目前的策略是每次请求随机返回一个配置列表中的IP,后面再升级一些高级策略

rebind-setting.png

注:一些本地DNS即时收到TTL=0的DNS也依然会缓存,比如说腾讯云会缓存1分钟

  • 4. 多用户

两级用户,内置用户为管理员,管理员可以新建、修改、删除普通用户。普通用户拥有除用户管理功能之外的所有功能

user-admin.png

  • 5. 主动推送

这个功能是给内网部署时设计的,我们在检测是否记录时一般是用api查询的,这里需要有个等待机制。跟这种pull的方式对应的就是push方式,在配置/系统模块配置。主动推送比较适合在内网使用,在内网环境中HTTPLOG+主动推送
  • 6. 支持API调用

传统的pull api模式,客户端通过token+api的方式查询DNS/HTTP记录,这里我改进了一下,一般的DNSLOG平台token直接在URL中传递不是很安全,稍微改进了一下,用hash校验替代了token校验。GODNSLOG将支持精准查询和模糊查询两种方式

api-token3.png

安装部署

docker一键部署,推荐http前面套个nginx可以套SSL证书

需求:一个域名、用户独立IP的主机.

1.修改域名DNS服务器,使用独立主机IP作为域名的DNS服务器
修改生效需要数小时到48小时,需要等全球DNS都刷新。修改完成之后所有的*.godnslog.com均会指向100.100.100.100

注:如果在内网环境中使用,域名也不是一定要注册的,在内网DNS中配置一个私有域名即可

2. 安装docker环境,并启动实例

curl -s https://get.docker.com/ | sudo sh
systemctl enable docker
systemctl start docker
docker pull sort/godnslog:version-0.3.0
docker run -d --name=godnslog -p8080:8080 -p53:53/udp sort/godnslog:version-0.3.0 -domain=godnslog.com -4 100.100.100.100

godnslog默认使用sqlite数据库,考虑到性能建议使用外部mysql.
命令行参数可以用以下命令查看

docker run --rm --it sort/godnslog:version-0.3.0 --help

注: 此处version-0.3.0为当前版本,后续可能会改动,请使用最新版本

mysql DSN格式: https://github.com/go-sql-driver/mysql/#dsn-data-source-name

sqlite DSN格式: https://github.com/mattn/go-sqlite3#dsn-examples

关于持久化,使用外部mysql时数据就是持久化的,sqlite要支持持久化需要通过docker -v参数将宿主机上的文件映射为sqlite数据库文件,否则重启docker后数据会丢失

3. 配置

3.1 安装nginx

yum install nginx
systemctl start nginx
systemctl enable nginx

3.2 配置并重启nginx

server {
   listen       80 default_server;
   server_name  www.godnslog.com *.godnslog.com;

   # Load configuration files for the default server block.
   access_log /var/log/nginx/www.godnslog.com.access.log;
   error_log /var/log/nginx/www.godnslog.com.error.log;

   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header Host             $host;
   proxy_set_header X-Real-IP        $remote_addr;

   location / {
       proxy_pass http://127.0.0.1:8080;
   }
}

3.3 配置防火墙开放UDP:53,TCP:80端口

3.4 登录配置用户

内置管理员用户名为admin,密码为password,安装完成后请尽快修改管理员密码。
登录管理员帐户后可以在配置/用户中管理用户

演示网站

演示网站: https://www.godns.vip

测试账号:

  • test1/test123456

  • test2/test123456

  • test3/test123456

  • test4/test123456

  • test5/test123456

  • test6/test123456

  • test7/test123456

  • test8/test123456

  • test9/test123456

  • test10/test123456
    不支持多用户共用一个帐号,后登录会踢掉前面的登录的用户

注意: 演示网站仅提供演示功能,不要用在实际环境,随时可能重启升级!

演示网站本来是申请了godnslog.com,这里吐槽下腾讯云,不支持自定义DNS host也就罢了,坑爹的修改DNS服务器IP还失败了。被迫昨晚又在阿里云申请了gons.vip。推荐在阿里云或者cheapname申请域名。

结语

GODNSLOG设计实现很大程度借鉴了ceye.io,关于DNSLOG的技巧http://ceye.io/payloads

页面有详细的描述,这里不再赘述。

源码地址: https://github.com/chennqqi/godnslog

如果你对这个项目感兴趣;如果你在使用体验中遇到问题需要反馈交流;如果你想吐槽我糟糕的设计、编码;如果你想反馈BUG;如果你对DNSLOG有些新的想法,想在GODNSLOG上实现;欢迎关注我们的公众号gh_d110440c4890,在公众号后台跟我交流。如果想吐槽的人多了,我会考虑建一个交流群,让大家组团吐槽

原文链接: https://mp.weixin.qq.com/s/SVrEAgeqwtj6JZSfcspxXA

本文作者:早睡的程序猿

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/140063.html


文章来源: https://www.secpulse.com/archives/140063.html
如有侵权请联系:admin#unsafe.sh