AgentTesla样本分析
md5:fa548af33ac073be63464186b33198aa
行为分析
存在混淆
使用exeinfo pe查壳,Eazfuscator.NET工具进行混淆。
使用de4dot去混淆
跳转到入口点分析
跟进YodaCoffeeShop类进行分析
先运行得是方法外的部分来进行环境变量得准备。
之后运行构造函数,构造函数在创建对象时自动执行,进行初始化工作。
在一些控件对象的准备后是实例化class3类,跟进分析。
跟进method_0方法中,先执行class20.smethod_4方法
获取资源文件
解密资源字节流得到dll载荷并加载
通过使用基于 HMACSHA1 的伪随机数生成器来基于密码 “newworldorder” 派生密钥并存储在第二个参数 new byte[8] 中,第三个参数是生成密钥的迭代次数 。
RijndaelManaged 是一个实现高级加密标准 (AES) 的类,可用于加密和解密数据。
设置加密密钥Key和IV向量。
CreateDecryptor() 获取解密器。最后用 TransformFinalBlock来附上从Encrypted2 资源获取的加密流进行解密转换。
获取到解密流后通过 Copy 除去开头一些混淆用的 16 字节冗余数据后返回,确定解密出的数据是dll文件。
之后load 1800字节大小的dll
method_1调用dll的Register方法,参数1是资源,参数2是资源管理集MycoffeeProject,从method_1中单步进入到dll中,
因为方法只是return false或者true,则修改方法名。
case 3:
获取资源,返回的是一个从指定的现有图像初始化的botmap类实例。
经过两层解密,得到pe文件,
加载解密出的exe文件并获取程序的入口点
dump exe 分析
使用相同的混淆,使用de4dot去混淆
调用 Assembly.GetEntryAssembly 可以拿到当前调用的入口函数所在的程序集
Assembly.GetEntryAssembly().Location获取当前调用的入口函数所在程序集的文件路径。
class3.string_4:xphBnwWXEWSZ,创建对应名称的互斥体。
根据int_x的值执行后续的流程。
跟进看到int_x的值是从string_2来的
通过split分割string_1的值获得string_2
从资源中获取xml数据,获取当前计算机用户名和临时文件路径,replace替换xml文件中的userid变量和location变量,将替换后的xml写入临时文件。
以隐藏窗口方式启动schtasks.exe进程创建计划任务。
之后获取ef3MQpgrT资源后经过两层解密得到pe文件
将解密出的pe注入到以自身创建的一个挂起进程
CreateProcess()---->GetThreadContext()---->ReadProcessMemory()---->NtUnmapViewOfSection()---->WriteProcessMemory()---->SetThreadContext()---->ResumeThread()---->Process.GetProcessById()---->processById.Kill()
将解密出的pe dump出来分析
2.dump 窃密文件分析
MD5:fa548af33ac073be63464186b33198aa
\u200f:解密字符串
跟进\u200f,先获取一个对象实例,\u206A函数中都是uint数组,存放的是加密的数据和解密的密钥。
解密操作,跟进\u206B
\u206B:Rijndael算法,设置key和iv向量,创建解密器,进行解密。
获取计算机用户名,环境变量,本地路径,
运行kqc-kqv次sleep函数,
创建线程并以后台模式运行,线程函数:与注册表操作相关,
禁用注册表
修改host文件
反调试:
System.Timers.Timer timer = new System.Timers.Timer(); //初始化 Timer 类的新实例,并将所有属性设置为初始值。
timer.Elapsed += kqb.kdv; //达到间隔时发生的一个处理程序,这是一个函数。这个是反调试的检测时间函数。
timer.Enabled = true; //默认重复触发事件
timer.Interval = 30000.0; //设置30秒重复一次
timer.Start(); //开始引发 Elapsed 事件。
判断文件是否存在。
获取公共存储库目录,批量生成要检测的浏览器的路径,add进list2中
浏览器:
"Opera Browser"
"Yandex Browser"
"360 Browser"
"Iridium Browser"
"Comodo Dragon"
"Cool Novo"
"Chromium"
"Torch Browser"
"Amigo"
"Brave"
"CentBrowser"
"Chedot"
"Coccoc"
"Elements Browser"
"Epic Privacy"
"Kometa"
"Orbitum"
"Sputnik"
“Uran”
"Vivaldi"
"Citrio"
"Liebao Browser"
"Sleipnir 6"
"QIP Surf"
"Coowon"
qbu分析
拼接出两个路径:+\Login Data和 +\Default\Login Data,Login Data路径下存在SQLite数据库文件,包含浏览器的登录信息。
判断是否存在浏览器的目录。
如果存在浏览器文件夹,用Directories()得到浏览器所在路径的文件夹下面的所有文件夹以及路径。
判断子路径下是否包含profile字符串。edge浏览器的路径下不存在profile字符串。
判断\Login Data和 +Default\Login Data文件夹是否存在
从|Local State中获取Local Data 数据的加密密钥:读取文件,解密出字符串,
正则匹配到密钥,base64解密密钥。
使用api,利用获取的解密密钥,解密字段。
获取wifi配置
对程序窃密,如openvpn,FtpGetter,claws-mail,winscp等
coreftp
窃取到的数据都存在list列表中,如果list列表不是空的,则遍历获取窃密的信息,加入标识符按照格式写入。
传输窃密数据
根据zml的值选择不同的传输方式。
通过smtp传输数据
数据html格式
通过ftp传输
通过http传输
窃密总结
浏览器 | 360Chrome | 7Star | Amigo | BlackHawk |
Brave | Brave Browser | CentBrowser | Chedot | |
Chrome | Chromium | Citrio | CocCoc | |
Comodo Dragon | CoolNovo | Coowon | CyberFox | |
Edge | Elements | Epic Privacy | Falkon Browser | |
Firefox | Flock | IceCat | IceDragon | |
Iridium | K-Meleon | Kometa | Liebao | |
Opera | Orbitum | PaleMoon | Postbox | |
QIP Surf | QQ Browser | Safari Browser | SeaMonkey | |
Sleipnir 6 | Sputnik | SRWare Iron | Thunderbird | |
TorchBrowser | UC Browser | Uran | Vivaldi | |
WaterFox | Yandex | |||
电子邮件 | ClawsMail | eM Client | Foxmail | IncrediMail |
Mailbird | Opera Mail | Outlook | PocoMail | |
TheBat | ||||
FTP | cftp | CoreFTP | FileZilla | FlashFXP |
FTP Navigator | SmartFTP | WS_FTP | ||
远程连接 | RealVNC | TigerVNC | TightVNC | UltraVNC |
WinRDP | WinSCP | WinVNC3 | ||
VPN | NordVPN | OpenVPN | Private Internet Access | |
即时通讯 | Paltalk | Psi/Psi+ | Trillian | |
其他软件 | DynDNS | JDownloader | MySQL Workbench | Vitalwerks DUC |
系统信息 |
行为总结
原始样本使用Eazfuscator 壳混淆,AES解密内嵌的资源得到dll文件,加载dll文件执行后定位图片资源经过第一层解析rgb数据,第二层与密钥异或两层解密得到exe文件,exe执行后获取xml文件资源,创建计划任务。从资源中两层异或解密后得到pe文件(窃密文件),进程镂空技术注入执行。
窃取系统数据,浏览器,电子邮件,ftp,远程连接工具,vpn账号,即时通讯软件等,通过smtp,ftp,http传输。