最近看到一个查找子域名的平台
数据来源于opendata.rapid7.com
这个方法之前在DC0531安全沙龙上简单提到过一次,自己也一直在用。
https://www.ichunqiu.com/open/63178
突然看到有师傅提供一个外网的查询平台,还是比较开心的(不用命令行啦!
不过使用后发现还是有一点点不足:查询的数据少了一点,好像是因为没有把关键词放到别名中进行模糊查询(小问题。
正好我也开发了自用的平台,记录一下过程分享出来。
需要的东西
Rapid7 DNS DATA
1T SSD
Ubuntu
ClickHouse
Flask
大概环境
我的主机有1T的SSD,直接安装Ubuntu,避免了虚拟机挂载硬盘等问题。
下载数据
https://opendata.rapid7.com/sonar.rdns\_v2/
https://opendata.rapid7.com/sonar.fdns\_v2/
不推荐迅雷,下载断断续续的,我这里用Ubuntu上的uGet基本没出过幺蛾子。
安装ClickHouse
ClickHouse,对我来说比较陌生的名字,Yandex团队的开源数据库作品,速度相当之快。
安装过程,不多介绍。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4
创建数据库
我们先看下Rapid7的数据结构:
{"timestamp":"1585700616","name":"_mta-sts.0-ml.com","type":"txt","value":"v=spf1 a ?all"}
字段名分别为:timestamp,name,type,value
其实我们真正需要的数据只有name和value,这里的timestamp是Rapid7处理数据的日期并不是域名解析生效的日期,type也不是特别有用,因为解析方式我们基本上看也可以看出来,因此导入数据的时候,可以选择性的导入也可以全部导入,我这里还是全部导入了。
在创建数据库选择引擎时要注意,默认创建数据库时ClickHouse的表引擎一定需要日期字段和主键,其实我们并不需要这两个东西,会浪费存储资源和性能。
CREATE DATABASE dnsRecord ENGINE = Ordinary;
我们这里使用PARTITION BY子句,选择name和value。
导入数据
ClickHouse支持JSON格式数据的导入
cat *.json | clickhouse-client --password ****** --database=dnsRecord -n --query="SET input_format_skip_unknown_fields=1;INSERT INTO dns FORMAT JSONEachRow"
导入后70亿条数据
查询
这里查询时候要注意一点,例如查询baidu.com,不仅要查name,也要查询value
因为有些时候解析方式是cname
select name,value from dns where name like "%baidu.com"
这样两次模糊查询所用的时间为单域名80秒,如果不使用模糊查询则单域名15秒,速度还是不错的。
Flask
最终随便弄成平台就方便自己和小伙伴查询了,效果不错,预计一天即可完成全部搭建。
其他
1.没啥技术含量。
2.感觉还是自己做一遍更好,不然怎么知道别人的东西哪里好哪里不好呢?
3.这个数据库的用途肯定不止是查域名和IP。