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

Editor發表於2018-09-07

技巧5:隱藏供選資料流


如前所述,可以通過dir命令中的/r開關檢視ADS。而streams.exe是Sysinternals裡的一個工具,它也可以檢視資料流:


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

圖17:streams.exe檢視ADS


在舊版本的Windows中,可以使用保留名作為基本名稱來隱藏ADS (例如: CON, NUL, COM1, COM2, LPT1, …)。而在Windows 10上就做不到了,但“…”仍然有效:


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

圖18:測試保留名隱藏ADS


“…”上的ADS是成功建立的,但是沒有被streams.exe工具列出。在COM1上建立ADS會導致錯誤,在NUL上建立ADS沒有任何提示(ADS沒被建立)。

請注意,還可以在驅動器上建立一個ADS,比如“echo 123 > C:\:abc.txt”。將隱藏在C:\ 中的“dir /r” 命令中。但是,它將在“..”目錄的C:\子資料夾中顯示ADS。例如:


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

圖19:在C:建立ADS的效果


紅色標記的部分ADS是由 C:\:abc.txt 建立。如果直接在C:\上呼叫 ,那麼通過Sysinternals工具流也看到ADS。因此,為了避開這兩種工具,應該使用“…”技巧。


所以還存在可用於隱藏工具的第二技巧。在Windows上可以新增“.<空格>.”在檔案的末尾,Windows將會自動刪除它(規範化將其刪除)。


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

圖20:新增...的技巧,echo 123 > "abc. ."


但是我們可以用ADS創建這樣的檔案!用工具不能開啟這個檔案,因為像“xyz. .”這樣的路徑會自動地更改為“xyz”,而這個檔案不存在。

這是證明:


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

圖21:“xyz. .”檔案被建立


建立的ADS foobar.txt通過工具是無法找到的:


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

圖22:foobar.txt


附註1:此類檔案也可以通過以下方式建立: echo test > “test. .::$DATA”


附註2:請注意“..:abc.txt”是在“C:\:abc.txt”上建立的ADS。


我們還可以建立一個名為“. .” 的目錄,如下所示:


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

圖23:建立一個名為“. .” 的目錄


這個資料夾是不可以進入的:


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

圖24:不可以進入名為“. .” 的目錄


前面提到過(像cd . .. .\ 無法正常使用),但是cd “. .::$INDEX_ALLOCATION” 是可以使用的(雙引號很重要)。


如果我們可以在資料夾名之間新增空格,那我們也可以在末尾新增空格,如 “b ” 或“.. ” 或“. “。


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

圖25:資料夾末尾新增空格


說明:有一個“b”和一個“b ”資料夾,一個名為“a”的檔案,一個名為“a ”的檔案,兩個預設的目錄“.”和“..”和“. ”和“. .”。


名稱為“.. ”的目錄可以使用我們已經討論過的技術進行寫入檔案:


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

圖26:寫入檔案到“. . ”目錄中


附註1:如果在資料夾上單擊兩次,可以通過檔案管理器開啟該資料夾。也會正確顯示資料夾的內容。但是由於路徑錯誤,無法開啟其中的檔案(explorer.exe 使用 C:\test22.. .. \123.txt 而不是 C:\test22.. \123.txt)。在搜尋這樣的資料夾時,Powershell將再次陷入無限迴圈。


附註2:還可以在一個名為“abc”的資料夾上建立ADS。然後可以將資料夾重新命名為僅包含數字的名稱(如“1”)。之後你仍然可以看到ADS,但是你不能開啟它。(用數字作為名稱的資料夾上的ADS不起作用)。要開啟ADS資料,必須首先將資料夾重新命名為“abc”。


檔案系統與反病毒產品/取證軟體:


我快速驗證了上述針對AntiVirus產品的技巧,以驗證它們是否可以捕獲濫用技巧的惡意軟體。最值得關注之處是檔案/資料夾以 “. .”結尾產生的變化。例如我將eicar(測試病毒)儲存在一個資料夾中,並用以下命令複製:


copy eicar.com >"123. .::$DATA"

copy eicar.com > tester

echo123>"foo. .::INDEX_ALLOCATION"

cd"foo. .::$INDEX_ALLOCATION"

copy ..\eicar.com .

copy ..\eicar.com .\eicar

之後,我重新啟用了AntiVirus解決方案並掃描了該資料夾,所有AntiVirus解決方案都在此資料夾中找到了“eicar.com”和“tester”,而不是“123. .” 中的eicar病毒或“foo. .” 資料夾中的兩個檔案。但是進入該資料夾並啟動檔案時,AntiVirus產品會找到它們(因為內容是從檔案系統載入到記憶體的)。Windows Defender的“刪除”操作無法刪除檔案,因此沒有影響。但是Emsisoft的“刪除”操作可以刪除資料夾中的tester病毒(譯者注:Emsisoft是來自澳大利亞的防毒軟體)。


