一诈骗案件中发现的.Net木马动静态分析思路与方法
背景
当今诈骗案件中,Windows系统环境下的远控软件是主要的“作案工具”,从魔改的Teamview到木马程序,诈骗人员也不断在进化“技术能力”。近期在对涉案木马程序进行分析时,注意到.Net架构木马程序相对于常规的C++木马而言,其涉案频率呈现出明显的上升趋势。这类木马以C#语言编写,通常使用dnSpy、ILSpy等工具进行逆向分析,其分析方法和思路与C++木马有所不同。
以近期一诈骗案中的.Net架构木马为例进行分析,笔者发现该木马具备多种恶意功能,包括但不限于监控用户屏幕、记录用户按键、实现远程控制等,并针对其shellcode释放以及远程连接C&C服务器的功能逻辑进行了深入逆向分析。本文以该案例为研究对象,介绍动态分析和静态逆向分析两种方法,查找其远程连接地址,并对木马具体功能的实现逻辑进行分析。
一、木马动态分析
1. 取证环境
测试电脑系统:Win10_64bit
木马取证分析工具:火绒剑、StudyPE、dnSpy
使用火绒剑加载检材木马程序文件后,获取基本信息如下图所示:

2. 文件相关行为
启动木马时,首先关注该程序是否有文件创建,修改和删除等行为,这些行为意味着木马程序可能会释放出所携带的shellcode进行远控操作,抑或是将自身复制到敏感目录下并修改其文件名为系统常见组件项,从而在受害者主机内达成持续化的操作。检查发现该木马能够复制自身到C:\Users\admin\AppData\Local目录下,复制程序和原始程序的MD5值相同且并未改变文件名称。

完成复制行为后,该木马执行\Local目录下的复制程序,并终止掉其原始进程(原始程序仍然保留并未删除)。

3. 木马远联地址
搜寻木马在运行时尝试远程连接的攻击者C&C服务器的IP地址,是在动态分析中最重要的一步,如果木马程序并未在启动时释放DLL库文件等shellcode,那它很有可能是先通过连接远程服务器,然后再下载shellcode以规避杀毒软件并开展下一步攻击行为。本文中,上一步中复制的木马程序尝试与IP地址27.*.*.137的6606端口进行TCP协议通讯,本次分析时已无法与对方建立连接。
使用火绒剑可以直观的发现木马程序尝试连接的IP地址,但这并不意味着C&C服务器一定就是在这个IP地址上,木马程序内可能编码的是一个下载服务器的IP地址,木马连接该服务器下载shellcode,或者程序内编码的是攻击者网站域名,如果存在CDN时极可能捕获到的仅是CDN服务器IP地址。这就需要对木马进一步逆向分析,在内部找到远联地址的调用方法,从而获取并佐证真正的IP地址线索,如下图所示。

4. 木马持久化操作
攻击者为了使木马在受害者主机上实现持续化运行,一般会在注册表,计划任务,服务中注册自启动项。本文中该木马远联IP地址已无法连接,在注册表,计划任务,服务中也暂未发现木马有持久化行为,重新启动测试机后也未发现有木马进程运行,可以初步判断该木马在此阶段中并未创建自启项,因此推断木马在连接CC服务器后,攻击者远程连接木马进行持久化行为。在对其他木马分析时,常见的自启动项位置也需要检查是否有存在恶意项目,包括如下范围:
- 注册表(使用regedit.exe检查):
- HKEY_CURRENT_USER\software\microsoft\windows\currentversion\run
- HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
- HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runonce
-
计划任务(使用计算机管理工具检查):
右键【开始】> 【计算机管理】 > 【系统工具】 > 【任务计划程序】 > 【任务计划程序库】,一般木马程序创建的计划任务项都在该目录下,触发器设置为“当任何用户登录时”

