导语:在本文中,我将探讨文档类的元数据,以及为什么它可以作为攻击者的信息来源。比如, 文档的元数据可以收集各种高度敏感性数据,例如用户名,公司中使用的软件,文件共享位置等。

1.png

前 言

在本文中,我将探讨文档类的元数据,以及为什么它可以作为攻击者的信息来源。比如, 文档的元数据可以收集各种高度敏感性数据,例如用户名,公司中使用的软件,文件共享位置等。 另外,本文还展示了如何找到公司泄露的元数据,以及利用这些收集的元数据创建一个漂亮的Splunk控制界面,为你的公司提供了一种全新数据管理方式,并以非常低的成本提供全程数据管理。

译者注:Splunk是一个可运行于各种平台的 IT 数据分析,日志分析,业务数据分析软件。

什么是文档元数据?

每个组织每天都在生成大量文件以及内容,每次创建文档时,用于创建该文档的软件都会在其中插入所谓的元数据,可以将其描述为有关数据的数据,比如:

用什么软件来创建这个文件? (例如Microsoft Word 2007)
什么用户创建了这个文件? (例如john.doe,u12345)
创建它的计算机名称是什么? (例如Super Secret Lab PC N203)
文件何时创建?
文件上次修改是什么时候?
文件是否被打印过?
导出文件的磁盘或共享文件路径(例如DOC_SERVERDOCSPATENTSWormhole_travel_engine.docx)
……

下图就是文件元数据的一个示例:

2.png

此信息将通过用于创建或修改文档的软件自动插入到文档中,插入的信息的数量和类型取决于所使用的软件及其配置。很少见到有公司试图限制这个信息的插入,因此,这些敏感信息就很容易被暴露出来,相信你的竞争对手对这些信息最感兴趣了,并利用这些业务分析你公司的业务。

元数据的侦测

对于黑客来说,侦测元数据就像挖掘宝矿一样。一般来说,公司最有可能面临三种类型的黑客:

脚本小子:恶意破坏他人系统的一些黑客
APT攻击者
内部人员

需要说明的是,内部人员的攻击不在本文讨论范围之内,而脚本小子和APT攻击者之间最大的区别之一是他们在发现系统漏洞阶段花费的时间不同。

发现系统漏洞是获取元数据最重要的阶段之一,通常决定着攻击是否成功。黑客通常先会寻找目标,并发掘所有可用的相关信息,比如连接到互联网的那些有漏洞的服务器。

通过执行子域枚举可以找到易受攻击的“宝矿”,发现公司的IP范围中的互联网暴露设备,并在其上运行漏洞扫描。不过要是对公司的个人用户进行攻击时,就有点复杂,需要使用例如LinkedIn进行在线OSINT。 OSINT通常会显示公司的员工名单,甚至是完整的组织结构图。如何发现一个公司里哪个环节最薄弱?

虽然这有点复杂,但使用网络钓鱼攻击的办法却很有效。通过发送伪装的电子邮件,再附加具有自定义PowerShell RAT的VBA宏的Microsoft Word文档。当哪个员工不小心打开该附件时,黑客就趁机发起攻击。为了增加攻击的成功率,黑客不会同时发送数百封类似的钓鱼电子邮件,因为这会引起公司的安全团队的注意。那黑客要怎么做才能增加攻击机会和后期的利用空间,比如:

攻击目标使用什么软件?如果他使用LibreOffice而不是Microsoft Word,那么在这种情况下发送VBA宏将不起作用。
目标的操作系统是什么?利用Windows解析TTF字体的漏洞是无法在Mac OS上运行的。
目标用户名和电子邮件地址是什么?这有助于在停留在雷达之下的后期开发阶段立足。
公司共享的最多文件是什么?一旦该文件受到威胁就可以快速的对整个共享的电脑进行传染。
为公司服务的有哪些服务商?众所周知,APT攻击者有时会把目标盯在承包商,因为他们的安全管理比攻击目标要弱一些。

也许看到这,你会将所有发布在公司官网上的信息都视为敏感数据。其实并不是这样,真正威胁公司安全的信息是那些没有去除元数据的信息,在这些没有去除元数据的信息中,黑客可以找到所需要的敏感数据。不过,我敢打赌你甚至不知道它在哪里,我称之为暗数据(dark data)。暗数据不应发布,对你的公司构成巨大的安全隐患。此外,你可能已经听说过GDPR(一般数据保护条例),要求你构建和维护你的文件或数据的清单。下图显示了发现敏感信息的关系网:

1501146327332515.png

