【技术分享】元数据:黑客最好的朋友(下)

http://p2.qhimg.com/t011d38a2229fe9f3b4.png

译者:WisFree

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


传送门

【技术分享】元数据:黑客最好的朋友(上)


《元数据:黑客最好的朋友(上)》中,我们给大家详细介绍了元数据以及泄漏元数据的危害有多么的严重。接下来,我们将给大家介绍如何分析元数据,并将元数据作为威胁情报使用。


映射数字足迹

在这篇文章中,我们假设自己是一名安全分析师,待分析的目标为whitehouse.gov和usa.gov,我们将对这两个域名所泄露的元数据进行数字足迹映射,并从中找出一些有价值的信息。

http://p1.qhimg.com/t01e8fefdd92a429f63.png

http://p8.qhimg.com/t01294b88df1321d659.png

首先我们要从目标网站上下载感兴趣的文档,我们可以使用以下几种技术:

1.爬虫/网站镜像,下载所有的网站内容

2.使用Google/Bing来搜索公开文件

3.如果可能的话,直接向公司的响应团队所要公开文档

最简单的方法就是获取网站镜像,我们可以使用wget将网站中的所有内容下载到本地:

wget -mk http://www.example.com/

这种方法最明显的缺点就是我们还会下载HTML页面以及其他一些我们并不需要的东西,不过我们待会儿还可以使用bash脚本来过滤掉这些内容。

另一种方法就是使用Google或Bing语法来搜索网站中的索引文件:

site:example.com filetype:pdf

注:使用filetype这种语法的话,Bing搜索出来的内容要比Google的多!

我们可以使用filetype语法来搜索office文档以及图片等内容,而且这种方法不仅可以帮助我们避免去下载那些没用的内容,而且还可以搜索子域名。从另一方面来看,它是依赖搜索引擎实现的,所以只有搜索引擎收录了的内容我们才能查找到,所以很可能会遗漏某些关键内容,具体还取决于网站的robots.txt文件。如果你想通过自动化的方式实现的话,你得自己动手写个脚本,而且依然会涉及到一些手动任务。如果你想使用工具的话,我推荐snitch。这款工具虽然很小巧,但功能已经可以满足你的需要了。你可以通过下列命令运行snitch并批量获取目标网站中的公开文件:

python2 snitch.py -C "site:whitehouse.gov filetype:pdf" -P 100

获取到文件之后,我们还要使用exiftool来提取其中的元数据。数据的输出格式为JSON(metadata.json),之后我们可以将其发送到Splunk引擎来分析所有的数据。

Sweepatic提供的元数据处理脚本:【点我下载

得到metadata.json文件之后,将其导入到Splunk(运行在Docker容器中)。首先,pull一个Docker Splunk镜像:

docker pull splunk/splunk

启动Splunk:

docker run -d -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_USER=root" -p "8000:8000" splunk/splunk

Splunk将会在本地运行,占用端口为8000。在浏览器中访问localhost:8000,然后完成初始化配置,最后导入需要分析的元数据:

1.点击仪表盘中的“Add Data”

2.点击“Upload”

3.接下来的配置也可以不用修改,保留默认即可,Splunk会自动检测并解析文件

4.来到下一步,在“Index”选项页中创建一个名叫document_metadata的新索引,其他设置不变,我们待会儿会用到这个索引。

5.在“Review”选项页中确认修改,然后完成数据的导入。


分析元数据

现在数据端的内容我们已经准备好了,接下来我们就要开始对这些数据进行分析了。

一般来说,软件在嵌入元数据时采用的是键值对的形式,不过具体的格式还得取决于文件格式。幸运的是,exiftool可以直接帮我们将元数据提取成JSON字典的形式,导入Splunk实例后它可以自动解析这些数据。这里的"键"为元数据名,"值"就是元数据的值,而我们就得通过元数据名来过滤出我们所感兴趣的内容。但是,元数据名并没有一定的标准,不同的软件使用的是不同的元数据名,而保存的内容却是差不多的。比如说“Creator”域中包含了创建这份文档的软件信息,但有些软件则用的是“Producer”。

先来看看你能从元数据中发现什么吧!将下列代码拷贝到Splunk的搜索栏中:

index="document_metadata" 
| eval software=mvappend(Creator, Producer)
| mvexpand software
| where NOT match(software, "^W+$")
| stats dc(FileName) as count by software
| sort -count

输出结果如下:

http://p9.qhimg.com/t016c8f5f48fd8de3a2.png

你可以看到,某些元数据名为公司或组织名称,这是一种非常好的实践方法。我们不仅可以利用正则表达式过滤出一些旧版本的软件,而且还可以搜索该组织所使用的打印机型号,例如关键字:xerox。

http://p5.qhimg.com/t0101cbaa36a32cb287.png

接下来,使用下列语句过滤出文档的创建用户:

