首页
社区
课程
招聘
[原创] APT28 样本分析报告(一)
发表于: 2022-10-25 21:29 11683

[原创] APT28 样本分析报告(一)

2022-10-25 21:29
11683

使用 IDA 打开后,停在 WinMain 处,x32dbg 的 Base 为 0x00EF1000,在 IDA 中 Rebase 为 0x00EF0000,则 WinMain 的地址为 0x00EF1ECF:

WinMain 中,连续调用了 sub_EF1DEF() 三次,该函数内有 XOR 等操作,猜测为字符串解密操作:

结合 x32dbg 可知:


因此,重命名 sub_EF1DEF()decryptStr_sub_EF1DEF();之后调用函数 sub_EF12D3()

连续两次调用 sub_EF1063()

查看 sub_EF1063() 内部代码后,猜测也是执行字符串解密操作:

结合 x32dbg 可知:

因此,重命名 sub_EF1063()decryptStr_sub_EF1063();之后调用函数 sub_EF1000()

内部代码看着也像是在进行解密操作,对 0x00F0B880 处的 0x59BD 字节的数据进行解密,解密后的数据如下,可以很明显地看到 4D5A

解密出一个 PE 文件数据后,函数结束;sub_EF12D3() 分析完成,返回到 WinMain()

连续两次调用 decryptStr_sub_EF1DEF(),解密字符串,可以看到是与解压缩有关的 API :RtlGetCompressionWorkSpaceSizeRtlDecompressBuffer

注:RtlGetCompressionWorkSpaceSize 函数用于确定 RtlCompressBuffer 和 RtlDecompressBuffer 函数工作空间缓冲区的正确大小。

之后调用 LoadLibraryW 加载 ntdll,并调用 GetProcAddress 获取上述两个 API 的函数地址;
调用 RtlGetCompressionWorkSpaceSize 获取缓冲区大小,在调用 HeapAlloc 申请空间;
最后调用 RtlDecompressBuffer 对刚刚解密出的 PE 数据进行解压缩:

连续调用两次 decryptStr_sub_EF1DEF,解密得到字符串:SystemRoot\\System32
之后调用 GetEnvironmentVariableW 获取 LOCALAPPDATA 环境变量:

这里为:C:\\Users\\Reverse\\AppData\\Local,再将 "\cdnver.dll" 与之拼接得到了释放文件的目标路径:C:\\Users\\Reverse\\AppData\\Local\\cdnver.dll

返回 sub_EF155B 继续执行;

调用 LoadLibraryW 加载 Kernel32.dll,并获取 CreateFile 函数地址并调用,创建文件:

获取 WriteFile 函数地址并调用,把 PE 数据写入文件:

文件释放完成。

连续 7 次调用 decryptStr_sub_EF1DEF 进行字符串解密,得到:


调用 LoadLibraryW 加载 Advapi32.dll,并获取 RegOpenKeyExW 函数地址,并调用,其中 0x80000001HKEY_CURRENT_USER

获取环境变量,并判断:

”cdnver.dll“ 中查找 ".",获取文件后缀:

之后确认只有一个 "." 出现。

连续 6 次调用 decryptStr_sub_EF1DEF 解密字符串:

调用 WideCharToMultiByte 将宽字符转为多字节字符;
调用 LoadLibraryW 加载 Kernel32.dll,_getenv 获取环境变量,获取 CreateFileA 的函数地址并调用创建文件 C:\Users\Reverse\AppData\Local\cdnver.bat

构建脚本字符串 start rundll32.exe "C:\Users\Reverse\AppData\Local\cdnver.dll",#1,调用 WriteFile 将脚本写入 bat 文件。

返回 sub_EF264C 继续执行;
拼接构造字符串 C:\\Users\\Reverse\\AppData\\Local\\cdnver.bat

调用 LoadLibraryW 加载 Advapi32.dll,获取 RegSetValueExW 函数地址,

设置注册表,使用 Logon Scripts 机制实现持久化,

