Trickbot是2016年出现的一种网银木马,它以大银行的客户为目标,窃取他们的信息。自出现以来,新的变体不断出现,每次都有新的技巧和模块更新。 Trickbot是一种模块化恶意软件,包括针对其恶意活动的不同模块。主要功能包括从浏览器中窃取数据、从Microsoft Outlook窃取数据、锁定受害者的计算机、系统信息收集、网络信息收集和域凭据窃取等模块等. 由于此家族出现至今已四年,公开的报告众多,此处不多描述初始载荷,以调试分析Trickbot功能载荷(本次分析的是1000511版本)为主,偏向于定位ShellCode,绕过反调试,解密配置文件。
Trickbot是一个多阶段的恶意软件,通常由一个外壳、一个加载器和一个主恶意软件模块组成。外壳使用多个不断变化的模板,旨在通过产生独特的样本来逃避检测,即使主要的恶意软件代码保持不变。 TrickBot运行后会复制自身文件到目录%APPDATA%(或其他路径),然后删除原始文件。接着会从C2服务器下载一些模块。这些模块也被加密存储,常见的功能模块及描述如下:
Systeminfo:用于收集有关主机的基本信息 importDll:从浏览器窃取数据 injectDll:进入银行网站盗取证件 Pwgrab:抓取密码 cookiesDll:窃取Cookie mailsearcher:遍历要窃取的系统中所有驱动器中的所有文件 sharedll:用于传输到管理共享并通过服务创建持久性 networkDll:用于收集系统信息和网络/域拓扑 NewBCtestDll:Backconnect SOCK5模块 psfin:POS提取 vncDll:远程控制/ VNC模块 wormDll:蠕虫 tabDll:用永恒的浪漫和MS17-010来传播SMB outlookDll:窃取由微软Outlook保存的数据 domainDll:用于域控制器配置的LDAP获取 mwormDll:用于通过LDAP和SMB开发的横向移动/枚举模块 mshareDll:通过LDAP和SMB开发横向移动/枚举;mshare和mworm模块协同工作 rdpScanDll:暴力破解远程桌面协议(RDP)的名单
本次分析的TrickBot变体查壳发现是由VB语言编写的32位可执行程序: IDA导入表中,除了MSVBVM60动态库的函数之外,另有几个比较有意义的函数: “VirtualAlloc”+“VirtualProtect”用来申请内存修改为可执行属性,一般用于后续写入ShellCode执行,并且在IDA中,有且仅有一个“VirtualProtect”调用: 并发现其操作的内存地址在后续代码中,由“RtlMoveMemory”调用写入数据“0xE9”,“E9”为汇编指令中的近跳转代码,在此处下断: 在后续跟踪中,发现是运行后的内存为“JMP+API地址”的代码,API地址来自RCData解密出的API名: 而有关资源的API函数“FindResourceW”和“LoadResource”可以推测为从资源段中加载资源: 从上述的API中,可以推测资源段中可能有加密(或未加密)的数据,使用“ResHacker”等资源查看软件,返现该PE文件的有一个包含大量数据的“RCData”资源:
动态运行后,通过火绒剑等动态监测工具,可以发现原始TrickBot会新建目录“C:\Users\Administrator\AppData\Roaming\CommandLineEx”作为工作目录,将自身复制到该目录下后,退出当前的进程。并且会新建计划任务“WinInform”在开机时和15分钟间隔运行副本: 在后续时间顺序内,副本有大量的外联行为,通过查看该行为的调用栈,发现是通过“WinHTTPSendRequest”进行网络通信,由于导入表中并无该函数,故推测为通过ShellCode动态解密/释放了一些API函数:
通过静态查看和动态监测之后,已经可以推测出TrickBot大致的行为流程和调用的API函数了。 由于有复制本身后退出原进程的行为,故以OD调试副本。 在运行到TrickBot的程序领空后开始下断,由于TrickBot本身的导入表并无WinHTTP系列的等API,此时只能下IDA导入表中显示的API断点,主要的有: 1.加载资源的“LoadResource”:用于查看RCData的资源如何被使用; 2.写内存数据的“RtlMoveMemory”:写入了那些数据,以及数据的用途; 3.修改属性的“VirtualProtect”:申请的内存有可能是别的数据,而ShellCode会被改为可执行属性。
对“LoadResource”下断后,发现RCData的数据存放在内存0x4279F0位置,下内存写入断点后F9运行,后续可以发现解密为函数名:
该函数用来写入申请的内存,写入后内存显示为“JMP+API地址”: 释放的函数比较少,并且其中的API包括“VirtualAlloc”+“VirtualProtect”(下断),推测这是一段ShellCode释放代码。
最后一次“RtlMoveMemory”,在0x422B20写入的是ShellCode1的地址。写入前为常规的存取堆栈操作“PUSH EBP”: 写入后为跳转至ShellCode1的“JMP [ShellCode1]”:
该段ShellCode主要用于释放ShellCode2并跳转。 上述在进程空间内释放ShellCode1的API函数地址时,对“VirtualProtect”下断,可以跟踪到申请后修改为执行的内存: 调用“VirtualProtect”后,接着会调用“VirtualFree”释放内存,至此,ShellCode2已经从ShellCode1中释放。紧接着就是“CALL”指令进入跳转ShellCode2的函数(011F0ED0),该函数通过“JMP ECX”的方式进入ShellCode2的领空,特征码为[58 59 50 FF E1]:
ShellCode2主要用来申请内存并写入ShellCode3数据,并通过“CALL EDI”的命令进入ShellCode3。 进入ShellCode2后无法明显从代码中看出功能: 运行后发现动态监测工具并无明显行为,对“Sleep”下断后,查看其调用代码,可以定位到有效代码处: 根据上下文代码,发现有以“JNZ”方式循环调用“Sleep”,取消“Sleep”断点,在“JNZ”下一行下断跳过While循环。F9运行后会断在“VirtualAlloc”上,申请多个内存,最后调用“VirtualProtect”将部分内存改为可执行属性,最后通过“CALL EDI”跳转至ShellCode3:
ShellCode3主要有两个函数,第一个用于解密释放API函数地址: 对存放API函数地址的内存块下访问断点,可以迅速定位到调用系统API函数处。或者单步步入第二个函数,也可以很快到达功能代码处。第二个函数就是最终的功能载荷,从此开始就可以分析有效的代码: 由于TrickBot功能介绍的报告众多,此处不多赘述。可以根据上一步出现的API函数,下对应断点,跟踪到对应的功能代码。 通过“Ctrl+B”调出查找二进制字串的窗口,输入对应函数地址的小端序: 或者通过查找“所有模块间的调用”,找到函数调用处: 比较值得注意的是解密的CSP系列API、创建线程的“CreateThread”、写入内存的“WriteProcessMemory”:
TrickBot的资源段中有加密的配置文件,在其运行后通过ShellCode多层执行解密代码,最终调用Windows 操作系统的加密服务提供程序(CSP)解密,设置API断点“CryptDecrypt”,其第五个参数“pbData”就是要解密的数据的缓冲区的指针,在数据窗口跟随,步过“CryptDecrypt”断点后,数据窗口就会显示解密后的配置文件数据: 配置文件中<srv>和</srv>标签中存放着需要连接的C2信息。
TrickBot的ShellCode会利用While循环,多次调用Sleep(1和2),以延时方式绕过沙箱等动态检测,可以通过修改零标志位ZF或者设置下一行为EIP跳过:
T1001.001(数据混淆.垃圾数据):攻击者将垃圾数据添加到代码中,从而使检测变得更加困难,也可以避免检测 T1053.005(计划任务):通过Windows任务计划程序来延迟执行恶意载荷,可能是用于规避动态检测 T1082(系统信息发现):攻击者获取受感染计算机的系统盘(或C盘),对手可能试图获取有关操作系统和硬件的详细信息,包括版本、补丁、修补程序、修补程序、服务包和体系结构。对手可以使用来自系统信息发现在自动发现过程中形成后续行为,包括对手是否完全感染目标和/或尝试特定的行为 T1087.001(帐户发现.本地帐户):通过获得本地系统帐户的列表。此信息可帮助对手确定系统中存在哪些本地帐户,以帮助后续行为。 T1140(去模糊/解码文件或信息):攻击者最终使用经过混淆和加密的ShellCode执行主要功能 T1497.003(虚拟化/沙箱规避.时基回避):攻击者通过设置延时和计划任务来避免虚拟化分析环境 T1592:收集受害者主机信息
<mcconf> <ver>1000511</ver> <gtag>lib723</gtag> <servs> <srv>5.182.211.215:443</srv> <srv>144.91.76.208:443</srv> <srv>185.99.2.57:443</srv> <srv>134.119.191.38:443</srv> <srv>195.123.238.17:443</srv> <srv>95.171.16.42:443</srv> <srv>85.204.116.238:443</srv> <srv>185.234.72.242:443</srv> <srv>178.157.82.227:443</srv> <srv>185.90.61.9:443</srv> <srv>45.148.120.205:443</srv> <srv>85.204.116.241:443</srv> <srv>5.1.81.68:443</srv> <srv>51.81.112.191:443</srv> <srv>23.239.84.138:443</srv> <srv>194.5.250.180:443</srv> <srv>194.87.93.114:443</srv> <srv>190.214.13.2:449</srv> <srv>181.129.104.139:449</srv> <srv>181.112.157.42:449</srv> <srv>181.129.134.18:449</srv> <srv>131.161.253.190:449</srv> <srv>121.100.19.18:449</srv> <srv>202.29.215.114:449</srv> <srv>171.100.142.238:449</srv> <srv>171.100.142.238:449</srv> <srv>202.29.215.114:449</srv> <srv>190.136.178.52:449</srv> <srv>45.6.16.68:449</srv> <srv>110.232.76.39:449</srv> <srv>122.50.6.122:449</srv> <srv>103.12.161.194:449</srv> <srv>36.91.45.10:449</srv> <srv>103.227.147.82:449</srv> <srv>96.9.77.56:449</srv> <srv>103.5.231.188:449</srv> <srv>110.93.15.98:449</srv> <srv>200.171.101.169:449</srv> </servs> <autorun> <module name="pwgrab"/> </autorun> </mcconf>
由于分析该TrickBot的目的是提取其加密的C2配置信息,故没有过多的描述其功能,偏向于调试定位到C2配置解密的部分。 TrickBot主要使用的模块和功能在公开报告《2018年TrickBot银行木马分析报告》有详细介绍。