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

全新的恶意攻击技术已出现:针对日本用户的复杂多阶段PowerShell恶意脚本分析

来源:本站整理 作者:佚名 时间:2019-03-30 TAG: 我要投稿

在本文中,我将分析了一个针对日本用户的复杂多阶段PowerShell恶意脚本。在本月的3月7日,网络安全公司InQuest在HybridAnalysis上发现了这个攻击示例,这个恶意软件样本是个全新的攻击样本,因为它利用了多阶段混淆、加密和隐写术来保护它的最终有效载荷不被检测到。截止发稿时,还没有任何杀毒软件能检测到这种攻击。
样本的详细信息如下:
· SHA256: 945a1276860fc4904ca23ed86b22e1782cd5761bc6c47f1cf331d9ae02cde0db
· Multi-AV: VirusTotal
· Sandbox: HyberidAnalysis
· 样本下载地址为:https://github.com/InQuest/malware-samples/tree/master/2019-03-PowerShell-Obfuscation-Encryption-Steganography
截至本文发表时,VirusTotal上的57个杀毒软件产品都没有检测到这个样本,具体原因你将在下文中看到。
在本文中,我将向你介绍这种恶意软件中经常使用的混淆技术。它特殊依赖于PowerShell中的字符串格式化运算符(-f)和转义字符(')来混淆它的最终有效载荷。Daniel Bohannon在Invoke-Obfuscation: PowerShell obFUsk8tion techniques & How To (Try) D""e ' tec ' th '+'em'中介绍了这些技术,并在他的Invoke-Obfuscation框架中实现了这些技术。
PowerShell中的基本字符串格式由-f运算符执行。点击这里,查看这个运算符的语法。
“带占位符的字符串”-f用逗号(,)字符分隔的字符串值列表,其中占位符以{Index,Alignment: format}的格式出现,其中Index是在-f运算符之后出现的字符串值列表中的索引。由于对齐和格式通常不用于混淆目的,所以我将它们忽略。如下示例:
考虑以下从主示例中选择的PowerShell语句:
"{2}{1}{0}" -f ']','te[','By'
应用-f运算符后,我可以得到'Byte[]' ('By'在索引2处,'te['在索引1处,']在索引0处)。
Grave字符(')用于转义PowerShell中具有特殊含义的字符,例如,如果要使用“in”放置“first”,你需要通过在字符串前面放置一个重要字符来转义此字符串中的双引号字符。为此,你需要先写入“place”。
在正常字符之前出现转义字符不会改变它们的含义,换句话说,它们就像不存在一样被忽略了。如下示例:
考虑从示例中提取的以下代码片段。
"lOAD`WiThPart`iAlN`AmE"
由于`W,`i和'A分别代表W,i和A,所以字符串等于lOADWiThPartiAlNAmE。
混淆或加密阶段的分析
此时,我将根据前面讨论的混淆技术,对混淆阶段逐一展开来分析。你还可以使用我创建的以下Python脚本,根据这些技术自动对编码的PowerShell脚本进行反混淆处理。

原始PowerShell脚本
上图就是描述了我们从HybridAnalysis中获得的原始PowerShell脚本,在第1行,特殊字符用于混淆“lOADWiThPartiAlNAmE”,然后使用字符串格式化混淆技术来混淆“System.Security”和“Out-Null”字符串。
为了对脚本进行反混淆,你可以利用我们开发的可以处理这两种特定技术的python脚本。
python bash-deobfuscator.py -f obfuscated.powershell.script.ps1
下图显示了反混淆原始脚本第一阶段的结果:

在第二行中,Set-Alias(sa)cmdlet为“new-object”创建了一个新名称“DF”。
代码由两个函数组成(从第3行到第18行,从第19行到第21行)。第21行的字符串为:
${ZAE} = (&("get-culture"))."pAreNT"."nAmE"[0];
Get-Culture cmdlet会检索系统当前所在的区域,name字段基于RFC 4646。你可以在这个GitHub存储库中看到完整的语言代码,name字段的第一个字符被分配给了ZAE变量。
在第22行,通过传递两个参数来调用函数pLank。mIss会被设置为一个长加密字符串,colSs被设置为ZAE。然后将colSs作为第一个参数传递给Rfc2898DeriveBytes 类的构造函数,得到的对象用于在第10行和第11行创建两个密钥,即DcZ和DeFs,然后将这些密钥传递给在第4行创建的RijndaelManaged对象的CreateDecryptor(DcZ作为密钥,DeFs作为IV)方法。
简而言之,pLank函数使用由第二个参数构造的密钥解密第一个参数。第二个参数是一串小写英文字母(a-z)。通过逐个测试这些字符,我意识到当字符为 j. ja-JP时,解密是有意义的,因为 j. ja-JP是唯一以j. 开头的语言代码。因此,我可以说这个恶意软件针对的是当前文化设置为ja-JP的系统。所以,我有理由认为这些系统位于日本,所发现的示例是针对日本用户和系统的。
最后,在第25行执行解密代码。
要获得解密的脚本,我可以使用PowerShell ISE中的调试器,它默认情况下安装在Windows 10上。我还将第22行更改为${ZAE} ='j',并将第25行更改为其他内容,以防止恶意软件样本无意中执行,然后在第25行上放置断点,此gif文件显示了执行此操作的详细过程。
调试PowerShell代码以解密有效载荷
下图显示了我在解密和解压缩后在第25行上获得的脚本:

第2阶段解密后,所显示的有效载荷
在红色部分,GV是Get-Variable的别名,Get-Variable'* mDR *'与MaximumDriveCount变量匹配。“MaximumDriveCount”[3,11,2]是['i','e','x']并且应用-join运算符,我可以得到“iex”。

[1] [2] [3]  下一页

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