这几年Agent Tesla在钓鱼邮件、文档宏投递和定向攻击里出现频率一直不低。名字虽然有点老但它至今仍在各种恶意软件家族排行上挂着号原因很简单功能实用、生成成本低、配置面板成熟只要能拿到一份有效载荷普通攻击者也能快速开起一场窃密行动。我从同事手里拿到一个可执行文件时第一反应也是先查哈希再扫字符串果然对上了Agent Tesla的典型特征。这篇文章就按我实际的样本分析流程来写从环境准备、静态拆解、动态行为、流量还原到最后的IOC提取和检测规则落地完整走一遍。适合刚接触恶意代码分析的读者照猫画虎地复现也适合已经会跑沙箱但想进一步理解“为什么这么做”的分析人员翻一翻。1. 样本信息采集哈希、编译特征与外壳识别全记录1.1 样本来源与隔离分析环境准备整个分析必须在一个隔离环境里完成千万不能在自己的工作机上直接双击。隔离环境不意味着完全断网因为后续还要观察网络外连行为所以要点是让这个环境无法影响真实生产网络同时又能记录对外请求。我习惯的做法是这样的准备一台随时可回滚快照的虚拟机操作系统可以选Windows 10或Windows Server32位和64位最好都测一遍有些样本只会在特定位数的系统上完整运行。关闭系统的自动更新和实时防护避免样本被查杀或行为被干扰。在网络侧搭一套抓包环境保留能解析DNS到本地的能力同时不让虚拟机直接访问外部网络。开启进程行为监控、文件系统监控和注册表监控记录运行时留下的痕迹。先给虚拟机做一个干净快照运行样本前再恢复一次确保每次试验的基线一致。从文件到达并确认哈希后第一件事不是跑行为而是做静态初筛。先看这个文件是不是看起来无害的图标很多Agent Tesla会伪装成PDF或文档图标实际上是个PE可执行文件。扩展名可能被隐藏比如“document.pdf.exe”在Windows默认不显示扩展名的情况下用户很容易被骗。所以先打开“查看”里的文件扩展名选项再确认类型。1.2 计算哈希与文件特征登记样本进入分析机后第一步永远是记录文件哈希。一般同时记录MD5、SHA1和SHA256三种值MD5方便情报平台检索SHA256用于精确标识文件唯一性。在PowerShell里直接执行下面的命令就能得到结果Get-FileHash -Path C:\analysis\sample.bin -Algorithm MD5 Get-FileHash -Path C:\analysis\sample.bin -Algorithm SHA1 Get-FileHash -Path C:\analysis\sample.bin -Algorithm SHA256我遇到的这个样本SHA256截图太长就不贴了重点是把它存进本地的威胁情报库后续所有检测规则的关联都以这个哈希为锚点。哈希本身没有风险但每次跑完新的变种都会用这个编号去追踪血缘关系。接下来看PE文件的元数据。用PE解析工具打开重点看几个字段编译时间戳、条目入口点、目标机器类型、可选头里的子系统、以及文件描述和产品名称。Agent Tesla的很多样本会伪造版本信息比如把“产品名称”写得像正常系统更新组件甚至带上假的数字签名图标。编译时间戳同样可以伪造不能当信任依据但是一个排序维度。如果样本是.NET编写PE头里会带mscoree.dll的导入表和CLR头部这是识别.NET样本最直接的特征。1.3 外壳、保护器与字符串初筛Agent Tesla的变种不少用打包壳或混淆器保护代码常见的有ConfuserEx、SmartAssembly、dnUPX等。识别壳的方式有几种查区段名、看入口点代码是不是一段解压循环、观察导入表中是否有大量动态解析的API、检查.NET元数据流是否被加密。如果看到区段名被改成“UPX0”“UPX1”或者干脆全是随机字符串基本就是加了壳。我一般会先用通用脱壳工具试着去壳再去翻字符串。字符串提取这一步非常关键因为很多配置信息会以明文或小幅编码的方式保存在文件里。对Agent Tesla来说最常搜的字符串包括“http://”或“https://”开头的C2地址片段“/admin/”“/upload”之类的URL路径“Software\Microsoft\Windows\CurrentVersion\Run”持久化路径“SOFTWARE\”开头的浏览器提取配置“smtp.”或“pop.”邮件服务地址常见的Base64字符集和自定义编码表需要注意有些变种把字符串做了加密静态搜不到URL只有运行起来才能拿到明文。这种情况下不要死磕静态把样本丢进隔离环境跑一轮抓网络请求反而更快。但仍有必要先用静态信息做分类通过PE头、图标、资源文件里的版本信息、或固定的互斥体名称快速判断它和已知哪个家族更接近。Agent Tesla通常有自己的互斥体生成规则比如内存地址计算或随机命名字符串如果能提取到互斥体后面做检测覆盖会方便很多。2. 静态拆解键盘记录与凭据窃取模块的代码还原2.1 配置提取看懂木马打算干什么静态分析的核心目标之一是把嵌入的配置还原出来。Agent Tesla配置通常不是明文而是经过Base64加异或、或者RC4之类的对称加密后再塞进程序集中。对于.NET样本可以先把程序集拖进反编译工具找到配置解密函数后直接用解密函数跑一遍配置数据就能看到结果。我拿这个样本分析时配置主要解出了几类字段配置字段示例值含义C2地址https://malicious.example.com:443数据外传的服务器地址上报间隔5000每5秒尝试上报一次日志键盘记录开关1开启全局键盘钩子浏览器窃取开关1开启浏览器凭据读取FTP客户端窃取开关1读取FTP站点配置SMTP服务配置smtp.example.com:587备用的邮件外发通道安装目录%APPDATA%\\SomeRandomDir自我复制到哪个目录互斥体名称Global\\WindowsUpdate_2024防止多个实例同时运行这些字段不一定全部存在不同变种的面板生成参数不一样但框架大差不差。把配置解出来相当于给了自己一张地图——后续动态分析可以按图索骥知道大概会在哪些地方动文件、发什么格式的包。解释一个常见的疑问为什么要加密配置因为安全软件会按URL特征和路径特征做静态拦截。攻击者把C2地址做一次Base64和异或混淆后静态扫描器不会直接看到URL很多基础检测就会失效。这也是为什么配置提取是静态分析的核心环节不解密配置就没法快速定位通信目标。2.2 键盘钩子与日志记录机制Agent Tesla的键盘记录模块通常通过SetWindowsHookEx安装一个全局低级键盘钩子WH_KEYBOARD_LL。全局钩子意味着它能够捕获几乎所有窗口下的键盘输入而不只是它自己窗口里的内容。在.NET样本里这一层逻辑会P/Invoke到user32.dll的SetWindowsHookEx和GetMessage等API。记录日志的时候木马通常会记录目标窗口的标题、类名和按键内容。窗口标题这个细节容易被新手忽略但它对攻击者的价值很高比如用户在浏览器地址栏输入网址时窗口标题可能会显示当前页面标题用户在文档编辑器里输入时窗口标题能看到文件名。这样拼凑出来的日志信息量比单纯按键记录大得多。静态代码里看到的字符串拼接方式也很有特征比如用“\r\n”分隔每条记录或者把窗口标题和按键内容一起写进一个内存缓冲区。很多变种并不是每个按键都立刻写盘而是先积累在内存里等到上报周期到了以后统一通过HTTP POST发出去。也就是说键盘记录模块的日志不一定在文件系统里查到必须配合流量分析才能完整还原。2.3 浏览器与邮件客户端凭据窃取逻辑Agent Tesla最值钱的部分是凭据窃取。它会把浏览器保存的密码、Cookie、历史记录、自动填充数据等一次性拖走。浏览器密码在Windows上通常受DPAPI保护但木马不需要自己实现复杂的解密算法它直接调用系统API拿到用户主密钥然后解密浏览器数据库。所以攻击者不需要懂密码学能做的是调用本机接口把“保险柜”从内部打开。从静态代码角度我能看到它对浏览器配置路径的引用比如读取“Login Data”这种文件、搜索本地SQLite数据库文件等。Chrome、Edge、Firefox的存储路径各不相同Agent Tesla会分别处理。它在访问这些文件时通常先复制一份到临时目录再对副本操作避免直接占用导致浏览器还在运行而文件被锁定。除了浏览器它还会扫描FTP客户端和邮件客户端的配置。FTP客户端站点的密码常常保存在本地配置文件中有些还是用可逆算法或明文保存木马拿到以后直接打包。邮件客户端则是读取本地账号配置、服务器地址和认证信息这块信息对后续定向攻击和横向渗透价值很大。静态分析看到这些逻辑以后我通常会标注一下对应代码地址和调用的系统API等动态分析时再对照验证。这样做的目的不是单纯找证据链条而是为了后面生成精准的检测规则比如特定进程读取“Login Data”的行为、读取浏览器Profile目录下多个文件的行为、以及调用解密API的行为。3. 动态运行进程行为与持久化陷阱3.1 隔离环境中运行的第一现场静态拆解完成以后下一步就是把样本丢进隔离虚拟机里看它到底怎么跑。这里我建议分两步走第一次运行用最快的速度抓“大动作”第二次运行根据第一次的记录做细分观察。恢复干净快照之后我会打开进程监控工具记录新进程创建时的时间线。Agent Tesla在运行时未必会持续唤起大量子进程很多.NET变种会在当前进程里直接完成全部工作然后通过计划任务或注册表Run键实现重启后运行。所以光看进程树还不够必须把文件系统、注册表、网络连接都串起来看。运行到第三分钟左右我在临时目录和%APPDATA%下发现了一个新创建的随机目录里面放着从原始文件中复制出来的可执行文件和一份日志缓存文件。同时在HKCU\Software\Microsoft\Windows\CurrentVersion\Run键下面看到了新的启动项指向这个释放出来的文件。这里有一个观察技巧先给虚拟机的文件系统做一次基线快照运行样本后再导出增量变化这样就不会漏掉细小的行为痕迹。注册表同理。如果手工翻麻烦也可以用支持对比的注册表工具导出操作前后差异。3.2 持久化与自启动的常见套路Agent Tesla的持久化手段并不算高级但很有效。最常见的是下面几种而且很多样本会同时使用多个以确保可靠性持久化方式位置或行为监控事件注册表Run键HKCU或HKLM下的Run/RunOnce注册表写入事件计划任务创建计划任务指向释放的二进制计划任务创建事件启动文件夹在开始菜单启动目录释放快捷方式文件创建事件服务有些变种尝试注册为服务服务安装事件我这次看到的样本在启动时复制了一份自身到%APPDATA%下的目录然后通过Run键调用。Run键的值看起来像一条正常的更新命令字符串里也做了拼接不容易一眼识别。动态分析时把Sysmon的注册表事件EventID 13和进程创建事件EventID 1打开就能比较清楚地看到哪个进程写了一行新键值以及之后哪个进程被拉起来。抗分析机制方面Agent Tesla也有一定的反沙箱逻辑。例如检测系统CPU核心数、内存大小、屏幕分辨率、是否处于调试状态、是否存在特定的虚拟机痕迹。如果它认为当前环境不对劲可能延迟执行、休眠一段时间或者直接退出。这就是为什么一次运行没看到行为不代表样本是干净的需要结合多轮观察和不同的运行参数来判断。3.3 互斥体与单实例执行的影响很多样本会创建一个互斥体确保进程只允许跑一个实例Agent Tesla也不例外。互斥体名称有时是硬编码有时是动态计算出来的字符串。从防御角度看互斥体是一个很好的检测点恶意软件一旦创建互斥体安全产品可以通过预置的互斥体名单直接命中。我这次分析时样本创建了一个名称类似系统更新组件的互斥体如果不专门监控内核对象很难发现。拿到互斥体名称以后可以把它记入IOC列表在下一次检测规则里作为一个静态特征来用。这样做价值很大即使文件改名、换壳只要互斥体名称没变检测仍然能命中。动态行为记录完成以后整个过程的信息其实已经相当全面文件释放路径、注册表持久化、互斥体、计划任务、网络外联。下一步进入最关键的流量分析环节。4. 通信链路与流量还原4.1 HTTP POST外传数据的典型格式Agent Tesla最主流的外传方式是把数据封装成HTTP POST请求发送到C2地址。请求体通常是一个普通的表单格式字段名是“username”“password”“log”“file”这类看起来像普通登录接口的参数。它会按一定时间间隔上报间隔大小由样本配置里的“sleep”或“interval”字段决定。请求包的数据载荷不是明文常见做法是先对日志内容做Base64编码再叠加异或或简单加密。抓包时能看到Content-Type是标准的application/x-www-form-urlencoded但POST Body里是一长串看似随机的字符。有些变种会在请求头里附加一个自定义的User-Agent有的直接用.NET默认UA版本不同差异明显。识别流量的时候需要先掌握该变种的具体编码方式再去写正则或载荷特征。我把这个样本跑完一轮之后抓到了外发的HTTP请求URL路径是固定的一个服务端脚本路径。请求参数里包含三个字段其中一个字段的值为Base64串解码后能看到键盘日志、当前窗口标题、系统信息等内容的混合数据。这基本上就是标准的Agent Tesla上报逻辑。4.2 本地仿真服务端观察外发行为分析者不能直接去连接样本配置里的真实C2地址这既涉及合规风险也很可能暴露自己的分析环境。正确的做法是在本地做仿真把配置中的C2域名在虚拟机里解析到本机回环地址再在分析机上启动一个简易HTTP服务用来接收样本发来的POST请求。具体流程是这样的修改分析机的hosts文件把恶意域名指向127.0.0.1。在分析机上启动一个本地WEB服务监听80或443端口如果是HTTPS则还需要准备本地证书也可以用HTTP替换。再次在干净快照中运行样本等待上报周期触发。在本地服务端日志和抓包文件里查看样本POST过来的数据。运行五分钟左右本地服务收到了样本回传的数据解码POST里的Base64字段看到的内容足够证明它的键盘记录和系统信息收集行为正在正常工作。这个本地仿真方法可以反复用在不同变种上只要配置里是HTTP协议就能把外传内容完整接住。如果是SMTP外传的变种就用本地的SMTP接收服务来替代。这种做法的好处是既能确认样本实际外传的数据内容又不会对真实网络造成任何影响。很多刚入门的人觉得必须连上真实C2才能看到流量其实大可不必本地仿真完全够用。4.3 流量特征与检测思路的关联通过流量还原我们得到了大量现场特征包括请求路径、请求字段名、基数字段长度特征、UA字符串、心跳间隔、以及加载载荷的固定结构。针对这些信息可以整理出一个简单的检测模型定期向固定路径发送POST请求返回内容很短甚至无响应。请求字段名与常规业务接口不匹配。载荷Base64解码后包含系统用户名、主机名、键盘日志标记等特征。多个内网主机在相近时间出现相同的通信路径。网络侧检测有一个现实难点如果攻击者使用了HTTPS加密外传所有载荷内容在抓包时都不可见。这种情况下只能依赖TLS证书信息、JA3/JA3S指纹、SNI域名和连接周期这几个维度做关联。Agent Tesla变种很多证书和JA3特征也随之变化但域名和连接频率依然是比较稳定的锚点。把这些特征和主机侧检测结合起来效果会明显好于单靠某一条规则。5. 从样本到防线IOC提取与检测规则落地5.1 提取结构化IOC分析完一个样本如果只是写一篇记录就结束价值就打了个折扣。样本分析真正能落地的产出物是IOC威胁指标是指能帮助判断系统是否被同一恶意家族入侵的各类特征。Agent Tesla的IOC可以分为静态、行为和网络三类IOC类型具体指标文件哈希样本原始MD5/SHA1/SHA256文件名释放出来的随机目录下的exe名称文件路径%APPDATA%下的特定随机目录注册表项HKCU...\Run下的启动键值互斥体名动态生成但可复用的全局对象名C2域名配置里解码出的域名和端口URL路径固定的服务端脚本路径流量载荷特征POST字段名及Base64编码规律我习惯把这些IOC整理成一张表格同时附上分析时间、样本类型、检测手法和置信度。对于不确定的特征不要直接进自动阻断规则避免误杀正常业务。比如某些注册表键值如果格式过于通用就需要加额外条件来降低误报。5.2 防御侧检测规则编写思路提取完IOC接下来要把它变成可以自动运行的检测规则。主机侧最常用的两种规则是YARA规则和Sysmon检测规则。YARA主要匹配文件内容适合在邮件网关或终端扫描时识别未知样本Sysmon侧重运行时行为检测适合在样本已经落地并运行时发现线索。写一条简单的YARA规则来匹配Agent Tesla常见特征可以长这样rule AgentTesla_HttpConfig_Heuristic { meta: author analyst description Heuristic detection for Agent Tesla config strings strings: $s1 Software\\Microsoft\\Windows\\CurrentVersion\\Run ascii wide $s2 System.Drawing ascii $s3 Microsoft.Win32 ascii $s4 smtp. ascii $s5 interval ascii wide condition: uint16(0) 0x5a4d and 2 of them }这条规则并不是精细匹配而是启发式检测只要文件是PE格式同时又出现了Agent Tesla常用的字符串子集就发出告警。真实生产环境里需要根据精确配置字符串做联动验证再加白合法软件否则误报率会偏高。Sysmon检测则更偏向行为侧。举例来说可以监控注册表Run键写入事件配合进程路径和命令行参数做上下文判断也可以监控进程读取浏览器“Login Data”文件的操作发现非浏览器进程读取浏览器凭据目录时产生告警。网络侧的检测可以把前面抓到的URL路径、POST字段名、User-Agent录入防火墙或NDR规则中实现双向拦截。5.3 应急响应的处置建议如果内网真的出现了Agent Tesla感染光靠删除样本文件是不够的因为凭据可能已经被外传了。处置流程大致是先隔离受害主机停止它的网络通信再导出进程、注册表、文件和时间线信息保留证据然后删除持久化项、释放文件和计划任务最后确认凭据泄露范围强制重置受影响的账号密码特别是管理员账号。还有一个重点Agent Tesla窃取浏览器Cookie后攻击者可以借助会话尽快登录受害者的Web应用即使改了密码短时间内的会话仍然有效。所以响应时不能漏掉“吊销会话”这一步需要让用户在所有相关应用里强制重新登录。这个细节常被忽略但在真实处置中非常重要。整个分析流程到这里基本完整了。实际跑样本时我还有个习惯每次分析前都规划好“运行几轮、每轮看什么”比如第一轮看启动项和释放物第二轮关掉防检测条件看网络外连第三轮强制结束进程看残留日志。这样做比闷头连续运行十次更有效率也能减少遗漏。Agent Tesla本身并不复杂但把一套标准分析流程吃透之后再去看其他窃密木马家族思路会清晰很多。
阅读完成 · 觉得有帮助?