Ayumu's I/O

ねだるな勝ち取れ、さすれば与えられん

Trickbot(Ver1000102)を解析してみる

マルウェア解析が趣味のあゆむです。今回はWindows7(64bit)環境下でTrickbotを解析したので、その結果をお伝えします。検体/ログ解析時の種類特定にお役立てください。モジュールの解析までは行っていませんのであしからず。

Trickbotとは

オンラインバンキングマルウェアです。Trickbotの主なターゲットは海外で日本にはあまりばら撒かれていない印象を受けます。
Trickbotは、ウェブインジェクション機能やURLリダイレクション機能などを持っています。たとえば、感染した状態でユーザが銀行のサイトなどにアクセスしようとすると、サイトに不正なコードが挿入されて入力した情報が盗まれるという被害が起こりえます。
主な感染経路はメールによるものです。メールに添付されたファイルを開いて感染するケースや脆弱な環境下で悪意のあるサイトに誘導される形で感染するケースがほとんどのようです。
Trickbotの更新はとても盛んで、バージョンアップして動作が変わったり、新たな機能を有するモジュールをダウンロードするようになったりと日々進化しています。執筆現在(12/23)の最新バージョンは1000108です。

検体情報

解析した検体は、2017年12月13日にばら撒かれたTrickbotです。メールに添付されたDocファイルを開くとTrickbotがダウンロードされて感染するという流れです。

Docfile

MD5 5a69998c829e08486b27ad16182f451e
SHA256 ee468a25416ad9f812198dbfb0f389fcdaf6326d1267625e921e7048bc37a9ee

TrickBot(Packed)

FileName nyRhdkwSD.exe / oySielwTD.exe
MD5 8b607501725d998c14f6a34eb4e8dc3e
SHA256 d27ea2a862848c82b7726584c6e66e41cb4988e3e92a42391d85d24fbe4e3d9c
Version(ver) 1000102
GroupTag(gtag) mac1

解析結果

概要

Trickbotは、パックされており本体が動作するまでに4つのステップがあります。下図をご覧ください。最初に実行されるファイルは「nyRhdkwSD.exe」です。これを実行すると、Process Hollowingという手法を用いて、新たに作成した自身のプロセスにコードを注入します(下図1-1)。次に実行元のファイルを別の場所へコピーします(下図2-1)。また、自動実行の設定をタスクスケジューラに登録します(下図2-2)。そして、再度Process Hollowing(下図3-1)とタスクの登録試行(下図4-2)を行い、正規のプログラムsvchost.exeへTrickbotを注入します(下図4-1)。以降では、これらをステップごとに解説します。
f:id:aes256:20171223190750p:plain

内容

1st Step

まず、デバッガで開くと、CreateWindowExA関数がたくさん呼び出されていることがわかります。これらは、解析妨害のために挿入されているようで、ブレイクポイントを設定しても一度も呼び出されません。引数もすべて0で呼び出す気がないです。
f:id:aes256:20171222185237p:plain:w300
f:id:aes256:20171222185251p:plain

実行すると、Process Hollowingを行います。自身をサスペンド状態でプロセス生成し、中身をアンマップ(空洞化)して、新たなコードを注入します。そして、エントリーポイントを書き換えて、スレッドを動作させます。このテクニックはよくある手法でDreamBotでも使われています。
f:id:aes256:20171223221920p:plain
f:id:aes256:20171222190133p:plain

なお、Process Hollowing実行時に呼ばれる関数のアドレスはスタック上に展開されます。
f:id:aes256:20171222190156p:plain

2nd Step

スレッドの動作が始まると注入されたコードが実行され、主にファイルのコピーとタスクスケジューラへの登録を行います。

まず、「%APPDATA%/AppData/Roaming/」に「services」というフォルダを作成します。CopyFileW関数を用いて、実行元のファイル(8b607501725d998c14f6a34eb4e8dc3e)をコピーします。当該解析環境では「oySielwTD.exe」という名前にリネームされて配置されました。
f:id:aes256:20171223162828p:plain

さらに、タスクスケジューラへ次の内容で自動実行の登録を行います。ログオン時または登録時点から3分ごとにプログラムが実行されます。
f:id:aes256:20171222190824p:plain

名前 services update
説明 Look for services monitor.
トリガー 複数のトリガーの定義(任意のユーザのログオン時。毎日hh:mmに起動、トリガーされた後、1日間の間、00:03:00ごとに繰り返す。)
操作 プログラムの開始 C:\Users\■■■\AppData\Roaming\services\oySielwTD.exe
3rd Step

