Yogi Gao发表于 2017.7.24
2016年1月Forcepoint安全实验室报告了一个通过邮件进行传播的Ursnif银行木马,它在初始HTTP请求中使用“Range“特征来规避检测。
在2017年7月我们在一封恶意邮件中发现了Ursnif的新变种,附件中是一个加密的word文档,解密密码在邮件的正文中。正如2017年4月以来记录的几个Ursnif的活动,这个word文档包含了几个混淆过的VBS文档,通过WMI来载入恶意DLLs。
然而,这些例子中出现了一些新的特征,包括使用鼠标位置的组合来进行反沙盒,和使用文件的时间戳来解码他们的内部数据,并从Thunderbird应用中偷窃数据。
诱饵邮件的一个例子如下所示:
在解密之后,它显示了三个以“docx“为扩展名的OLE文档图标,它诱惑用户去双击它们(如下图)。
事实上,他们的文件属性表明他们是三个VBS脚本,包含同样调试混淆过的代码,使用大量垃圾脚本来掩盖正常的逻辑。
一旦脚本被触发,它就会从“hxxp://46. 17.40[.]22/hyey.pnj”处下载恶意软件。如果失败了,它就会从另一个网站进行下载:“hxxp://inshaengineeringindustries[.]com/head.pkl”,这些文件事实上是可以通过WMI载入的DLL文件:
rundll32 [malwarepath] DllRegisterServer
恶意DLL被加壳,并填充了大量垃圾代码以防止对其进行静态分析。在运行时,它会下载第二个DLL文件,并把这个新的DLL文件映射到当前地址,并修复IAT和重定位表,最后跳转到入口点执行。
下载下来的DLL文件首先会检测自身的完整性,然后:
分析的剩余部分将重点关注基于鼠标移动反沙盒/解密功能。
这个例子中使用的算法,使用了当前的和先前的鼠标坐标来检测鼠标的移动并避开沙盒环境,因为沙盒环境中鼠标通常是不移动的。它进一步使用了进程产生的值来暴力破解自己的解密密钥。
第一步-产生Key
首先,恶意软件计算上一次和当前鼠标x和y坐标间的D-Value(delta)。然后把.BSS段的相对虚拟地址(RVA)和 “SizeOfRawData”的和,作为基础种子。
把这个基础种子与文件的创建时间(在这个例子中是2017年4月11日)进行XORs(异或)运算,并将得到的值与鼠标移动D-Value的低5位相加,最终的结果作为解密密钥。
第二步-解密.BSS段
恶意软件会进行一个循环运算,在这个运算中,每次把DLL的.BSS段的一个DWORD,和当前的DWORD数据以及上一个DWORD数据进行异或,然后和解密密钥进行异或,将得到的值循环右移count位(count为循环计数器),最终将结果替换掉当前的DWORD数据。
第三步-验证解密密钥
在.BSS段的数据被解密后,从.BSS段的偏移0x61d, 0x619和0x625分别获取三个值,将它们的总和与“0EE553B4E“这个校验和进行比较。如果匹配上了,就会执行余下代码,否则它就会恢复加密的.BSS段,并重新计算一个新的key来进行另一次解密和验证操作。
因为在沙盒环境中,基于鼠标移动的D-Value值总是0,解密出来的BSS段总是不对,它就会循环执行这段解密代码。当在实际的环境中,因为使用的仅仅的D-Value的低5位而不是整个32位,会更有可能得到正确的解密后的段数据。
解密密钥本身是一个重要的全局常量,在随后的解密APIs的代码,一个隐藏的PE文件(在这个变种中是DLL),同步对象,注册表数据,URLs等等中都有使用到。
此外,解密操作在运行时进行,防止内存分析工具转储恶意软件内存的整个明文字符串。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课