Social Engineering Database Setup

前言

注意:非法获取、贩卖个人信息系犯罪行为,本文及相关代码仅供学习使用。privacy原作者现已将项目主要文件移除。
本次以github上收tx律师函的项目privacy为契机,尝试对四组数据进行清洗,并导入Elasticsearch数据库中,最终实现快速查询。本文记录了建立信息库的主要流程和注意点。

数据清洗

首先使用Golang程序对数据进行清洗,将不符合规范的条目筛除,提高查询、存储效率,降低查询结果中的噪声。
但单纯进行数据清洗不一定能排除所有的异常数据,在导入数据库时需要动态调整规则。

社交账号

社交账号绑定信息主要是QQ和微博绑定手机号。
手机号使用正则检查:(13[0-9]|14[01456879]|15[0-3,5-9]|16[2567]|17[0-8]|18[0-9]|19[0-3,5-9])
QQ主要依据长度判断,将小于5位和多于11位的筛除。
读取文件时要注意行末的换行符,还要注意字段分割符。

快递

快递信息字段数较多,正确数据也会包含不同的格式。
邮件地址使用正则检查:[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+
京东快递的电话信息可能包含备注等,不能仅凭正则匹配,按照长度规律进行过滤。此外,还要注意空数据的表示格式\N
在打开顺丰文件时需要注意编码,使用golang.org/x/text/transform包打开UTF-16 LE文件。
由于顺丰文件是MS SQL导出的数据库脚本,在处理时要将无关SQL语句筛除。这里采用文件偏移量和行长度,从20行之后,长度大于80字符的行中解析数据。
此外,顺丰数据有些字段存在错位,观察原始数据发现数据库中就是错误的,通过添加特定条件识别并纠正。

环境配置

在Docker中配置7.10.1版本的Elasticsearch和Kibana,组成一个单节点ES集群,方便迁移和分析管理。
ES不支持root用户运行,在容器中使用elasticsearch用户,使用的uid:gid为1000:0,因此在共享目录时需要注意读写权限。但本文使用一块exFAT格式的移动SSD存储数据,由于exFAT格式不支持Linux的权限管理功能,需要对ES启动参数和硬盘挂载选项进行配置。

1
2
# exFAT无法更改文件权限和所属信息,因此在挂载时将整个磁盘配置为目标id
mount -o uid=1000,gid=0 /dev/sdb1 /mnt

1
2
3
# 根据官方文档,这一环境变量会使容器修改数据和日志目录的所有者,即uid:gid为1000:0
environment:
- TAKE_FILE_OWNERSHIP # docker-compose中设置es的环境变量

随后通过Kibana的开发工具创建索引。Type要被弃用了,所以为每个结构创建一个索引。
ES使用RESTful API通信,创建shunfeng库索引的请求如下。注意mapping中的keyword不会被分词器解析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
PUT shunfeng/
{
"mappings": {
"properties": {
"name": {
"type":"keyword"
},
"phone": {
"type":"text"
},
"province": {
"type":"keyword"
},
"city": {
"type":"keyword"
},
"dist": {
"type":"keyword"
},
"addr": {
"type":"text"
}
}
}
}

尝试了一下自带的权限管理,对单节点容器部署来说不太高效,本地跑的话还是关闭了。

数据导入与查询

接下来,在数据清洗脚本的基础上进行修改,实现批量导入Elasticsearch数据库。
由于ES通信使用RESTful API,每次请求都会有TCP连接建立和断开,产生端口资源消耗:当客户端发起连接的频率过高时,处于time_wait状态的端口过多,导致客户端无法申请到通信端口。因此,通过olivere/elastic的批量处理器BulkProcessor将多次操作合并为一次请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
esClient, err := elastic.NewClient(elastic.SetURL(esUrl))
if err != nil {
fmt.Println(err.Error())
return
}
esService, err := esClient.BulkProcessor().
BulkActions(1000).
Workers(4).
Do(context.Background())
if err != nil {
fmt.Println(err.Error())
return
}
defer esService.Close()

设置每次提交中包含的最大操作数量BulkActions小于1000,防止出现请求过大。按照wiki,每次请求的最大字节数BulkSize为5MB,但是在我只设置了BulkActions时貌似没有做这个限制,导致中途报错。
异常的document在match_all查询中可能会有较高的score,因此可以在进行数据插入的同时使用match_all查询,快速发现数据清洗的不足。

总结

Elasticsearch提供了强大的分析能力,依靠全文搜索甚至可以根据地址进行查询。还发现其他一些有趣的查询,但这里不做详细描述。
本文是在笔记本上运行单节点ES数据库,产生了六十多G的虚存,并没有发挥倒排索引的全部性能。但速度依然很快,14.3亿条数据跨索引查询响应时间不超过70ms,大多数简单查询不超过20ms。
发现:在查一位朋友QQ绑定信息时发现了三个手机号,但只有一个是本人的;用另外两个手机号查询微博绑定信息,发现对应微博账号均因违规被封禁。结合这位朋友QQ曾不止一次被盗,猜想这两条绑定记录可能是由盗号产生的,且手机号很可能还曾用于其他黑/灰产活动。鉴于手上的数据覆盖不广,又不想支持黑产,暂且不进行验证。
思考:根据泄露数据的分布特征,能否追溯信息泄露源头?根据数据时效性,能否确定泄露时间?

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 前言
  2. 2. 数据清洗
    1. 2.1. 社交账号
    2. 2.2. 快递
  3. 3. 环境配置
  4. 4. 数据导入与查询
  5. 5. 总结
,