译者注:暗数据是企业正常商业活动期间搜集,处理,存储的数据。但这些数据通常无法用于诸如分析,商业关系或者是直接变现获利等目的。企业信息数据中的大部分都是暗数据。存储和保障暗数据安全通常需要大量资金。

从上图可以看出,你公司的安全团队应该收集的威胁情报有哪些类型。

绘制数字足迹

在本文中,我会将假装我是安全分析师,负责处理whitehouse.gov和usa.gov各种子域,这些域将用作绘制泄露元数据的数字足迹。

首先是获取在我感兴趣的网站上公布的文件,为此,我用了以下有各种各样的技术:

抓取或镜像网站,下载所有内容。
使用Google / Bing dorking查找公共文件。
像公司负责人要已发布过的所有文件。

其中最简单但最肮脏的方式是通过使用wget将所有发布到本地磁盘的内容下载到镜像站点:

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

但该方法的最明显的缺点是,会下载很多HTML和其他我不感兴趣的内容。但是,稍后可以使用bash脚本过滤此内容。

更有针对性的方法是使用Google或Bing dorks来查找这些搜索引擎索引来的文档。这也是一些其他工具,如FOCA用于查找文档(在Google和Bing中工作)所使用的方法:

site:example.com filetype:pdf

不过对于这些类型的dork(文件类型),Bing往往比Google更多。

文件类型部分可以进一步调整或更改以查看办公文件,图片等,此方法可避免从目标网站下载不必要的内容并覆盖子域(example.com涵盖blog.example.com大多数搜索引擎),从而增加了覆盖面。另一方面,它依赖于搜索引擎和索引的文件,可能会由于robots.txt文件而排除一些有趣的部分。如果你希望自动执行此操作,而不需要手动下载这些文件或编写相关的脚本。如果你正在寻找一种可以为你收集结果的工具,而不是手动编辑数千个URL的列表,请查看snitch。 虽然Snitch是一个较旧的工具,但仍然非常好用。你可以通过以下参数运行snitch来获取暴露的文档列表:

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

如果你想要一个完整的数字足迹概述,建议结合两种方法,即抓取或镜像你的网站,然后通过搜索引擎技术丰富文档。

一旦拥有这些文件,我将使用一个流行的工具exiftool从CLI switch -j的组合中提取元数据,输出会以JSON格式显示,通过Splunk,我可以管理和分析所有的数据。

点此下载处理元数据的bash脚本。

该脚本可以通过两种方式使用:

1.你可以通过下载网站内容的文件夹提供运行的位置,然后,运行exiftool将元数据提取到当前工作目录中的metadata.json文件中,并过滤出不感兴趣的文件(如HTML和文本文件)。

2.你可以传递第二个参数,该参数就是文件的位置,其中包含要下载的URL列表,然后分析元数据(例如通过Google dorking获取的文档列表)。

一旦你有了metadata.json文件,就把它导入到在Docker容器中运行的Splunk。首先,从Docker官方存储库中下载一个Docker Splunk镜像:

docker pull splunk/splunk

然后启动它:

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

一旦你在本地的8000端口上运行Splunk,请使用Web浏览器访问localhost:8000,并进行初始设置(更改默认管理员密码)。完成后,导入元数据进行分析,分析分为5步:

1.单击主显示板上的添加数据或菜单中的设置面板。

2.点击上传。

3.设置源文件,默认情况下,你可以保留这些设置,Splunk应该自动检测到它是一个JSON文件并自动解析。

4.转到下一页,在索引部分创建一个名为document_metadata的新索引(只给它一个名称,保持其他设置不变),我将在下面进一步描述的搜索查询中使用此索引。如果要使用不同的索引,那么不要忘记相应地调整查询。

5.在“审阅”部分中确认更改并完成导入数据。

分析元数据

你现在可以从数据端准备好一切,所以让我跳到更有趣的部分,并分析刚收集的数据。

嵌入元数据的软件通常通过使用key-value方案来实现,精确的格式取决于文件格式。幸运的是,exiftool为我提取了一个JSON目录,在导入到Splunk实例中时自动解析。这里的关键是元数据名称,它是我感兴趣的部分,例如创建文档,使用什么软件等。我需要知道这些元数据字段名称来过滤掉我想要的数据。不幸的是,这些字段名称并不是很标准,不同的软件可以使用具有相同含义的不同字段名称。例如,有一个名为“Creator”的字段,其中包含有关用于生成文件的软件的信息。一些软件使用 “Producer” 字段存储相同的信息,还有一个两个字段都使用的软件,其中“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

将产生如下表格:

1501146499258695.png