Logon Scripts 机制:Windows允许在特定用户或用户组登录系统时运行脚本,也就是能使脚本优先于杀毒软件执行。

注册表设置前后对比:

调用 _wcsstr 函数在 cdnver.dll 路径中查找 ".dll"

若找到子串,连续 3 次调用 decryptStr_sub_151DEF 解密字符串:

调用 OpenProcessTokenGetTokenInformationGetSidSubAuthorityCountGetSidSubAuthority 等 API 获取进程的 RID 信息:


x32dbg 中,RID = 0x2000,为中完整性:

返回 sub_EF1707 继续执行,将 eax(0x1) 与 3 比较,不等则跳转到 loc_EF1811 执行 shell 命令,之后返回:

sub_EF1707 返回值为 3,则继续执行 00EF17DE

首先会调用 sub_EF1957 函数:首先加载 AdvApi32.dll,获取 OpenProcessToken 的函数地址并调用;获取 LookupPrivilegeValue 的函数地址并调用,查看系统权限的特权值,第二个参数表示所要查看的特权信息的名称 SeSecurityPrivilege

调用 AdjustTokenPrivileges 修改令牌权限,再调用 LookupPrivilegeValue,所要查看的特权信息的名称 SeTcbPrivilege

最后再调用一次 AdjustTokenPrivileges 修改令牌权限。

提权完成,返回 sub_EF1B02
调用 sub_EF1C3D 函数:通过调用 CreateToolhelp32SnapshotProcess32FirstWProcess32NextW 等 API 遍历进程,查找 explorer.exe 进程:

调用 OpenProcessOpenProcessToken 等 API 获取 explorer.exe 进程的访问令牌句柄 TokenHandle,并作为结果返回:

在进行内存初始化后,调用 sub_EF18DC 函数,向内存中写入命令:

返回 sub_EF1B02
加载 AdvApi32.dll,获取 CreateProcessAsUser 函数地址,并调用:

CreateProcessAsUser 函数创建一个新的进程及其主线程,其第三个参数为指向命令行字符串的指针,即:RunDll32.exe \"C:\Users\Reverse\AppData\Local\cdnver.dll\",#1
通常,调用 CreateProcessAsUser 函数的进程必须具有 SE_INCREASE_QUOTA_NAME 特权,并且如果令牌不可分配,则可能需要 SE_ASSIGNPRIMARYTOKEN_NAME 特权。

返回 sub_EF1707,进行内存释放等操作。
返回 _WinMain,最后调用 sub_EF18AD

调用 DeleteFileW 删除文件

综上,该样本的主要行为有:

[1]. Windows普通程序与服务程序的初始特权(Privileges)
[2]. [原创]【APT样本分析】APT28样本超详细分析
[3]. “奇幻熊”(APT28)组织最新攻击

Hash Value
MD5 36524C90CA1FAC2102E7653DFADB31B2
SHA1 8D6DB316EA4E348021CB59CF3C6EC65C390F0497
SHA256 FF808D0A12676BFAC88FD26F955154F8884F2BB7C534B9936510FD6296C543E8
1 次调用,解密字符串:SystemRoot\\SysWow64
2 次调用,解密字符串:SystemRoot\\System32
3 次调用,解密字符串:TEMP
1 次调用,解密字符串:SystemRoot\\SysWow64
2 次调用,解密字符串:SystemRoot\\System32
3 次调用,解密字符串:TEMP
1 次调用,解密字符串:cdnver.dll
2 次调用,解密字符串:LOCALAPPDATA
1 次调用,解密字符串:cdnver.dll
2 次调用,解密字符串:LOCALAPPDATA
 
rundll32.exe
#1
UserInitMprLogonScript
cdnver.dll
Environment
LOCALAPPDATA
cdnver.bat
rundll32.exe
#1
UserInitMprLogonScript

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 4
支持
分享
最新回复 (1)
游客
登录 | 注册 方可回帖
返回
//