標籤:

文檔元數據——基礎信息泄露的源頭

前 言

在本文中,我將探討文檔類的元數據,以及為什麼它可以作為攻擊者的信息來源。比如, 文檔的元數據可以收集各種高度敏感性數據,例如用戶名,公司中使用的軟體,文件共享位置等。 另外,本文還展示了如何找到公司泄露的元數據,以及利用這些收集的元數據創建一個漂亮的Splunk控制界面,為你的公司提供了一種全新數據管理方式,並以非常低的成本提供全程數據管理。

譯者註:Splunk是一個可運行於各種平台的 IT 數據分析,日誌分析,業務數據分析軟體。

什麼是文檔元數據?

每個組織每天都在生成大量文件以及內容,每次創建文檔時,用於創建該文檔的軟體都會在其中插入所謂的元數據,可以將其描述為有關數據的數據,比如:

用什麼軟體來創建這個文件? (例如Microsoft Word 2007)n什麼用戶創建了這個文件? (例如john.doe,u12345)n創建它的計算機名稱是什麼? (例如Super Secret Lab PC N203)n文件何時創建?n文件上次修改是什麼時候?n文件是否被列印過?n導出文件的磁碟或共享文件路徑(例如DOC_SERVERDOCSPATENTSWormhole_travel_engine.docx)n……n

下圖就是文件元數據的一個示例:

此信息將通過用於創建或修改文檔的軟體自動插入到文檔中,插入的信息的數量和類型取決於所使用的軟體及其配置。很少見到有公司試圖限制這個信息的插入,因此,這些敏感信息就很容易被暴露出來,相信你的競爭對手對這些信息最感興趣了,並利用這些業務分析你公司的業務。

元數據的偵測

對於黑客來說,偵測元數據就像挖掘寶礦一樣。一般來說,公司最有可能面臨三種類型的黑客:

腳本小子:惡意破壞他人系統的一些黑客nAPT攻擊者n內部人員n

需要說明的是,內部人員的攻擊不在本文討論範圍之內,而腳本小子和APT攻擊者之間最大的區別之一是他們在發現系統漏洞階段花費的時間不同。

發現系統漏洞是獲取元數據最重要的階段之一,通常決定著攻擊是否成功。黑客通常先會尋找目標,並發掘所有可用的相關信息,比如連接到互聯網的那些有漏洞的伺服器。

通過執行子域枚舉可以找到易受攻擊的「寶礦」,發現公司的IP範圍中的互聯網暴露設備,並在其上運行漏洞掃描。不過要是對公司的個人用戶進行攻擊時,就有點複雜,需要使用例如LinkedIn進行在線OSINT。 OSINT通常會顯示公司的員工名單,甚至是完整的組織結構圖。如何發現一個公司里哪個環節最薄弱?

雖然這有點複雜,但使用網路釣魚攻擊的辦法卻很有效。通過發送偽裝的電子郵件,再附加具有自定義PowerShell RAT的VBA宏的Microsoft Word文檔。當哪個員工不小心打開該附件時,黑客就趁機發起攻擊。為了增加攻擊的成功率,黑客不會同時發送數百封類似的釣魚電子郵件,因為這會引起公司的安全團隊的注意。那黑客要怎麼做才能增加攻擊機會和後期的利用空間,比如:

攻擊目標使用什麼軟體?如果他使用LibreOffice而不是Microsoft Word,那麼在這種情況下發送VBA宏將不起作用。n目標的操作系統是什麼?利用Windows解析TTF字體的漏洞是無法在Mac OS上運行的。n目標用戶名和電子郵件地址是什麼?這有助於在停留在雷達之下的後期開發階段立足。n公司共享的最多文件是什麼?一旦該文件受到威脅就可以快速的對整個共享的電腦進行傳染。n為公司服務的有哪些服務商?眾所周知,APT攻擊者有時會把目標盯在承包商,因為他們的安全管理比攻擊目標要弱一些。n

