きっかけ
とあるイベントでpythonで書いたコードをpyinstallerでexe化したmalwareのデコンパイルに遭遇した。
少し前に、別件でpython製のmalwareを見かけて放置していたので、そいつをデコンパイルしてみる。
準備
tool
githubから以下のtoolをダウンロード
https://github.com/countercept/python-exe-unpacker
モジュールを追加する。python2系だって。
pip2 install --user -r requirements.txt
uncompyle6をインストール。flareVMには最初から入っていた。
pip2 install uncompyle6
対象のmalware

この検体は元々野生でjarファイルで設置されており、実行後に何度かのstepを経てpython製malwareが生成されたもの。野生のmalware観測中に遭遇して、放置していた子です。この度、再度探してきました。
localで生成されたので、なんとなくhash値を伏せておきます。
デコンパイル
1.exeをpyinstxtractorにて展開
PS C:\python-exe-unpacker-master> C:\Python27\python.exe .\pyinstxtractor.py .\1.exe [*] Processing .\1.exe [*] Pyinstaller version: 2.1+ [*] Python version: 27 [*] Length of package: 5526223 bytes [*] Found 28 files in CArchive [*] Beginning extraction...please standby [*] Found 340 files in PYZ archive [*] Successfully extracted pyinstaller archive: .\1.exe You can now use a python decompiler on the pyc files within the extracted directory
ヘッダを追加
展開されたフォルダを見てみる。

今回は”mein”がデコンパイル対象。
python2.7で記述されたことがわかる。
sqlite、暗号関連、sslときたら、chromeのデータを読み取るのに使用した気がする。VTでもstelerの名前が出ていたため、stelerの可能性が高い。
このmeinはヘッダが欠けているため、手で追記する必要がある。
ネットで調べたヘッダ情報にはめられたので、自分で作って移植することにします。まずは、pythonのversionをあわせます。

左がPC上のpython、右がmalwareのpythonのバージョン(dll)です。追加でpythonをインストールする必要はなさそうです。てか、windowsだと、異なるpythonのバージョンを共存させれるんですね。。
pycを作成するには、適当なスクリプトを用意して以下を実行する
> python -V Python 2.7.1 > python -m py_compile .\test_python27.py
するとpycが作成される。バイナリエディタで見てみる

この8byteが2.7.16利用時のヘッダであると想定される。meinにヘッダを足して、mein.pycとして保存する。

で、このmein.pycをuncompyle6でデコンパイルする
> uncompyle6.exe .\mein.pyc > mein.py

Excellent!!!!!!!!
後は、12000行を読めば以上終・・・・えっ、長いって!?w
malwareの特定
opensourceのtoolが悪用されていそう。
https://github.com/AlessandroZ/LaZagne
こちらのお方をカスタムしていると思います。
で、前段のjarと、美味しいラザニアだという事がわかったので、再びOSINT検索です。
https://www.zscaler.com/blogs/research/qealler-new-jar-based-information-stealer
Qeallerとかいう新しめのmalwareだそう。12000行の速読で疲れたよ、パトラッシュ。
レアっぽいけど、洗練されたmalwareとはいえないな〜w
おまけ
Pyinstallerの使い方は下のページが参考になる。
ちなみに、自分の環境では、python3系の場合、upxを無効にするオプションをつけないとexe化できなかった。多分upxのpathの問題な希ガス
pyinstaller.exe .\target.py --onefile --noupx