Emsisoft刪除了 “foo. .” 資料夾中的 “eicar.com” 檔案,“eicar”檔案沒有被刪除,內容可以毫無問題地讀取(Emsisoft回應我們,只有對映為可執行檔案的檔案才會被掃描,有些特定的副檔名如.com除外)。這種行為可以在檔案保護設定中通過切換到“徹底掃描”來讀取就可以進行查殺;另一方面,Windows Defender也阻止了將“eicar”作為文字檔案讀取)。


我還對Autopsy 4.6.0(免費取證軟體)進行了一個簡短的測試。通過將“logical files ”模式載入到工具中(從正在執行的系統;不是一個磁碟映像),可以輸入“…” 資料夾,但是不能輸入“foo. .” 資料夾。我建立了兩個檔案,一個命名為“valid”,內容為“valid”,還有一個檔案命名為“valid.”,內容為“secret”。Autopsy 顯示了兩個檔案的內容“valid”(而不是“secret”的內容)。在“logical files ”模式下雙擊“.. ”資料夾(末尾有空格)後被轉化為“..” 。在磁碟映象(raw)模式下,一切都顯示正確(在live模式中,Autopsy使用Windows API訪問資料,才會出現問題)



技巧6:隱藏程式二進位制


正如上面已經討論過的:Windows會在檔案的末尾自動刪除“. .” 。如果我們可以以“file1. .” 這樣的名稱來啟動一個程式呢?好吧,那就會在“file1”執行的情況發生檢查(例如:來自AntiVirus產品的簽名檢查)。讓我們試試以下命令:


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

圖27:複製了三個檔案


我們建立了3個檔案:


來自taskmgr具有微軟簽名的檔案“file”

“file. .”這是我們的"假惡意軟體",應該隱藏但執行

“filex x”包含WinSCP的簽名,此檔案稍後將變得重要。

我們現在需要一種方法來從 “file. .” 二進位制檔案啟動程式,這不是一項簡單的任務,因為所有Microsoft Windows API呼叫都會自動從檔名中刪除“. .”,然後啟動“file”(taskmgr)。為了解決這個問題,我們使用以下程式碼:


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

圖28:解決自動從檔名中刪除“. .”的程式碼


上面的程式碼只是呼叫CreateProcessA來從“filex x”(WinSCP)建立一個程式。如果我們編譯這個應用程式並啟動它,最終將執行的是WinSCP。可我們不能正常啟動這個檔案。相反,我們在偵錯程式內啟動應用程式(例如:WinDbg)。現在我們在函式中設定一個斷點,它將產生相關的系統函式呼叫,呼叫:“bp ntdll!NtCreateUserProcess”。我們可以使用 “g” (go) 命令在偵錯程式中啟動程式並命中斷點。在斷點處,可以dump當前堆疊 (“dq rsp”) 。堆疊上的第12個指標很重要,應該被dump。這個地址的第四個值是指向檔名的指標。


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

圖29:windbg


檔名(綠色框)現在是標準化顯示(以\??\C:\… 開頭)。這種標準化還需要從檔名末尾刪除 “. .” ——這就是為什麼上面的C程式碼不使用“file. .” 作為程式名的原因。但是由於檔案已經被改變為標準化,現在可以修改這個值。讓我們用“.” 覆蓋 “x” 字元。(命令“eb”用於編輯位元組):


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

圖30:編輯位元組為"."


然後繼續執行“g”。猜猜會發生什麼?


“file. .” (惡意軟體)被執行。但如果使用者右鍵單擊工作管理員中的程式並選擇“屬性”,則顯示“file” (taskmgr) 的Microsoft簽名。


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

圖31:顯示“file” (taskmgr) 的Microsoft簽名。

但是“filex x” (WiSCP)是什麼呢?是的,這個檔案也顯示為正在執行的程式,即程式資源管理器(因為路徑是在呼叫NtCreateUserProcess之前設定的)。

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

圖32:"filex x"執行情況


與PowerShell有什麼關係?是的,也是錯誤的二進位制檔案:


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

圖33:Powershell顯示情況


這是不是安全問題得視情況而定。首先,攻擊者可以啟動一個程式(惡意軟體),重新命名/刪除它,然後將一個有效的檔案重新命名為相同的名稱。在taskmanager和process explorer中也會出現上述效果。但是不同之處在於,使用上述技巧,得在程式啟動的同時發生。


例如,如果在雲中已知二進位制雜湊,請考慮已經安裝的端點保護檢查每個已啟動的程式。通過此技巧,端點保護可能會使用錯誤的二進位制檔案來驗證雜湊是否為白名單。另外還要注意建立此類程式並不需要偵錯程式,應用程式可以掛鉤 NtCreateUserProcess函式並在鉤子中就可以實現修改。


