Python恶意软件呈上升趋势

2020-07-14 04:08:09

在过去的30年里,绝大多数严重的恶意软件都是用汇编语言或编译语言(如C、C++和Delphi)编写的。然而,在过去的十年里,越来越多的恶意软件是用解释语言(如Python)编写的。入门门槛低、易用、快速的开发过程和海量的库集合使Python对数百万开发人员--包括恶意软件作者--具有吸引力。Python已迅速成为威胁参与者创建远程访问特洛伊木马(RAT)、信息窃取程序和漏洞利用工具的标准语言。随着Python的人气继续从根本上增长,以及C恶意软件单一文化模式继续受到挑战,似乎只有一点可以肯定,Python将越来越多地被用作网络攻击中的恶意软件。

与C这样的标准编译语言相比,用Python编写恶意软件有很多困难。首先,为了解释和执行Python代码,需要在操作系统上安装Python。但是,正如我们将在下一节中看到的那样,可以使用各种不同的方法轻松地将Python程序转换为本机可执行文件。

用Python编写的恶意软件还会对文件大小、内存占用和处理能力产生不利影响。严重恶意软件通常设计为体积小、隐蔽性强、内存占用量低,并且使用有限的处理能力。用C编写的编译后的恶意软件示例可能是200KB,而用Python编写的类似恶意软件示例在转换成可执行文件后可能是20MB。使用解释型语言时,CPU和Amp;RAM的使用率也会大大提高。

然而,现在是2020年,数字景观已经今非昔比。互联网比以往任何时候都快,我们的计算机比以往任何时候都有更大的内存和存储容量,CPU每年都在变得更快。Python也比以往更加普遍,默认情况下预装在MacOS和大多数Linux发行版上。

Microsoft Windows仍然是大多数恶意活动的主要目标,并且默认情况下不会安装Python。因此,为了让威胁行为者有效地分发恶意软件,他们必须将Python代码转换为可执行格式。有很多方法可以将Python“编译”为本机可执行文件。让我们来看看几种最流行的…方法。

PyInstaller能够通过“冻结”Python代码,将Python应用程序构建成适用于Windows、Linux、MacOS等系统的独立可执行文件。它是将Python代码转换为可执行格式的最流行的方法之一,已被广泛用于合法和恶意目的。

让我们创建一个简单的“你好,世界!”用Python编写程序,并使用PyInstaller将其冻结为独立的可执行文件:

$cat hello.py print(';Hello,world!';)$pyinstaller--onefile hello.py.$./dist/hello,world!$file dist/hello dist/hello:ELF 64位lsb可执行文件,x86-64,版本1(Sysv),动态链接,解释器/lib64/ld-linux-x86-64.so.2,对于GNU/Linux2.6.32,BuildID[sha1]=294d1f19a085a730da19a6c55788ec08c2187039,已剥离$du-sh dist/hello

此过程创建了一个可移植的、独立的Linux ELF(可执行和可链接格式),相当于Windows上的EXE。现在让我们创建并编译一个“Hello,world!”Linux上的C程序比较:

$cat hello.c#include<;stdio.h>;int Main(){printf(";Hello,world!";);}$GCC hello.c-o hello$。/hello,world!$file hello:ELF 64位LSB PIE可执行文件,x86-64,版本1(Sysv),动态链接,解释器/lib64/ld-linux-x86-64.so.2,适用于GNU/Linux3.2.0的BuildID[sha1]=480c7c75e09c169ab25d1b81bd28f66fde08da7c,,

注意文件大小有多大:7MB(Python)与20KB(C)!这说明了我们前面讨论的关于文件大小和内存使用的主要缺点。Python可执行文件要大得多,因为它必须将Python解释器(在Linux上作为共享目标文件)捆绑在可执行文件内部才能运行。

Py2exe是将Python代码转换为可本地运行的Windows EXE(可执行文件)格式的另一种流行方法。与PyInstaller类似,它将Python解释器与Python代码捆绑在一起,以生成可移植的可执行文件。Py2exe可能会随着时间的推移而过时,因为它在Python3.4之后还没有得到支持,这是因为CPython中的字节码在Python3.6和更高版本中发生了很大的变化。

Py2exe利用distutils,并且需要创建一个小的.setup.py脚本来生成可执行文件。让我们创建一个示例“Hello,world!”使用py2exe的可执行文件:

