十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
前言:
繼《Xbash部分樣本分析》一篇博客之后,研究了關(guān)于pyinstaller與pyc字節(jié)碼格式。雖然相關(guān)資料比較少,但是不影響去接觸新的知識(shí)。
不得不說(shuō)pyinstaller是Xbash系列惡意軟件跨平臺(tái)執(zhí)行的罪魁禍?zhǔn)?,PyInstaller支持Linux、Windows、Apple macOS等多平臺(tái)可執(zhí)行文件轉(zhuǎn)換。意味著病毒可以在多平臺(tái)上兼容運(yùn)行。雖然python開(kāi)發(fā)維護(hù)病毒難度較小,周期短,對(duì)于分析人員來(lái)說(shuō)也是件好事,比如把可執(zhí)行文件提取成python源碼。
pyinstaller | pyc | 惡意代碼分析 |
---|---|---|
環(huán)境搭建及使用 | pyc格式解析(部分) | Python惡意代碼 |
?
一、Pyinstaller:
?介紹一下pyinstaller,如前言所說(shuō)pyinstaller將會(huì)讀取您編寫得python腳本,它會(huì)自行分析,當(dāng)然是根據(jù)導(dǎo)出得與執(zhí)行所需要得模塊與庫(kù)。收集這些文件包括活動(dòng)得解釋器,把他們放在一個(gè)文件夾中。
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.
上述參考源于pyinstaller手冊(cè):https://pyinstaller.readthedocs.io/en/stable/index.html
也就是說(shuō)當(dāng)使用pyinstaller得時(shí)候,會(huì)自動(dòng)檢索我們代碼中所需要得庫(kù)與模塊與解釋器,將他們打包到一起,根據(jù)不同得參數(shù)生成可執(zhí)行得文件。當(dāng)然我們并不是研究如何實(shí)現(xiàn)轉(zhuǎn)換成pe格式與elf格式得,因?yàn)檫@需要很漫長(zhǎng)得過(guò)程。
但是我們需要了解,pyinstaller打包到一個(gè)文件夾后,如何執(zhí)行得?首先pyinstaller會(huì)加載myscript.exe,這是核心文件,然后會(huì)引導(dǎo)加載程序得活動(dòng)平臺(tái)二進(jìn)制可執(zhí)行程序。會(huì)引導(dǎo)加載程序,加載python環(huán)境,方便python解釋器在myscript中導(dǎo)入模塊和庫(kù)。
啟動(dòng)時(shí)候會(huì)在操作系統(tǒng)對(duì)應(yīng)得文件夾創(chuàng)建一個(gè)臨時(shí)得文件夾名稱_MEIxxxxxx, 引導(dǎo)加載程序與臨時(shí)文件夾的上下文中的單文件夾包完全相同。當(dāng)捆綁代碼終止時(shí),引導(dǎo)加載程序?qū)h除臨時(shí)文件夾,詳細(xì)得參考請(qǐng)看官方文檔。
?關(guān)于pyinstaller的一些參數(shù),如下所示:
圖片一:pyinstaller參數(shù)
1、-F, --onefile 創(chuàng)建一個(gè)文件捆綁的可執(zhí)行文件
2、-w, --windowed, --noconsole pe格式窗口程序GUI
3、-c, --console, --nowindowed pe格式控制臺(tái)程序
4、-a, --ascii不包含unicode支持
5、-D, --onedir 創(chuàng)建包含可執(zhí)行文件的單文件夾包
如和安裝pyinstaller呢?很簡(jiǎn)單,命令如下所示:
系統(tǒng)Centos
如果你沒(méi)有安裝pip,參考如下:
1、安裝epel擴(kuò)展:yum -y install epel-release
2、安裝pip:yum -y install python-pip
安裝pyinstaller:
pip install pyinstaller
Windows下參考也一樣
如何使用pyinstaller?分為以下幾大步,如下所示:
1、首先你需要編寫一個(gè)py文件,當(dāng)然你可以分成多個(gè)文件進(jìn)行代碼得編寫,除了特殊模塊需要告訴pyinstaller位置之外,其余會(huì)自定幫你分析模塊與庫(kù),這里用測(cè)試代碼如下:
圖片二:python測(cè)試代碼
2、使用pyinstaller命令進(jìn)行打包,如下所示:
圖片三:pyinstaller打包
3、查看生成得數(shù)據(jù),如下所示:
圖片四:dist/xxx
生成的elf程序運(yùn)行正常,而且pyinstaller維護(hù)了如上圖所示得PYZ格式的數(shù)據(jù)文件,附加到了可執(zhí)行文件的末尾,然后最前面是PYZ開(kāi)頭的格式。
官方提供了對(duì)應(yīng)的腳本來(lái)提取pyc,名字叫archive_viewer.py代碼下載:https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/utils/cliutils/archive_viewer.py
4、從上述網(wǎng)站中把代碼粘貼下來(lái),touch一個(gè)文件,+x權(quán)限后,復(fù)制即可使用,如下所示:
圖片五:archive_viewer.py
5、我們發(fā)現(xiàn)下面有很多數(shù)據(jù),我們需要關(guān)注的s標(biāo)志段中name是我們本身文件名:
圖片六:S段標(biāo)志數(shù)據(jù)
6、archive_viewer.py都有什參數(shù)呢?很簡(jiǎn)單分析一下源碼,如下所示:
圖片七:命令分析
我們需要用到X的命令去提取pyc,上圖中為標(biāo)記的命令U是go Up one level的含義。
7、開(kāi)始提取pyc,如下所示:
圖片八:提取命令
8、這時(shí)候我們來(lái)看一看提取的pyc,widnows下用010就可以了,linux下用xxd可以觀察,如下所示:
圖片九:提取pyc數(shù)據(jù)觀察
9、pyc提取的到底對(duì)不對(duì)呢?怎樣來(lái)確認(rèn)?這時(shí)候我們需要利用python中的py_compile模塊,這個(gè)模塊中方法compile可以將py生成pyc,這樣我們對(duì)比觀察,如下所示:
圖片十:py_compile
代碼:
import py_compile
py_compile.compile(r'路徑')
注意:
有時(shí)候會(huì)生成一個(gè)__pycompile__文件夾,里面會(huì)是pyc,有時(shí)候會(huì)在輸入的路徑下生成pyc,小心覆蓋elf中提取的pyc。
10、我們看一下python原生態(tài)編譯生成的字節(jié)碼pyc如下:
圖片十一:compile編譯pyc
圖片九與圖片十一做比對(duì),你一定會(huì)開(kāi)頭少了8個(gè)字節(jié)的數(shù)據(jù),注意當(dāng)前編譯環(huán)境使用的python2.7.5,缺少了8個(gè)字節(jié)的數(shù)據(jù),python3前面的字節(jié)編碼字節(jié)也是不同的。
所以在當(dāng)前環(huán)境下測(cè)試觀察,那么使用pyinstaller中archive_viewer.py抽取的pyc比正常編譯的字節(jié)碼缺少了8個(gè)字節(jié)的數(shù)據(jù),缺少的是什么?下面我們來(lái)看一看pyc格式解析。
?
二、pyc格式解析:
圖片十二:部分pyc格式數(shù)據(jù)分析
當(dāng)然pyc的格式不只上述那么多,只是羅列出了一部分,詳細(xì)的去介紹參數(shù)不是一篇文章或者短時(shí)間內(nèi)能夠研究學(xué)習(xí)明白的,那么我們來(lái)看一些重要的數(shù)據(jù)。
1、MAGIC,魔術(shù)頭,注意版本區(qū)分不同所以魔術(shù)頭的數(shù)值不同,比如python2一般是03f30d0a,python3.6一般是33790d0a,占用4個(gè)字節(jié),前兩個(gè)字節(jié)是版本,后兩個(gè)字節(jié)是0d0a兩個(gè)標(biāo)志位.
2、緊跟著Magic的是MTIME,是時(shí)間也占四個(gè)字節(jié)。
3、TYPE_CODE, 表示了一個(gè)PyCodeObject對(duì)象,占用了一個(gè)字節(jié)大小,這個(gè)標(biāo)志位是c,其實(shí)就是Pyton中編譯過(guò)程生成code對(duì)象PyCodeObject。將PyCodeObject寫入二進(jìn)制文件,即.pyc。
4、我們發(fā)現(xiàn)圖片中co_code的數(shù)值,其實(shí)就是PyCodeObject結(jié)構(gòu)體中的各個(gè)域,每一個(gè)屬性占用一個(gè)long字節(jié)。
5、下面三個(gè)屬性Type_string與size values數(shù)值,是對(duì)應(yīng)著PyCodeObject的co_code。
6、Type_List,占用一個(gè)字節(jié),是類型鏈表。
7、co_consts size 表示元素個(gè)數(shù),占用四個(gè)字節(jié)。
8、Type_INT與co_consts[0]是一個(gè)×××。
還有很多的屬性,詳細(xì)的數(shù)據(jù)還可以參考:https://www.2cto.com/kf/201504/395067.html
?通過(guò)上面的描述,對(duì)pyc的數(shù)據(jù)格式有一個(gè)基礎(chǔ)的認(rèn)識(shí),簡(jiǎn)單的知道了那些字節(jié)的含義與基礎(chǔ)的作用。
這樣我們就可以很輕易的知道在pyinstaller打包的時(shí)候,解壓Pyc缺失了8個(gè)字節(jié),分別是Magic與MTIME兩個(gè)字段屬性,MTIME字段我們可以填充為0(無(wú)關(guān)緊要)。
所以根據(jù)當(dāng)前環(huán)境來(lái)判定魔術(shù)頭的格式(pyinstaller在打包的時(shí)候,應(yīng)該會(huì)抽取魔術(shù)頭來(lái)作為版本的判定方式,所以會(huì)缺少字節(jié))。我們嘗試將確實(shí)的數(shù)據(jù)添加到c也就PyCodeObject對(duì)象之前補(bǔ)齊8個(gè)字節(jié)的數(shù)據(jù),如下所示:
圖片十三:補(bǔ)齊數(shù)據(jù)
注意:是在PyCodeObject對(duì)象之前補(bǔ)齊數(shù)據(jù),而不是在原來(lái)的數(shù)據(jù)上修改!否則轉(zhuǎn)換py的時(shí)候會(huì)報(bào)錯(cuò)的。
補(bǔ)齊數(shù)據(jù)之后我們需要做的是用工具去反編譯成py文件,wdinows下推薦一款為EasyPythonDecompiler.exe的軟件,而linux下更是數(shù)不勝數(shù),那么這里使用linux下名為uncompyle2, decompyle2很多都可以。下面演示就使用EasyPythonDecompiler.exe來(lái)轉(zhuǎn)換py,如下所示:
圖片十四:Decompile Success
?轉(zhuǎn)換完成之后將會(huì)生成mypy.pyc_dis文件,如果pyc的格式不對(duì)就會(huì)失敗,生成mypy.pyc_dis.failure,這時(shí)候我們拉入到IDE看一看python源碼是否與圖二中源碼相同,如下所示:
圖片十五:匹配成功
上述一已經(jīng)能成功的將pyinstaller打包elf格式的文件成功的轉(zhuǎn)換成py,有何用呢?還記著Xbash系列病毒其中便有pyinstaller打包的病毒,如下所示:
圖片十六:提取惡意代碼
?
三、Python惡意代碼分析:
?弱用戶與密碼字典:
圖片十七:弱用戶與弱密碼
?公網(wǎng)請(qǐng)求及初始化掃IP及描端口:
圖片十八:請(qǐng)求及端口初始化
?初始化惡意線程環(huán)境及啟動(dòng)線程:
圖片十九:創(chuàng)建啟動(dòng)線程
?線程回調(diào)分析:
圖片二十:線程回調(diào)分析
?WEB掃描及數(shù)據(jù)庫(kù)掃描:
圖片二十一:pass_crack
圖片二十二:check_pass
圖片二十三:check_pass
圖片二十四:mysql
圖片二十五:mysql刪庫(kù)勒索
圖片二十六:postgresql刪庫(kù)勒索
圖片二十七:mongodb刪庫(kù)勒索
圖片二十八:redis刪庫(kù)勒索
圖片二十九:hadoop Yarn Rm執(zhí)行命令
圖片三十:MQ利用執(zhí)行put
⑥內(nèi)網(wǎng)掃描:
圖片三十一:內(nèi)網(wǎng)掃描
圖片三十二:內(nèi)網(wǎng)掃描
通過(guò)上述惡意代碼的分析,最可惡的是沒(méi)有任何備份的情況下刪庫(kù),且欺0.02BTC,即使給對(duì)方支付了費(fèi)用,抱歉你的數(shù)據(jù)庫(kù)仍無(wú)法恢復(fù),對(duì)方會(huì)利用你的心性索要更多的BTC。
服務(wù)器中大量的弱賬戶與弱密碼,給病毒帶來(lái)了福利。掃描web、內(nèi)網(wǎng)創(chuàng)建線程,一經(jīng)發(fā)現(xiàn)字典匹配成功,那么會(huì)對(duì)數(shù)據(jù)庫(kù)進(jìn)行毀滅的操作。
如何防范?如果你服務(wù)器與數(shù)據(jù)庫(kù)賬戶名,密碼規(guī)范化管理(復(fù)雜程度及長(zhǎng)度),經(jīng)常更換,不使用這些弱密碼弱賬戶,即使突破了安全防護(hù),在字典掃描與破解的時(shí)候,也不能胡作非為,那么XbashY樣本分析告一段落。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。