Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863550878

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

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 的方法。