WINDOWS CMD的技巧:


這些技巧與檔案系統技巧沒有任何關係,但是我認為它們很適合這篇博文。在Windows cmd中,可以在命令中的任何位置寫入^符號,CMD將完全忽略掉這個符號。例如,“calc.exe” 和“ca^l^c”效果相同。^是不是最後一個符號不重要,並且兩個^符號在相鄰時無法使用。使用雙引號"隔開就沒有限制了(它可以是最後一個字元或多次使用)。例如,^ca^“^”^lc^“將啟動計算器。


這同樣適用於零長度環境變數。可以通過%name%訪問環境變數。如果環境變數的長度為零,則“cal%name%c”將與“calc”相同。由於環境變數的預設值長度不為零,因此不能直接使用。但是,可以使用特殊語法(:~start,end)在環境變數上呼叫substring。下圖顯示了“windir”環境變數以及子字串如何與negativ值一起使用以獲取返回的零長度變數:


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

圖34:環境變數取字元


下圖顯示了這些技術的組合,以隱藏Powershell在版本2中啟動(這些技巧在之前很有用,但在最新的Windows 10系統上應該是實現不了):


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

圖35:執行Powershell技巧


可以看到使用^和環境變數技巧(%os:~0,-56%),還使用版本“00000000002.0000”(而不僅僅是2)並且引數是“?ver ”不是“-ver”(注意,這不是正常的?符號,它是U+2015 ;光使用?不起作用)。


在Windows上除了“\” 也可以把“/”作為路徑使用。例如,C:\Windows/\//\system32\calc.exe 與C:\Windows\system32\calc.exe 相同。 而且還可以通過UNC路徑訪問二進位制檔案不用 “C:\”模式: \\127.0.0.1\C$\windows\system32\calc.exe


通常可以使用類似的技巧來突破使用黑名單的方法(例如,如果禁止使用Powershell.exe,則攻擊者可以呼叫Power^shell.exe來繞過限制。或者如果禁止使用calc,則可以執行:^"%LOCALAPPDATA:~-3%^%SYSTEMROOT:~0,1%^"啟動calc.exe等)。


這篇部落格文章由RenéFreingruber (@ReneFreingruber) 代表SEC Consult Vulnerability Lab撰寫。James Forshaw(@tiraniddo)將一系列的技術列表文件化。Alex Inführ (@insertScript) 在他的部落格文章中記錄了一些ADS隱藏技巧。有關ADS之前的參考文獻,請參閱以下參考資料部分。


參考文獻

https://msdn.microsoft.com/en-us/library/dn393272.aspx

https://tyranidslair.blogspot.co.at/2014/05/abusive-directory-syndrome.html

https://tyranidslair.blogspot.co.at/2014/06/addictive-double-quoting-sickness.html

https://googleprojectzero.blogspot.co.at/2016/02/the-definitive-guide-on-win32-to-nt.html

https://googleprojectzero.blogspot.co.at/2015/12/between-rock-and-hard-link.html

https://googleprojectzero.blogspot.co.at/2015/08/windows-10hh-symbolic-link-mitigations.html

http://insert-script.blogspot.co.at/2012/11/hidden-alternative-data-streams.html

https://bogner.sh/2017/11/avgater-getting-local-admin-by-abusing-the-anti-virus-quarantine/


附錄


譯者注:經過測試Windows XP後微軟就禁止使用者從ADS裡執行程式了。不允許執行,但是寫入,讀出操作都可以。其實只是禁用了OWASP中提到的start命令,文章中用WMIC執行就很巧妙的繞過封堵,測試方法如下(需要使用絕對路徑)。


wmic process call create"C:\ProjectCode\test\test:putty.exe"


文中的zone.identifier是一個文字檔案,然後作為資料流存放到了putty.exe裡。ADS並不是一個新的話題了,在翻譯過程中發現國內有許多相關資料寫得都不錯,國人很棒棒。根據目前知識量的儲備在WinDBG除錯部分翻譯的詞彙翻譯不夠準確,根據需求請參考原文。


文章來源

1)https://www.sec-consult.com/en/blog/2018/06/pentesters-windows-ntfs-tricks-collection/

2)OWASP alternate_data_stream

3)https://www.owasp.org/index.php/Windows_::DATA_alternate_data_stream

4)一個用ADS(供選資料流)隱藏Windows後門的方法

5)http://www.freebuf.com/articles/73270.html

6)檔案流-MSDN說明

7)https://msdn.microsoft.com/en-us/library/dn410405.aspx

8)https://docs.microsoft.com/zh-cn/windows/desktop/FileIO/file-streams

9)Hidden Alternative Data Streams的進階利用技巧

10)http://www.4hou.com/technology/4783.html




相關文章