首页
论坛
课程
招聘
[原创]无文件挖矿分析
2021-1-8 16:34 1554

[原创]无文件挖矿分析

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

  2. 样本信息
    样本名 1.ps1
    样本大小 4239412 bytes
    MD5 CDC34DDF78A16D4CF8A3B8E7CC361406
    SHA1 01111C0FCC8CC75FF0EF84CF9C7C9628FB4EABCD

  3. 实验环境
    控制端: ip: 192.74.245.97
    受控端端:windows 7 ip:192.168.202.139

  4. 简要运行

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

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

看后面的字串,混淆思路比较简单,首先去除掉string中,w!~<mhl字符,然后逐个对字符toInt16,接着用.( $VeRbOSEpREfeReNcE.tOSTrInG()[1,3]+'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:

 

事件过滤参数如下:

事件消费者参数如下:

创建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项:

 

完,谢谢大家观看。


看雪学院推出的专业资质证书《看雪安卓应用安全能力认证 v1.0》(中级和高级)!

最后于 2021-1-11 15:43 被快乐鸡哥编辑 ,原因:
上传的附件:
收藏
点赞1
打赏
分享
最新回复 (4)
雪    币: 3153
活跃值: 活跃值 (2467)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 活跃值 8 2021-1-11 14:17
2
0
样本能否加个密码,上传论坛本地一份?
雪    币: 759
活跃值: 活跃值 (419)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
快乐鸡哥 活跃值 2021-1-11 15:43
3
0
kanxue 样本能否加个密码,上传论坛本地一份?
忘了上传,不好意思。
雪    币: 952
活跃值: 活跃值 (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zylrocket 活跃值 2021-1-11 17:44
4
0
非常不错,哥们专家
雪    币: 2983
活跃值: 活跃值 (213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shuyangzjg 活跃值 2021-1-12 15:00
5
0
学习了
游客
登录 | 注册 方可回帖
返回