-
服务项(使用services.msc检查):
单击【开始】>【运行】,输入services.msc,注意服务状态和启动类型,检查是否有异常服务。
二、木马静态逆向分析
动态分析主要是对木马程序进行一个活动状态的认知,分析它实现的文件操作,远程连接的IP地址。而静态逆向分析则是对木马内部运行逻辑进行分析,与动态分析中获得的线索相印证,保证线索的准确性。本节主要介绍对本次检验中的木马进行静态逆向分析并复现其功能,探查其远联IP地址的调用逻辑。
1. 定位木马功能函数
使用StudyPE可发现该木马为.net架构,然后使用dnSpy打开该木马程序。


进入入口点,分析主函数发现该程序首先睡眠了4次3333毫秒,再进入MyMain函数。

MyMain函数负责获取当前用户的AppData\Local路径,并判断该路径下是否存在与木马文件名相同的程序,如果存在则跳入_MEP方法(真正功能函数所在处),如果不存在,则复制一个相同文件。

功能函数1:获取程序所需DLL并注入到目标地址
_MEP方法内主要使用了两个函数DL_And_P_RTK()和Program._R();,

首先分析DL_And_P_RTK(),该函数通过几次跳转,主要使用为Nw_ET_P方法和_____方法,如下图中箭头标注所示。


Nw_ET_P方法根据操作系统选择不同的加密字符串,然后加载指定的DLL库和获取函数地址,然后便将解密得到的字节数据注入到目标地址。

_____方法跟上述方法功能类似,通过解密unicode字符串获取需要使用的DLL库和函数地址、然后尝试将字节数据注入到目标地址处。

继续分析unicode字符串的解密逻辑,字符串主要由"ф"和"й"两个unicode字符组成,根据上图中的代码:Replace("ф", "0").Replace("й", "1")可知,其字符串即为一个01的二进制字节流,继续分析解码方法_B可得,其主要功能为将传入的二进制字符串转换为字节,再将字节转换为对应的ASCII字符串。

编写对应的python脚本,对字符串
“фййфййфффййфййфффййффйффффйфйййффййфйффйфйййффййфййфййфйфййффффй”进行解密,解密结果如图下所示,实际为字符串“lld.isma”

功能函数2:对硬编码数据进行解密,释放Shellcode
上述获取目标DLL并注入其目标地址后,_MEP方法接下来对硬编码数据Program.RT(实质为.lzma格式的压缩包数据)进行一系列操作:首先使用ST方法对其进行解密,接着使用_Dec方法解压其解密数据,并将解压后的文件传递给_R方法,在_R方法内定义了对解压文件的调用方式(定位其入口点并进入)。


ST函数内主要使用KEY值对字节数组数据进行循环异或解密,实现功能为:将字节数组内的每一个字节与密钥数组中对应的字节进行异或,并将异或结果减去字节数组中的下一个字节(减法结果可能出现负值,该方法接着对结果进行加256并取256的模,保证数值相同且不会出现负数),从而完成解密。

_Dec方法主要对解密后的数据(lzma压缩包格式数据流)解压缩为原始的字节数据,并未对数据进行修改。

功能函数2复现
在本地编写C#脚本复现功能函数2,调用ST方法使用Key值解密RT字节数组。

解密结果如下所示,将该文件后缀名改为.lzma后打开并解压,里面的文件为MZ头,即PE文件头,解密成功。


1. 分析释放的PE文件,定位远联IP地址
使用StudyPE可发现该PE文件也是.net架构,使用dnSpy打开该PE文件。

打开后发现其项目名为Orcus,网络查询可得其可能隶属于远控木马Orcus家族。


本次分析中主要定位其远联IP地址,因此主要寻找Connect,IPaddress等关联信息,该PE文件中的各个命名空间的命名方法较为直观且未做混淆操作,可以根据名字大致猜测各个命名空间负责的功能。