タスクスケジューラによってプログラムが実行されます。このときの動作は1st Stepと同一のもので、再度Process Hollowingが行われます。
f:id:aes256:20171223222441p:plain

4th Step

スレッドの動作が始まると注入されたコードが実行され、2nd Stepと途中まで同一の動作をします。この段階では、主にタスクスケジューラへの登録試行とTrickbotの展開、svchost.exeへの注入が行われます。

詳細を解析していませんが、svchost.exeへの注入もProcess Hollowingによって行われていると思われます。CreateProcessW関数を用いてsvchost.exe(64bit)のプロセスをサスペンド状態で作成します。
f:id:aes256:20171223222504p:plain

なお、一連の動作終了後の「oySielwTD.exe」のヒープ領域には、Trickbot(64bit)が展開されています。マジックナンバー0x4D 0x5A(MZ)が確認できます。
f:id:aes256:20171222191340p:plain:w300

Trickbot

Trickbotが注入されたsvchost.exeが動作すると、まず、「%APPDATA%/AppData/Roaming/」に新たにファイルとフォルダを作成します。この動作は繰り返されるようで、削除しても当該svchost.exeが動作している間は再度生成されます。
f:id:aes256:20171222192407p:plain
Modulesフォルダには、モジュールをダウンロードして配置します。client_id、group_tagの中身は下図をご覧ください。黒塗りにしていますが、client_idは感染端末のユーザ名から始まり、Windowsバージョンと乱数で構成されています。
f:id:aes256:20171222193107p:plain

外部のサービスと通信して感染端末のグローバルIPアドレスを確認します。User-AgentがChromeとなっていますが、確認したところ感染端末にインストールされているChromeのバージョンと異なっていました。
f:id:aes256:20171223095034p:plain
f:id:aes256:20171223165157p:plain

C2サーバとのC2通信が発生します。
f:id:aes256:20171222192651p:plain
残念ながら解析時点では接続できませんでした。Trickbotは基本的にHTTPS通信を行うようです。
f:id:aes256:20171223145144p:plain

なお、おとりC2サーバを用意して通信させてみた結果、次のリクエストを投げていることがわかりました。「/5/spk/」の5はコマンドIDで、C2サーバから何かをダウンロードする際に使われるとのことです。*1
f:id:aes256:20171223163622p:plain

さて、C2サーバのIPアドレスを含むconfigは、Trickbotが注入されたsvchost.exeのメモリのヒープ領域に保持されています。
f:id:aes256:20171222193418p:plain:w300

取り出したデータは次の通りです。ここにTrickbotのバージョンやC2通信先、取得するモジュールのリストが記載されています。

<mcconf>
<ver>1000102</ver>
<gtag>mac1</gtag>
<servs>
<srv>79.106.41.9:449</srv>
<srv>185.21.149.41:449</srv>
<srv>200.111.97.235:449</srv>
<srv>67.209.219.92:449</srv>
<srv>209.205.188.238:449</srv>
<srv>73.252.252.62:449</srv>
<srv>76.16.105.16:449</srv>
<srv>82.202.236.84:443</srv>
<srv>78.155.199.124:443</srv>
<srv>179.43.160.45:443</srv>
<srv>94.250.253.142:443</srv>
<srv>5.200.55.47:443</srv>
<srv>37.60.177.19:443</srv>
<srv>94.250.255.50:443</srv>
<srv>82.146.48.44:443</srv>
<srv>194.87.93.30:443</srv>
<srv>194.87.94.225:443</srv>
<srv>195.62.53.88:443</srv>
<srv>82.146.48.241:443</srv>
<srv>195.88.209.128:443</srv>
<srv>80.87.198.204:443</srv>
<srv>194.87.146.14:443</srv>
<srv>195.133.147.140:443</srv>
<srv>92.53.66.60:443</srv>
<srv>194.87.93.84:443</srv>
<srv>82.202.226.189:443</srv>
<srv>95.154.199.136:443</srv>
</servs>
<autorun>
<module name="systeminfo" ctl="GetSystemInfo"/>
<module name="injectDll"/>
</autorun>
</mcconf>

解析結果は以上です。
今回の解析ではC2サーバと通信ができなかったため、これ以降の分析はしていません。通常は、この後に各種情報を窃取する機能を持ったモジュールがダウンロードするようです。そのうちチャレンジします。