TrickBotの亜種が、この10年近く使われてきたHTTPによるコマンド&コントロール(C2)通信チャネルを、独自のDNSトンネリング方式に置き換えていることが確認されました。この方式では、ビーコンやペイロードを不正な形式のDNSクエリの中に隠して送受信します。
Fortinetの脅威研究チームFortiGuard Labsが7月22日に公開した新たな調査によると、今回のサンプルはこれまでのTrickBotキャンペーンと一致するモジュール構造を持ちながらも、トランスポート層を再設計し、暗号化したデータをDNSパケットに紛れ込ませてパブリックリゾルバへ送る仕組みに変えています。
このマルウェアファミリーの経緯を踏まえると、今回の再設計は注目に値します。感染台数が100万台を超えたことを受けて、Microsoftは2020年に裁判所命令に基づくTrickBotボットネットの摘発を主導し、その後は公にはこのマルウェアファミリーの活動は終息したものと見られていました。しかし今回の亜種は、攻撃者が依然としてこのプラットフォームの改良を続けていることを示しています。
サイバーセキュリティコンサルティング会社Bambenek Consultingの社長を務めるJohn Bambenek氏は、このマルウェアファミリーが生き延びてきた要因は攻撃者側の適応力にあると指摘します。
同氏は「TrickBotは長期にわたり存続してきたマルウェアファミリーであり、それは攻撃者が常に適応を続けてきたからだ」と述べ、今回の報告書で特定されたC2に対するパッシブDNS分析からは広範な悪用活動が確認されており、企業が自社でDNS解決を管理することの重要性を改めて裏付けていると付け加えました。
DNSトンネリングに関する関連記事: 新たなマルウェア「HollowGraph」、Microsoft 365カレンダーを悪用し隠密なC2通信を実現
DNSクエリに埋め込まれた暗号化コマンド
マルウェアは起動すると、外部へのC2通信を通常のドメイン名検索に見せかけ、応答も一見普通のIPアドレスのように装って読み取っていました。
送信チャネルでは、まず各コマンドを1バイトのXORキーで暗号化し、その結果を16進数エンコードした上で、正規のドメイン名に見せかけるために63文字ごとのチャンクに分割してピリオドでつなぎ、最後にこの文字列全体をハードコードされたC2ドメインの先頭に付加していました。
通信には3種類のパケットタイプが使われており、0x30はコマンド要求、0x31はサイズ照会、0x32は応答データをそれぞれ表していました。
受信側の通信は、DNS仕様が1つの応答に複数のIPv4アドレスを含めることを許容している点を悪用していました。TrickBotは、返された各「アドレス」の先頭バイトを順序を示すインデックスとして扱うことで、リゾルバによってシャッフルされた応答を並べ替え、残りの3バイトを生のペイロードとして読み取っていました。
FortiGuardの検証環境では、スループットは毎秒約30.7KBと計測され、1.2MBのファイルを40秒で転送できました。
永続化とモジュール式の実行
永続化にはWindowsのタスクスケジューラが利用されていました。TrickBotは、%AppData%フォルダ名からランダムに選んだ名称と、文字列「autoupdate #」、そしてランダムな数字を組み合わせてタスク名を生成しており、「Wireshark autoupdate #72784」といった名前のエントリが5分おきに実行されていました。
タスク名と実行ファイルのパスは、NTFSの代替データストリーム(ADS)2つに保存されており、これにより次回以降の実行時にも同じスケジュールタスクを再構築でき、重複作成を避けられる仕組みになっていました。
コマンド処理の仕組みは、HTTP時代の設計とほぼ変わっていません。FortiGuardは12種類の応答コマンドを確認しており、その中にはEXEモジュールのダウンロードと実行、rundll32.exe経由でのDLL実行、プロセスホロウイングやプロセスドッペルゲンジングによるプロセスインジェクション、cmd.exeへの匿名パイプを介したPowerShellの実行、メモリ上での生のシェルコード実行などが含まれます。
実行時に復号される文字列や、ハッシュ値によるWindows API解決の仕組みは、静的解析を回避するために設計されたものです。今回のDNSトンネリングへの移行後も、TrickBotを持続的な脅威たらしめてきたモジュール式の機能はそのまま維持されています。
翻訳元: https://www.infosecurity-magazine.com/news/trickbot-dns-tunneling-c2/