滲透測試的WINDOWS NTFS技巧集合(一)

Editor發表於2018-09-06
——————————————————————————————————————————————————
由於篇幅過長,故將《滲透測試的WINDOWS NTFS技巧集合》分為兩個部分發,今日為第一部分,內有技巧1-4。

明日將釋出第二個部分,內有技巧5、技巧6。
——————————————————————————————————————————————————

這篇文章是來自SEC Consult Vulnerability Lab的ReneFreingruber (@ReneFreingruber),分享了過去幾年從各種部落格文章中收集的或者是他自己發現的檔案系統技巧,這些技巧不可以直接被利用。但是它們會在特殊情況下間接地產生可以被攻擊者利用的漏洞。


請注意,這篇文章只說明有關於如何利用這些問題以及影響的資訊(沒有關於Windows API的技術底層細節),因為這樣會超出本篇文章的技術範圍。


第一個檔案系統技巧(技巧1 - CVE-2018-1036)被微軟修補了,其他技巧還有沒有安全補丁。


技巧1:建立沒有許可權的資料夾(CVE-2018-1036/NTFS EOP)


在Windows上,可以為資料夾分配“特殊許可權”,例如允許使用者在資料夾中建立檔案但不允許建立資料夾的許可權。


此類資料夾的一個示例是C:\Windows\Tasks\,使用者可以在其中建立檔案,但不允許建立資料夾:


滲透測試的WINDOWS NTFS技巧集合(一)

圖1:Windows10,Win7介面不一樣。示例為Windows10


而管理員或程式可能會配置這樣的許可權,並假設使用者不允許在其中建立資料夾。


這個ACL策略可以在使用者建立檔案時被繞過。如果在檔名的末尾新增“::$INDEX_ALLOCATION”將建立一個資料夾而不是一個檔案。Windows當前不包含對該類情況的檢查。


滲透測試的WINDOWS NTFS技巧集合(一)

圖2:建立test資料夾


如上圖所示,已成功建立了一個資料夾,使用者可以在這個資料夾中建立任意的檔案或資料夾(如果管理員/程式認為缺少許可權而無法執行建立資料夾的操作,這個技巧可能會導致特權提升 )。


附註:如果應用程式只允許刪除檔案,:: $ INDEX_ALLOCATION技巧也可用於刪除資料夾。


譯者注:使用以下命令即可刪除資料夾。


rd test::$INDEX_ALLOCATION

微軟漏洞聯絡時間表:


2018年3月1日:    通過secure@microsoft.com進行初步聯絡。傳送PGP加密的部落格帖子。

2018年3月1日:    Microsoft分配了MSRC Case43968CRM:0461039882

2018年3月5日:    微軟要求延長披露期限。

2018年3月5日:    同意延長90天的截止日期。

2018年3月27日:    詢問微軟是否可以重現漏洞以及何時可以獲得補丁。

2018年3月28日:    微軟證實,“技巧1”漏洞已成功重現並分配給了編號CVE-2018-1036。該漏洞將由5B(5月補丁星期二)修復。

2018年4月27日:    微軟與我們聯絡,提議的修復方案導致回退。微軟要求將修補的最後期限延長至2018-06-12(6月補丁週二)。

2018年4月30日:    瞭解微軟的情況,截止日期延長至2018-06-12。詢問微軟是否還會修補其他技巧。

2018年4月30日:    微軟回應稱其他技巧“不會收到低階安全更新”。

