
“又是一个Agent Tesla”。每次在样本池里看到这个家族的新变种我脑子里第一反应不是“又来老熟人”而是“这回又多了一层什么花活儿”。作为安全圈里资历最老、传播最广的信息窃取木马之一Agent Tesla从2014年活跃到今天中间换过几轮作者、用过好几套混淆框架但它的核心目标始终没变把受害者机器上的浏览器密码、Cookie、剪贴板、键盘输入以及各种客户端凭据一个不落全部打包外传。很多刚入门的恶意样本分析师第一次上手逆向的样本往往就是它因为代码量不大、逻辑清晰、而且网上分析文章多拿来练手再合适不过。但真正自己把一整个样本从拿到手到提取出C2地址、还原窃密逻辑、写成IOC跑通检测中间还是有不少坑。这篇文章就把我近期分析一批Agent Tesla样本的完整思路和实操细节整理出来该跳过的坑直接指出来能抄的作业直接给到位。1. 拿到样本之后先别急着双击静态初判的完整思路1.1 文件识别与元数据提取几个命令的事无论样本是邮件附件里解出来的还是从某个上传检测平台拉下来的拿到手第一件事都是算哈希。MD5、SHA1、SHA256一个都不能少sha256是后面关联情报、查VT记录、写IOC的主力ID。这一步别偷懒直接写个小脚本批量算或者用PE-bear、HashCalc这类工具都行但我个人更习惯命令行一把梭速度快而且可复现。接着用DIEDetect It Easy查一下编译器和壳。Agent Tesla绝大多数是.NET程序直接能看到Microsoft Visual C# / Basic .NET之类的编译信息如果是被混淆过的版本DIE会标出.NET Reactor、SmartAssembly、Confuser等保护特征。这一步非常关键因为是不是混淆版本直接影响后面用dnSpy还是de4dot的策略。再看PE头信息重点看编译时间戳和入口点。Agent Tesla样本常见的情况是编译时间戳被作者随机改过但如果是旧版直接打包出来的时间戳往往能跟该家族某个活跃周期对上。再有就是用CFF Explorer查看程序集版本号、语言类型顺带看一眼是否有合法的数字签名——很多攻击者会把窃密木马拿过期证书签一下绕过部分小白用户的安全告警。到这里我能初步判断这个样本属于哪一代变形是否经过特殊保护以及是不是加载器-载荷分离的结构。有一次我遇到一个只有几KB的.NET加载器静态一看几乎什么敏感API都没有结果它运行时从资源里释放出真正的Agent Tesla主体——这就是典型的分离式结构单看外层根本看不出名堂。1.2 从字符串和资源里先摸一遍底细字符串提取要分两个维度做。第一是原始的ASCII/Unicode字符串第二是经过编码的密文字节。用binwalk或strings工具先跑一遍主要找下面几类东西邮件相关关键字SMTP、MailFrom、MailTo、PasswordAgent Tesla从早期版本开始就支持用受害者的SMTP账号外发数据所以这类配置字符串直接暴露了它的窃密出口。文件路径关键字AppData、Local、Temp、Roaming这是它定位浏览器数据库、FTP配置文件的常用路径。互斥体名、管道名和进程名很多版本会检查进程列表里是否有沙箱软件、分析工具、杀毒进程。Base64特征串或hex编码串配置信息通常藏在资源文件里用高熵检测能快速定位。Agent Tesla的配置结构从旧版到新版变化不大通常是一段XML或键值对结构的密文里面包含C2地址、外发邮箱账号、键盘记录开关、屏幕截图间隔等。如果你在字符串里直接看到一段很长的Base64且末尾带着明显的填充符号那十有八九就是加密后的配置块先记录下来后面解密阶段要重点处理。资源段.rsrc也很值得手动翻一遍。用Resource Hacker或者PE-bear查看常见的Agent Tesla会内嵌一个二进制资源存放加密配置内容。有的变种会把载荷藏到资源节里运行时反射加载。识别这类行为的快捷方法是看程序里是否调用了Assembly.Load、ResourceManager或DownloadString这类方法一旦在导入表或IL代码里看到就要警惕了。1.3 编译时间线和PDB路径别忽略的线索很多人分析样本时不太关注编译时间戳和PDB路径但这招在溯源和聚类上特别好用。Agent Tesla的代码仓库在圈内流传范围很广不少小团伙拿着同一套源码各自改造PDB路径经常能暴露出作者本机的项目目录结构比如.\Builds\AgentTesla.pdb或者自定义的文件夹名。同一个作者编译的不同样本PDB路径往往高度一致这对于把散落的样本归并到同一攻击者是很好的旁证。编译时间戳的聚类价值更大。我遇过一批样本它们的编译时间全都集中在某几个凌晨时段说明攻击者在一台固定机器上批量打包。通过聚类时间戳我能反推活动波次再结合钓鱼邮件的投递日期就能画出完整的攻击时间线。另外提一句PE头里的Product Name和Company Name也经常被忽略。这类木马通常会伪装成合法的文档阅读器、PDF转换器、发票工具文件名也往往跟着伪装走。把这些信息记录好标题栏、窗口名的伪装手法后面做告警规则的时候很有用。2. 动态行为观察在隔离环境里看它到底干了什么2.1 准备一个干净的分析环境细节都在这里动态分析的机器配置和网络环境直接决定你观察到的行为是否完整。Agent Tesla对沙箱和虚拟机的检测不算最顶级但也不是完全没有如果一个样本检测到自己是跑在虚拟机里它可能不再执行任何窃密动作直接干净退出。所以分析环境的关键词就是模拟得像真机、网络受限但不全断。我常用的方案是VMware虚拟机装好快照硬件配置贴近主流办公机的水准关闭不必要的虚拟硬件特征。虚拟机的名称不要叫默认的Administrator因为很多样本会把用户名和已知沙箱用户名做比对一旦命中就隐藏行为。网络方面我会用FakeNet-NG或INetSim之类的工具做流量模拟让样本以为网络可用实际上所有外联都被劫持到本地。分析前先把Procmon的监控规则调好默认全量记录会产生海量日志反而干扰判断我会预先把进程树、注册表写入、文件创建三类事件设成高亮筛选同时开好Wireshark抓包。API Monitor和Process Hacker也要挂上前者记录敏感API调用后者观察进程线程和句柄变化。2.2 进程、注册表、文件系统三个维度的行为监控运行样本后第一个关注点就是进程树的变化。Agent Tesla导入到系统后要么直接注入到合法进程要么自己派生子进程。常见手法是通过CreateProcess创建rundll32.exe然后自身代码注入进去目的就是伪装成系统进程降低警惕。Procmon里看到shell - rundll32或svchost的异常父子关系基本可以判定注入行为。注册表维度它会在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run下写入自启动项这是老牌木马的默认持久化姿势。不过新版本的Agent Tesla不一定会写注册表有些变种直接把自己放到启动文件夹Startup目录里或者利用计划任务创建自启。判断逻辑很简单一旦发现系统特定位置的文件发生新增且文件名伪装成正常样式就要去跟自启项关联。文件系统维度重点关注三个方向。第一是浏览器配置文件目录Chrome的Login Data、CookiesFirefox的logins.json、cookies.sqlite这几个文件只要被读取复制想都不用想就是在偷密码。第二是FTP客户端的配置文件路径比如FileZilla的recentservers.xml。第三是临时目录里新生成的自身副本很多木马会把主程序复制一份放到%TEMP%或%APPDATA%再执行原文件反而成了诱饵。2.3 键盘记录、剪贴板窃取与截屏行为的识别特征键盘记录是Agent Tesla的默认标配大多数版本会在LWA_INPUT类的钩子上调用SetWindowsHookExW。从行为监控上看特征是进程加载了user32.dll并且注册了全局消息钩子随后系统里所有按键消息都会被记录到一块缓冲区定期由主线程写入本地文件。如果你用API Monitor观察会看到每几秒就有一批按键数据被写进日志文件这个节奏跟主程序的数据回传间隔基本一致。剪贴板窃取更隐蔽它通过反复调用GetClipboardData来读取剪贴板内容。正常程序不会这么频繁地读剪贴板所以我判断样本是否在偷剪贴板时直接看调用的频率和时机如果样本在运行后的前几秒就开始高频访问剪贴板且读取类型包含了CF_UNICODETEXT和CF_BITMAP基本可以确定剪贴板窃取模块已启动。这类行为结合键盘记录一起分析能还原出攻击者侧重收集的信息类型。截屏功能则按照配置的时间间隔周期性调用GDI或DirectX相关的API捕获整个屏幕。动态调试时看样本是否加载了gdiplus.dll、user32.dll中的GetDC、BitBlt函数如果这些API搭配出现在样本运行过程中并且输出目录出现了.png或.jpg文件截屏模块就跑不掉了。我在监控环境里遇到过配置里关闭键盘记录、只保留截屏和剪贴板窃取的样本说明新版Agent Tesla的模块化程度更高配置开关不再是从前那种全开模式分析时一定要结合配置内容判断不能默认所有功能都会执行。3. 网络通信追踪与配置还原挖出C2服务器3.1 用受控网络观察DNS解析与HTTP外联动态分析过程中网络行为是最能直观展示木马意图的部分。Agent Tesla新版普遍采用HTTP POST作为数据外传通道也有一些版本会使用SMTP直接外发邮件。在受控网络里我会用FakeNet-NG监听所有DNS查询请求和HTTP流量这样样本发起任何域名解析、任何端口连接都能第一时间被我截获。观察的顺序一般是运行样本等待几秒到十几秒看有没有DNS查询动作。Agent Tesla的C2域名普遍不是随机生成的DGA域名而是攻击者手工注册的固定域名因此DNS查询记录就相当于直接告诉你C2地址。如果样本从配置里解密出的是IP而非域名就直接在Wireshark里看到TCP SYN包发往某个外部IP端口多数是80或443。我还习惯在FakeNet里模拟一个虚假的C2响应端返回空内容看样本的反应。很多Agent Tesla样本会把从服务端拉取的数据当作二次加载指令如果响应内容是空它可能不会再有任何明显的后续动作而如果响应内容符合它预期的结构就能诱导它继续执行后续模块。这类交互式引导对分析复杂变种非常有价值。3.2 从加密字符串里解出C2地址的完整过程配置解密的经典流程是定位资源配置段找到密文块再从代码中找到AES解密的密钥和IV。Agent Tesla的老版本用固定的硬编码密钥密钥字符串就明文躺在代码里用dnSpy打开一眼就能看到。新版本把密钥做了进一步包装藏在程序集资源里或者经过多层Base64变换分析时需要先把外层编码剥掉还原出真实的AES密钥和IV。我记得有一次遇到的样本配置块不是直接AES加密而是先用Base64解码再经过一个异或变换最后才交给AES-CBC解密。整个过程如果用dnSpy单步调试就很简单在解密函数入口下断点运行到解密完成后直接看返回的明文。这里给新手一个建议与其在静态上猜来猜去不如直接在dnSpy里找到调用解密函数的地方下断点看内存里解出来的明文又快又准。解密之后拿到的配置结构通常长这样C2地址域名或IP:端口 外发方式http / smtp 键盘记录开关on/off 截屏间隔秒数 剪贴板窃取开关on/off 被杀软查杀时的退出策略其中C2地址往往不止一个有些版本配置了两三个地址轮询使用分析时要把所有地址都提取出来一个都不能漏。漏掉一个IP等于漏掉攻击者的一条退路写封禁规则就直接不完整了。3.3 情报落地IOC提取与检测规则写法从解密后的配置和行为数据里整理IOC是样本分析最终要交付的成果之一。我的IOC清单通常分成四类网络IOCC2域名、IP、URL路径、请求头中的User-Agent特征文件IOC样本哈希、释放物文件名、互斥体名、写入的注册表键路径行为IOC异常进程父子关系、特定目录批量文件读取、高频剪贴板访问战术IOC窃取数据打包后的压缩格式、外发数据包的结构特征检测规则的写法取决于你用的平台。写Suricata规则时重点抓HTTP请求里的特征字段。Agent Tesla的外传流量有一个特点POST数据体通常是Base64或十六进制编码的压缩数据段而且User-Agent要么是浏览器的固定字符串要么是空字符串跟正常流量一比很突兀。写规则时用content匹配这个长度畸高的POST体再配合流量方向和时间特性命中率会比较高。写YARA规则时建议不要只匹配一个字符串要做组合匹配。比如同时匹配Agent Tesla配置加载时使用的资源名、解密后配置结构里的关键字、以及某段通用的解密函数字节码。组合式的YARA规则误报相对低而且能覆盖同源变种。4. 逆向调试的实战难点反混淆、反沙箱、加密流量4.1 脱壳与反混淆处理混淆框架的常用打法Agent Tesla目前能见到的保护框架主要是SmartAssembly、ConfuserEx和.NET Reactor。SmartAssembly是商业混淆器代码结构相对规整de4dot脱壳后能还原大部分逻辑ConfuserEx是开源的好在分析生态也成熟de4dot同样能处理绝大多数情况。NET Reactor就麻烦一些它不只是混淆还带了反调试和native stub的技术支持真正需要手动脱壳的情况不少。de4dot的使用没啥高深技巧直接把样本拖进去输出文件对比脱壳前后的字符串和类名。但要注意de4dot处理完之后类名还是会保留一大部分比如Form1、Settings这种需要结合代码逻辑重新命名才能理顺分析路径。你不要指望一次脱壳就能看到所有明文混淆框架对字符串常量的加密处理是另一层挑战通常还需要在dnSpy里手动解密并重写字符串。有一个很管用的办法在dnSpy里对字符串解密函数做patch把解密后的明文直接写回去这样后续反编译出来的代码就全是可读的明文了。操作方法是找到字符串解密函数打补丁让它直接返回解密结果再保存修改后的程序集。这个技巧在处理ConfuserEx的字符串加密时百试百灵。4.2 反沙箱与反调试手法的识别和绕过Agent Tesla的反沙箱检测逻辑并不复杂但很有效。最常见的是检查进程列表和窗口标题它遍历进程名单一旦发现Wireshark、Procmon、VBoxService、Wireshark等分析工具或虚拟机特征进程就会直接退出。还通过检查台式机的CPU核心数、内存大小、MAC地址前缀、系统盘容量等硬件指纹做沙箱判断。绕过的思路有三个方向。第一是提前把分析工具改名或者干脆用命令行版本替代GUI版本降低特征命中概率。第二是直接把样本里包含进程黑名单字符串的区域patch掉让它永远匹配不到黑名单进程。第三是hook进程枚举API让样本看到的进程列表是伪造的一个正常办公机环境这种方案对绝大多数反沙箱都通用复杂度高一些但最稳定。反调试方面新版Agent Tesla很少上重型反调试最多用Environment.IsDebuggerPresent和Debugger.IsAttached做基础检测。遇到这种直接在dnSpy里把调试器检测函数的返回结果改掉就行。真正麻烦的是加了.NET Reactor保护的版本它额外塞了一层IsDebuggerPresent的native调用有时候还有定时器反调试——运行一段时间后如果没有收到特定窗口消息就自杀这类需要在调试器里提前绕过定时器逻辑。4.3 解密网络外联数据的实操记录当样本通过HTTP外传窃取的数据时流量往往是先压缩再Base64编码有的变种还会额外做一层AES加密。分析外联流量时我最常用的方法是在C2响应端做中间人解密用FakeNet-NG模拟C2服务器把样本发过来的数据体保存到本地文件然后写脚本按样本代码里的算法做逆处理。有一次遇到的样本把数据格式做成类似id机器标识d加密内容的结构其中加密内容用了样本内置的公钥做RSA加密那一次就无法直接在本地解密只能把私钥提取出来再解密。RSA私钥往往藏在样本配置的密钥对里需要回到静态逆向阶段去把私钥完整取出。这种场景下动态调试和静态逆向要来回切换才能把一条流量从密文完全还原成明文。解密完成后你会看到一个标准的zip压缩包里面是各个模块收集到的密码和Cookie数据文件。文件名通常跟受害者机器名绑定比如passwords_机器名.txt、cookies_机器名.txt。展开压缩包验收一下每一份文件的结构这不仅能验证分析结论是否正确还能反过来校验你前面配置解密是否完整——如果某份文件缺失那说明对应的窃密模块没启用或者配置解析不完整需要回头复查。5. 常见问题与排查技巧实录5.1 运行时没看到明显行为的排查思路动态分析最常见的问题是样本运行后什么都没做几秒钟就退出。遇到这种情况别急着怀疑自己的环境有问题首先检查样本是否已经针对当前环境做了反沙箱判定。我按照一套固定的排查顺序来第一步看进程是否存续。如果进程秒退说明前面的反沙箱逻辑直接把它杀掉了。第二步看Procmon日志里退出前的最后一个操作往往会停在某个进程枚举或者注册表查询结果上这个位置往往就是反沙箱判断点。第三步把样本重新静态分析搜索进程名和用户名黑名单字符串如果找到匹配项直接patch掉再重新运行。排除反沙箱因素后再检查是不是配置解析失败。有些样本的配置被破坏或者缺少关键键值会导致它初始化到一半就异常退出。这种问题通常可以通过dnSpy调试捕捉异常来定位在模块初始化处下断点单步跟进观察异常抛出的位置和原因。一个不得不提的细节有的Agent Tesla变种要求必须在参数里带上某个特定值才执行比如通过邮件附件双击运行时会带一个随机参数如果你从命令行直接运行不带参数它就干瞪眼不动。遇到这种先检查进程命令行参数再检查样本对参数的使用逻辑往往能定位到一个简单的判断分支。5.2 流量抓不到或域名解析失败的几种原因受控网络环境下有时根本看不到样本发起网络请求。首要怀疑对象是配置里的开关某些版本默认关闭网络外传只在特定条件下开启。从配置解密结果里检查networkOutgoing开关是true还是false这个最简单也最容易被忽略。第二个常见原因是样本的C2域名已经失效。攻击者的域名随时可能被安全厂商或注册商处置如果样本拿到的C2域名DNS解析不下来它自然就不会发起后续连接。这种场景下你需要在配置里找出备用C2地址或者直接把DNS响应劫持到一个你自己搭建的地址诱导样本连接。第三个原因是样本实际上通过其他通道通信。上文提到了基于SMTP的外传方式很多Agent Tesla变种会优先尝试SMTP外发如果它的SMTP配置指向某个邮箱服务商受控网络的流量监控还得覆盖到25、465、587这些邮件端口。如果只盯着HTTP端口很容易完美错过真正的外传流量。5.3 一批值得长期保存的检查清单这些年在分析Agent Tesla样本时我沉淀了一份速查清单每次遇到新样本都会按顺序走一遍文件哈希是否关联到已知样本先跑VT和本地样本库比对是否加壳DIE识别保护框架决定用de4dot还是手动脱壳配置加密方式定位解密函数记录密钥和IV窃密模块数量键盘记录、剪贴板、截屏、浏览器密码逐项验证数据外传通道HTTP还是SMTP配置中的C2地址和邮箱地址全提取持久化方式注册表Run键、启动文件夹、计划任务逐一记录反沙箱/反检测逻辑列出黑名单进程、用户名、硬件特征清单这份清单我每次分析新样本时都会对照一遍确保没有遗漏项。你可以在自己日常工作中维护一份类似的清单把每次踩坑遇到的特殊行为补充进去逐渐会形成一套属于你自己的分析框架。写在最后Agent Tesla作为一个活跃了近十年的窃密木马家族它的代码逻辑并不算复杂但正因为代码量小、改造门槛低它被无数小团伙反复利用和定制。分析它的价值不只是对一个样本给出结论更重要的是通过配置结构、C2地址、外传通道这些细节把零散的攻击行为串联成完整的攻击事件。每次分析完一批样本我会额外把提取出的IOC和同源样本做一次关联比对往往能发现几个之前没有注意到的攻击基础设施。最后想分享一个经验分析这类.NET家族的样本时别把时间全花在静态逆向上。很多时候动态环境里看它实际访问了哪些文件、调用了哪些API比读代码猜逻辑快得多。当然动态行为观察的前提是你已经把反沙箱逻辑处理干净否则看到的行为全是假象。先patch、再运行、后验证这套流程走熟练之后Agent Tesla这类样本对你来说就基本没什么秘密了。