网银木马TrickBot的分析调试笔记

2023-11-15

Trickbot描述

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

对“LoadResource”下断后,发现RCData的数据存放在内存0x4279F0位置,下内存写入断点后F9运行,后续可以发现解密为函数名:
在这里插入图片描述

RtlMoveMemory

该函数用来写入申请的内存,写入后内存显示为“JMP+API地址”:
在这里插入图片描述
释放的函数比较少,并且其中的API包括“VirtualAlloc”+“VirtualProtect”(下断),推测这是一段ShellCode释放代码。

进程空间→ShellCode1

最后一次“RtlMoveMemory”,在0x422B20写入的是ShellCode1的地址。写入前为常规的存取堆栈操作“PUSH EBP”:
在这里插入图片描述
写入后为跳转至ShellCode1的“JMP [ShellCode1]”:
在这里插入图片描述

ShellCode1

该段ShellCode主要用于释放ShellCode2并跳转。
上述在进程空间内释放ShellCode1的API函数地址时,对“VirtualProtect”下断,可以跟踪到申请后修改为执行的内存:
在这里插入图片描述
调用“VirtualProtect”后,接着会调用“VirtualFree”释放内存,至此,ShellCode2已经从ShellCode1中释放。紧接着就是“CALL”指令进入跳转ShellCode2的函数(011F0ED0),该函数通过“JMP ECX”的方式进入ShellCode2的领空,特征码为[58 59 50 FF E1]:
在这里插入图片描述

ShellCode2

ShellCode2主要用来申请内存并写入ShellCode3数据,并通过“CALL EDI”的命令进入ShellCode3。
进入ShellCode2后无法明显从代码中看出功能:
在这里插入图片描述
运行后发现动态监测工具并无明显行为,对“Sleep”下断后,查看其调用代码,可以定位到有效代码处:
在这里插入图片描述
根据上下文代码,发现有以“JNZ”方式循环调用“Sleep”,取消“Sleep”断点,在“JNZ”下一行下断跳过While循环。F9运行后会断在“VirtualAlloc”上,申请多个内存,最后调用“VirtualProtect”将部分内存改为可执行属性,最后通过“CALL EDI”跳转至ShellCode3:
在这里插入图片描述

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跳过:
在这里插入图片描述
在这里插入图片描述