>;type hello.py print(';Hello,world!';)>;type setup.py import py2exe from distutils.core import Setup Setup(console=[';hello.py';],options={';py2exe';:{';Bundle_files';:1,';压缩';:true}},zipfile=NONE)>;

由py2exe创建的.hello.exe文件在大小上与PyInstaller相似,大小为6.83MB。

Nuitka可能是将Python代码编译为可执行文件的最未得到充分利用的、也是更先进的方法。它将Python代码转换为C程序,然后链接到libpython以执行与CPython相同的代码。Nuitka可以使用各种C编译器,包括GCC、clang、minGw64、Visual Studio2019+和clang-cl来将Python代码转换为C。

让我们创造一个“你好,世界!”Linux上的Python程序,并使用Nuitka进行编译:

$cat hello.py print(';Hello,World!';)$nuitka3 hello.py.$./hello.bin Hello,world!$file hello.bin hello.bin:ELF 64位LSB饼可执行文件,x86-64,版本1(Sysv),动态链接,解释器/lib64/ld-linux-x86-64.so.2,适用于GNU/Linux3.2.0的BuildID[sha1]=eb6a504e8922f8983b23ce6e82c45a907c6ebadf,,去掉$du-sh hello.bin 432K helv。

Nuitka非常简单地生成了一个可移植的二进制文件,432KB的大小是PyInstaller或py2exe所能生成的大小的一小部分!努伊特卡是如何做到这一点的?让我们来看看Build文件夹:

$cloc hello.build/--语言文件空白注释代码。-C 112263 7098109 C/C++标题1 1 0 7-。-SUM:122264 7098116-。

Nuitka从我们的1行Python程序中生成了超过8000行C代码。Nuitka的工作方式是,它实际上将Python模块转换成C代码,然后使用自己的libpython和静态C文件以与CPython相同的方式执行。

这非常令人印象深刻,随着时间的推移,Nuitka“Python编译器”很可能会得到进一步采用。正如我们稍后将看到的,Nuitka在防御反向工程(RE)方面可能有更深一层的内置优势。已经有几个工具可以方便地分析PyInstaller和py2exe生成的二进制文件来恢复Python源代码。然而,通过Nuitka将Python代码转换成C语言,逆向工程要困难得多。

Python恶意软件可以利用大量开源Python包和存储库的生态系统。几乎您能想到的任何东西,都有人已经用Python构建过了。这对恶意软件作者来说是一个巨大的优势,因为简单的功能可以从开放的网络中挑选出来,而更复杂的功能可能不需要从头开始编写。

使用Python的恶意软件作者有许多库可以用来混淆他们的Python代码,从而使代码的可读性变得更加困难,例如:pyminizer和pyarmor。

$cat hello.py print(';Hello,world!';)$pyarmor obffuscate hello.py.$cat dist/hello.py from pyTransform import pyarmor_time pyarmor_time()__pyarmor__(__name_,__file__,b';\x50\x59\x41\x52\x4d\x4f\x52\x00\x00\x03\x08\x00\x55\x0d\x0d\x0a\x04\x00\x01\x00\x40\x00\xd5\x00\x18\xf4\x63\x79\xf6\xaa\xd7\xbd\xc8\x85\x25\x4e\x4f\xa6\x80\x72\x9f\x00\x00。\x00\xec\x50\x8c\x64\x26\x42\xd6\x01\x10\x54\xca\x9c\xb6\x30\x82\x05\xb8\x63\x3f\xb0\x96\xb1\x97\x0b\xc1\x49\xc9\x47\x86\x55\x61\x93\x75\xa2\xc2\x8c\xb7\x13\x87\xff\x31\x46\xa5\x29\x41\x9d\xdf\x32\xed\x7a\xb9\xa0\xe1\x9a\x50\x4a。\x65\x25\xdb\xbe\x1b\xb6\xcd\xd4\xe7\xc2\x97\x35\xd3\x3e\xd3\xd0\x74\xb8\xd5\xab\x48\xd3\x05\x29\x5e\x31\xcf\x3f\xd3\x51\x78\x13\xbc\xb3\x3e\x63\x62\xca\x05\xfb\xac\xed\xfa\xc1\xe3\xb8\xa2\xaa\xfb\xaa\xbb\xb5\x92\x19\x73\xf0\x78\xe4\x9f\xb0。\x1c\x7a\x1c\x0c\x6a\xa7\x8b\x19\x38\x37\x7f\x16\xe8\x61\x41\x68\xef\x6a\x96\x3f\x68\x2b\xb7\xec\x60\x39\x51\xa3\xfc\xbd\x65\xdb\xb8\xff\x39\xfe\xc0\x3d\x16\x51\x7f\xc9\x7f\x8b\xbd\x88\x80\x92\xfe\xe1\x23\x61\xd0\xf1\xd3\xf8\xfa\xce\x86\x92。\x6d\x4d\xd7\x69\x50\x8b\xf1\x09\x31\xcc\x19\x15\xef\x37\x12\xd4\xbd\x3d\x0d\x6e\xbb\x28\x3e\xac\xbb\xc4\xdb\x98\xb5\x85\xa6\x19\x11\x74\xe9\xab\xdf';,1)$python dist/hello.py你好,世界!

