[二进制安全]静态分析揭开Joanap木马的神秘面纱

先知技术社区独家发表本文,如需要转载,请先联系先知技术社区授权;未经授权请勿转载。

近期,出于对索尼电影的崇拜之心,本打算分析分析当年入侵索尼,造成索尼数十仇美金损失的木马样本,找到赛门铁克家报的名字为“Backdoor.Destover”的样本, Destover家族可是公开的当年攻击索尼影业的样本家族名字,谁知天不遂人意,发现我找到这个样本并不是传说中的Backdoor.Destover家族成员,而是更类似于微软报的Joanap家族木马,在网上对Joanap家族的木马的分析也并不多见,因此形成本文分析,权当记录之用。

木马在报毒截图如下:

1

木马的执行流程图如下:

2

dropper文件根据配置内容释放 dna 文件和 wkcli2000002.dll,其中的dna文件保存了十个CC地址,CC地址数据不是简单的明文表示,而是以十六进制socket结构表示,木马会随机了从这十个CC地址中随机选择进行使用。wkcli2000002.dll 负责与CC地址进行初始化通信并发送用户信息。只有当初始化通信成功后,会解密出svc.dll文件,并将其加入启动项进行持久化攻击,同时清理环境现场。

dropper

模块的主要功能:根据文件尾部的配置信息,解密出上线地址(保存到文件.dna中)和恶意组件wkcli2000002.dll
配置文件保存在文件的尾部,配置文件内容如下:

3

解析配置内容时,先读取文件最后一个DWORD内容,此DWORD表示了配置项的个数,(在此样本中的配置项的个数为2),说明文件尾部有两个配置项。而每个配置项的结构如下
文件偏移 + 文件大小 + 文件名 + 文件名长度
文件偏移:表示释放的文件在dropper文件中的文件偏移位置
文件大小:表示释放的文件在dropper文件中占用的文件大小
文件名:表示释放的文件保存的文件名
文件名长度:表示释放的文件名的字节长度

4

Dropper程序随后会定位到每个配置内容的详细信息,根据配置信息从原始文件中读出指定的内容并写入相应的文件中。

解析完配置文件后,dropper程序会判断配置文件中的文件名的扩展名是不是为dll,如果文件扩展名为dll,则对配置项中定义文件内容进行zlib解压,解压出来的数据才是真正的PE文件,dropper会将这个PE文件释放到临时目录下,并使用LoadLibrary加载这个PE文件

5
6

被加载的dll文件就是我们即将进行分析的 wkcli2000002.dll 文件。

wkcli2000002.dll:

wkcli2000002.dll文件被dropper文件加载后,主要进行下面的操作:

动态获取API地址:

获取API地址时使用到的自定义的key轮换算法:
Key为长度为0x20长度的字节,每次轮换进行0x80次的计算,每次计算将key中索引为0的值通过公式一计算,将索引为e的值通过公式二计算,将索引为1-F和F-1F的内容分别用上次轮换时的key的0-C和E-1E的内容进行替换。

7

上图表示的为初始key为

93 3C 4A D5 C0 46 0E 1B 78 C5 E2 E9 6C 0E 40 DE 50 5A 4D A9 A6 6F 09 CC 7A 7C 88 A0 50 44 92 9A
经过轮换后(0x80次的变换)最终得到的结果为: 
AC 93 F0 81 6D DE 45 24 D7 7F B6 44 F4 45 CA DB 6E 1F A6 00 8B E7 41 B4 40 0E CB 05 32 08 FF C6

获取API地址所需要的函数名字符串通过解密函数解密后获得。
解密函数名的算法为:
依次取得加密过的字符,将该字符^(公式一的值^公式二的值)作为解密后的字符(此句中的^表示异或操作),同时进行一次key轮换,并使用新的key解密下一字符,直至所有的字符解密完成。

8

生成随机文件名:

根据硬盘的SerialNum作为随机种子,生成随机的6字符作为文件名和三字符的文件扩展名。此随机文件名用于保存加密后的CC地址,同时,为了隐藏行为,程序还将篡改此文件的时间信息。

