Jump to content

Windows 開發了反惡意軟件掃描接口(AMSI) 標準,允許開發人員在其應用程序中集成惡意軟件防禦。 AMSI 允許應用程序與系統上安裝的任何防病毒軟件進行交互,並防止基於腳本的動態惡意軟件執行。我們將在本文中了解更多關於AMSI、代碼實現和一些眾所周知的繞過方法。

背景簡而言之,它是微軟提供的基於腳本的惡意軟件掃描API,可以集成到任何應用程序中,以掃描和檢測用戶輸入的完整性,從而保護應用程序,從而保護消費者免受惡意軟件的攻擊。例如,一個消息應用程序可能會在將消息轉發給接收者之前掃描帶有AMSI 的消息以查找惡意軟件。

AMSI是獨立於供應商的,並提供開放的Win32 API 和COM 接口供開發人員使用。由於Microsoft 自己管理AMSI,因此會自動更新最新的惡意軟件簽名。因此,開發人員可以很容易地集成AMSI,以保護其消費者免受基於腳本的動態惡意軟件的攻擊。

AMSI 適用於基於簽名的檢測。這意味著對於每個特定的惡意關鍵字、URL、函數或過程,AMSI 在其數據庫中都有一個相關的簽名。因此,如果攻擊者再次在他的代碼中使用相同的關鍵字,AMSI 就會立即阻止執行。

惡意軟件命名規則在閱讀有關AMSI 工作原理的更多信息之前,讓我們先了解一下惡意軟件是如何命名的。在分析中,Windows 通常會檢測到惡意軟件,但分析人員無法確定惡意軟件的確切細節和行為。計算機防病毒研究組織(CARO) 給出了惡意軟件的標準命名約定。例如,基於快捷方式的caphaw 後門命名如下:

1.png

AMSI 工作原理作為一名開發人員,你可以使用AMSI 提供使用AMSI 的惡意軟件防禦。假設你創建了一個應用程序,該應用程序輸入一個腳本並使用像Powershell 這樣的腳本引擎執行。在進行輸入時,可以調用AMSI 以首先檢查惡意軟件。 Windows 提供COM 和Win32 API 來調用AMSI。 AMSI 的執行流程如下:

2.png

AMSI API 是開放的,因此任何殺毒軟件都可以從其函數中讀取數據。此時,一個Windows 腳本就會運行。當它通過AMSI 時,amsi.dll 被注入到與我們程序相同的虛擬內存中。這個amsi.dll 有各種可以評估代碼的函數。但是,實際的掃描任務是由這兩個函數執行的:

AmsiScanString()

AmsiScanBuffer()這些函數的作用是評估代碼。如果代碼是乾淨的,則結果最終會傳遞給殺毒軟件提供程序類,然後使用RPC 調用從那里傳遞給殺毒軟件服務。如果代碼可疑,則會被AMSI 阻止。

AMSI 繞過方法既然我們已經討論了AMSI 的基礎知識,我們將討論一些非常著名的繞過AMSI 的技術。為了執行橫向移動/特權升級的任意代碼,滲透測試人員通常需要繞過AMSI。

如要討論所有繞過方法則超出了本文的範圍,因為每天都有新方法出現。本文將討論其中最突出的幾個,並在Windows 10 1809版本上進行了測試。值得注意的是,隨著簽名的不斷更新,Windows的最新版本(超過1903年)幾乎阻止了互聯網上所有可用的方法。

注意:AMSI 會阻止某些關鍵字,如“invoke-mimikatz”或“amsiutils”,因為它們被廣泛用於利用,因此,作為概念證明,我們將僅在繞過後運行這些命令。此處不會繞過實際的有效載荷。

Microsoft 已將AMSI 集成在powershell 終端(powershell.exe 應用程序)中,該終端接收輸入並通過Powershell 引擎對其進行解析。如果我們打開進程黑客並蒐索amsi.dll,我們會看到amsi 正在powershell 終端中運行,任何輸入都會首先被掃描。

3.png

方法1:Powershell降級如果你正在運行基於powershell 的有效負載並且AMSI 阻止了它,你可以將你的powershell 版本降級到2.0,因為AMSI 僅在2.0 之後的版本中受支持。首先,你可以看到我們的關鍵字被amsi屏蔽了。

4.png

讓我們檢查一下PS 的當前版本,然後降級到版本2 並再次運行這些被阻止的命令。

5.png

但正如你想像的那樣,這裡最大的缺點是許多現代函數或腳本無法在Powershell 2.0 上運行。

方法2:混淆混淆是指使代碼變得複雜和不可讀的技巧。 AMSI 根據某些關鍵字檢測簽名,因此對這些關鍵字進行模糊處理是有效的。例如,讓我們混淆invoke-mimikatz 命令

6.png

如你所見,只需斷開一個字符串並使用+運算符將它們連接起來,這樣就可以繞過AMSI。

然而,這種技術也有它自己的缺點。有效載荷可能會觸發AMSI多次。在每次運行有效負載後,一直對關鍵字進行模糊處理實際上非常耗時,而且會產生噪音。因此,手動混淆一直對關鍵字進行模糊處理實際上非常耗時,而且會產生噪音最好。