ATTCK对应技术点

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银行木马分析报告》有详细介绍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网银木马TrickBot的分析调试笔记 的相关文章

  • 终止进程树(C for Windows)

    以前曾有人问过这个问题 但我在代码中找不到明确的答案 我打开一个进程 ProcessA PID 为 1234 此进程打开一个子进程 ProcessAB PID 5678 完成后 我终止了 ProcessA 但 ProcessAB 仍然存在
  • Windows EventLog:它的操作速度有多快?

    我有一个服务应用程序 它通过 TCP 处理客户端请求并将任何事件写入 Windows EventLog 由于该应用程序预计会在短时间内为许多客户端和每个客户端的大量请求提供服务 假设每秒 1 到 50 个请求 因此我很想知道密集程度 CPU
  • 如何在Windows平台上编写Git Server Hooks?

    我找不到任何适用于 Windows 的 Git 挂钩的明确示例 我在 Windows Server 上使用 Bonobo Git Server 我需要预提交和提交后挂钩作为 cmd 或 bat 预提交应检查空注释 提交后应发送有关提交的电子
  • 如何使用 G++ MinGW 将 Psapi.lib 添加到 Eclipse 中的 TARGETLIBS

    我正在尝试实现这个示例进程枚举器程序来自 MSDN https msdn microsoft com en us library windows desktop ms682623 v vs 85 aspx 我收到许多未解析符号的错误 包括
  • 生成唯一硬件 ID 的可靠方法

    问题 我必须为每个联网客户端提供唯一的 ID 例如 一旦客户端软件安装在目标计算机上 它 ID 应该持续存在 并且如果在同一台计算机和相同的操作系统安装上重新安装软件 它应该继续存在 如果以大多数方式修改硬件配置 除了更改主板 它不应该改变
  • Ruby on Rails 安装问题 (Windows)

    我从 RuyInstaller 安装了 Ruby 2 0 0 和 DevKit 创建新项目时出现错误消息 rails new testtest d mysql a lot of output here Installing mysql2 0
  • Windows/C++:是否可以找到抛出具有“异常偏移”的异常的代码行

    我们的一位用户在我们的产品启动时遇到异常 她从 Windows 向我们发送了以下错误消息 Problem Event Name APPCRASH Application Name program exe Application Versio
  • 如何测试 Windows (10) 上是否安装了 Python,如果未安装则运行 exe 来安装它?

    仅当第一个命令失败时 我才需要在 Windows cmd 上运行第二个命令 在另一个场景中 我想在检查 python setup 是否安装后打开它 我用了这个命令 python version path to python install
  • VC++ 中的 getopt()

    我非常喜欢使用 GNUgetopt http www gnu org software libtool manual libc Getopt html 当在Linux 据我所知 getopt 在 MS VC 下不可用 Note Win32环
  • 如何根据操作系统系列拥有不同的依赖关系

    我正在编写一个跨平台库 它具有特定于平台的依赖关系 一个用于类 UNIX 平台 一个用于 Windows 这些板条箱仅在特定平台上编译 因此我不能正常地将它们全部添加到依赖项下 在我实际使用的 Rust 代码中cfg属性 例如 cfg un
  • 动态获取当前LDAP路径

    我正在使用 C 和 NET Framework 4 0 开发一个库 我想检索所有活动目录用户 它效果很好 但我的问题是 如果我在另一个域上运行我的程序 我必须更改此设置 private static string ldapPath LDAP
  • 适用于 Windows 的免费内存调试器? [复制]

    这个问题在这里已经有答案了 可能的重复 有 Windows 的良好 Valgrind 替代品吗 https stackoverflow com questions 413477 is there a good valgrind substi
  • Windows批量编程中读取文件名

    我想在Windows批处理编程中读取文件的名称 我尝试使用不同的方法但失败了请帮助 下面给出了场景 我的文件夹中有不同的文件 但所有文件的文件名长度相同 例如 1000342578 30062011 PDF 1000342329 30062
  • 自动化 Windows UI 测试方法

    我们正在寻求设置自动化 UI 测试 并想知道最好的方法是什么 潜在的陷阱是什么 设置费用是否昂贵 提前致谢 B 自动化测试最大的消耗可能是时间 有很多非常昂贵的工具 但也有免费的工具 即使是昂贵的工具的成本也不太可能与正确设置自动化测试所需
  • 如何以编程方式重新启动 Windows 资源管理器进程

    我正在开发 Windows shell 扩展 不幸的是 在更改 DLL 时 我必须重新启动 Windows 资源管理器 因为它将 DLL 保留在内存中 我从 Dino Esposito 找到了这个程序 但它对我不起作用 void SHShe
  • 如何在 Powershell 中为特定命令设置别名?

    有一个命令我经常输入 java jar foo param1 param2 param n 如何创建命令别名来运行此命令 如下所示 launch foo param3 where launch foo被翻译成完整的命令 你必须创建一个函数
  • 如何从 Emacs 中运行 Cygwin Bash Shell?

    我在 Windows 上运行 GNU Emacs 因此输入 M x shell 启动 Windows 命令行 DOS shell 但是 我希望能够从 Emacs 中运行 Cygwin Bash Shell 或任何其他非 Windows sh
  • shell进程的并行执行

    有没有一个工具可以在 Windows 批处理文件中并行执行多个进程 我发现了一些有趣的 Linux 工具 parallel http mi eng cam ac uk er258 code parallel html and PPSS ht
  • Shell 执行将窗口置于前面

    我正在使用此函数从我的 MSI 调用可执行文件 然而 可执行文件的窗口隐藏在我的 MSI 窗口后面 有什么办法可以把它带到前面吗 我尝试在调用之前最小化所有窗口ShellExecute但这仍然没有将可执行窗口带到前面 extern C UI
  • 如何在 Windows 中将 Electron 应用程序部署为可执行文件或可安装文件?

    我想生成一个独特的 exe文件来执行应用程序或 msi安装应用程序 怎么做 您可以使用以下方式打包您的程序电子包装机 https github com maxogden electron packager然后使用以下命令构建单个安装 EXE