窃取信息的恶意软件通常具有截取用户桌面屏幕截图的能力,以窃取敏感信息。使用Python实现这一点太简单了,有几个库可以实现这一点,包括:pycreenshot和python-mss。

恶意软件通常会执行Web请求,以在受危害的端点上执行各种不同的操作,包括:基于Web的命令和控制(C2)、获取外部IP地址、下载第二阶段有效负载等。使用Python,发出Web请求非常简单,可以使用标准库或开源库(如:Requests和HTTPX)来完成。

可以使用以下请求轻松获取受危害端点的外部IP地址,如下所示:

通常,Python的eeval()内置函数被视为非常危险,因为它在生产代码中使用时存在严重的安全风险。但是,在Python恶意软件中使用时,xeval()有巨大的威力。

函数的功能非常强大,可以用来从Python程序本身内部执行Python代码字符串。此单一功能通常被视为已编译恶意软件中的高级功能。它是在正确使用时动态运行高级脚本或“插件”的能力。这类似于C恶意软件包含Lua脚本引擎,使恶意软件能够执行Lua脚本。这一点已经在备受瞩目的恶意软件(如Flame)中看到了。

让我们假设一个假设的APT组正在与一些基于Python的恶意软件进行远程交互。如果这组人遇到需要快速反应的意外情况,能够直接在最终目标上执行Python代码将非常有益。此外,Python恶意软件可以有效地“无功能”地放置在目标上,并且可以根据需要在目标上执行功能以保持隐蔽性。

好的,让我们来看几个真实世界的Python恶意软件示例!

Seaduke恶意软件可能是基于Python的恶意软件涉及的最引人注目的危害。在2015年和2016年,民主党全国委员会(DNC)受到两个威胁行为者团体的威胁,许多分析人士认为这两个团体是APT 28和29的罪魁祸首。

帕洛阿尔托的第42部队对Seaduke进行了一些奇妙的分析。未发现的反编译后的Python源代码单元42可以在这里找到。此外,F-Secure还发布了一份关于Duke恶意软件的伟大白皮书,其中涵盖了Seaduke和相关的恶意软件。

Seaduke恶意软件是一种Python特洛伊木马程序,使用PyInstaller将其制成Windows可执行文件,并与UPX一起打包。Python源代码被混淆,使分析人员更难阅读代码。该恶意软件具有多种功能,包括在Windows上建立持久性的几种方法、跨平台运行的能力以及执行命令和控制的Web请求。

PWOBot是基于Python的恶意软件,类似于Seaduke,它使用PyInstaller编译成Windows可执行文件。它在2013-2015年间很流行,影响了几个欧洲组织,主要是在波兰。

该恶意软件功能非常齐全,包括记录击键、在Windows上建立持久性、下载和执行文件、执行Python代码、创建Web请求和挖掘加密货币。帕洛阿尔托的42部队对PWOBot进行了一些很好的分析。

PyLocky是基于Python的勒索软件,使用PyInstaller编译成Windows独立可执行文件。它针对的是几个不同的国家,包括美国、法国、意大利和韩国。它包括反沙盒功能、命令和控制,以及使用3DES(三重DES)密码加密的文件。

趋势科技(Trend Micro)对PyLocky进行了一些很好的分析。Talos Intelligence分析师逆向设计了PyLocky,并能够为受害者创建文件解密器,以恢复他们的加密文件。

PoetRAT是一种基于Python的特洛伊木马程序,于2020年初针对阿塞拜疆政府和能源部门。该特洛伊木马程序列举系统并窃取与控制风力涡轮机的ICS/SCADA系统相关的信息。