RhytmStick 開發了這個工具“AmsiTrigger”,它可以針對AMSI 掃描腳本/有效負載,並告訴我們哪些行會觸發AMSI,然後我們可以混淆它們!你可以在此處下載該工具。

現在,我們使用以下命令創建了一個名為demo.ps1 的腳本

7.png

我想使用AmsiTrigger 對照AMSI 進行檢查。具體過程如下:

8.png

現在,就可以知道AMSI 阻止執行的行。我們可以繼續使用字符串連接方法對它們進行混淆,例如:

9.png

現在,它們可以運行並成功繞過AMSI!

10.png

你也可以嘗試https://amsi.fail 來混淆你的代碼。

方法3:強制執行錯誤Matt Graeber 在他的推文中談到了繞過AMSI 的方法。如果在上述場景中啟動AMSI 掃描,則存在一個名為amsiInitFailed() 的函數,該函數將拋出0。這種繞過基本上是為amsiInitFailed 分配一個布爾True 值,以便AMSI 初始化失敗,不會對當前進程進行任何掃描!代碼如下:

11.png

這之後,許多人發布了相同方法的不同版本。在某些方法中使用字節碼,在其他方法中,替換函數或替換字符串,但邏輯都相同。

方法4:內存劫持Daniel Duggan 在他的博客中發布了關於可以繞過AMSI 的內存劫持技術。其邏輯是掛鉤函數AmsiScanBuffer() 以便它始終返回句柄AMSI_RESULT_CLEAN 指示AMSI 是否發現惡意軟件。可以使用Rohitab 的API 監控工具監控API 響應。

首先,通過我們下載Invoke-Mimikatz 腳本,查看AMSI 是否正常工作。

12.png

為了減少將代碼編譯為DLL 的麻煩,你可以查看我的fork。下載後,確保將主包的名稱從“AmsiScanBufferBypass”更改為“Project”或任何你喜歡的名稱,因為AMSI 也會阻止字符串“AmsiScanBufferBypass”!

下載之後,進入發布文件夾,看到一個名為ASBBypass.dll的DLL。請注意,由於我們現在有一個DLL,它也可以與我們的EXE 有效負載集成,並且會繞過AMSI!

這樣內聯C# 代碼僅使用powershell 終端激活補丁!

13.png

如你所見,amsi 現在已經被繞過了!

方法5:內存劫持(混淆操作碼)在Rasta Mouse (Daniel Duggan) 技術開始被檢測到後,人們對代碼進行了各種更改以使其再次FUD。 Fatrodzianko 在他的博客中發布了一種這樣的技術。他使用操作碼混淆了相同的代碼,可以查看腳本。

要運行腳本,只需下載它,重命名它(以避免AMSI 檢測關鍵字),然後像這樣運行:

14.png

如你所見,我們現在已經成功繞過了AMSI。

方法6:使用反射技術繞過AMSI根據微軟的說法,Reflection 提供了描述程序集、模塊和類型的對象(Type 類型)。你可以使用反射來動態創建類型的實例,將類型綁定到現有對象,或從現有對象獲取類型並調用其方法或訪問其字段和屬性。如果你在代碼中使用屬性,反射可以讓你訪問它們。

Paul Laine 在contextis.com 上發布了原始的內存劫持方法。 Shantanu Khandelwal 使用Matt Graeber 的反射技術將相同的代碼轉換為完整的內存補丁。 Shantanu 使代碼更加隱秘,因為現在沒有留下任何磁盤上的繞過製品。

我們不會在本文中演示原始補丁,但反射更新可以下載。確保下載並重命名腳本並避免使用“amsibypass”等關鍵字,因為它們會被阻止。我已將其重命名為“am-bp-reflection.ps1”

15.png

方法7:Nishang All in One 腳本Nikhil Mittal 在他著名的工具“Nishang”中添加了一個AMSI 繞過腳本。該腳本結合了6 種不同的方法來一次運行繞過AMSI。具體如下:

unload——Matt Graeber 的方法。從當前PowerShell 會話中卸載AMSI。

unload2——Matt Graeber 的另一種方法。從當前PowerShell 會話中卸載AMSI。

unloadsilent——Matt Graeber 的另一種方法。卸載AMSI 並避免WMF5 自動記錄。

unloadobfuscated——上面的“卸載”方法使用Daneil Bohannon 的Invoke-Obfuscation 進行了混淆,這就避免了WMF5 自動記錄。

dllhijack——Cornelis de Plaa 的方法。代碼中使用的amsi.dll來自p0wnedshell。

psv2——如果.net 2.0.50727 在Windows 10 上可用。 PowerShell v2 已啟動,它不支持AMSI。

我們只需下載腳本並運行,該工具將使用有效方法自動繞過AMSI。例如,這裡WMF5 自動記錄繞過已經奏效。此方法可以從當前終端卸載AMSI 並繞過它。

從這裡下載腳本並將其重命名為“nishang.ps1”並像這樣運行它:

16.png

總結在本文中,我們討論了AMSI的工作流程以及繞過它們的7 種方法。需要注意的是,還有比本文介紹的更多的方法,但本文的目的只是討論最廣為人知的7 種繞過AMSI 的方法。

0 Comments

Recommended Comments

There are no comments to display.

Guest
Add a comment...