2018年6月12日:    Microsoft釋出補丁(請參閱此處的釋出

https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/CVE-2018-1036

2018年6月13日:    部落格釋出。

技巧2:使用供選資料流繞過路徑限制


你可能想知道為什麼上面的方法有效。


<檔名>:<資料流名稱>:<型別>


如果我們建立一個名為test的檔案。它將在內部儲存為test.test::$DATA,因為資料流名為空,且$DATA是預設型別。第一個技巧的原理是將資料流型別更改為INDEX_ALLOCATION,而INDEX_ALLOCATION對應於資料夾型別,所以建立了一個資料夾。


但是,也可以將資料儲存在不同的流中。(這就是所謂的Alternate Data Stream – ADS)。如果我們寫的例子是“test.txt”,我們在實際寫入的是“test.txt::$DATA”(資料流名稱為空)。我們也可以寫入“test.txt:foo” 或“test.txt:foo:$DATA”(兩者都相同,因為$DATA是預設型別)。也可以使用不同的流名稱用於儲存檔案的資訊。如果你從網際網路下載檔案(或通過電子郵件接收),Windows系統會通過流名稱悄悄地新增區域識別符號(如果你想執行會顯示出一個附加的警告對話方塊)例如,如果我們下載“putty.exe”,Windows也會建立”putty.exe:Zone.Identifier:$DATA“。使用dir /r命令可以看到這些流名稱:


滲透測試的WINDOWS NTFS技巧集合(一)

圖3:將zone.identifier放到putty.exe中,然後嘗試讀取出來。


正如我們所看到的,帶有資料流的檔案是不能通過type命令直接讀取的(使用更多的命令就可以了),如果我們使用notepad讀取檔案,那麼可以忽略冒號最末尾的$DATA型別。我們還可以把重要的資訊(包括應用程式!)在ADS中儲存。例如putty.exe就可以複製到ADS中,然後通過wmic呼叫(不可以用start直接呼叫):


滲透測試的WINDOWS NTFS技巧集合(一)

圖4:執行test:Putty.exe


附註:本文撰寫於2018-03-01,並報告給微軟。與此同時,微軟的Windows Defender被更新以檢測WMIC程式呼叫。


你可能會問為什麼有人會這樣做?首先,ADS可以用來隱藏資料(dir沒有使用/r開關不會顯示檔案中的ADS;explorer.exe也不會顯示ADS;稍後介紹如何能夠隱藏dir /r開關的內容…)而ADS還有一個很好的特性——我們可以在資料夾中新增ADS。這樣做的前提是在資料夾裡擁有“建立資料夾”的許可權(而且資料夾名稱不能是數字)。這樣做可以使資料夾上的ADS看起來像是來自父資料夾的檔案!


在Windows上一個普通使用者無法在C:\Windows建立檔案(只有管理員可以寫這個資料夾)。因為只有管理員可以建立這些檔案,所以應用有可能認為檔案在C:\Windows\是可以受信任的。可是普通使用者在C:\Windows\Tracing資料夾中是可以建立檔案和資料夾的,因此普通使用者可以建立一個ADS在這個資料夾中。

假設使用者寫入檔案C:\Windows\Tracing:test.dll。如果這個路徑現在被傳遞給一個遍歷資料夾的Windows API,這個API將從路徑的末尾開始,直到找到第一個“\”。將“\”中剩下的所有內容作為資料夾返回。而C:\Windows\Tracing:test.dll 將返回C:\Windows\作為資料夾。正如前面提到的,一個普通使用者不允許使用這個技巧建立檔案在Windows資料夾。但是我們可以通過這個方法建立了一個檔案,而且是儲存在C:\ Windows資料夾內 !


這裡是不同Windows函式遍歷資料夾的輸出(我們可以看到它總是C:\ Windows):


滲透測試的WINDOWS NTFS技巧集合(一)

圖5:遍歷資料夾


注:上述儲存dll可以開始與Windows內建的control.exe應用程式啟動,命令為:control.exe C:\Windows\tracing:foobar.dll


此行為可用於繞過某些應用程式白名單解決方案,也可以在各種情況下繞過安全檢查。例如程式設計師認為檢查檔案是否儲存在特定的檔案資料夾中就足夠了並且假設當管理員通過設定ACL後寫入這個資料夾。


考慮應用程式允許上傳資料,上傳的資料儲存在applicationFolder \ uploadedData \中。而應用程式允許從applicationFolder\啟動指令碼/應用程式,而不允許從applicationFolder \uploadedData(使用黑名單方法)啟動指令碼/應用程式。如果使用者上傳一個名為“:foo.ps1”的檔案,系統將建立一個類似於applicationFolder\uploadedData:foo.ps1的ADS。此檔案似乎儲存在applicationFolder\中,因此繞過安全檢查。


另一個有趣的事情是ADS可以包含通常檔名禁止使用的“或*符號(必須使用本機Windows API建立這些檔案;cmd.exe會過濾這些字元):


滲透測試的WINDOWS NTFS技巧集合(一)

圖6:特殊符號


這本身就可能導致幾個問題。 (例如,如果檔名以“開頭和路徑被”包圍結尾,正如James Forshaw在他的部落格中提到的方法;請參見參考資料部分)。另一個有趣的攻擊向量可以是XSS(或命令注入)。假設一個網站在IIS上執行並允許上傳檔案,並且很容易出現CSRF。上傳檔案後,將顯示包含檔名的成功對話方塊。如果檔名未被處理,這可能會導致XSS,但是如果檔名不允許包含像<或>之類的符號(因此我們不能用它來執行JavaScript程式碼)。如果允許ADS檔案包含這些符號,那麼攻擊者可以嘗試使用ADS檔名傳送上傳請求:


滲透測試的WINDOWS NTFS技巧集合(一)

圖7:ADS的XSS利用


技巧3:建立無法通過“…”資料夾找到的檔案


每個資料夾都包含預設的兩個特殊條目,也就是指當前資料夾“.”資料夾和指向父資料夾(父目錄)“..”資料夾。在Windows上不能用名稱中的點建立檔案/資料夾,最有可能防止將解析器與點混淆的攻擊。


滲透測試的WINDOWS NTFS技巧集合(一)

圖8:建立...資料夾測試


上面的截圖顯示,不能建立一個“…”或“....”的資料夾。但是可以使用上面提到的:$INDEX_ALLOCATION技巧來繞過:


滲透測試的WINDOWS NTFS技巧集合(一)

圖9:ADS建立....資料夾


“…”資料夾是用上面提到的技巧建立的,但是這樣的資料夾也可以將名稱傳遞兩次來建立,如“…”示例中所示。(mkdir “....\ ....\“ 建立資料夾”....”,但裡面還有一個資料夾“….”。僅僅通過mkdir ”....\xyz\“不起作用)。


使用第二個技巧,我們還可以輸入這些資料夾,在那裡儲存檔案,甚至從這個位置執行程式:


滲透測試的WINDOWS NTFS技巧集合(一)

圖10:向...資料夾寫入檔案的方法


如圖所示,無法僅使用名稱進入資料夾(例如:“cd …”或“cd …\”或“cd …\…”不起作用),必須使用“cd …\…\”的語法。進入資料夾之後可以在這個資料夾裡建立檔案。(有趣的是:如果你在這個資料夾裡輸入“cd .”,你又會回到這個資料夾,因為路徑是混亂的)


此外,也不可能從GUI (explorer.exe)開啟這個資料夾。我遇到了兩種不同的情況。在某些情況下,雙擊這樣的資料夾沒有影響(保持在當前資料夾中,路徑保持不變),在其他情況下,我們將保持在資料夾中,但是資源管理器中的路徑發生了更改。例如,在“開啟”資料夾17次之後(注意路徑中的“…” ):


滲透測試的WINDOWS NTFS技巧集合(一)

圖11:...資料夾顯示在位址列的情況


可以嘗試根據需要隨時進入該資料夾 ,可無法在GUI中的資料夾中看到這些檔案 。也無法通過在上圖中的路徑輸入欄位傳遞“C:\test\…\…\”來開啟資料夾。

(附註:如果試圖從GUI中刪除該資料夾,explorer.exe會崩潰;我們將看到一個對話方塊,其中Windows正在計算資料夾中的檔案以及它所在的位置“很多檔案” ;不要在工作系統上試試這個... )


通過GUI (explorer.exe)搜尋這個資料夾中的檔案也不起作用,例如GUI搜尋“123.txt”檔案,圖形使用者介面實際上是被掛起/搜尋,而不會查詢檔案 。

請注意, 通過cmd進行搜尋是沒有問題的:


滲透測試的WINDOWS NTFS技巧集合(一)

圖12:命令列下搜尋檔案


但是大多數人現在都使用Powershell,而使用Powershell又找不到這個檔案,因為它會陷入無限迴圈:


滲透測試的WINDOWS NTFS技巧集合(一)

圖13:Powershell搜尋


(輸出被截斷,因為命令總是迴圈列印這兩個資料夾......)


搜尋“123.txt”(例如:“Get-ChildItem -Path C:\test -Filter 123.txt -Recurse -ErrorAction SilentlyContinue -Force”)將永遠不會找到該檔案(並且永遠不會結束)。

我還用不同的AntiVirus產品進行了測試,這些產品似乎都可以正常工作(我將惡意軟體樣本放在這個...的特殊資料夾中,經過測試AntiVirus產品可以找到它們)。有些人仍然對這條路徑感到困惑,例如在“C:\test\…\”中搜尋病毒時,他們會在“C:\test\”中搜尋。使用os.walk()的python程式碼似乎也能正常工作。

請注意,只是建立一個目錄連線指向它自己的父資料夾不會在cmd或Powershell中導致無限迴圈 。


技巧4:“隱藏”目錄連線的指向目標


目錄連線是一個非常有用的NTFS功能,可以為攻擊者找到安全漏洞。使用它可以建立(使用普通使用者許可權)到目標資料夾的符號連結。


解釋目錄連線的最佳安全漏洞是AVGater,攻擊者將一個檔案放在x資料夾中,然後將該檔案標記為病毒,並且已安裝的AntiVirus解決方案將其移至隔離區。之後攻擊者刪除資料夾x,並用一個名為“x”的目錄連線替換它,該連線指向C:\windows\System32\。如果攻擊者現在單擊“恢復”按鈕,AntiVirus解決方案會將把檔案複製到x資料夾,該資料夾現在指向具有SYSTEM許可權的system32(直接導致EoP)。


如果目標應用程式包含競爭條件型別漏洞(TOCTOU漏洞——檢查使用時間),則目錄連線會被濫用。


使用mklink實用程式和/J引數建立一個目錄連線。可以將它與::$INDEX_ALLOCATION技巧結合使用,建立一個名為“…”的目錄連線:


滲透測試的WINDOWS NTFS技巧集合(一)

圖14:建立目錄連線


第一個目錄連線“test1”是用一個普通的名稱建立的,因此目標在“dir”輸出中被正確地顯示。但是,在“…”目錄連線的情況下,不再顯示目標(而是顯示[…];見紅框)。還請注意,你可以讓連線點1指向連線點2,指向連線點3,以此類推,直到最後一個指向真正的目的地。


由於路徑混淆,您可以使用上面提到的“cd…\…\”技巧(在system32資料夾中)進入結點,但 “.”會指向“C:\test8”:


滲透測試的WINDOWS NTFS技巧集合(一)

圖15:在...目錄執行dir命令


dir命令從system32資料夾列印檔案(紅色標記;請注意,第一個命令在C:\test8\建立了hello.bat檔案)


滲透測試的WINDOWS NTFS技巧集合(一)

圖16:執行hello.bat結果


紅色標記的檔案是system32資料夾中的最後一個檔案(dir命令的最後一個輸出)。在藍色中我們可以看到執行的是當前目錄 (“.\”)中的“hello.bat” ,由於路徑混淆,執行了C:\test8\hello.bat(綠色方塊)而不是C:\windows\system32\hello.bat。我不確定這是否對安全性產生直接影響。因為我們可以在任何資料夾中啟動檔案。但是它可能會被用來繞過應用程式使用白名單指令碼檔案的白名單解決方案。



————————————————————未完待續,明日續更技巧6&技巧7—————————————————————




本文譯者:lipss(看雪ID)


轉載請註明:轉自看雪論壇




看雪閱讀推薦:


1、打造Wi-Fi “DOS”攻擊工具——Wi-Fi_deauther


2、Asis 2016 b00ks (off by one利用)


3、[原創]網鼎杯第一場預選 babyheap


4、[原創]ctf pwn中的unsorted bin利用及chunk shrink——0ctf2018 heapstorm2 writeup


5、[原創]反虛擬機器技術總結


相關文章