前言:
繼《Xbash部分樣本分析》一篇博客以後,研究了關於pyinstaller與pyc字節碼格式。雖然相關資料比較少,可是不影響去接觸新的知識。
不得不說pyinstaller是Xbash系列惡意軟件跨平臺執行的罪魁禍首,PyInstaller支持Linux、Windows、Apple macOS等多平臺可執行文件轉換。意味着病毒能夠在多平臺上兼容運行。雖然python開發維護病毒難度較小,週期短,對於分析人員來講也是件好事,好比把可執行文件提取成python源碼。
html
pyinstaller | pyc | 惡意代碼分析 |
---|---|---|
環境搭建及使用 | pyc格式解析(部分) | Python惡意代碼 |
✃
1、Pyinstaller:
☛介紹一下pyinstaller,如前言所說pyinstaller將會讀取您編寫得python腳本,它會自行分析,固然是根據導出得與執行所須要得模塊與庫。收集這些文件包括活動得解釋器,把他們放在一個文件夾中。python
This section covers the basic ideas of PyInstaller. These ideas apply to all platforms. Options and special cases are covered below, under Using PyInstaller.
PyInstaller reads a Python script written by you. It analyzes your code to discover every other module and library your script needs in order to execute. Then it collects copies of all those files – including the active Python interpreter! – and puts them with your script in a single folder, or optionally in a single executable file.mysql
上述參考源於pyinstaller手冊:https://pyinstaller.readthedocs.io/en/stable/index.html
也就是說當使用pyinstaller得時候,會自動檢索咱們代碼中所須要得庫與模塊與解釋器,將他們打包到一塊兒,根據不一樣得參數生成可執行得文件。固然咱們並非研究如何實現轉換成pe格式與elf格式得,由於這須要很漫長得過程。
可是咱們須要瞭解,pyinstaller打包到一個文件夾後,如何執行得?首先pyinstaller會加載myscript.exe,這是核心文件,而後會引導加載程序得活動平臺二進制可執行程序。會引導加載程序,加載python環境,方便python解釋器在myscript中導入模塊和庫。
啓動時候會在操做系統對應得文件夾建立一個臨時得文件夾名稱_MEIxxxxxx, 引導加載程序與臨時文件夾的上下文中的單文件夾包徹底相同。當捆綁代碼終止時,引導加載程序將刪除臨時文件夾,詳細得參考請看官方文檔。linux
✍關於pyinstaller的一些參數,以下所示:
圖片一:pyinstaller參數git
一、-F, --onefile 建立一個文件捆綁的可執行文件 二、-w, --windowed, --noconsole pe格式窗口程序GUI 三、-c, --console, --nowindowed pe格式控制檯程序 四、-a, --ascii不包含unicode支持 五、-D, --onedir 建立包含可執行文件的單文件夾包
如和安裝pyinstaller呢?很簡單,命令以下所示:github
系統Centos 若是你沒有安裝pip,參考以下: 一、安裝epel擴展:yum -y install epel-release 二、安裝pip:yum -y install python-pip 安裝pyinstaller: pip install pyinstaller Windows下參考也同樣
如何使用pyinstaller?分爲如下幾大步,以下所示:
一、首先你須要編寫一個py文件,固然你能夠分紅多個文件進行代碼得編寫,除了特殊模塊須要告訴pyinstaller位置以外,其他會自定幫你分析模塊與庫,這裏用測試代碼以下:
圖片二:python測試代碼
二、使用pyinstaller命令進行打包,以下所示:
圖片三:pyinstaller打包
三、查看生成得數據,以下所示:
圖片四:dist/xxx
生成的elf程序運行正常,並且pyinstaller維護瞭如上圖所示得PYZ格式的數據文件,附加到了可執行文件的末尾,而後最前面是PYZ開頭的格式。
官方提供了對應的腳原本提取pyc,名字叫archive_viewer.py代碼下載:https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/utils/cliutils/archive_viewer.py
四、從上述網站中把代碼粘貼下來,touch一個文件,+x權限後,複製便可使用,以下所示:
圖片五:archive_viewer.py
五、咱們發現下面有不少數據,咱們須要關注的s標誌段中name是咱們自己文件名:
圖片六:S段標誌數據
六、archive_viewer.py都有什參數呢?很簡單分析一下源碼,以下所示:
圖片七:命令分析
咱們須要用到X的命令去提取pyc,上圖中爲標記的命令U是go Up one level的含義。
七、開始提取pyc,以下所示:
圖片八:提取命令
八、這時候咱們來看一看提取的pyc,widnows下用010就能夠了,linux下用xxd能夠觀察,以下所示:
圖片九:提取pyc數據觀察
九、pyc提取的到底對不對呢?怎樣來確認?這時候咱們須要利用python中的py_compile模塊,這個模塊中方法compile能夠將py生成pyc,這樣咱們對比觀察,以下所示:
圖片十:py_compileweb
代碼: import py_compile py_compile.compile(r'路徑') 注意: 有時候會生成一個__pycompile__文件夾,裏面會是pyc,有時候會在輸入的路徑下生成pyc,當心覆蓋elf中提取的pyc。
十、咱們看一下python原生態編譯生成的字節碼pyc以下:
圖片十一:compile編譯pyc
圖片九與圖片十一作比對,你必定會開頭少了8個字節的數據,注意當前編譯環境使用的python2.7.5,缺乏了8個字節的數據,python3前面的字節編碼字節也是不一樣的。
因此在當前環境下測試觀察,那麼使用pyinstaller中archive_viewer.py抽取的pyc比正常編譯的字節碼缺乏了8個字節的數據,缺乏的是什麼?下面咱們來看一看pyc格式解析。
✃
2、pyc格式解析:
圖片十二:部分pyc格式數據分析
固然pyc的格式不僅上述那麼多,只是羅列出了一部分,詳細的去介紹參數不是一篇文章或者短期內可以研究學習明白的,那麼咱們來看一些重要的數據。redis
一、MAGIC,魔術頭,注意版本區分不一樣因此魔術頭的數值不一樣,好比python2通常是03f30d0a,python3.6通常是33790d0a,佔用4個字節,前兩個字節是版本,後兩個字節是0d0a兩個標誌位.
二、緊跟着Magic的是MTIME,是時間也佔四個字節。
三、TYPE_CODE, 表示了一個PyCodeObject對象,佔用了一個字節大小,這個標誌位是c,其實就是Pyton中編譯過程生成code對象PyCodeObject。將PyCodeObject寫入二進制文件,即.pyc。
四、咱們發現圖片中co_code的數值,其實就是PyCodeObject結構體中的各個域,每個屬性佔用一個long字節。
五、下面三個屬性Type_string與size values數值,是對應着PyCodeObject的co_code。
六、Type_List,佔用一個字節,是類型鏈表。
七、co_consts size 表示元素個數,佔用四個字節。
八、Type_INT與co_consts[0]是一個×××。
還有不少的屬性,詳細的數據還能夠參考:https://www.2cto.com/kf/201504/395067.html
✉經過上面的描述,對pyc的數據格式有一個基礎的認識,簡單的知道了那些字節的含義與基礎的做用。
這樣咱們就能夠很輕易的知道在pyinstaller打包的時候,解壓Pyc缺失了8個字節,分別是Magic與MTIME兩個字段屬性,MTIME字段咱們能夠填充爲0(可有可無)。
因此根據當前環境來斷定魔術頭的格式(pyinstaller在打包的時候,應該會抽取魔術頭來做爲版本的斷定方式,因此會缺乏字節)。咱們嘗試將確實的數據添加到c也就PyCodeObject對象以前補齊8個字節的數據,以下所示:
圖片十三:補齊數據
注意:是在PyCodeObject對象以前補齊數據,而不是在原來的數據上修改!不然轉換py的時候會報錯的。
補齊數據以後咱們須要作的是用工具去反編譯成py文件,wdinows下推薦一款爲EasyPythonDecompiler.exe的軟件,而linux下更是數不勝數,那麼這裏使用linux下名爲uncompyle2, decompyle2不少均可以。下面演示就使用EasyPythonDecompiler.exe來轉換py,以下所示:
圖片十四:Decompile Success
轉換完成以後將會生成mypy.pyc_dis文件,若是pyc的格式不對就會失敗,生成mypy.pyc_dis.failure,這時候咱們拉入到IDE看一看python源碼是否與圖二中源碼相同,以下所示:
圖片十五:匹配成功
上述一已經能成功的將pyinstaller打包elf格式的文件成功的轉換成py,有何用呢?還記着Xbash系列病毒其中便有pyinstaller打包的病毒,以下所示:
圖片十六:提取惡意代碼
✃
3、Python惡意代碼分析:
➀弱用戶與密碼字典:
圖片十七:弱用戶與弱密碼
➁公網請求及初始化掃IP及描端口:
圖片十八:請求及端口初始化
➂初始化惡意線程環境及啓動線程:sql
圖片十九:建立啓動線程
➃線程回調分析:
圖片二十:線程回調分析
➄WEB掃描及數據庫掃描:
圖片二十一:pass_crack
圖片二十二:check_pass
圖片二十三:check_pass
圖片二十四:mysql
圖片二十五:mysql刪庫勒索mongodb
圖片二十六:postgresql刪庫勒索
圖片二十七:mongodb刪庫勒索
圖片二十八:redis刪庫勒索
圖片二十九:hadoop Yarn Rm執行命令
圖片三十:MQ利用執行put
⑥內網掃描:
圖片三十一:內網掃描
圖片三十二:內網掃描
經過上述惡意代碼的分析,最可惡的是沒有任何備份的狀況下刪庫,且欺0.02BTC,即便給對方支付了費用,抱歉你的數據庫仍沒法恢復,對方會利用你的心性索要更多的BTC。 服務器中大量的弱帳戶與弱密碼,給病毒帶來了福利。掃描web、內網建立線程,一經發現字典匹配成功,那麼會對數據庫進行毀滅的操做。 如何防範?若是你服務器與數據庫帳戶名,密碼規範化管理(複雜程度及長度),常常更換,不使用這些弱密碼弱帳戶,即便突破了安全防禦,在字典掃描與破解的時候,也不能胡做非爲,那麼XbashY樣本分析告一段落。