[原创] APT28 样本分析报告(一)
13小时前 478
Hash | Value |
---|---|
MD5 | 36524C90CA1FAC2102E7653DFADB31B2 |
SHA1 | 8D6DB316EA4E348021CB59CF3C6EC65C390F0497 |
SHA256 | FF808D0A12676BFAC88FD26F955154F8884F2BB7C534B9936510FD6296C543E8 |
Environment\UserInitMprLogonScript
为 C:\Users\Reverse\AppData\Local\cdnver.bat
实现持久化。LOCALAPPDATA
目录下释放了两个文件:cdnver.dll
和 cdnver.bat
;cdnver.dll
的 MD5
为 AA2CD9D9FC5D196CAA6F8FD5979E3F14
bat
脚本内容为:start rundll32.exe "C:\Users\Reverse\AppData\Local\cdnver.dll",#1
rundll32.exe
,加载释放的文件:cdnver.dll
;cdnverify.net
,使用奇安信威胁分析平台查询:使用 IDA 打开后,停在 WinMain
处,x32dbg 的 Base 为 0x00EF1000,在 IDA 中 Rebase 为 0x00EF0000,则 WinMain
的地址为 0x00EF1ECF:
在 WinMain
中,连续调用了 sub_EF1DEF()
三次,该函数内有 XOR 等操作,猜测为字符串解密操作:
结合 x32dbg 可知:
1 2 3 |
|
因此,重命名 sub_EF1DEF()
为 decryptStr_sub_EF1DEF()
;之后调用函数 sub_EF12D3()
。
连续两次调用 sub_EF1063()
查看 sub_EF1063()
内部代码后,猜测也是执行字符串解密操作:
结合 x32dbg 可知:
1 2 |
|
因此,重命名 sub_EF1063()
为 decryptStr_sub_EF1063()
;之后调用函数 sub_EF1000()
。
内部代码看着也像是在进行解密操作,对 0x00F0B880 处的 0x59BD 字节的数据进行解密,解密后的数据如下,可以很明显地看到 4D5A
:
解密出一个 PE 文件数据后,函数结束;sub_EF12D3()
分析完成,返回到 WinMain()
。
连续两次调用 decryptStr_sub_EF1DEF()
,解密字符串,可以看到是与解压缩有关的 API :RtlGetCompressionWorkSpaceSize
和 RtlDecompressBuffer
;
注: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
进行字符串解密,得到:
1 2 3 4 5 6 7 |
|
调用 LoadLibraryW
加载 Advapi32.dll
,并获取 RegOpenKeyExW
函数地址,并调用,其中 0x80000001
是 HKEY_CURRENT_USER
:
获取环境变量,并判断:
从 ”cdnver.dll“
中查找 "."
,获取文件后缀:
之后确认只有一个 "."
出现。
连续 6 次调用 decryptStr_sub_EF1DEF
解密字符串:
1 2 3 4 5 6 |
|
调用 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
解密字符串:
调用 OpenProcessToken
、GetTokenInformation
、GetSidSubAuthorityCount
、GetSidSubAuthority
等 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
函数:通过调用 CreateToolhelp32Snapshot
、Process32FirstW
、Process32NextW
等 API 遍历进程,查找 explorer.exe
进程:
调用 OpenProcess
、OpenProcessToken
等 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
删除文件
综上,该样本的主要行为有:
LOCALAPPDATA
目录下释放 dll
和 bat
;cdnver.dll
。[1]. Windows普通程序与服务程序的初始特权(Privileges)
[2]. [原创]【APT样本分析】APT28样本超详细分析
[3]. “奇幻熊”(APT28)组织最新攻击