滲透測試的WINDOWS NTFS技巧集合(二)
技巧5:隱藏供選資料流
如前所述,可以通過dir命令中的/r開關檢視ADS。而streams.exe是Sysinternals裡的一個工具,它也可以檢視資料流:
圖17:streams.exe檢視ADS
在舊版本的Windows中,可以使用保留名作為基本名稱來隱藏ADS (例如: CON, NUL, COM1, COM2, LPT1, …)。而在Windows 10上就做不到了,但“…”仍然有效:
圖18:測試保留名隱藏ADS
“…”上的ADS是成功建立的,但是沒有被streams.exe工具列出。在COM1上建立ADS會導致錯誤,在NUL上建立ADS沒有任何提示(ADS沒被建立)。
請注意,還可以在驅動器上建立一個ADS,比如“echo 123 > C:\:abc.txt”。將隱藏在C:\ 中的“dir /r” 命令中。但是,它將在“..”目錄的C:\子資料夾中顯示ADS。例如:
圖19:在C:建立ADS的效果
紅色標記的部分ADS是由 C:\:abc.txt 建立。如果直接在C:\上呼叫 ,那麼通過Sysinternals工具流也看到ADS。因此,為了避開這兩種工具,應該使用“…”技巧。
所以還存在可用於隱藏工具的第二技巧。在Windows上可以新增“.<空格>.”在檔案的末尾,Windows將會自動刪除它(規範化將其刪除)。
圖20:新增...的技巧,echo 123 > "abc. ."
但是我們可以用ADS創建這樣的檔案!用工具不能開啟這個檔案,因為像“xyz. .”這樣的路徑會自動地更改為“xyz”,而這個檔案不存在。
這是證明:
圖21:“xyz. .”檔案被建立
建立的ADS foobar.txt通過工具是無法找到的:
圖22:foobar.txt
附註1:此類檔案也可以通過以下方式建立: echo test > “test. .::$DATA”
附註2:請注意“..:abc.txt”是在“C:\:abc.txt”上建立的ADS。
我們還可以建立一個名為“. .” 的目錄,如下所示:
圖23:建立一個名為“. .” 的目錄
這個資料夾是不可以進入的:
圖24:不可以進入名為“. .” 的目錄
前面提到過(像cd . .. .\ 無法正常使用),但是cd “. .::$INDEX_ALLOCATION” 是可以使用的(雙引號很重要)。
如果我們可以在資料夾名之間新增空格,那我們也可以在末尾新增空格,如 “b ” 或“.. ” 或“. “。
圖25:資料夾末尾新增空格
說明:有一個“b”和一個“b ”資料夾,一個名為“a”的檔案,一個名為“a ”的檔案,兩個預設的目錄“.”和“..”和“. ”和“. .”。
名稱為“.. ”的目錄可以使用我們已經討論過的技術進行寫入檔案:
圖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產品的簽名檢查)。讓我們試試以下命令:
圖27:複製了三個檔案
我們建立了3個檔案:
來自taskmgr具有微軟簽名的檔案“file”
“file. .”這是我們的"假惡意軟體",應該隱藏但執行
“filex x”包含WinSCP的簽名,此檔案稍後將變得重要。
我們現在需要一種方法來從 “file. .” 二進位制檔案啟動程式,這不是一項簡單的任務,因為所有Microsoft Windows API呼叫都會自動從檔名中刪除“. .”,然後啟動“file”(taskmgr)。為了解決這個問題,我們使用以下程式碼:
圖28:解決自動從檔名中刪除“. .”的程式碼
上面的程式碼只是呼叫CreateProcessA來從“filex x”(WinSCP)建立一個程式。如果我們編譯這個應用程式並啟動它,最終將執行的是WinSCP。可我們不能正常啟動這個檔案。相反,我們在偵錯程式內啟動應用程式(例如:WinDbg)。現在我們在函式中設定一個斷點,它將產生相關的系統函式呼叫,呼叫:“bp ntdll!NtCreateUserProcess”。我們可以使用 “g” (go) 命令在偵錯程式中啟動程式並命中斷點。在斷點處,可以dump當前堆疊 (“dq rsp”) 。堆疊上的第12個指標很重要,應該被dump。這個地址的第四個值是指向檔名的指標。
圖29:windbg
檔名(綠色框)現在是標準化顯示(以\??\C:\… 開頭)。這種標準化還需要從檔名末尾刪除 “. .” ——這就是為什麼上面的C程式碼不使用“file. .” 作為程式名的原因。但是由於檔案已經被改變為標準化,現在可以修改這個值。讓我們用“.” 覆蓋 “x” 字元。(命令“eb”用於編輯位元組):
圖30:編輯位元組為"."
然後繼續執行“g”。猜猜會發生什麼?
“file. .” (惡意軟體)被執行。但如果使用者右鍵單擊工作管理員中的程式並選擇“屬性”,則顯示“file” (taskmgr) 的Microsoft簽名。
圖31:顯示“file” (taskmgr) 的Microsoft簽名。
但是“filex x” (WiSCP)是什麼呢?是的,這個檔案也顯示為正在執行的程式,即程式資源管理器(因為路徑是在呼叫NtCreateUserProcess之前設定的)。
圖32:"filex x"執行情況
與PowerShell有什麼關係?是的,也是錯誤的二進位制檔案:
圖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值一起使用以獲取返回的零長度變數:
圖34:環境變數取字元
下圖顯示了這些技術的組合,以隱藏Powershell在版本2中啟動(這些技巧在之前很有用,但在最新的Windows 10系統上應該是實現不了):
圖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
相關文章
- 滲透測試的WINDOWS NTFS技巧集合(一)2018-09-06Windows
- 滲透測試技巧總結2019-03-30
- linux滲透測試技巧2則2020-08-19Linux
- 滲透測試實驗二2020-11-21
- 滲透測試工具實戰技巧合集2018-06-10
- 滲透測試會用到哪些工具?滲透測試教程2021-08-05
- 滲透測試怎麼做?滲透測試的步驟有哪些?2022-04-08
- 網站滲透測試漏掃工具的應用技巧2020-12-14網站
- Linux滲透測試2018-05-31Linux
- 網路安全滲透測試的型別!滲透測試入門教程2021-08-02型別
- 什麼是滲透測試?滲透測試的服務方式有哪些?2023-03-29
- 什麼是滲透測試?為什麼要做滲透測試?2021-08-10
- 什麼是滲透測試?滲透測試分類方式有哪些?2023-10-17
- 什麼是滲透測試?滲透測試分為哪幾類?2021-08-11
- 你真的瞭解“滲透測試”嗎?滲透測試有何作用?2022-03-18
- 記一次本地Windows-2008滲透測試2020-12-19Windows
- 記學習滲透測試之報告測試引數二2022-01-21
- 滲透測試報告2024-03-22測試報告
- 滲透測試之nmap2020-10-25
- 【滲透測試】Vulnhub DarkHole2024-08-19
- 安全測試和滲透測試的區別2022-07-29
- 滲透測試什麼?滲透測試具體操作流程是什麼2022-03-31
- 什麼是滲透測試?滲透測試培訓班如何選擇?2022-11-08
- metasploit滲透測試筆記(內網滲透篇)2020-08-19筆記內網
- 為什麼滲透測試很重要?滲透測試的服務方式有幾種?2023-01-31
- 記學習滲透測試之破解密碼二2021-11-26解密密碼
- 記學習滲透測試之漏洞掃描二2021-11-21
- 什麼是滲透測試?網站有必要進行滲透測試嗎?2023-09-19網站
- 滲透測試是什麼?滲透測試三種分類主要包括哪些?2022-03-09
- 誰來教我滲透測試——黑客應該掌握的Windows基礎2020-07-29黑客Windows
- 網路安全滲透測試2018-06-01
- 滲透測試-資訊收集2024-04-22
- GraphQL滲透測試詳解2023-04-24
- 滲透測試------資訊收集2020-06-27
- Burpsuite 滲透測試工具使用2020-08-22UI
- 物理滲透測試基礎2019-03-26
- 【滲透測試】Vulnhub Hackable II2024-08-19
- Web 端滲透測試初探2024-06-26Web