根据这一特点寻找Connect关键词,即网络连接相关的命名空间,最后发现得Orcus,Connection命名空间,里面存在Client,ServerConnection这几个类,高度怀疑与远联IP地址相关,对其进行检查。

检查得,Client类下的Connect()方法与尝试连接到服务器构建TCP连接相关,首先其通过通过Settings.GetBuilderProperty


可以发现其远联服务器IP地址是通过Settings.GetBuilderProperty方法进行获取的,检查此方法发现,其主要功能为管理和获取Settings集合中不同的属性实例。

通过上一代码,可以得出服务器远联IP地址存在Settings集合内,继续寻找其实现方式。最后发现得其存在于Settings方法内,该方法主要工作流程是从加密的设置中(Settings.GetDecryptedSettings)加载并反序列化应用程序的配置数据。

继续寻找Settings.GetDecryptedSettings方法的实现代码,最后可得知是以SettingsData.SETTINGS为密文,SettingsData.SIGNATURE为密钥,做了一个AES解密,根据AES.Decrypt的实现方式,即可对其进行解密。

2. 远联IP地址解密
在网络上搜索Orcus后发现Github上存在其1.9.1版本的源代码,搜索AES.Decrypt后得到其实现代码在AES,cs中,复制其函数,在本地实现其解密(实际为AES-CBC解密算法,密钥大小为256,初始iv为0sjufcjbsoyzube6的ASCII编码)。

调用类对密文进行解密,最后得到解密后的数据为XML格式数据

在该XML中发现了远联IP地址和端口号:27...137:6606,与动态分析中的远联IP地址对应,复现成功。

在网上寻找源码这一方法在分析市面中流行的木马家族时较为有效,但有些木马程序可能是攻击者对这些木马的魔改,抑或是自己编写的木马程序,则需要分析人员自己去查找实现功能的所在之处,以本次实验中orcus的配置文件加密逻辑为例,寻找其真正使用到的加密逻辑文件。
根据上文分析可得知,该加密逻辑定义在Settings类中,检查该类所使用到的命令空间时,发现其中有一Orcus.Shared.Encryption命名空间,可能与加解密相关,最后在程序所使用的资源中,发现了有costura.orcus.shared.dll.zip该文件,怀疑就是调用的shared库文件。
将此zip文件保存到本地,尝试使用bandzip解压打开发现文件报错,无法打开,使用Winhex检查该文件发现其也并不是正常的zip压缩文件头,返回到木马程序中查找其调用方法。

其文件名开头为costura,而程序内也存在该命名空间,推断可能就是在此命名空间中定义了对其的调用方式,检查后可得Costura的AssemblyLoader类中定义了对此类.zip结尾文件的解压缩方法:判断文件名是否以".zip"结尾,如果是,则表示该资源文件是一个压缩文件,将其传入DeflateStream中进行解压缩,并将其返回作为方法的结果。

此文件并不是真正的zip格式压缩文件,而是调用.NET Framework中DEFLATE压缩算法压缩后的文件,可以使用Cyberchef在线网站对其解压缩,解压缩结果如下图所示。观察解压后的文件流可得知,其为MZ头起始,判断为PE文件,也就是该DLL文件本身。

保存该DLL文件后,在dnSpy中打开检查可发现AES解密类,其中的AES加密实现方式和网上寻找到的加密源码类似。

结论
PE木马分析是一个漫长的过程,需要取证分析人员对木马程序抽丝剥茧,在代码中找到真正的功能运行逻辑,本文中以动态分析为辅,静态逆向分析为主,对一个.NET架构的木马进行了深入分析,在本文撰稿期间,笔者也在网上找到了可用的Orcus木马服务端,并将本文中木马释放的Orcus客户端调整配置文件后,实现了上线。在网络技术不断发展过程中,各类木马文件所使用的加壳,混淆,抗逆向等对抗技术等层出不穷,分析人员需要不断提高技术能力,搜寻可用线索以充分打击违法犯罪势力。