内容简介:0X00:思路概述渗透的本质就是信息收集。因此,前期信息的收集的完整性直接影响到渗透目标是否能够做下。本文是尝试利用一些互联网公开的DNS数据来搭建一个本地的查询数据库,不求能完整的建立,只尝试这样的思路是否可行。
0X00:思路概述
渗透的本质就是信息收集。因此,前期信息的收集的完整性直接影响到渗透目标是否能够做下。
本文是尝试利用一些互联网公开的DNS数据来搭建一个本地的查询数据库,不求能完整的建立,只尝试这样的思路是否可行。
数据来源:https://opendata.rapid7.com/
数据样例:
2019-03-27-1553712188-rdns.json.gz 11.4GB
2019-03-29-1553861003-fdns_a.json.gz 19.8GB
实验主机配置(虚拟机):
内存 64GB
Windows Server 2016 X64
CPU E5-2678 v3 2.5GHz
0X01:数据库的选择
2019-03-27-1553712188-rdns.json.gz 解压后 128G内容大概如下:
{“timestamp”:”1553746651″,”name”:”1.10.147.153″,”value”:”node-3vd.pool-1-10.dynamic.totbroadband.com”,”type”:”ptr”}
{“timestamp”:”1553772228″,”name”:”1.10.147.154″,”value”:”node-3ve.pool-1-10.dynamic.totbroadband.com”,”type”:”ptr”}
{“timestamp”:”1553744853″,”name”:”1.10.147.155″,”value”:”node-3vf.pool-1-10.dynamic.totbroadband.com”,”type”:”ptr”}
……
数据是单行的json格式文件。
前期猜想:
|
mongodb |
mysql(myisam) |
mysql(innodb) |
|
|
导入 |
方便 |
不方便 |
不方便 |
|
查询速度 |
最快 |
快 |
慢 |
|
存储占用 |
最大 |
小 |
大 |
实际测试过程中
1)mongodb
mongoimport –db dns –collection testDns –file E:\testDns.json
mongoimport –db dns –collection testRdns –file E:\testRdns.json
导入很方便,存储空间却是三种中占用最少的。
> db.testDns.storageSize()
87838519296 (91.8GB)
> db.testRdns.storageSize()
51861549056 (48.2GB)
2)mysql(myisam)和mysql(innodb)
{“timestamp”:”1553746651″,”name”:”1.10.147.153″,”value”:”node-3vd.pool-1-10.dynamic.totbroadband.com”,”type”:”ptr”}
{“timestamp”:”1553772228″,”name”:”1.10.147.154″,”value”:”node-3ve.pool-1-10.dynamic.totbroadband.com”,”type”:”ptr”}
{“timestamp”:”1553744853″,”name”:”1.10.147.155″,”value”:”node-3vf.pool-1-10.dynamic.totbroadband.com”,”type”:”ptr”}
……
中我们想要的其实也就是name和value的值,其他的数值并不重要。(这里需要节约存储空间)
因此处理之后的数据应该是这样的:
1.10.147.153₡node-3vd.pool-1-10.dynamic.totbroadband.com
1.10.147.154₡node-3ve.pool-1-10.dynamic.totbroadband.com
1.10.147.155₡node-3vf.pool-1-10.dynamic.totbroadband.com
…..
再通过load data local infile的方式快速将数据导入
myisam
> Affected rows: 1276329672
> 时间: 4141.457s
innodb
> Affected rows: 1276329672
> 时间: 8245.99s
innodb导入数据的速度比起myisam差不多要慢一倍的时间
myisam 20190327rdns.MYD 64.9GB
innodb 20190327rdns.ibd 98GB
这样看起来应该优先使用 mongodb 数据库,它不仅导入方便而且占用空间小。
0X02:查询速度的对比
1)建立索引速度
没有记录具体的时间作为供参考,印象中innodb和mongodb建立索引的速度会比myisam快很多。
使用myisam对1276329672数据建立索引,几乎用了二十多个小时。
这可能和测试机器是虚拟机搭建的,I/O处理性能没那么高有关。
2)测试查询的速度
a.精确查询:
myisam和innodb的查询速度几乎一样,都是0.033s左右
mongodb使用时间特别长(可能优势在于分布式,也可能是虚拟机不行,最可能是因为以前没用过配置有问题)
b.模糊查询:
模糊查询C段:
‘127.0.0.%’ 这种形式会使用到索引。
查询子域名:
‘%.test.com’ 这种形式不会使用索引,会整个遍历匹配。
解决方法:
在处理原始数据的时候,我们将包含域名的那一列字符串反转存入数据库中,如下:
1.10.147.153,moc.dnabdaorbtot.cimanyd.01-1-loop.dv3-edon
1.10.147.154,moc.dnabdaorbtot.cimanyd.01-1-loop.ev3-edon
1.10.147.155,moc.dnabdaorbtot.cimanyd.01-1-loop.fv3-edon
…
查询的时候使用’moc.tset.%’这样的格式就可以触发索引了。
0X03:实际对比效果
|
mongodb |
mysql(myisam) |
mysql(innodb) |
|
|
导入 |
方便 |
不方便 |
不方便 |
|
查询速度 |
最慢 |
快 |
快 |
|
存储占用 |
小 |
大 |
最大 |
通过对比,就直接把mongodb排除,可能是以前没接触过,也可能是没优化好,它就是最慢的。
myisam占用空间和查询速度的优势都不是特别明显,再加上索引建立的速度太慢了,因此它也被排除。
最终决定使用innodb引擎建立数据库。
0X04:innodb搭建流程简介
1)处理原始数据
E:\>DnsProcess.exe -f testRdns.json
35
1h26m22.7345813s
success!
DnsProcess.exe源代码如下:
package main
import (
"bufio"
"flag"
"fmt"
"os"
"strings"
"time"
"github.com/json-iterator/go"
)
type Dns struct {
Timestamp string
Name string
Value string
Type string
}
func main() {
startTime := time.Now()
filename := flag.String("f", "test.txt", "filename")
flag.Parse()
ProcessJson(*filename)
endTime := time.Now()
fmt.Println(endTime.Sub(startTime))
fmt.Println("success!")
}
func ProcessJson(filename string) {
n := 0 //统计最大长度,方便建立数据表
SP := "₡" //列分隔符,以免原始数据中存在脏数据包含了',',导致无法正确导入数据
var err error
if !checkFileIsExist(filename) {
fmt.Println(filename + " does not exist!")
os.Exit(0)
}
var f2 *os.File
filename2 := "p_" + strings.Split(filename, ".")[0] + ".txt"
if checkFileIsExist(filename2) {
fmt.Println(filename2 + " exists!")
os.Exit(0)
} else {
f2, err = os.Create(filename2)
check(err)
}
defer f2.Close()
f1, err := os.Open(filename)
check(err)
defer f1.Close()
r := bufio.NewReader(f1)
w2 := bufio.NewWriter(f2)
for {
o_l, err := readLine(r)
if err != nil {
break
} else {
var dns Dns
if err := jsoniter.Unmarshal(o_l, &dns); err != nil {
fmt.Println("error: ", err)
}
if len(dns.Name) > n {
n = len(dns.Name)
}
if len(dns.Value) > n {
n = len(dns.Value)
}
//_, err2 := w2.WriteString(dns.Name + SP + reverseString(dns.Value) + "\r\n") //rdns
_, err2 := w2.WriteString(reverseString(dns.Name) + SP + dns.Value + "\r\n") //fdns
check(err2)
w2.Flush()
}
}
fmt.Println(n)
}
func reverseString(s string) string {
runes := []rune(s)
for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 {
runes[from], runes[to] = runes[to], runes[from]
}
return string(runes)
}
func readLine(r *bufio.Reader) ([]byte, error) {
line, isprefix, err := r.ReadLine()
for isprefix && err == nil {
var bs []byte
bs, isprefix, err = r.ReadLine()
line = append(line, bs...)
}
return line, err
}
func check(e error) {
if e != nil {
panic(e)
}
}
func checkFileIsExist(filename string) bool {
var exist = true
if _, err := os.Stat(filename); os.IsNotExist(err) {
exist = false
}
return exist
}
2)根据统计最大长度建立数据表
3)load data导入数据
load data local infile “E:\\p_testRdns.txt” into table 20190327rdns fields terminated by “₡” (name,value)
4)对两个字段建立索引
5)当导入完所有数据时,可以建立视图,编写查询程序。
0X05:结束:
这个数据库最后完整的搭建出来可能能查处一些东西,也可能查不出什么东西,并且查询到的很多子域名可能是很久之前用过的。这种数据看似是没有什么用。但是,我们通过分析这些数据,过对旧的子域名进行关键字的替换,进行爆破处理,有一定几率可以找到一些隐蔽的子域名。当然,这个是一个小概率事件,但至少也为我们的信息收集提供了一种思路。
以上所述就是小编给大家介绍的《利用收集的DNS数据搭建C段和子域名查询库》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 在 Kubernetes 上搭建 EFK 日志收集系统
- window环境下搭建简单ELK日志收集
- JVM 笔记:垃圾收集算法与垃圾收集器
- JVM 笔记:垃圾收集算法与垃圾收集器
- Java 垃圾收集技术
- 日志收集的 “DNA”
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C语言名题精选百则技巧篇
冼镜光 / 机械工业出版社 / 2005-7 / 44.00元
《C语言名题精选百则》(技巧篇)收集了100则C语言程序设计题,共分9类。第一类比较简单,主要希望读者了解到《C语言名题精选百则》(技巧篇)的题目、解法与其他书籍之间的差异;第二至六类分别是关于数字、组合数学或离散数学、查找、排序、字符串等方面的题目;第七类列出了一些不太容易归类的题目,如Buffon丢针问题、Dijkstra的三色旗问题等;第八类则收录了一些有趣的、娱乐性的题目,如魔方阵等;第九......一起来看看 《C语言名题精选百则技巧篇》 这本书的介绍吧!