9

独特的删除文件方法

获取dna文件中的内容后,删除dna文件。其中dna文件中保存的是木马程序的CC地址信息。
删除文件并不是简单的使用了DeleteFile函数,而是先使用随机字符覆盖原始文件内容后,再通过DeleteFile删除文件。之所以先使用随机字符覆盖原始文件内容是防止用户通过数据恢复类软件查看到原始文件的内容。

10

获取用户信息:

获取的用户信息包括当前用户的权限,计算名,用户名,操作系统版本信息,CPU信息,网络连接信息,当前系统的语言信息,当前系统的国家信息,当前机器的网络接口信息,磁盘信息等内容。

11

与CC初始化通信:

CC地址来自于dropper解密出来的dna文件中,文件中包含了多个上线CC及其端口
其中包含了10个上线地址及对应的端口

12

与CC通信时,以当前时间做种子生成随机数,在上面的十个上线地址中随机选取做为通信地址。

13

由于程序的CC地址已经失效,此后的分析全部通过静态分析完成。

随机生成长度大于0x10的通信密钥。向CC发送密钥的长度,随后向CC发送密钥内容,紧接着向CC发送密钥内容的hash校验值,发送完上面三项内容后,等待接收CC返回4字节的确认值,当收到CC地址返回的确认值后,比较接收到的确认值与发送的密钥的内容的hash校验值是否一致,如果一致,则认为初始化通信成功。

14

初始化通信成功后,向CC地址发送用户信息:
首先会将dna文件内容,使用通信密钥处理后发送给CC服务器
然后,会发送用户的进程及窗口信息内容。
最后会发送上面获取到的用户信息,用户信息并不会直接发送给CC服务器,而是使用将保存这些信息的文件通过zlib压缩后,再次使用前面介绍的算法进行处理。

16

发送完上面的信息后,等待CC地址返回8字节的数据内容,程序会使用这8字节的数据做为互斥体名称,建立互斥对象。

解密svc.dll

wkcli2000002.dll与dropper结构相似,都是在文件尾部保存有配置信息。使用同样的定位方法,读取到mini.dll中经过zlib压缩过的数据。

17
18

使用zlib解压缩后,本来通过配置文件,应该保存成mini.dll文件,但程序却摇身一变将zlib解压缩后的内容成svc.dll文件。

19

加入启动项

将svc.dll通过注册表注册到服务中

20

以服务方式启动svc.dll文件

21

删除自身

使用批处理删除自身,进行毁尸灭迹。

22

Svc.dll

Svc.dll是个典型的下载者,svc.dll与上面程序的最大不同在于,加入了反调试与反虚拟机的功能。但由于样本的CC地址已经全部失效,我们只能通过反汇编代码来理解程序的功能。

1.  使用上面介绍过的方法动态获取API地址

23

2.  加入了对调试器和虚拟机的检测:

24
25
26

3.  Svc.dll也会生成随机密钥与CC地址进行通信,从代码中可以看出,svc.dll将接收到的数据,经过解密保存到临时目录下,并通过CreateProcess加载运行。

27
由上面的分析,可以断定作为服务项开机启动svc.dll是个典型的下载者木马,主要是从CC地址中获得下一步攻击的负荷并加载运行。

总结

通过上面的分析可以看到,样本是通过数据重写来防止简单的数据恢复,而且木马各模块分工明确,dropper模块只是负责解密CC地址和加载下一步的wkcli2000002.dll攻击负载,wkcli2000002.dll模块只是初始化通信,提交用户信息和加载下一步的svc.dll攻击负载,svc.dll只是负责下载执行。可以看到,该木马的分工明确,而且能够记得通过数据复写来删除文件,也说明该木马有相当强的安全对抗意识。

【本文转自安全脉搏战略合作伙伴先知技术社区  作者:菠菜  安全脉搏整理发布 原文链接

本文作者:先知技术社区

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/54289.html

Tags:
评论  (1)
快来写下你的想法吧!

先知技术社区

文章数:27 积分: 3

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号