也許看到這,你會將所有發布在公司官網上的信息都視為敏感數據。其實並不是這樣,真正威脅公司安全的信息是那些沒有去除元數據的信息,在這些沒有去除元數據的信息中,黑客可以找到所需要的敏感數據。不過,我敢打賭你甚至不知道它在哪裡,我稱之為暗數據(dark data)。暗數據不應發布,對你的公司構成巨大的安全隱患。此外,你可能已經聽說過GDPR(一般數據保護條例),要求你構建和維護你的文件或數據的清單。下圖顯示了發現敏感信息的關係網:

譯者註:暗數據是企業正常商業活動期間搜集,處理,存儲的數據。但這些數據通常無法用於諸如分析,商業關係或者是直接變現獲利等目的。企業信息數據中的大部分都是暗數據。存儲和保障暗數據安全通常需要大量資金。

從上圖可以看出,你公司的安全團隊應該收集的威脅情報有哪些類型。

繪製數字足跡

在本文中,我會將假裝我是安全分析師,負責處理whitehouse.govusa.gov各種子域,這些域將用作繪製泄露元數據的數字足跡。

首先是獲取在我感興趣的網站上公布的文件,為此,我用了以下有各種各樣的技術:

抓取或鏡像網站,下載所有內容。n使用Google / Bing dorking查找公共文件。n像公司負責人要已發布過的所有文件。n

其中最簡單但最骯髒的方式是通過使用wget將所有發布到本地磁碟的內容下載到鏡像站點:

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

但該方法的最明顯的缺點是,會下載很多HTML和其他我不感興趣的內容。但是,稍後可以使用bash腳本過濾此內容。

更有針對性的方法是使用Google或Bing dorks來查找這些搜索引擎索引來的文檔。這也是一些其他工具,如FOCA用於查找文檔(在Google和Bing中工作)所使用的方法:

site:example.com filetype:pdfn

不過對於這些類型的dork(文件類型),Bing往往比Google更多。