随机推荐

  • 安装VMware Tools方法(对于 18.04LTS版本)

    大家都知道 每一种虚拟机 如VMware Parallels Desktop等都有一个Tools用来让linux系统和windows系统可以共用剪贴板等工具 使得在windows上复制了的东西 在linux ubuntu 上可以访问 对于V
  • MQ知识梳理

    常见MQ有哪几种 分别适用什么场景 常见的有ActiveMQ RabbitMQ RocketMQ Kafka ActiveMQ比较成熟 功能多 但也比较老 各方面都不突出 目前已很少使用 RabbitMQ性能高 功能多 吞度量万级 有开源活
  • C#中的接口(interface)

    接口的命名规范 I 名词 接口与抽象类的区别 接口是由抽象类演变而来的 抽象类是未完全实现逻辑的类 其内部可以有抽象成员 也可以有非抽象成员 且子类在覆写抽象成员时 需要修饰符override 而接口是完全未实现逻辑的 其内部只允许存在抽象
  • java报错:com.alibaba.druid.pool.DruidDataSource.info {dataSource-1} inited

    JDBC使用Druid连接池连接数据库的时候 遇到报错 com alibaba druid pool DruidDataSource info dataSource 1 inited 具体报错信息如下 从网页上报错信息 可以看到是获取驱动名
  • 彻底理解vue底层运用的核心函数Object.defineProperty

    一个函数诞生一个框架 vue就是得益于javaScrit的原生函数Object defineProperty而诞生的 那么Object defineProperty到底是什么 它的用法又是怎样的呢 很简单 它就是用来为对象定义属性的 从字面
  • 51单片机串口通信数码管显示

    外部晶振 11 0592MHZ 主控芯片 STC89C52 程序功能 串口工作方式1 8位UART 比特率9600 接收串口数据 数码管以十 进制格式显示 并且把接收到的数据加1后通过串口发出
  • 【Idea】创建包自动分层

    Idea 创建包自动分层 创建Maven 项目时 新建包使得Tomcat查找访问路径时更准确 但是有时包会不分层 如图1 然后我们使用图3的方法取消勾选 使得新建包时自动分层 如图2
  • 华为机试--简单题(一)

    HJ14 字符串排序 知识点 字符串 排序 描述 给定 n 个字符串 请对 n 个字符串按照字典序排列 数据范围 1 n 1000 字符串长度满足1 len 100 输入描述 输入第一行为一个正整数n 1 n 1000 下面n行为n个字符串
  • JAVA基于Slack实现异常日志报警

    一 功能介绍 在我们日常开发中 如果系统在线上环境上 发生异常 开发人员不能及时知晓来修复 可能会造成重大的损失 因此后端服务中加入异常报警的功能是十分必要的 而开发一个功能全面的异常报警服务 可能会花费较长的周期 今天给大家带来一种基于S
  • STM32F407基于RT-Thread连接ESP8266WiFi模块

    1 连接规则 STM32F4连接ESP8266无线通信 串口通信 首先 本次用到两个串口 我使用的是普中STM32F407 第一个串口为USART1 PA2 PA3 串口一 就是数据线连接单片机和电脑时用的口 串口三USART3 PB10T
  • 当面试官问你离职原因的时候怎么回答比较好?

    所有的前提都是建立在有一定的物质基础 当你的一日三餐都成了问题 都需要家庭支持的时候我希望你可以找一份工作 靠自己的本事养活自己从来不丢人 我觉得死要面子活受罪才是真的让你看不起 所有的建议都是建立在我们是普通打工人的前提 大佬是不需要建议
  • C++:二维数组--输出斐波那契数列的前20项

    大家都知道 在数学世界中有很多神奇的数列 斐波那契数列正是众多有规律的数列中的一种 该数列是意大利数学家列昂纳多 斐波那契发现的 他的基本规律是从第三项开始 每一项都等于前两项之和 第一项和第二项都是1 斐波那契数列如下图所示 1 1 2
  • http概述

    目录 概述 Web客户端和服务器 资源 http如何通信 媒体类型 URI 事务 方法 状态码 报文 连接 版本历程 Web的结构组件 代理 缓存 网关 隧道 Agent代理 爬虫 概述 HTTP是现代全球因特网中使用的公共语言 web浏览
  • 11个强大的Visual Studio调试小技巧

    伯乐在线注 我们在 程序员的那些事 微博上推荐了英文原文 感谢 halftone 被禁用了 的热心翻译 简介 调试是软件开发周期中很重要的一部分 它具有挑战性 同时也很让人疑惑和烦恼 总的来说 对于稍大一点的程序 调试是不可避免的 最近几年
  • 人工智能技术在软件开发中的应用

    人工智能技术的不断发展和成熟 使得它在软件开发中的应用越来越广泛 人工智能技术的应用可以帮助软件开发人员提高效率 降低成本 增强软件的功能性和可靠性 在本文中 我们将探讨人工智能技术在软件开发中的应用 并且提供一些实际案例 以帮助读者更好地
  • PHP 两个页面跳转,session会失效?

    两个页面都包含以下信息 可是 在A php中设置 SESSION go go 在B php中读出来的 SESSION
  • Pycharm远程连接服务器(实践笔记)

    Pycharm远程连接服务器 实践笔记 1 远程连接服务器 2 配置服务器上的环境 记录一下过程 防止自己隔一段时间又忘了 只有pycharm专业版才能远程连接 搞错了步骤1和2的顺序 然后代码一直不能实现同步 一下午配置了n次都不成功 不
  • java计算算术表达式

    直接上代码 String str 1 0 3 2 1 2 ScriptEngineManager manager new ScriptEngineManager ScriptEngine engine manager getEngineBy
  • Android 将布局文件放在服务器上,动态改变布局。

    转自 https blog csdn net chan1116 article details 44200405 目前在做项目时候有这样的需求 布局文件的控件类型大致相同 例如某布局文件由GridView ScrollView TextVi
  • 网银木马TrickBot的分析调试笔记

    Trickbot描述 Trickbot是2016年出现的一种网银木马 它以大银行的客户为目标 窃取他们的信息 自出现以来 新的变体不断出现 每次都有新的技巧和模块更新 Trickbot是一种模块化恶意软件 包括针对其恶意活动的不同模块 主要