index="document_metadata" Author="*" 
| stats count(FileName) as count by Author
| sort -count

http://p8.qhimg.com/t01c3b7e11a68ffbaf1.png

“Author”域中通常包含了操作系统或软件许可证中的用户名,攻击者可以直接用正则表达式在Splunk中搜索类似u12345或john.doe等格式的用户名,例如^[a-z]{1,3}d{3,}$。实际上,除了用户名之外,我们还可以过滤出邮箱地址。同样的,我们还是使用正则表达式:

index="document_metadata" 
| rex field=_raw "(?<email>[-w._]+@[-w._]+)"
| search email!=""
| table FileName, email

http://p0.qhimg.com/t0134f033736bcfeaec.png

在创建文档时,创建人通常会插入关键字,以此来帮助他人精准地搜索到该文件。不过这部分内容有时收集起来比较困难,因为有些软件在嵌入这些信息时使用的是数组,而有些则使用的是字符串(用逗号分隔开)。不过这些对于Splunk来说都不是事儿:

index="document_metadata" Keywords!="" 
| eval keyword=case(
  isstr(Keywords) and like(Keywords, "%, %"), split(Keywords, ", "),
  isstr(Keywords), split(Keywords, " "),
  1=1, Keywords
)
| mvexpand keyword
| regex keyword!="^W+$"
| stats count as kw_count by keyword
| sort 20 -kw_count

http://p7.qhimg.com/t01a4cc3d806b4ad1b0.png

除了关键字之外,文档中还会包含创建人留下的一些注释信息,例如文档版本或其他的一些记录等等,有的时候创建人在发布这些文档之前很可能会忘记删除这些内容:

index="document_metadata" Comments!="" 
| table FileName, Comments

http://p4.qhimg.com/t019049fab13f52e6fe.png

接下来,我们看看“杀伤力”最大的部分:文件路径。这些文件路径可能是本地磁盘路径,或者是网络服务器的共享文件路径,而且文件路径还会暴露Web服务器的文件结构。但这种内容为什么会存在在元数据里面呢?一般来说,导出文档或进行文档格式转换时这种情况才会出现。从元数据中提取文件路径会有一点点复杂,这里仍然需要使用正则表达式(查找路径/unix/style/paths或\windowsfilesharepaths):

index="document_metadata" 
| rex field=_raw ""(?<file_path>(([A-Z]:)?\\\\|/)([-a-zA-Z _.]+(/|\\)){2,}[^"]+)""
| where file_path!="*"
| table FileName, file_path

http://p0.qhimg.com/t01055e2e89d956cf11.png

除了上面这些字符串或键值对形式的元数据之外,我们还可以用Splunk提取出文档创建的时间和日期等信息,并将其解析为图表格式:

index="document_metadata" CreateDate="*" 
| eval document_created=case(
  match(CreateDate, "^d{4}:d{2}:d{2} d{2}:d{2}:d{2}[-+]d{2}:d{2}"), strptime(CreateDate, "%Y:%m:%d %H:%M:%S%:z")
)
| eval _time=document_created
| bucket _time span=1d
| timechart span=1d dc(FileName) as documents

http://p7.qhimg.com/t0135142b39fe393762.png

提取文档的最后修改日期并以图表形式输出:

index="document_metadata" ModifyDate="*" 
| eval document_modified=case(
  match(ModifyDate, "^d{4}:d{2}:d{2} d{2}:d{2}:d{2}[-+]d{2}:d{2}"), strptime(ModifyDate, "%Y:%m:%d %H:%M:%S%:z")
)
| eval _time=document_modified
| bucket _time span=1d
| timechart span=1d dc(FileName) as documents

http://p3.qhimg.com/t01bc34ca5e58a28e78.png


整合信息,制作我们的威胁仪表盘

在前面的章节中,我们介绍了一些可以从元数据中提取威胁情报的基本查询语句,但这些真的只是冰山一角而已。但是在一篇文章中,我们无法面面俱到地给大家介绍所有元数据的查询方法,不过你现在应该已经学会了如何去挖掘更多有价值的数据了。

我们建议各位同学用本文所介绍的技术来收集关于你公司或组织的文档元数据,然后将它们导入到Splunk中(点击下载仪表盘),Splunk会帮助你把这些数据解析成非常漂亮的图表形式,而它们将帮助你更加清楚地了解你的数字足迹,并让你意识到你当前的安全情况。

http://p3.qhimg.com/t012cddade0fe1766e5.png

最佳的实践方式是定期使用Splunk更新你组织所生成的数据,如果你发现组织中的某个人仍然在使用Word 2007之类的旧版本软件来创建那些存储敏感信息的文档,那你一定要及时警告他,因为他会对整个组织的网络系统以及官方网站造成巨大的安全威胁。

注:如果你想了解更多关于应对方案的内容,请通过官网与Sweepatic团队取得联系,他们也许可以帮到你!

(完)