该恶意软件是使用恶意Microsoft Word文档删除的。RAT提供了许多窃取信息的功能,包括通过FTP提取文件、使用网络摄像头拍摄图像、上传其他工具、键盘记录、浏览器枚举和凭证窃取。Talos Intelligence报道了这名威胁演员,并制作了一份关于使用该恶意软件的未知演员的奇妙记录。

除了在野外发现的恶意软件外,还有几只Python老鼠可以开源获得,如Puppy和Stitch。这些开源的Python特洛伊木马程序显示了Python恶意软件的复杂性和丰富的功能。pupy RAT是跨平台的,具有全内存执行指南,占用空间非常小,可以组合几种C2加密方法,使用反射注入迁移到进程中,并且可以从内存加载远程python代码。

有许多工具可用于分析Python恶意软件,即使是编译形式的也是如此。让我们粗略地看一下恶意软件分析师可以使用哪些工具来破解Python恶意软件。

dispyle、uncompyle和uncompyle2-uncompyle6的后继者是原生的Python跨版本反编译器和片段反编译器。它可用于将Python字节码转换回Python源代码。

例如,以我们的“你好,世界!”为例。脚本,并将其作为模块执行,我会看到一个PYC文件(字节码)。我们可以使用uncompyle恢复脚本的源代码。

$xxd hello.cpython-38.pyc 00000000:550d 0d0a 0000 0000 16f3 075f 1700 0000 U._.00000010:E300 0000 0000 0000.00000020:0002 0000 0040 0000 0073 0c00 0000 6500[电子邮件受保护]00000030:6400 8301 0100 6401 5300 2902 7a0d 4865 d.D.S.).z.he 00000040:6c6c 6f2c 2077 6f72 6c64 214e 2901 da05 llo,世界!n)..。00000050:707269e 74a9 0072 0200 0000 7202 0000打印.r.r.00000060:00fa 2d2f 686f 6d65 2f75 7365 722f 746d..-/HOME/user/tm 00000070:702f 7079 7468 6f6e 5f617274 6963 6c65 p/python_Particle 00000080:2f6e 2f74 6573 742f6865 6c6c 6f2e 7079/n/test/hello.py 00000090:da08 3c6d 6f64 756c 653e0100。模块>;.000000a0:0000 00$uncompyle6 hello.cpython-38.pyc|grep-v&39;#';打印(';Hello,world!';)。

*PyInstaller Extractor可以从PyInstaller编译的可执行文件中提取Python数据。它的运行非常简单:

这将生成PYC文件,然后可以与uncompyle6反编译器一起使用来恢复源代码。

使用python exeunpack.py脚本可以对使用py2exe构建的可执行文件进行解包和反编译。它的使用方法如下:

在Windows上编译时,PyInstaller和py2exe都会在其二进制可执行文件中放置唯一的字符串。这意味着它们可以通过简单的YARA规则被检测到。

PyInstaller在可执行文件的末尾写入字符串“Pyi-windows-MANIFEST-FILENAME”,您可以在十六进制编辑器(HXD)中看到它:

导入规则PE_文件_PyInstaller{META:Author=";Didier Stevens(https://DidierStevens.com)";Description=";检测PyInstaller";生成的PE文件字符串:$a=";Pyi-WINDOWS-MANIFEST-FILENAME&34;条件:pe.number_of_resource>;0和$a}。

导入";pe";规则py2exe{META:Author=";Didier Stevens(https://www.nviso.be)";描述=";检测由py2exe";生成的PE文件条件:对于(0.。pe.number_of_resource-1):(pe.resources[i].type_string==";P\x00Y\x00T\x00H\x00O\x00N\x00S\x00C\x00R\x00I\x00P\x00T\x00";)}。

这就是目前来自Python恶意软件世界的所有内容。随着计算机系统变得更快、更容易操作,观察恶意软件趋势的变化非常有趣。作为一个安全行业,我们需要密切关注基于Python的恶意软件,否则它可能会在我们最意想不到的时候把它的尖牙扎进我们的肚子里。

奥斯汀是一名美国海军退伍军人,在应征入伍期间,他曾与USCYBERCOM、NSA和DISA合作,进行防御性和进攻性的网络行动。离开军队后,他一直在私营部门工作,从事软件工程、安全研究和威胁追踪工作。