前言
在过去十年中,大量恶意软件是用解释型编程语言(例如Python)编写的,数量在不断增加且具有较好的免杀效果。日常工作中会遇到需要对一线反馈的恶意文件进行分析获取相关信息的流程,自己手工逆向分析时难免会遇到Python恶意文件,于是借用一些公开的分析工具针对具体遇到的案例实现分析过程,将过程简单记录下来作为笔记。
我们发现的Python恶意文件大多数是Py2exe或Pyinstaller打包的,因此手工分析的第一步是利用pyinstxtractor.py提取pyc文件。最好是在分析环境里安装Python打包的恶意exe文件被构建时选择的Python版本,例如本例为Python3.8。提取完成后可以得到pyc后缀文件和pyd后缀文件以及一些dll文件,我们主要聚焦pyc文件,然后慢慢找到核心代码文件,这里最重要的文件是Alfre.pyc。
https://github.com/extremecoders-re/pyinstxtractor
pyc文件是Python脚本被编译后的二进制文件,内容属于Python字节码,不适合人直接阅读。如果要获取到源码级别的内容以便安全人员分析判断,我们需要将pyc文件反编译为py文件,这个过程可以考虑使用pycdc工具,该工具官方地址位于github,需要自行利用源码编译。
整体来说,该工具的编译过程不复杂,还属于比较顺畅的编译使用体验。
Windows环境编译pycdc
在Windows下编译可以成功,但是实际动手过程中对pyc文件反编译成py文件的步骤失败了,失败的过程也记录在了本文作为对照。
在Windows环境下编译首先准备cmake工具,直接下载msi安装包。
安装时记得勾选“Add CMake to the system PATH for all users”,这样就不用自己再配置环境变量了。
安装配置MinGw,下载地址如下:
将MinGW下bin目录的路径添加到环境变量中,路径为:C:\mingw64\bin。
进入bin文件夹,找到mingw32-make.exe,复制一份,将其中一份重命名为make.exe(依旧保存在bin文件夹中)。
验证是否配置成功,cmd中输入。
gcc -v
make -v
使用命令行cmake构建步骤如下:
首先手动创建build文件夹:mkdir build
接着进入至build文件夹中:cd build
执行命令cmake -G "MinGW Makefiles" ..
最后执行命令make
最后的结果是Windows环境不适合反编译,我们需要改用Linux环境。
Ubuntu环境编译pycdc
我的个人测试环境是Ubuntu22.04,本文以Ubuntu环境来编译pycdc。
在Ubuntu环境中执行如下命令:
git clone https://github.com/zrax/pycdc
cd pycdc
cmake .
make
./pycdc -h
如果编译报错如下,如何解决这个错误?需要安装C++编译器。
onion@onionsec:~/桌面/pycdc$ cmake .
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is unknown
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
CMake Error at CMakeLists.txt:2 (project):
No CMAKE_CXX_COMPILER could be found.
Tell CMake where to find the compiler by setting either the environment
variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
to the compiler, or to the compiler name if it is in the PATH.
-- Configuring incomplete, errors occurred!
See also "/home/onion/桌面/pycdc/CMakeFiles/CMakeOutput.log".
See also "/home/onion/桌面/pycdc/CMakeFiles/CMakeError.log".
在基于Debian的系统(如Ubuntu)上,你可以使用以下命令安装g++:
sudo apt-get update
sudo apt-get install g++
在完成C++编译器的安装后,再次执行上述命令则成功完成编译,编译后的二进制文件位于当前目录下。
利用pycdc实际反编译一个样例如下,可以发现并没有出错。对于安全分析人员来说,阅读Python代码可以很明显地看出这属于大概率恶意文件。
但针对2023年收集的hw红队的Python恶意文件报错了,存在不支持的opcode,说明该工具并不是百分百完善,不过对于日常手工分析已经足够了。
另一个案例是quasarrat提取的Python字节码被反编译时报错,同样提示不支持的opcode,但对人理解代码是否存在异常(恶意)来说没有很大的影响,读完反编译输出的代码后安全分析人员第一眼就可能发现异常。
手工分析是第一步,是直接面对问题的过程,但作为防御视角的时候需要给自己提问,最后的问题留给自己,如何批量检测Python木马?目前也算一种遇到的真实问题了。
参考文章