微步在线在威胁监控过程中,多次发现病毒木马或直接使用Python来编写,或使用Python打包的方式进行投递:如在2020年1月的一起针对阿-拉-伯地区的APT攻击事件中,攻击者通过投递携带CVE-2017-0199漏洞的docx文件,释放并运行了Python打包的后门程序;又如2019年11月份,Gaza(中东背景APT组织)也被发现使用了Python封装其木马组件。由此可见,Python在 *** 攻击事件中的出现日趋频繁,这也为安全分析人员带来新的挑战。
经过分析发现,Python打包的病毒木马主要存在以下3种形式:
1. 以py脚本的形式存在,此种方式最为常见,但也最容易阅读和分析。2. 将pyc文件结构打包到各种可执行文件中,如PyInstaller工具等。3. 通过Cython转换成C语言代码,再编译成可执行文件。其中,以第1种方式最为简单也最为常见,而第2种、第3种 *** 具有一定分析难度。本文针对第二种方式进行介绍,将介绍常见的Python打包工具的安装和使用 *** ,同时对典型的Python打包木马病毒进行分析,并讲述相关逆向分析技巧。简介
PyInstaller 是一个用来将 Python 程序打包成一个独立可执行软件包,支持 Windows、Linux 和 macOS X。该工具是现在非常成熟的一款工具,具有良好的兼容性,支持的Python版本可达到Python3.7。使用方式
PyInstaller的使用方式非常简单:(1) pip install pyinstaller指令就可进行安装。(2) pyinstaller.exe -F yourcode.py指令就可进行简单打包。
分析 ***
PyInstaller打包的文件分析起来也十分简单,有现成的工具脚本——pyinstxtractor.py可以使用。pyinstxtractor.py的下载地址如下:https://sourceforge.net/projects/pyinstallerextractor/。用法也很简单,指令pyinstxtractor.py+可执行文件,就可以进行解包。简介
Py2exe这个工具只能在Windows平台使用,Py2exe是一个开源项目,github的地址:https://github.com/py2exe/py2exe。Py2exe执行Python2和Python3。使用方式
(1) 下载地址,如下:set.py -h可查看帮助
python set.py py2exe指令可编译成exe文件效果如下图:
分析 ***
(1) 在py2exe打包后的结果文件中,exe和python.dll都是必要组件。有时python.dll可能会被内嵌在exe中。
(2) 可执行文件运行时必然会调用附带的python.dll。(3) 对python.dll的导出函数PyMarshal_ReadObjectFromString进行hook或者下断点。
(4) 通过PyMarshal_ReadObjectFromString函数可以获取到打包进exe的pyc数据。该函数有两个参数,参数一是pyc数据的起始地址,参数二为数据的长度。
注意:在py2exe中获取的pyc数据内包含多个模块,一定要将多个模块进行拆分再反编译,否则会出错的。简介
BBFreeze由BrainBot Technologies AG开发。
GitHub的地址:https://github.com/schmir/bbfreeze。
使用方式
(1) 下载地址,如下:可以通过pip或easy_install直接下载。(2) 使用 *** ,如下:指令:bbFreeze+py脚本输出结果如图:
分析 ***
BBFreeze和其他工具有所差别,它是通过PyRun_StringFlags函数进行。BBFreeze会通过zip模块把随身携带的library.zip进行解压,再通过python的exec来进行执行。其中的library.zip可能会嵌在可执行文件当中。library.zip解压后如图:
简介
cx_Freeze也是一种用于将Python脚本打包成可执行文件的一种工具,使用起来和py2exe差不多。GitHub的地址:https://github.com/marcelotduarte/cx_Freeze
使用方式
(1) 下载地址,如下:
https://sourceforge.net/projects/cx-freeze
也可使用pip进行下载。
(2) 使用 *** ,如下:
指令:cxfreeze+py脚本。
输出文件如同:首先,我们可以看到有“_MEIPASS2=”字符串,从这可以看到该样本是由Python打包而来。从WinMain函数的代码来看,可以看出来该样本是PythonInstaller打包而来。
确定好是由什么工具打包后,可以使用之前提到的方式直接对其解包。使用pyinstxtractor.py脚本对其进行解包。解包后的文件列表大致如下:
其中我们可以看到解包后会生成python27.dll,从这可以看出来该样本是由Python2.7编写的。
我们大致可以看到,解包后的文件有很多。会有很多Python运行必要的组件和第三方组件,如:_socket.pyd、Crypto.Cipher._AES.pyd等。我们可以在文件列表内看到一个没有扩展名的文件:
该文件就是我们需要样本核心代码。该文件的文件名就是打包前py文件的文件名,该文件的文件格式很接近pyc的文件格式。之间的差别就是在于文件头缺少majic字段和时间戳。
我们添加一个Python2.7的majic字段和任意的时间戳。然后我们就可以使用uncompile.py脚本还原出该py文件。
对于这种常见工具打包的Python样本,我们通常处理的流程:(1) 判断样本是由什么工具打包而来的。这种工具很常见,它们打包出来的程序往往很容易判断出来。(2) 使用针对的破解工具或 *** 进行代码提取。(3) 提取的代码通常是pyc文件格式的。(4) 使用uncompile.py脚本进行反编译就可得到原始的py文件。
3. 将libpython2.7.so.1.0的导出函数地址初始化到imports全局变量内。通过使用dlsym函数,利用函数的名称来获取函数地址。
4. 之前已经将python api的地址存储在imports变量内,之后的调用也是通过imports变量来进行的,还原一下调用的python函数的符号,可以看到样本初始化python环境和执行的整个过程。
首先是初始化python运行环境。随后初始化必要的python模块。
看到PyMarshal_ReadObjectFromString函数的时候,可以得知该样本使用脚本式来执行python的代码。
PyMarshal_ReadObjectFromString函数的主要功能是,读取一段数据,生成一个PyCodeObject的python对象。之一个参数是string的地址,第二个参数是数据的长度。
5. PyMarshal_ReadObjectFromString的之一个参数就是pupy的字节码,这个字节码的实际格式是一个pyc文件。将这个string还原成pyc文件就可以恢复出pupy的py脚本。
将PyMarshal_ReadObjectFromString的之一个参数数据保存到pyc文件中。注意,这个时候保存的pyc文件内并没有python的版本信息和时间戳。在文件头前添加8个字节,前四个字节表示python版本(不可随意填写,一定要是python2.7版本)、后四个字节表示时间戳(可随便填写)。
通过python的反编译脚本uncompyle6.py对保存的pyc文件进行反编译,就可以生成一个pupy的py脚本。通过对脚本的简单分析就可以十分确定这个样本是pupy家族的。脚本是开源的,具体的行为就不进行分析。
通过对多个工具分析可以看到,无论是通过什么工具进行打包,都需要一个关键的因素,那就是python.dll或libpython.so。那么我们先来介绍一下python.dll在python中起到了什么作用。
实质上,在整个Python的目录结构中,python.dll是最核心最基础的组件。Python的运行时环境就是在python.dll中实现的,这里包含了对象/类型系统、内存分配器和运行时状态信息。这里也就可以理解为什么任何方式进行打包都需要将对应的python.dll一同打包进去了。
也就是说,无论什么工具,都是要通过python.dll来建立python的运行环境。这个过程是可以通过调用python.dll的导出函数来实现的。在python.dll的一个导出函数中,有个函数Py_Initialize就是用来初始化Python的运行环境。
Python有两种主要的运行模式,一种是交互式模式,另一种是脚本运行方式。我们通过两个简单例子来演示一下:
我们准备一个简单的py脚本,将其编译为pyc文件。
我们准备一个简单的C代码来调用此pyc文件。(1) 加载对应版本的python.dll。
(2) 首先先调用Py_Initialize函数。(3) 随后调用PyRun_SimpleFile,来运行pyc文件。简单的C代码的例子:
(1) 加载对应版本的python.dll。
(2) 首先先调用Py_Initialize函数。
(3) 接下来利用PyDict_New创建一个Dict。
(4) 然后调用PyEval_GetBuiltins获取解释器。
(5) 最后调用PyRun_String来执行各种代码。
通过这一系列的函数,我们可以获取到打包进可执行文件内的明文Python脚本或pyc的字节码。
(4) 使用uncompile.py脚本进行反编译就可得到原始的py文件。
工具 | 链接 |
Pyinstaller | https://pypi.org/project/pyinstaller/ |
py2exe | https://pypi.org/project/py2exe/ |
bbFreeze | https://pypi.org/project/bbfreeze/ |
cx-Freeze | https://pypi.org/project/cx-Freeze/ |
https://s.threatbook.cn/report/file/287b67d9927b6a318de8c94ef525cc426f59dc2199ee0e0e1caf9ef0881e7555/?sign=history&env=winxpsp3_exe
6.3 有关Python木马的安全事件报告
民以食为天,食品安全问题相信不用小编多阐述,我们国家对于不合格产品及企业的打击力度也是非常大,但总有部分企业想着浑水摸鱼赚黑心钱。近日北京市场监督管理局通告每日优鲜一款产品大肠菌群超标,据了解大肠菌群...
本文导读目录: 1、微软捕获的第一个中国黑客-刘蝶雨 2、“Macrohard”---“巨硬公司”(和微软作对的公司) 谁听说过? 3、微软等50多家科技公司源代码泄露,其中有哪些微软公司?...
常吃六味地黄丸好吗(长期这样吃六味地黄丸真的好吗)明明是补肾的方子,为什么吃六味地黄丸会越来越虚。 每当肾虚我们就想到六味地黄丸,关于六味地黄丸至少在现代人看来,已经和肾虚划上了等号。 不...
杨浦小学(杨浦区学区房排名) 作为复旦大学的所在地,杨浦区是整个“复旦系”的发源地,尤其是复旦附中的存在,给杨浦增添许多“复旦”的气氛,各中小学都在一个很高的高度上。 杨浦区目前小学共计54所。其...
棋牌输了怎么找黑客 1、网上黑客影片的前半段和科幻接单关联不大,棋牌输了接单签名林正英。他试图在网络上逡巡溜达的同时发现一些。你可以随便申请个Qq。黑客hook。com,记住,最喜欢的合唱团,快。棋牌...
本文导读目录: 1、你好,我想用手机连接别人的监控,应该怎么连接 2、别人用过的小米监控摄像头怎么重新用自己的手机注册 3、家人买了个华为摄像头,但我在外地,如何远程连接家里的摄像头(注:我用...