0x00 背景
APT28是一个疑似具有俄罗斯政治背景的APT组织。笔者根据公开的情报整理到的信息大概如下。
本次的样本来源于沙箱app.any.run:https://app.any.run/tasks/d6a8d1db-52c8-4371-b6d3-bf740408bb10/
可以看到样本已经标记为了APT28
样本MD5为:36524c90ca1fac2102e7653dfadb31b2
0x01 样本基本信息
样本下载到本地之后通过exeinfo查看样本可以知道样本是标准VC编译的程序。
使用火绒剑可fakenet跑一下样本的行为:
样本运行后,最直接的行为就是在本地appdata路径释放了一个dll文件和一个bat文件,然后在左边的fakenet窗口中可以看到发送了超级长的一段base64编码数据,这次猜测可能是通过base64编码了本地收集到的信息然后传到C2.
转到bat和dll文件的目录下,可以看到bat的内容就是调用rundll32.exe去启用加载这个dll。
所以看样子,我们拿到的这个exe有很大的概率是一个Dropper。
0x02 Dropper分析
使用IDA加载原始样本。
WinMain的入口点没什么特殊的,进来之后调用了三次sub_401DEF函数,这种情况下,sub_401DEF一般都是解密函数。
解密的第一个字符串是SystemRoot\SysWow64
第二个串是SystemRoot\SysWow64
第三个串是:TEMP
所以我们将sub_401DEF函数重命名为:Rename_decodeStr
三个字符串解密之后,程序会再调用一个名为sub_4012D3的函数,这个函数如果调用失败,程序将通过jmp跳转到最后结束运行。所以sub_4012D3有可能是进行环境校验啥的。
WinMain->12d3
12D3函数进来之后,首先会通过GetProcessHeap获取当前进程的堆地址,然后通过HeapAlloc分配一个堆空间。
成功分配之后,程序会调用sub_401063继续分配
然后在分配的堆空间中解密出这个dll名称
第二次解密出appdata这个环境变量的名称
12D3函数执行完成之后,程序会调用执行sub_4013F7
WinMain->13F7
该函数进来,程序首先是通过之前分析的解密函数,解密了两个解压相关的API:
RtlGetCompressionWorkSpaceSize
RtlDecompressBuffer
这里应该是为等会释放文件做准备了。
然后LoadLibrary之后通过GetProcAddress获取刚才解密出来的API函数的地址
然后直接调用该函数,参数为eax:
然后调用了RtlDecompressBuffer,根据参数来看,这里应该是会将目标数据解压缩到esi所在的地址
函数执行之后成功解压出一个PE
至此,sub_4013F7函数功能分析完毕,经过分析,该函数用于解压缩数据为PE文件。
接下来是调用sub_40155B函数。
WinMain->155B
在115B函数中,程序首先执行了一个call ,然后就准备LoadLibrary
155B->sub_4010CD
跟进到sub_4010CD中,程序首先是解密了两个字符串,分别是SystemRoot和\System32
然后就尝试通过GetEnvironmentVariableW获取LOCALAPPDATA环境变量的路径。
成功获取,根据行为分析我们可以知道,这个路径是后续用于释放文件的。
然后尝试通过lstrcatW拼接字符串,获取更完整的路径。
最后拼接处解密dll的完整路径:
至此,sub_4010CD函数分析完成,我们回到1565B函数中
程序是通过了拆分字符串的方式,组装出了Kernel32.dll
然后准备调用CreateFileW
成功获取API地址之后,程序首先跳转到loc_4016E3去,然后通过jmp函数又跳转回来继续执行。
跳回来之后,程序通过CreateFile创建这个dll的文件对象。
同样的方式,去获取WriteFile的API地址:
然后调用WriteFile将dll文件写入过去:
这里是文件对象创建成功
这里是closeHandle之后,dll文件写入成功。
到这里,sub_40155B函数就分析完成。
通过分析我们可以知道,该函数的主要功能是解压缩资源,释放目标dll文件到指定的目录。
回到WinMain中,155B函数调用完成之后,程序会调用sub_40264C函数。
WinMain->264C
264c函数进来之后就一直在解密字符串:
解密的第一个字符串是rundll32.exe
解密出来的字符串分别如下:
然后老套路解密出了操作注册表的API:RegOpenKeyExw
然后循环的去调用之前的解密函数,逐步解密出bat的完整内容
尝试通过CreateFileA创建文件:
文件对象创建成功之后,将调用执行dll的命令写入进去:
写入成功之后就是一系列的收尾工作:
到这里,sub_402030函数分析完成,该函数的主要功能就是将启动dll的命令写入到bat文件中。
然后创建一个UserInitMprLogonScript的注册表,这是一种用于权限维持的操作。因为HKEY_CURRENT_USER\Environment\
Logon Scripts 的执行顺序在杀软钱,所以Logon Scripts可以优先于杀软执行,绕过杀软对敏感操作的拦截。
到这里,264C函数也执行完毕。
该函数的主要功能就是释放bat文件,然后写入Logon Scripts注册表以绕过杀软。
接下来是在WinMain中调用sub_401707函数:
WinMain->1707
1707进来之后首先是解密了三个字符串,分别是RunDll32.exe ,#1 和Open
接着call到了sub_401D09中。该函数用于获取进程的一个执行权限
获取之后,程序会带参数加载这个dll文件。
这里加载执行之后,程序就会做一些收尾操作,然后退出当前的程序了。
这里程序其实配置了多种启动方式,感兴趣的可以看下。
最后,程序尝试通过DeleteFile删除自身
到这里,Dropper这个程序就完全分析完成。
0x03 cdnver.dll分析
释放出来的这个dll就是APT28的特马。
该样本功能非常完善,包括信息收集、信息上传、下载、执行PE、截屏等。
网上关于该木马的分析报告还挺多的,这里就随便看一下,且因为篇幅的原因,也不能写太长啦~ 这就是一个标准的远控木马,没有什么混淆,有一些自定义的解密函数,跟着调试很快就可以调试完。
使用IDA加载该dll,由bat文件中的执行指令可以知道,程序调用该dll的时候,是执行了序号为1的导出函数。
start rundll32.exe “C:\Users\Administrator\AppData\Local\cdnver.dll”,#1
该函数结构非常简单,进来直接就是CreateThread执行了sub_10002CA0,这里是该特马的入口点。
#1->2ca0
2CA0进来调用的第一个函数是sub_10002CFD
sub_10002CFD
程序首先是通过10002F3F解密得到了一个互斥体名,然后通过CreateMuteA创建互斥体。
通过gethostbyname获取当前的主机名:
通过GetVolumeInformationW获取磁盘信息:
调用obtainUserAgentString检索当前的User-Agenet HTTP请求标头字符串。
打开:Software\Microsoft\Windows\CurrentVersion\Internet Setting\Servers注册表键值,将C2信息加密后存储在这个键值的Domain项中。
解密出域名:cdnverify.net
该域名已经被打上了对应的标签。
将接下来要请求的信息base64编码,方便之后传输。
首先对google发起网络请求,确保网络畅通。
样本会来回在googl和真实的c2之间来回切换通信,达到隐藏通信的目的。
该样本中使用的是标准的HttpSendRequestA系列API进行网络请求:
发送数据之后,程序会通过InternetReadFile接收并解析返回值。
关于cdnver.dll就分析到这里。感兴趣的小伙伴可以到app.any.run上下载该样本到本地继续分析。