0x00 背景

APT28是一个疑似具有俄罗斯政治背景的APT组织。笔者根据公开的情报整理到的信息大概如下。
image.png

本次的样本来源于沙箱app.any.run:https://app.any.run/tasks/d6a8d1db-52c8-4371-b6d3-bf740408bb10/
image.png

可以看到样本已经标记为了APT28

样本MD5为:36524c90ca1fac2102e7653dfadb31b2

0x01 样本基本信息

样本下载到本地之后通过exeinfo查看样本可以知道样本是标准VC编译的程序。
image.png

使用火绒剑可fakenet跑一下样本的行为:
image.png

样本运行后,最直接的行为就是在本地appdata路径释放了一个dll文件和一个bat文件,然后在左边的fakenet窗口中可以看到发送了超级长的一段base64编码数据,这次猜测可能是通过base64编码了本地收集到的信息然后传到C2.
image.png

转到bat和dll文件的目录下,可以看到bat的内容就是调用rundll32.exe去启用加载这个dll。image.png

所以看样子,我们拿到的这个exe有很大的概率是一个Dropper。

0x02 Dropper分析

使用IDA加载原始样本。
image.png

WinMain的入口点没什么特殊的,进来之后调用了三次sub_401DEF函数,这种情况下,sub_401DEF一般都是解密函数。
image.png

解密的第一个字符串是SystemRoot\SysWow64
第二个串是SystemRoot\SysWow64
第三个串是:TEMP
image.png

所以我们将sub_401DEF函数重命名为:Rename_decodeStr

三个字符串解密之后,程序会再调用一个名为sub_4012D3的函数,这个函数如果调用失败,程序将通过jmp跳转到最后结束运行。所以sub_4012D3有可能是进行环境校验啥的。
image.png

WinMain->12d3

12D3函数进来之后,首先会通过GetProcessHeap获取当前进程的堆地址,然后通过HeapAlloc分配一个堆空间。
image.png

成功分配之后,程序会调用sub_401063继续分配
image.png

然后在分配的堆空间中解密出这个dll名称
image.png

第二次解密出appdata这个环境变量的名称
image.png

12D3函数执行完成之后,程序会调用执行sub_4013F7

WinMain->13F7

该函数进来,程序首先是通过之前分析的解密函数,解密了两个解压相关的API:

RtlGetCompressionWorkSpaceSize
RtlDecompressBuffer

这里应该是为等会释放文件做准备了。
image.png

然后LoadLibrary之后通过GetProcAddress获取刚才解密出来的API函数的地址
image.png

然后直接调用该函数,参数为eax:
image.png

然后调用了RtlDecompressBuffer,根据参数来看,这里应该是会将目标数据解压缩到esi所在的地址
image.png
函数执行之后成功解压出一个PE
image.png

至此,sub_4013F7函数功能分析完毕,经过分析,该函数用于解压缩数据为PE文件。

接下来是调用sub_40155B函数。

WinMain->155B

在115B函数中,程序首先执行了一个call ,然后就准备LoadLibrary
image.png

155B->sub_4010CD

跟进到sub_4010CD中,程序首先是解密了两个字符串,分别是SystemRoot和\System32

然后就尝试通过GetEnvironmentVariableW获取LOCALAPPDATA环境变量的路径。
image.png

成功获取,根据行为分析我们可以知道,这个路径是后续用于释放文件的。
image.png

然后尝试通过lstrcatW拼接字符串,获取更完整的路径。image.png

最后拼接处解密dll的完整路径:
image.png

至此,sub_4010CD函数分析完成,我们回到1565B函数中

程序是通过了拆分字符串的方式,组装出了Kernel32.dll
image.png

然后准备调用CreateFileW
image.png

成功获取API地址之后,程序首先跳转到loc_4016E3去,然后通过jmp函数又跳转回来继续执行。
image.png

跳回来之后,程序通过CreateFile创建这个dll的文件对象。
image.png

同样的方式,去获取WriteFile的API地址:
image.png

然后调用WriteFile将dll文件写入过去:
image.png

这里是文件对象创建成功
image.png

