AgentTesla

AgentTesla窃密木马样本分析

1. 简介

Agent Tesla 是一种密码窃取间谍软件,自 2014 年以来一直存在。攻击者可以使用该恶意软件来监视受害者,使他们能够查看在支持的程序和网络浏览器中输入的所有内容。

Agent Tesla 病毒在其自己的网站上进行营销和销售,该网站错误地声称该程序是为个人使用而创建的合法键盘记录器,因此在黑客社区中非常流行。不仅仅是因为它的易用性和技术支持,可以在攻击者出售此恶意软件的“官方”网站以及专用的 Discord 服务器上找到。尽管声称该软件是合法的,但售卖人员还是会就非法使用该病毒提出建议。

2. 样本详情

本次分析的样本哈希如下:

MD5:af98b88c0b5dc353fbe536bd6fb8c4ec
SHA256:cc262fd3fa1f646aff2f5bcdea33beca5ed081260028b8604d5f714dd23c03ac

可以从any.run沙箱查看到样本的行为及下载样本。

将样本用PEStudio打开,可以看到Mircrosoft将其标记为AgentTesla

libraries标签可以看出这是一个.NET程序,且strings标签内字符串数量有点多,version标签中可以获取到样本的原始文件名及哈希情况:

3. 样本分析

使用dnSpy加载样本,向下观察代码,可以在Helper类中找到Gzip其中存放了约10000行数据,向下阅读代码,是C#中常用的解压缩函数GZipStream

3.1. 样本释放

retrun result处下断,得到了解压内存存放的内存地址0x00027800,在内存窗口中查看,可以明显看出是PE文件结构:

使用dnSpy自带的保存功能,将该地址处存放的数据保存到本地,再使用PEStudio查看,这是一个名为:Ihinax.dll.NET文件。

Ihinax.dll函数名经过了混淆,经过了长时间的阅读,在LVU3WCMrRsWDmqar8f空间下的Su370LNVnsglWDN9lR类的第311行,找到了gzipStream,下断点执行到此处,array2中所存放的内容是PE文件格式的内容。

保存下来,使用PEStudio查看:

这里推荐使用互联网工具对文件进行解压。UnpacMe解压结果如下:

将手动解压与UnpacMe解压的内容进行SHA256比较,并无差别:

3.2. 样本解码

使用dnSpy加载最终的恶意程序,进入主函数可以看到一些奇怪的函数,GetEnvironmentVariable函数是用于获取系统变量的,参数却是函数97085277-F30F-47FA-9C3D-82DA9E6730B4.L()

进入其中可以看到类中有个类似于解密的东西,然后下方的方法进行方法传递:

解密字符集:

这里可以使用de4dot对其进行动态解密,作者在readme中进行了如下说明:

de4dot--strtyp参数的说明如下:

String decrypter types
  none             Don't decrypt strings
  default          Use default string decrypter type (usually static)
  static           Use static string decrypter if available
  delegate         Use a delegate to call the real string decrypter
  emulate          Call real string decrypter and emulate certain instructions

这里选取了emulate进行尝试,但是作者显然并不想我们这么容易就解除了混淆,加密字符串居然有6000535h - 600022Bh = 30Ah处!

所以我简单生成了一个粗糙的bat:

de4dot.exe dump2.bin --strtyp emulate --strtok 600022B
rename dump2-cleaned.bin dump3.bin
de4dot.exe dump3.bin --strtyp emulate --strtok 600022C
del dump3.bin
rename dump3-cleaned.bin dump3.bin
de4dot.exe dump3.bin --strtyp emulate --strtok 600022D
del dump3.bin
rename dump3-cleaned.bin dump3.bin
de4dot.exe dump3.bin --strtyp emulate --strtok 600022E
del dump3.bin
rename dump3-cleaned.bin dump3.bin
de4dot.exe dump3.bin --strtyp emulate --strtok 600022F
del dump3.bin
rename dump3-cleaned.bin dump3.bin
……
……
……
de4dot.exe dump3.bin --strtyp emulate --strtok 6000533
del dump3.bin
rename dump3-cleaned.bin dump3.bin
de4dot.exe dump3.bin --strtyp emulate --strtok 6000534
del dump3.bin
rename dump3-cleaned.bin dump3.bin
de4dot.exe dump3.bin --strtyp emulate --strtok 6000535
del dump3.bin
rename dump3-cleaned.bin dump3.bin

在经过了大约二十分钟后,我获得了一个解密后的程序:

3.3. 代码阅读

对于C#程序,既然字符串已经还原了,个人习惯是先阅读代码,然后就会有如下的这些发现。

3.3.1. 设置开机自启

3.3.2. 获取本机公网ip

3.3.3. 下载文件

3.3.4. 获取系统信息

3.3.5. 截取屏幕

3.3.6. FTP服务操作

3.3.7. 浏览器用户数据窃取

3.3.8. SMTP请求配置

3.3.9. 键盘记录

3.3.10. SOCKET通信

3.3.11. 数据上传

3.3.12. DES加密

3.3.13. 判断操作系统版本

3.3.14. 特殊软件的凭证窃取

特殊软件的凭证窃取(下图是Edge浏览器的窃取函数段)

从Edge凭证窃取函数可以看出,窃取函数存在以下特征:

UserName =
Password =
Browser = ""

检索全部代码,反复确认后,发现窃取目标包含以下对象:

Browser = "IE/Edge"
Browser = "Edge Chromium"
Browser = "QQ Browser"
Browser = "incredimail"
x.Browser = "Eudora"
Browser = "Falkon Browser"
Browser = "Falkon Browser"
Browser = "ClawsMail"
Browser = "Flock Browser"
Browser = "DynDNS"
x.Browser = "Psi/Psi+"
x.Browser = "Open VPN"
x.Browser = "FileZilla"
Browser = "WinSCP"
Browser = "FlashFXP"
x.Browser = "FTP Navigator"
x.Browser = "JDownloader"
Browser = "Paltalk"
Browser = "Pidgin"
Browser = "SmartFTP"
x.Browser = "WS_FTP"
Browser = "FTPCommander"
x.Browser = "FTPGetter"
Browser = "NO-IP"
Browser = "NO-IP"
Browser = "TheBat"
x.Browser = "Becky!"
Browser = "Trillian"
x.Browser = "Outlook"
x.Browser = "Foxmail"
x.Browser = "Opera Mail"
x.Browser = "PocoMail"
Browser = "eM Client"
x.Browser = "Mailbird"
x.Browser = "Mailbird"
Browser = "NordVPN"
Browser = "MySQL Workbench"
Browser = "Private Internet Access"
x.Browser = "Safari Browser"
x.Browser = "Internet Download Manager"

3.3.15. VNC凭证窃取

3.3.16. 下载Tor浏览器

3.4. 动态调试

进入程序入口,会生成一串字符串,用于标识受害者主机,然后会设置一个30s的定时循环任务,接着开始进行浏览器用户数据窃取;

汇总如下:

@"C:\Users\alee\AppData\Local\7Star\7Star\User Data"
@"C:\Users\alee\AppData\Local\uCozMedia\Uran\User Data"
@"C:\Users\alee\AppData\Local\MapleStudio\ChromePlus\User Data"
@"C:\Users\alee\AppData\Local\Yandex\YandexBrowser\User Data"
@"C:\Users\alee\AppData\Local\Torch\User Data"
@"C:\Users\alee\AppData\Local\Coowon\Coowon\User Data"
@"C:\Users\alee\AppData\Local\Comodo\Dragon\User Data"
@"C:\Users\alee\AppData\Local\Sputnik\Sputnik\User Data"
@"C:\Users\alee\AppData\Local\Iridium\User Data"
@"C:\Users\alee\AppData\Local\Vivaldi\User Data"
@"C:\Users\alee\AppData\Roaming\Opera Software\Opera Stable"
@"C:\Users\alee\AppData\Local\Chedot\User Data"
@"C:\Users\alee\AppData\Local\CocCoc\Browser\User Data"
@"C:\Users\alee\AppData\Local\Fenrir Inc\Sleipnir5\setting\modules\ChromiumViewer"
@"C:\Users\alee\AppData\Local\Epic Privacy Browser\User Data"
@"C:\Users\alee\AppData\Local\Elements Browser\User Data"
@"C:\Users\alee\AppData\Local\Amigo\User Data"
@"C:\Users\alee\AppData\Local\CatalinaGroup\Citrio\User Data"
@"C:\Users\alee\AppData\Local\BraveSoftware\Brave-Browser\User Data"
@"C:\Users\alee\AppData\Local\360Chrome\Chrome\User Data"
@"C:\Users\alee\AppData\Local\Kometa\User Data"
@"C:\Users\alee\AppData\Local\liebao\User Data"
@"C:\Users\alee\AppData\Local\CentBrowser\User Data"
@"C:\Users\alee\AppData\Local\QIP Surf\User Data"
@"C:\Users\alee\AppData\Local\Chromium\User Data"
@"C:\Users\alee\AppData\Local\Orbitum\User Data"

然后会在每一个目录下寻找logins文件夹,窃取其中的信息

针对logins内的文件窃取函数内容如下:

往下则是一列窃取函数的调用,核实并整理后如下:

list.AddRange(global::A.b.E.LoginsSteal(x.A, x.A));
list.AddRange(global::A.b.E.RimArtsSteal());
list.AddRange(global::A.b.E.ChromeSteal());
list.AddRange(global::A.b.E.FlockSteal());
list.AddRange(global::A.b.E.IceDragonSteal());
list.AddRange(global::A.b.E.OpearMailSteal());
list.AddRange(global::A.b.E.GetOSVersion());
list.AddRange(global::A.b.E.ClawsMailSteal());
list.AddRange(global::A.b.E.PostboxSteal());
list.AddRange(global::A.b.E.AppleSteal());
list.AddRange(global::A.b.E.IncrediMailSteal());
list.AddRange(global::A.b.E.BlackHawkSteal());
list.AddRange(global::A.b.E.IceCatSteal());
list.AddRange(global::A.b.E.WaterFoxSteal());
list.AddRange(global::A.b.E.PocomailSteal());
list.AddRange(global::A.b.E.UCBrowserSteal());
list.AddRange(global::A.b.E.FileZillaSteal());
list.AddRange(global::A.b.E.FirefoxSteal());
list.AddRange(global::A.b.E.WinSCP_2_Steal());
list.AddRange(global::A.b.E.FalkonSteal());
list.AddRange(global::A.b.E.QQBrowserSteal());
list.AddRange(global::A.b.E.CyberFoxSteal());
list.AddRange(global::A.b.E.SeaMonkeySteal());
list.AddRange(global::A.b.E.K-MeleonSteal());
list.AddRange(global::A.b.E.OutLookSteal());
list.AddRange(global::A.b.E.FoxmailSteal());
list.AddRange((IEnumerable<global::A.b.X>)global::A.b.E.EudoraSteal());
list.AddRange(global::A.b.E.ThunderbirdSteal());
list.AddRange(global::A.b.E.PaleMoonSteal());

4. 总结

AgentTesla是一款商业窃密木马,当中还存在某些交互并未深入分析,不过基础模块已经很清晰了,从这些模块可以看出大多是针对浏览器和邮件客户端的窃密。这里提醒大家尽量不要在浏览器中保存密码,在使用邮件客户端时,也应当格外小心。