看到这个Word 2013的底部截图,你认为元数据应该在哪里,然后发送电子邮件到你的服务器进行修复。我还可以看到,一些值实际上不是软件名称或版本,而是公司名称。可以使用正则表达式来扩展上面的查询,以寻找特定的旧版本的软件。此字段也可用于搜索公司正在使用的打印机(比如,搜索关键字xerox)。

11.png

现在,我来浏览使用这个查询创建发布文档的各种用户:

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

1501146540897212.png

作者字段通常包含在生成该文件的操作系统或软件许可证中设置的人员名称,攻击者可以寻找那些像u12345,john.doe或类似格式的常用用户名。这些可以使用Splunk查询中的正则表达式进行过滤,例如^ [a-z] {1,3}  d {3,} $,其他用户名格式也可以与正则表达式类似。可以通过调整稍后展示的文件路径正则表达式或使用包含与作者字段相同类型的信息的LastModifiedBy字段来提取其他用户名。

当我简要介绍元数据中发现的个人信息的主题时,电子邮件地址也要用到正则表达式,更具体来说,就是这个Splunk查询:

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

13.png

创建文档时,创建者有时会将关键字放在其中,这用于帮助搜索企业文件共享中的特定文档,它是元数据的一部分,以方便被检索。困难在于,一些软件嵌入的是一个数组,而另一些软件将它作为一个长字符串嵌入到元数据中,作为分隔符等等。幸运的是,对我来说,可以用以下这个查询做到这一点:

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

1501146596619225.png

一般来说,关键字并不是最有趣的元数据,但在某些情况下,它可以用于查找非常有趣的东西,那就是当你查看或过滤关键字(如机密,受限制等)时。我已经看到几次标有机密的文件已经在公司网站上被发布。当然,这也取决于你的公司是如何标记文档级别的。一些软件可以将其放入单独的元数据字段中,而不是关键字,或者可能根本就不在元数据中。你也可以通过Splunk索引整个文档的内容,在其中搜索这些机密关键字。

与关键字类似,文档还包含作者在撰写时留下的评论,例如在发布最终版本或个人意见及注释之前的草稿。在发布文档之前,文章创建者可能会忘记删除这些注释。

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

1501146621664923.png

其中最可怕的部分便是文件路径的泄露,这些路径通常包含生成文档的人的本地磁盘上的路径或网络上的文件共享位置,更甚者,比如Web服务器上的文件结构。最常见的情况是导出文档或格式之间的转换。假设你准备好一个Word文档,以便在最终版本被批准时在网站上公布,你将其导出为PDF,然后在线发布。大多数软件会以其他格式来将文档导出到目标格式中,将其用于转换的文件嵌入到目标格式中经常看到使用MS Word docx文件来生成PDF报告。另外,文件包含的打印机标识(名称和型号,IP地址网络等)都会被泄露。从元数据中提取文件路径有点复杂,因为我要使用正则表达式来找到/ unix / style / paths或 windows  file  share  paths:

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

1501146644501935.png

到目前为止,我一直把各种字符串作为元数据,但是,还有各种数据可以作为元数据,比如时间戳。通常黑客利用文档元数据中的那些时间戳可以查询提取该文档首次创建的版本:

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

1501146673850259.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

1501146693259179.png

在分析Splunk中的时间时,你需要注意不同的软件可以将不同格式的时间戳放在元数据中。通过在查询中扩展case子句可以轻松地增加解析这些附加格式的覆盖面。从上图可以看出,我可以跟踪多年前的文件,乍一看,这个时间表可能似乎没有提供很多信息,但是它可以以多种方式使用。通过分析每月使用的峰值,可以看到每个星期二的该公司会进行生产并更新公开的内容。

然而,攻击者最有趣的部分便是过滤出最近创建的文档。使用上面的查询,我可以发现有人正在使用MS Word 2007,虽然已经很久不用了,但是将其与时间戳相结合,可以了解到我上次看到它上次被查看是在2007年12月。

元数据的整合

将以上的碎片数据整合在一起,便会形成非常可怕的信息。

我上文介绍的一些分析元数据的基本查询方法只是黑客使用的方法中的小小一部分。所以为了全面保护你公司的信息,我建议你要真正掌握元数据的发生足迹,并隐藏这些足迹。你可以使用Splunk来管理贵公司的数字足迹。

1501146725317807.png

一个很好的做法是定期更新Splunk关于你公司正在产生和暴露的数据,并结合保存的搜索,提醒你创建的机密信息。

1501146734749467.png

监控你公司发布的文件和暗数据至关重要,这能为你公司的安全状态提供全新的保护。

1501146743350404.png

源链接

Hacking more

...