这里是closeHandle之后,dll文件写入成功。
image.png

到这里,sub_40155B函数就分析完成。
通过分析我们可以知道,该函数的主要功能是解压缩资源,释放目标dll文件到指定的目录。

回到WinMain中,155B函数调用完成之后,程序会调用sub_40264C函数。

WinMain->264C

264c函数进来之后就一直在解密字符串:
image.png

解密的第一个字符串是rundll32.exe
image.png

解密出来的字符串分别如下:
image.png

然后老套路解密出了操作注册表的API:RegOpenKeyExw
image.png

然后循环的去调用之前的解密函数,逐步解密出bat的完整内容image.png

尝试通过CreateFileA创建文件:
image.png

image.png

文件对象创建成功之后,将调用执行dll的命令写入进去:
image.png

写入成功之后就是一系列的收尾工作:
image.png

到这里,sub_402030函数分析完成,该函数的主要功能就是将启动dll的命令写入到bat文件中。
image.png

然后创建一个UserInitMprLogonScript的注册表,这是一种用于权限维持的操作。因为HKEY_CURRENT_USER\Environment\
Logon Scripts 的执行顺序在杀软钱,所以Logon Scripts可以优先于杀软执行,绕过杀软对敏感操作的拦截。

image.png

到这里,264C函数也执行完毕。
该函数的主要功能就是释放bat文件,然后写入Logon Scripts注册表以绕过杀软。

接下来是在WinMain中调用sub_401707函数:
image.png

WinMain->1707

1707进来之后首先是解密了三个字符串,分别是RunDll32.exe ,#1 和Open
image.png

接着call到了sub_401D09中。该函数用于获取进程的一个执行权限
image.png

获取之后,程序会带参数加载这个dll文件。
image.png

这里加载执行之后,程序就会做一些收尾操作,然后退出当前的程序了。

这里程序其实配置了多种启动方式,感兴趣的可以看下。

最后,程序尝试通过DeleteFile删除自身
image.png

到这里,Dropper这个程序就完全分析完成。

0x03 cdnver.dll分析

释放出来的这个dll就是APT28的特马。
该样本功能非常完善,包括信息收集、信息上传、下载、执行PE、截屏等。
网上关于该木马的分析报告还挺多的,这里就随便看一下,且因为篇幅的原因,也不能写太长啦~ 这就是一个标准的远控木马,没有什么混淆,有一些自定义的解密函数,跟着调试很快就可以调试完。

使用IDA加载该dll,由bat文件中的执行指令可以知道,程序调用该dll的时候,是执行了序号为1的导出函数。
start rundll32.exe “C:\Users\Administrator\AppData\Local\cdnver.dll”,#1

image.png

该函数结构非常简单,进来直接就是CreateThread执行了sub_10002CA0,这里是该特马的入口点。
image.png

#1->2ca0

2CA0进来调用的第一个函数是sub_10002CFD
image.png

sub_10002CFD

程序首先是通过10002F3F解密得到了一个互斥体名,然后通过CreateMuteA创建互斥体。
image.png

image.png

通过gethostbyname获取当前的主机名:
image.png

通过GetVolumeInformationW获取磁盘信息:
image.png

调用obtainUserAgentString检索当前的User-Agenet HTTP请求标头字符串。
image.png

image.png

打开:Software\Microsoft\Windows\CurrentVersion\Internet Setting\Servers注册表键值,将C2信息加密后存储在这个键值的Domain项中。
image.png

解密出域名:cdnverify.net
image.png

该域名已经被打上了对应的标签。
image.png

将接下来要请求的信息base64编码,方便之后传输。
image.png

首先对google发起网络请求,确保网络畅通。
image.png

样本会来回在googl和真实的c2之间来回切换通信,达到隐藏通信的目的。

该样本中使用的是标准的HttpSendRequestA系列API进行网络请求:
image.png

发送数据之后,程序会通过InternetReadFile接收并解析返回值。
image.png

关于cdnver.dll就分析到这里。感兴趣的小伙伴可以到app.any.run上下载该样本到本地继续分析。