之前有一段工作是跟漏扫相关的,在开发漏扫时有DNSLOG这么一个需求,当时考虑到时间成本没有自己做。虽然现有市面上DNSLOG不少,我还是重复造了一个轮子, 有多个原因。现有的开源DNSLOG体验没有一些知名闭源的DNSLOG平台好,站在甲方的立场自建的服务总归是比使用公共服务好一些,毕竟没有多少人愿意把自己的漏洞情况让第三方知道。此外现有DNSLOG平台IP已经上了威胁情报名单,在不少环境这些IP直接就被干掉了,特别是在公有云环境下。所以甲方自建DNSLOG服务非常有必要。现有的开源DNSLOG python项目居多,也有个别golang的,在我看来安全开发的技术架构方向一定是微服务化、SaaS化,python程序封装成docker体积确实有点大。刚好最近看了一点vue,想写个东西练练手,就把这个事情捡起来。GODNSLOG前端是套了ant design vue pro
,后端用golang
开发。
每个用户分配一个唯一的三级域名,该域名或其子域名的所有解析记录均会被记录。
请求记录超过设置的最长时间会被自动清理,自动清理时间设置范围是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}
为用户自定义变量
HTTPLOG也需要用到唯一分配的域名,HTTPLOG地址格式如下,所有访问以下地址的请求会被记录。
请求记录超过设置的最长时间会被自动清理,自动清理时间设置范围是1-48小时
curl http://ktqlujjpgc4j.godns.vip/log/`/sbin/ifconfig eth0|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
除了只能用DNSLOG检测的情况,HTTPLOG都比DNSLOG好用一些,在内网环境中配合主动推送可以让检出更有效率,代码也相对简单一些。
这是河马安全团队的另一位成员提的需求。目前的策略是每次请求随机返回一个配置列表中的IP,后面再升级一些高级策略
注:一些本地DNS即时收到TTL=0的DNS也依然会缓存,比如说腾讯云会缓存1分钟
两级用户,内置用户为管理员,管理员可以新建、修改、删除普通用户。普通用户拥有除用户管理功能之外的所有功能
这个功能是给内网部署时设计的,我们在检测是否记录时一般是用api查询的,这里需要有个等待机制。跟这种pull
的方式对应的就是push
方式,在配置/系统模块配置。主动推送比较适合在内网使用,在内网环境中HTTPLOG+主动推送
传统的pull api模式,客户端通过token
+api
的方式查询DNS/HTTP记录,这里我改进了一下,一般的DNSLOG平台token
直接在URL
中传递不是很安全,稍微改进了一下,用hash
校验替代了token
校验。GODNSLOG
将支持精准查询和模糊查询两种方式
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:v0.2.2
docker run -d --name=godnslog -p8080:8080 -p53:53/udp sort/godnslog:v0.2.1 -domain=godnslog.com -4 100.100.100.100
godnslog默认使用sqlite数据库,考虑到性能建议使用外部mysql.
命令行参数可以用以下命令查看
docker run --rm --it sort/godnslog:v0.2.2 --help
注: 此处v0.2.2为当前版本,后续可能会改动,请使用最新版本
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;
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申请域名。
GDNSLOG当前版本为v0.2.2
,这个版本BUG比较多,很多接口还没来得及测试,预计下周发布相对稳定一点的v0.3.0
。
GODNSLOG设计实现很大程度借鉴了ceye.io,关于DNSLOG的技巧http://ceye.io/payloads页面有详细的描述,这里不再赘述。
v0.3.0
完成测试后会将代码发布在GITHUB上。
如果你对这个项目感兴趣;如果你在使用体验中遇到问题需要反馈交流;如果你想吐槽我糟糕的设计、编码;如果你忍不住想动手,想抢先获取GODNSLOG源代码;如果你想反馈BUG;如果你对DNSLOG有些新的想法,想在GODNSLOG上实现;欢迎关注我们的公众号gh_d110440c4890
,在公众号后台跟我交流。如果想吐槽的人多了,我会考虑建一个交流群,让大家组团吐槽