概述
样本信息
原始样本md5:90a59c16d670fd77d710516299533834
样本类型:doc
样本利用方式:宏代码利用
样本文件名:Pyongyang stores low on foreign goods amid North Korean COVID-19 paranoia.doc
原始doc文档分析
样本以朝鲜平壤地区的疫情为诱饵,向对此话题感兴趣的人士发起攻击,暂未定位到具体的受害目标。
原始样本通过设置颜色在正文上面加上一层遮挡物以诱导用户启用宏:
宏代码启用之后,遮挡物消失,文档正文正常显示以掩护恶意代码执行。
宏代码运行之后主要是执行两个功能
- 去掉遮挡物让用户以为打开的是正常文档
- 从C2:hxxps://www[.]rabadaun.com/wordpress/wp-content/themes/TEMP.so 下载TEMP.so到本地加载执行。
下载的TEMP.so为exe文件,md5为: f160c057fded2c01bfdb65bb7aa9dfcc
加载后续payload
加载的后续payload主要有两个可疑行为
- 创建C:\ProgramData\a7963\目录并将自身拷贝过去
- 循环对C2服务器186[.]122.150.170:80 发起网络请求
此样本由MFC编写,样本运行后会通过一个超大循环以延迟关键代码执行,起到一定的反检测作用,这里是个for循环,循环变量每次自增1,循环条件是变量小于0x0BAADBEEF,循环体是给ebp+var_18变量自增1。循环一共会执行3131948783次,所以程序加载后,在恶意代码执行起来之前会有一个明显的停顿。
循环执行完毕,程序通过VirtualProtect更改0x422548到0x42A548的内存属性为0x40(可读可写可执行)
更改完成之后,程序会在00401070函数中对这片内存进行解密。
解密算法如下,程序首先将刚才更改了内存属性的数据的起始地址0x422548赋值给eax
赋值给eax之后,程序首先会清空esi,然后通过自增esi和eax+esi的方式对这片内存中的每个字节进行操作,第一次执行时,程序会将eax+esi的值赋给bl并且将bl与4330c0处的值进行异或计算,计算的值存储到bl中。
异或之后,程序会将bl的值进行not运算,运算之后的值依旧在bl寄存器中,此时,程序再将bl与4330c1的值进行异或,异或的值放入bl寄存器。
第二次异或之后,程序会将bl的值放回原位以替代原数据,同时自增esi,计算下一个字节的值。这里程序一共会将0x77E6大小的值以同样的方法进行计算解密出后面的shellcode。
解密完成之后,EnumChildWindows的回调函数EnumFunc已经被替换为了解密后的代码
直接在00427068处设置断点过来
解密出来的这段shellcode主要是一个loader,用于解密后续的payload继续执行,程序会用如下的字符串和程序的数据解密出一个PE
动态解密API地址
4255C8函数再次通过和之前一样的手法,执行一个大循环以延迟程序执行
程序在00423827处重新创建自身进程
接着程序通过ZwResumeThread、ZwSetContexThread这一套进行傀儡进程注入
最后通过ZwResumeThread恢复目标进程执行
傀儡进程注入
注入的进程为Amadey恶意软件,程序中的字符串均已加密,程序定义了一个字符串a7963b909152f8ebc3ec69b1dee2b255a9678a5用于动态解密其他字符串
程序会调用这个解密函数解密出一系列杀软文件名并判断是否存在这些杀软文件名
这里程序主要是检测是否存在0A和0B所对应的杀软,也就是Norton和Sophos,如果检测到这两款杀软程序就跳转到函数最后,不继续执行此函数功能。
当前函数继续执行,则会解密拼接出C:\ProgramData\a7963\tlworker.exe路径并创建文件句柄
创建目标文件夹
创建文件,然后在004016f2函数将自身写入到C:\ProgramData\a7963\tlworker.exe文件中
接下来,程序创建进程,通过cmd指令将上面的路径写入到启动项中以实现本地持久化
网络请求模块
程序解密出请求C2:196.122.150.107
接着程序开始解密请求路径和参数,首先是解密出请求路径cc/index.php
接着解密出id参数并且通过获取系统目录和磁盘信息以计算出id
同样的,指定当前的样本版本
程序会通过类似的方法拼接一系列参数,包括是否为管理员权限、操作系统版本信息、计算机名和杀软信息等,最后拼接出的请求信息如下
一切准备就绪之后,获取目标主机地址准备请求:
通过post的方式将数据send到C2
数据发送之后,程序会根据服务器返回执行对应的操作,并且休眠1分钟重复进行请求,也就是最开始在行为分析中看到的循环请求。由于末尾的跳转是jmp,并且中间并没有跳转可以跳出循环,说明这里是永真循环,程序执行到这里,功能已经执行完毕,后续则需要服务器返回执行。
由于目前服务器已经没有返回,无法对后续操作进行深入分析。但是根据攻击者所使用的Amadey恶意软件和钓鱼的内容,基本可以确定这是东亚APT组织Thallium针对韩国用户的攻击活动。