文件類型部分可以進一步調整或更改以查看辦公文件,圖片等,此方法可避免從目標網站下載不必要的內容並覆蓋子域(http://example.com涵蓋http://blog.example.com大多數搜索引擎),從而增加了覆蓋面。另一方面,它依賴於搜索引擎和索引的文件,可能會由於robots.txt文件而排除一些有趣的部分。如果你希望自動執行此操作,而不需要手動下載這些文件或編寫相關的腳本。如果你正在尋找一種可以為你收集結果的工具,而不是手動編輯數千個URL的列表,請查看snitch。 雖然Snitch是一個較舊的工具,但仍然非常好用。你可以通過以下參數運行snitch來獲取暴露的文檔列表:

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

如果你想要一個完整的數字足跡概述,建議結合兩種方法,即抓取或鏡像你的網站,然後通過搜索引擎技術豐富文檔。

一旦擁有這些文件,我將使用一個流行的工具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/splunkn

然後啟動它:

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

一旦你在本地的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" n| eval software=mvappend(Creator, Producer)n| mvexpand softwaren| where NOT match(software, "^W+$")n| stats dc(FileName) as count by softwaren| sort -countn

將產生如下表格:

看到這個Word 2013的底部截圖,你認為元數據應該在哪裡,然後發送電子郵件到你的伺服器進行修復。我還可以看到,一些值實際上不是軟體名稱或版本,而是公司名稱。可以使用正則表達式來擴展上面的查詢,以尋找特定的舊版本的軟體。此欄位也可用於搜索公司正在使用的印表機(比如,搜索關鍵字xerox)。

現在,我來瀏覽使用這個查詢創建發布文檔的各種用戶:

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

作者欄位通常包含在生成該文件的操作系統或軟體許可證中設置的人員名稱,攻擊者可以尋找那些像u12345,john.doe或類似格式的常用用戶名。這些可以使用Splunk查詢中的正則表達式進行過濾,例如^ [a-z] {1,3} d {3,} $,其他用戶名格式也可以與正則表達式類似。可以通過調整稍後展示的文件路徑正則表達式或使用包含與作者欄位相同類型的信息的LastModifiedBy欄位來提取其他用戶名。

當我簡要介紹元數據中發現的個人信息的主題時,電子郵件地址也要用到正則表達式,更具體來說,就是這個Splunk查詢:

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

創建文檔時,創建者有時會將關鍵字放在其中,這用於幫助搜索企業文件共享中的特定文檔,它是元數據的一部分,以方便被檢索。困難在於,一些軟體嵌入的是一個數組,而另一些軟體將它作為一個長字元串嵌入到元數據中,作為分隔符等等。幸運的是,對我來說,可以用以下這個查詢做到這一點:

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

一般來說,關鍵字並不是最有趣的元數據,但在某些情況下,它可以用於查找非常有趣的東西,那就是當你查看或過濾關鍵字(如機密,受限制等)時。我已經看到幾次標有機密的文件已經在公司網站上被發布。當然,這也取決於你的公司是如何標記文檔級別的。一些軟體可以將其放入單獨的元數據欄位中,而不是關鍵字,或者可能根本就不在元數據中。你也可以通過Splunk索引整個文檔的內容,在其中搜索這些機密關鍵字。

與關鍵字類似,文檔還包含作者在撰寫時留下的評論,例如在發布最終版本或個人意見及注釋之前的草稿。在發布文檔之前,文章創建者可能會忘記刪除這些注釋。

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

其中最可怕的部分便是文件路徑的泄露,這些路徑通常包含生成文檔的人的本地磁碟上的路徑或網路上的文件共享位置,更甚者,比如Web伺服器上的文件結構。最常見的情況是導出文檔或格式之間的轉換。假設你準備好一個Word文檔,以便在最終版本被批準時在網站上公布,你將其導出為PDF,然後在線發布。大多數軟體會以其他格式來將文檔導出到目標格式中,將其用於轉換的文件嵌入到目標格式中經常看到使用MS Word docx文件來生成PDF報告。另外,文件包含的印表機標識(名稱和型號,IP地址網路等)都會被泄露。從元數據中提取文件路徑有點複雜,因為我要使用正則表達式來找到/ unix / style / paths或 windows file share paths:

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

到目前為止,我一直把各種字元串作為元數據,但是,還有各種數據可以作為元數據,比如時間戳。通常黑客利用文檔元數據中的那些時間戳可以查詢提取該文檔首次創建的版本:

index="document_metadata" CreateDate="*" n| eval document_created=case(n 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")n)n| eval _time=document_createdn| bucket _time span=1dn| timechart span=1d dc(FileName) as documentsn

同樣,也可以在提取終稿時候的版本:

index="document_metadata" ModifyDate="*" n| eval document_modified=case(n 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")n)n| eval _time=document_modifiedn| bucket _time span=1dn| timechart span=1d dc(FileName) as documentsn

在分析Splunk中的時間時,你需要注意不同的軟體可以將不同格式的時間戳放在元數據中。通過在查詢中擴展case子句可以輕鬆地增加解析這些附加格式的覆蓋面。從上圖可以看出,我可以跟蹤多年前的文件,乍一看,這個時間表可能似乎沒有提供很多信息,但是它可以以多種方式使用。通過分析每月使用的峰值,可以看到每個星期二的該公司會進行生產並更新公開的內容。

然而,攻擊者最有趣的部分便是過濾出最近創建的文檔。使用上面的查詢,我可以發現有人正在使用MS Word 2007,雖然已經很久不用了,但是將其與時間戳相結合,可以了解到我上次看到它上次被查看是在2007年12月。

元數據的整合

將以上的碎片數據整合在一起,便會形成非常可怕的信息。

我上文介紹的一些分析元數據的基本查詢方法只是黑客使用的方法中的小小一部分。所以為了全面保護你公司的信息,我建議你要真正掌握元數據的發生足跡,並隱藏這些足跡。你可以使用Splunk來管理貴公司的數字足跡。

一個很好的做法是定期更新Splunk關於你公司正在產生和暴露的數據,並結合保存的搜索,提醒你創建的機密信息。

監控你公司發布的文件和暗數據至關重要,這能為你公司的安全狀態提供全新的保護。

本文翻譯自:Metadata: a hackers best friend ,如若轉載,請註明來源於嘶吼: 文檔元數據--基礎信息泄露的源頭 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

AirHopper:使用無線電突破獨立網路和手機物理隔離(上)
3個步驟實現簡單語言解釋器(自製簡易編程語言)
Linux 防火牆技術
許可權的遊戲

TAG:信息安全 |