mai1zhi2 发表于 2021-1-8 11:49

无文件挖矿分析

1. 概述

该样本为无文件门罗币挖矿,传播行为通过ms17010和hash传递进行传播,相关脚本保存在WMI 对象中,挖矿程序通过开源的PowerSploit中Invoke-MemoryLoadLibrary进行调用,相关操作比较隐蔽,在分析时部分相关的服务器依然存活,若有错误的地方望大伙指出,谢谢。

2. 样本信息
样本名         1.ps1
样本大小         4239412 bytes
MD5            CDC34DDF78A16D4CF8A3B8E7CC361406
SHA1            01111C0FCC8CC75FF0EF84CF9C7C9628FB4EABCD
3. 实验环境

windows 7 x64 ip:192.168.202.139
4. 简要运行



设置powershell执行策略后,运行脚本。


5.具体分析5.1简单去混淆
打开样本,样本经过混淆,开头有六个变量,先不管这六个变量:


看后面的字串,混淆思路比较简单,首先去除掉string中,w!~<mhl字符,然后逐个对字符toInt16,接着用.( $VeRbOSEpREfeReNcE.tOSTrInG()+'X'-jOIN'')生成的iex调用;我们去掉iex,执行后即获得原本字符串:

5.2分析解混淆后的脚本:
先ping两个域名update.7h4uk.com、info.7h4uk.com和两个地址185.128.43.62, 192.74.245.97,判断是否能通信


两个域名DNS均失败:


Ip地址185.128.43.62失效:

Ip地址192.74.245.97有回复:

再判断系统位数是否32位,否则下载64位的ps1脚本:

注册名为root\default:System_Anti_Virus_Core类,并把上面六个变量的数据保存到该类的属性中,其中版本ver=1.8:


root\default:System_Anti_Virus_Core类:


类中新增的六个属性:


如果保存属性失败,则执行以下操作:

设置标志位,运行cohernece.exe

$funs解码后为powershell脚本,其中内容文章后面有介绍。其中RunnDDOS 函数在$funs解密后的变量中,大意是如果$env:temp路径下没有cohernece.exe则请求http://$nic/logos.png、http://$nic/cohernece.txt,分别下载java-log-9527.log和cohernece.exe,并执行cohernece.exe:

Download_File函数具体实现如下:

若保存属性成功后,通过scan函数进行漏洞扫描,有ms17010漏洞的IP保存在$17属性,用eb7/eb8函数内网传播$sc变量解码出shellcode:

5.3安装WMI事件
安装WMI事件消费者,事件过滤名为Windows Event Filter,事件消费者名,Windows Events Consumer:


事件过滤参数如下:
https://attach.52pojie.cn//forum/202101/07/170034pmd342nomzddvl6r.png?l

事件消费者参数如下:

创建WMI属性,当捕获到指定事件发生,则执行恶意代码EncodedScript:

__EventFilter实例:


CommandLineEventConsumer实例:

5.4其他设置查询其他团伙后门,并删除:

增加一条名为netbc的安全策略,组织主机139/445端口通信:



增加名为WindowsLogTasks、System Log Security Check任务计划,



设置从不休眠睡眠和电源使用方案:

查找进程名包含powershell或schtasks,该进程包含使用端口为80或14444的tcp网络连接,认为挖矿程序已经在执行中,则停止该进程:

当没有触法到上面的catch分支则直接执行恶意代码脚本$script,否则解码并释放msvcp120.dll、msvcr120.dll,再反射调用mon挖矿程序:


5.5所执行的恶意代码EncodedScript分析:先判断服务器是否在线和延时时间:

访问'update.7h4uk.com/ver.txt判断本地版本与服务端版本是否一致:

跟接着是一系列准备操作,获取开机时间,解密并执行$funs内容,判断$dirpath路径下是否有msvcr120.dll、msvcp120.dll:

查找进程名包含powershell,该进程包含使用端口为80或14444的tcp网络连接,认为挖矿程序已经在执行中,不再继续执行之后的代码:

运行DDOS并结束包含字符“System_Anti_Virus_Core“的进程:


KillBot函数如下:

检查每个进程是否存在3333、5555、7777端口tcp链接,有则结束该进程:

获取WMI中的属性$mon、$funs,其中$mon解码后为门罗币的挖矿程序:




矿池和钱包如下:

解码$funs作为命令,$mon作为参数传入执行,使得可以在Powershell进程中注入执行矿机:


其中$RemoteScriptBlock就是反射调用的核心脚本,观察其主要的调用过程,发现主要调用了Invoke-MemoryLoadLibrary函数,其内容与https://github.com/PowerShellMafia/PowerSploit/blob/d943001a7defb5e0d1657085a77a0e78609be58f/CodeExecution/Invoke-ReflectivePEInjection.ps1一致:

继续跟进Invoke-MemoryLoadLibrary函数,该函数里使用CreateThread创建新线程调用挖矿进程,线程回调函数地址存放在$ExeMainPtr变量中:

接着解码得到$mimi属性的内容,其为mimikatz:



通过Get-creds函数反射调用mimikatz:


Get-cred函数详情如下:

其中$RemoteScriptBlock就是反射调用的核心脚本,跟进脚本看其实现,取得"powershell_reflective_mimikatz"函数地址转为委托并调用:

下面看脚本中得传播行为,先获得分配到电脑的所有IP并解码出传播用的shellcode:

判断开机时间是否小于1.5小时,少于则不攻击;传播过程如下,先调用Test-Port 探测ip地址是否开启445端口,再调用test-ip函数实现WMIExec攻击,需要mimikatz提供$NTLM,再通过scan函数进行漏洞扫描,有ms17010漏洞的IP保存在$17,扫描完后条用eb7\eb8攻击,$sc为解密的shellcode:


Test-Port函数实现如下:

test-ip函数主要调用如下,其中调用invoke-wmiexec函数用于hash传递攻击,该函数在$fun解码后的变量中:

invoke-wmiexec函数详情如下,其内容与https://github.com/Kevin-Robertson/Invoke-TheHash/blob/master/Invoke-WMIExec.ps1一致:

最后把有密码的ip和有漏洞的ip重新写入属性:


6清理:

结束并删除计划任务:

删除名为netbc的本地策略:

删除WMI项:




完,谢谢大家观看。

woshicp 发表于 2021-1-8 12:02

还会删除其他团伙的后门,那装个这个,再移除它,不就相当于杀了一次毒

a981043 发表于 2021-1-8 13:43

看不懂啊,我为什么要点进来{:1_909:}

xuebinboy 发表于 2021-1-8 12:24

xmr跌这熊样 还有人挖

Ailen 发表于 2021-1-8 12:09

11点才在公众号看到了这篇文章,大佬是鸡哥本人吗?

dongse 发表于 2021-1-8 12:09

谢谢分享啊

ShadowY 发表于 2021-1-8 12:11

谢谢分享 挖矿是个坑

3158164206 发表于 2021-1-8 13:02

谢谢分享

lastfallen 发表于 2021-1-8 13:03

很有意思,多谢分享

cptw 发表于 2021-1-8 13:11


谢谢分享啊
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 无文件挖矿分析