ユニット42テクニカル分析: Seaduke
Resolution
ユニット42から転載。
今週シマンテックは、マルウェアの ' デューク ' 家族によって使用される新しいトロイの木馬を詳述ブログの記事をリリース. このブログ投稿では、' forkmeiamfamous ' という名前の関数を含むペイロードが記載されていました。いくつかの研究をオンラインで実行している間、ユニット42は、アンチウイルス企業の数によって ' Seadask ' としてラベル付けされている次のサンプルを、識別することができた。
MD5 | A25EC7749B2DE12C2A86167AFA88A4DD |
SHA1 | BB71254FBD41855E8E70F05231CE77FEE6F00388 |
SHA256 | 3EB86B7B067C296EF53E4857A74E09F12C2B84B666FC130D1F58AEC18BC74B0D |
タイムスタンプのコンパイル | 2013-03-23 22:26:55 |
ファイル タイプ | PE32 実行可能ファイル (GUI) インテル 80386, MS Windows 用, UPX 圧縮 |
当社の分析は、シマンテックの記事に記載されていないマルウェア自体の詳細技術的な詳細と指標を上になっている。ここに私たちの観測の一部です:
難読化の最初の層
UPX パッカーがマルウェアサンプルから削除されると、PyInstaller を使用してコンパイルされたサンプルを扱っていることがすぐに明らかになります。このプログラムは、個々の Python スクリプト言語を使用してプログラムを作成し、Microsoft Windows、Linux、Mac OSX、Solaris、または AIX プラットフォーム用の実行可能ファイルに変換することができます。UPX で解凍されたバイナリ内で見つかった次の文字列のサブセットは、私たちの疑惑を確認します。
- システムパスを追加します (r "% s")
- デルシステムパス [:]
- sys をインポートします。
- PYTHONHOME
- PYTHONPATH
- コマンドでエラーが発生しました:% s
- システムパスを追加します (r "% s?% d")
- _MEI% d
- 内部エラー: 一時ディレクトリを作成できません。
- 警告: ファイルは既に存在しますが、すべきではありません:% s
- 子プロセスの作成エラーです!
- PySys_SetObject のために GetProcAddress できない
- PySys_SetObject
このサンプルはもともと Python で作成されているため、基になるコードを抽出することができます。' PyInstaller エクストラクタ ' などのツールを使用して、バイナリ内に存在する基になる pyc ファイルを抽出できます。
図 1. Seaduke から抽出された Python ファイル
その後、uncompyle2 などのツールを使用して 、Python バイトコードを元のソースコードに変換することができます。このプロセスが完了すると、基になる Python コードが難読化されていることをすぐに理解できます。
図 2. 難読化 Python コード
難読化の第2層
難読化されたコードをたどって、我々はおそらくいくつかの Python コードを実行する ' exec (ZxkBDKLakV) ' ステートメントを、識別します。さらにトレースすると、この文字列は ' ZxkBDKLakV ' 変数に多数の文字列を付加することによって生成されることを発見します。最後に、この文字列が作成された後、base64 でデコードされ、その後 ZLIB ライブラリを使用して解凍することがわかります。
図 3。難読化の第2層の識別
次の単純な Python コードを使用して、この難読化の層を回避することができます。
クレヨン構文蛍光ペン v 2.6.6
インポート sys, re, base64, zlib
len(sys.argv) ! = 2:
印刷 "使用法: python% s [ファイル]"% __file__
sys.出口(1)
f = open (システム argv [1]、' rb ')
fdata = f. read ()
f. 閉じる ()
# これに応じて設定
変数 = "ZxkBDKLakV"
regex = "% s \ + = ([Z0-9] +) \n"% 変数
out = ""
findall (正規表現、fdata) の x について:
regex2 = "% s = \" ([Z0-9 \ + \/] +) \ ""% x
findall (regex2、fdata) の x1 の場合:
out + = x1
o = base64. b64decode (out)
印刷 zlib. 解凍 (o)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | インポートsys, re, base64, zlib
len(sys.argv) ! = 2: 印刷"使用法: python% s [ファイル] " % __file__ sys.出口(1)
f = open(sys.argv[1]、 ' rb ') fdata = f.read() f.閉じる()
# これに応じて設定 変数 = "ZxkBDKLakV"
regex = "% s \ + = ([Z0-9] +) \n" %変数 out = "" re の x について。findall(正規表現、 fdata): regex2 = "% s = \" ([Z0-9 \ + \/] +) \ "" % x re の x1 の場合 。findall(regex2、 fdata): out + = x1
o = base64。b64decode(アウト) zlib を印刷します。解凍(o) |
[フォーマット時間: 0.0038 秒]
残りの Python コードは依然として難読化されているように見えますが、全体的な機能を識別できます。
最終ペイロード
以下に示すように、ほとんどすべての変数名とクラス名が、長い一意の文字列を使用して難読化されています。
図 4。最終的なペイロードでの難読化の検出
少し頭脳と検索/置換を使用して、我々は、マルウェア内の機能の識別と名前の変更を開始することができます。このコードのクリーンアップされたコピーは、GitHub 上で見つけることができます。最初に気付くのは、base64 でエンコードされたデータの大規模な blob であり、さらに ZLIB を使用して解凍したものです。このデータをデコードして解凍すると、このマルウェアの構成データを含む JSON オブジェクトが報われます。
図 5。Base64 エンコード/ZLIB 圧縮データ
クレヨン構文蛍光ペン v 2.6.6
{
"first_run_delay": 0,
"キー": {
"aes": "KIjbzZ/ZxdE5KD2XosXqIbEdrCxy3mqDSSLWJ7BFk3o =",
「aes_iv」: 「cleUKIi + mAVSKL27O4J/UQ = =」
},
"autoload_settings": {
"exe_name": "LogonUI",
"app_name": "LogonUI",
"delete_after": 偽
},
"host_scripts": ["http://monitor.syn [.]cn/rss. php"]、
"referer": "https://www.facebook.com/",
"user_agent": "SiteBar/3.3.8 (ブックマークサーバー; http://sitebar.org/) ",
"key_id": "P4BNZR0",
"enable_autoload": 偽
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | { "first_run_delay": 0, "キー": { "aes": "KIjbzZ/ZxdE5KD2XosXqIbEdrCxy3mqDSSLWJ7BFk3o =", 「aes_iv」: 「cleUKIi + mAVSKL27O4J/UQ = =」 }, "autoload_settings": { "exe_name": "LogonUI", "app_name": "LogonUI", "delete_after":偽 }, "host_scripts": ["http://monitor.syn [.]cn/rss. php"]、 "referer": "https://www.facebook.com/", "user_agent": "SiteBar/3.3.8 (ブックマークサーバー;http://sitebar.org/) ", "key_id": "P4BNZR0", "enable_autoload":偽 } |
[フォーマット時間: 0.0023 秒]
この構成オブジェクトは、マルウェア自体に関する手がかりとインジケーターの数を提供します。このデータが特定された後、最初からマルウェアの実行のトレースを開始します。マルウェアが最初に実行されると、どのオペレーティングシステムが実行されているかが判断されます。それは、Windows 以外のシステム上で実行されている場合, 我々は悪名高い ' forkmeiamfamous ' メソッドへの呼び出しを参照してください. このメソッドは、いくつかの Unix 固有の設定を構成し、プロセスをフォークする役割を担います。
図 6。マルウェアの主な実行
続いて、我々は、このマルウェアは、次のいずれかの技術を使用して永続化する能力を持っていることを発見:
- PowerShell による永続性
- 実行レジストリキーによる永続性
- スタートアップディレクトリに格納されたファイルを使用した永続性
マルウェアは、JSON 構成で参照されるファイル名に自身をコピーします。
図 7。永続化のテクニック
マルウェアがインストールされると、ネットワーク要求の作成が始まります。すべてのネットワーク通信は、この特定のサンプルに対して HTTP 経由で実行されます。ただし、HTTPS もサポートしているように見えます。マルウェアが最初の送信接続を行うと、特定の Cookie 値が使用されます。
図 8。最初の HTTP 要求の作成
実際には、この Cookie 値には暗号化されたデータが含まれます。base64 でエンコードされたデータは、Cookie の値から解析します (必要に応じてパディングが追加されます)。
EBJhZTlKiqN8nYWejKh7UpDycPlcrGMEcTE =
結果のデコードされたデータを以下に示します。
\x10\x12ae9J\x8a\xa3 | \x9d\x85\x9e\x8c\xa8{R\x90\xf2p\xf9\\\xacc\x04q1
基になるデータには、次の特性があります。
図 9。クッキーデータ構造
XORing 2 番目の文字に対して最初の1文字を指定すると、ランダムな文字列の長さが識別されます。上記の例を使用して、次のようになります。
最初の文字: ' \x10 '
2番目の文字: ' \x12 '
文字列の長さ (16 ^ 18): 2
ランダムな文字列: ' ae '
暗号化されたデータ: ' 9J \ x8a \ xa3 | \x9d\x85\x9e\x8c\xa8{R\x90\xf2p\xf9\\\xacc\x04q1 ′
最後に、暗号化されたデータは RC4 アルゴリズムを使用して暗号化します。キーは、以前に使用したランダムな文字列を新しいものと連結し、このデータの SHA1 ハッシュを取得することによって生成されます。
この同じキーは、サーバーによって提供される応答データの復号化に使用されます。サーバーは HTML ページを模倣し、次に示すように、応答内に base64 でエンコードされたデータを提供しようとします。
図 10。サーバーの応答
HTML 応答のタグ内で見つかったデータが結合され、空白が削除されます。このデータは、以前に説明したキーを使用して RC4 を介して復号化される前に、追加の文字 ('-_ ') で base64 デコードされます。復号化が行われると、キー生成で使用される前のランダムな文字列がランダムな文字列で更新されます。これにより、攻撃者は、前のセッションを見なくても個々の HTTP セッションを復号化できないことを保証しました。復号化されたデータが適切な JSON データを生成しない場合、Seaduke はそれを破棄し、スリープサイクルを入力します。
それ以外の場合、この JSON データはコマンドに対して解析されます。Seaduke では、次のコマンドが識別されています。
コマンド | 説明 |
cd | 作業ディレクトリを指定された1つに変更 |
pwd | 現在の作業ディレクトリを返す |
Cdt | 作業ディレクトリを% TEMP% に変更します |
Autoload | 特定の場所にマルウェアをインストールする |
移行 | プロセスの移行 |
clone_time | クローン・ファイルのタイムスタンプ情報 |
ダウンロード | ファイルをダウンロードします。 |
execw | コマンドの実行 |
取得 | ファイルに関する情報を取得する |
アップロード | 指定した URL にファイルをアップロード |
b64encode | ファイルデータを Base64 エンコードし、結果を返す |
Eval | Python コードの実行 |
set_update_interval | メインネットワーク要求間でのスリープタイマの更新 |
self_exit | マルウェアの終了 |
切腹 | マルウェアを終了およびアンインストールする |
' self_exit ' または ' 切腹 ' コマンドが適切に実行されるためには、攻撃者は ' YESIAMSURE ' の2次引数を指定する必要があります。
結論
全体的に、Seaduke は非常に洗練されています。Python で書かれている間、マルウェアは、ネットワーク上でデータを暗号化し、被害者のマシン上で永続化するための興味深いテクニックの数を採用しています。山火事のお客様は、この脅威から保護されます。さらに、パロアルトネットワークは、Seaduke が使用する URL を悪質として適切に分類します。