一例无文件门罗币挖矿分析

  1. 概述
    该样本为无文件门罗币挖矿,传播行为通过ms17010和hash传递进行传播,相关脚本保存在WMI 对象中,挖矿程序通过开源的PowerSploit中Invoke-MemoryLoadLibrary进行调用,相关操作比较隐蔽,在分析时部分相关的服务器依然存活,若有错误的地方望大伙指出,谢谢。
  2. 样本信息
    样本名 1.ps1
    样本大小 4239412 bytes
    MD5 C++DC34DDF78A16D4CF8A3B8E7CC361406
    SHA1 01111C0FCC8CC75FF0EF84CF9C7C9628FB4EABCD
  3. 实验环境
    控制端: ip: 192.74.245.97
    受控端端:windows 7 ip:192.168.202.139
  4. 简要运行
    718877_KZD47BXSADDZBG6
    设置powershell执行策略后,运行脚本。
  5. 具体分析
    5.1简单去混淆
    打开样本,样本经过混淆,开头有六个变量,先不管这六个变量:
    718877_KEVKRPN4QCRHYBN

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

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

两个域名DNS均失败:
718877_KMQVNABYGNJ3CSC
718877_KBJT9DGCARJNGXR

Ip地址185.128.43.62失效:
718877_PQQTE4KPPSMSWNN
Ip地址192.74.245.97有回复:
718877_D66QV8T7XJ5U5WF

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

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

rootdefault:System_Anti_Virus_Core类:
718877_AVJ9N5DR5RFKS54
新增的六个属性:
718877_ECA2C3WXYNSE8NV

如果保存属性失败,则执行以下操作:
设置标志位,运行cohernece.exe
718877_6K3H7JY4D4FU5K5

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

Download_File函数具体实现如下:
718877_Q6ZNWEEQ4UWZD97

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

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

事件过滤参数如下:
718877_NNKXBGG5G5VJT7B
事件消费者参数如下:
718877_45RJMG8PE6TYDBQ
创建WMI属性,当捕获到指定事件发生,则执行恶意代码EncodedScript:
718877_KUUEV5CQ3XWA8JX
__EventFilter实例:
718877_5T9YB9D494PDYBF
CommandLineEventConsumer实例:
718877_98AQ6JYNEKA66S8

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

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

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

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

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

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

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

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

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

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

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

KillBot函数如下:
718877_SM3972537JDU4A4

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

获取WMI中的属性$mon、$funs,其中$mon解码后为门罗币的挖矿程序:
718877_5PGPMEUGTAT8Z4A
718877_9XG6Q2VSMUHY8TS
矿池和钱包如下:
718877_8XCKSTW434AGC5U

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

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

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

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

通过Get-creds函数反射调用mimikatz:
718877_NANWBYF487W6TMA
Get-cred函数详情如下:
718877_G3J2VZ85UDFR3RV
其中$RemoteScriptBlock就是反射调用的核心脚本,跟进脚本看其实现,取得"powershell_reflective_mimikatz"函数地址转为委托并调用:
718877_Y76J4ZF9MYSVHQ7

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

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

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

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

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

6 清理:
结束并删除计划任务:
718877_UHNUWT98H4VHNX9
删除名为netbc的本地策略:
718877_DQDGJVZWVEB3BUF
删除WMI项:
718877_HJRHZ96YR4DE6ME

完,谢谢大家观看。

标签