NanoCore の解析とオペレータの行動分析

はじめに

NICT では,昨年5月頃より,NanoCore と呼ばれる RAT の C2 サーバの追跡やオペレータの誘引実験および行動分析を行っていました.本ブログでは,誘引実験の際に行った NanoCore の解析とオペレータの誘引実験の結果について共有します.

なお,本ブログの内容は,Botconf20201,JSAC20212 で発表しております.

NanoCore について

NanoCore は,2013年に初めて登場した Remote Access Trojan(RAT)で,2021年現在でも未だに攻撃に使用されています.NanoCore には,画面共有,ファイルやパスワードの窃取,キーロガーなど,50 種類以上の機能が搭載されています.

現在最も使用されているバージョンは,NanoCore v1.2.2.0(図1)です.このバージョンは,DarkWeb 等にクラック版が既にリークされており,比較的簡単に入手することが可能です.今回は,このバージョンを対象に解析等を行いました.

/posts/2021-01/images/nanocore.png

図1. NanoCore v1.2.2.0 の外観

NanoCore の解析(通信の復号と読み方について)

復号に使用する鍵の生成処理

NanoCore の通信や構成情報などのデータは,DES で暗号化されてます. 復号に使用する DES の Key と IV は,別の方式で暗号化された状態で格納されています.

まずは,DES Key/IV の復号方法について説明します. 暗号化された DES Key/IV は,図2 のようにリソースセクションに格納されており,Rijndael で暗号化されています.

/posts/2021-01/images/nanocore_encrypted_key.png

図2. 暗号化されたDES key/IV の格納場所

Rijndael の復号に使用する Key/IV は,GUID を使って生成されます. GUID は,NanoCore Client 毎に設定されており,値は毎回異なります(図3).

/posts/2021-01/images/nanocore_guid.png

図3. Rijndael Key/IV の生成に使用する GUID

GUID は,図4 のように PBKDF2(RFC2892)の Password と Salt に使用されます.PBKDF2 で Rijndael Key/IV を生成し,DES の Key/IV を復号します.

/posts/2021-01/images/nanocore_create_aes_key_iv.png

図4. DES Key/IV の復号処理

図5 のように復号した DES Key および IV は,共に同じ値が使用されます.

/posts/2021-01/images/nanocore_cipher.png

図5. DES の初期化処理(KeyとIVは共通の値が使用される)

我々が解析した NanoCore は,GUID や 暗号化された DES Key/IV の値が毎回異なるものの,最終的に復号される DES Key/IV はすべて共通で 72 20 18 78 8c 29 48 97 が使用されていました.

暗号化されたデータの復号

NanoCore の初回通信を例に復号方法について説明します.初めの4バイトは,データサイズを意味し,その後に続くデータが DES で暗号化されています.図6 の場合,56 byte のデータが暗号化されています.復号すると,図7 のようになります.

/posts/2021-01/images/nanocore_initial_communication.png

図6. NanoCore の初回通信

/posts/2021-01/images/des_decrypted_data.png

図7. DES 復号後のデータ

復号後のデータの読み方

復号後のデータの構成について説明します.構成は,大きく分けて 3 パターンあります.

  • パターン 1(圧縮なし,プラグイン指定なし)

    /posts/2021-01/images/decrypted_data_pattern_1.png

    図8. パターン1(NanoCore の初回通信)

    • 1 バイト目は,圧縮の有無を示すフラグです.0x00 の場合,データは圧縮されていません.
    • 4 バイト目は,プラグインの使用の有無を示すフラグです.0x00 の場合,プラグインは使用されていません.
    • 5 バイト目以降は,型番号,データの順に格納されます.型番号は,表1 の通りに変換されます.
  • パターン 2(圧縮なし,プラグイン指定あり)

    /posts/2021-01/images/decrypted_data_pattern_2.png

    図9. パターン2(ウィンドウ名の送信)

    • 1 バイト目は,圧縮の有無を示すフラグです.0x00 の場合,データは圧縮されていません.
    • 4 バイト目は,プラグインの使用の有無を示すフラグです.0x01 の場合,プラグインが使用されています.
    • 5 ~ 20 バイト目は,GUID であり,プラグインの識別に使用されます.GUID と対応するプラグインの種別は,表2 の通りです.
    • 21 バイト目以降は,型番号,データの順に格納されます.型番号は,表1 の通りに変換されます.
  • パターン 3(圧縮あり)

    /posts/2021-01/images/decrypted_data_pattern_3.png

    図10. パターン3(プラグインの DLL のダウンロード)

    • 1 バイト目は,圧縮の有無を示すフラグです.0x01 の場合,データが Raw Deflate で圧縮されています.
    • 2 ~ 5バイト目は,展開後のデータサイズが格納されています.
    • 6 バイト目以降のデータが,Raw Deflate で圧縮されています.展開後の構成は,パターン1,2と同様です.

表1. 型変換テーブル

型番号
0x00 bool
0x01 byte
0x02 byte[]
0x03 char
0x04 char[]
0x05 decimal
0x06 double
0x07 int
0x08 long
0x09 sbyte
0x0a short
0x0b float
0x0c string
0x0d uint
0x0e ulong
0x0f ushort
0x10 DateTime
0x11 string[]
0x12 Guid
0x13 Size
0x14 Rectangle
0x15 Version

表2. プラグイン対応表

GUID Plugin Name
d4466edc-d84f-f2d0-8dce-eb4345fd8569 Core Plugin
8e554d9c-a2bd-1b48-e703-c5704de5a7d8 Management Plugin
d0aba983-d188-e5d9-03fa-ea3df4ea994d Misc Tools
94caa1be-766d-6a44-a7be-3d14688fc136 NanoBrowser
46dba22e-b7d5-7204-7d2c-b8de9e767095 NanoCoreSwiss
bb1cf52d-d82c-72d9-c259-5c1cb3155589 NanoNana
a42871f1-7588-a24a-6543-93866f7d582d NanoStress
00592cb9-e09a-3d31-3c36-119998044e3d Network Plugin
5ff5348d-4be5-ff14-57a4-ee5f523ee6b3 Security Plugin
2441ccc7-e521-6225-4a86-bbbd0ea9b98f SurveillanceEx Plugin
c0ef879c-365c-dde4-7b37-20a8972cbbfb Surveillance Plugin
83d05a36-970f-6690-ed4b-27b89b03c077 Tools Plugin

構成情報の抽出

NanoCore の構成情報は,図2 のようにリソースセクションに格納されています.DESで復号し,Raw Deflate で圧縮されたデータを展開すれば,図11のような構成情報を抽出できます.

/posts/2021-01/images/nanocore_settings.png

図11. 抽出した NanoCore の構成情報

サーバとクライアント間の通信フロー

NanoCore C2 サーバとクライアント間の通信フローは,図12 の通りです.ただし,プラグインの有無によって動作が異なる場合があります.

/posts/2021-01/images/nanocore_flow.png

図12. NanoCore C2 サーバとクライアント間の通信フロー

  1. 初回通信
    • GUID(HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid の値が送信される)
    • Identity(HostName\UserName)
    • Group(Default)
    • Version(1.2.2.0)
  2. プラグインの DLL のダウンロード
    C:\Users\<UserName>\AppData\Roaming\<GUID>\storage.dat に暗号化された状態で保存される)
  3. 感染端末情報の送信(CorePlugin)
    • Role(Admin/User)
    • OS Name
    • OS Bits(64bit/32bit)
    • Build Time
    • Install Time
    • File Name
    • File Bits(64bit/32bit)
  4. セキュリティ設定の送信(SecurityPlugin)
    • Anti-Virus
    • Anti-Spyware
    • Firewall
  5. ウィンドウ名の送信(定期的に送信される)
    • IdleTime
    • Window Name

NanoCore プラグイン

NanoCore のプラグインは,サーバアプリケーションの Plugins フォルダ以下に格納されています(図13).各ファイルは,別の方式で暗号化されています.

/posts/2021-01/images/ncp_files.png

図13. NanoCore プラグイン(別の方式で暗号化されている)

プラグインの DLL 抽出

NanoCore のサーバアプリケーションは,起動時に暗号化された DLL を復号してロードします.NanoCore プラグイン関連のDLLは,Assembly.Load() でロードされます.図14 のように Breakpoint を置き,メモリダンプを取ると DLL を抽出することができます.

/posts/2021-01/images/server_dump_dll.png

図14. メモリダンプからDLLを抽出する

今回の解析の場合は,図15 のような 32 個のファイルを抽出することができました.

/posts/2021-01/images/server_dll_list.png

図15. 抽出された 32 個のファイル

抽出されたファイルのほとんどは,NanoCore プラグイン用に DLL でした.図16 のように各 DLL は,サーバ用とクライアント用のものに分かれています.クライアント用の DLL は,NanoCore 感染後にクライアントに対して送信されます.

/posts/2021-01/images/nanocore_plugins.png

図16. ファイル名とバージョン

プラグインの保存先

NanoCore に感染すると,C:\Users\<UserName>\AppData\Roaming\<GUID>\ にいくつかのファイルが生成されます.

/posts/2021-01/images/nanocore_drop_files.png

図17. NanoCore 感染後に生成されるファイル(例)

プラグインは,storage.dat に暗号化された状態で保存されます.DES で復号すると,図18 のようになり,BYTEARRAY 型でPEファイルが格納されていることが分かります.

/posts/2021-01/images/nanocore_storage_dat.png

図18. storage.dat の復号結果の一部

図19 は,storage.dat の BYTEARRAY を抽出した結果です.図15 で確認できた DLL と同様です.

/posts/2021-01/images/storage_dat_dump_dlls.png

図19. storage.dat から抽出された DLL

各プラグインには,GUID が割り当てられており,図20 のように catalog.dat で管理されます.

/posts/2021-01/images/nanocore_catalog_dat.png

図20. catalog.dat の復号結果の一部

C2 サーバの稼働状況

我々は,前節で述べた NanoCore の解析結果を基に C2 サーバを検出する専用のスキャナを作成しました.これを用いて NanoCore C2 サーバの検知および長期観測を行いました.2020年05月14日 ~ 2020年11月10日の長期観測結果について共有します.

  • 検知した NanoCore C2 サーバ数

    • ユニークなIPアドレス数: 2,075
    • ポート別: 3,671(1つのホストにつき複数のポートで待ち受けている場合がある)
  • 国別の C2 サーバの分布

    全部で 85 カ国に C2 サーバがホスティングされていました.特にアメリカとヨーロッパに多く見られました.NanoCore C2 サーバの分布と上位10カ国について,図21,図22 に示します.

    /posts/2021-01/images/hosting_country.png

    図21. NanoCore C2 サーバの分布

    /posts/2021-01/images/top10_country.png

    図22. NanoCore C2 サーバの分布(上位 10 か国,全体の約 75 %)

  • C2 サーバの稼働時間

    図23 は,サーバの死活監視を行い,1 時間毎にまとめたグラフです.NanoCore C2 サーバは,9:00 ~ 18:00(UTC)に多く稼働していることが分かります.

    /posts/2021-01/images/c2_server_times.png

    図23. NanoCore C2 サーバの稼働時間(1時間毎のオープンポート数の合計)

NanoCore オペレータの行動

STARDUST を用いた実験

NanoCore を利用するオペレータが侵入後にどのような動作をするのかを観測するために,STARDUST を用いたオペレータの誘引実験を行いました.

解析には,サイバー攻撃誘引基盤である STARDUST3 を使用しました.図24 の環境を STARDUST ネットワーク上に構築し,侵入してきたオペレータの行動を分析しました.

/posts/2021-01/images/analysis_env.png

図24. 実験環境の全体構成

分析のために,NanoCore 専用のプロキシを用意し,オペレータのコマンドを常に監視できるような状態で解析を行いました.実験は,以下の手順で行っています.

  1. NanoCore 解析専用のクライアントをビルドし,解析環境上で動作させておく.
  2. スキャンで検出した C2 サーバすべてに接続し,コマンド待ち状態に遷移させておく.
  3. オペレータによるコマンドを受信したら,そのコマンドを解析環境上のクライアントにリダイレクトさせる.

実験結果

今回の実験では,88人のオペレータによる侵入を確認しました.53人のオペレータは,アカウント情報やファイルの窃取など,1 つ以上の目的を達成していました.一方 35人のオペレータは,ほとんど何もせずに去ってしまっていました.

1 つ以上の目的を達成していた 53 人のオペレータによる主な行動を分類しました.

  • ユーザの偵察

    • 閲覧履歴やブックマーク,メールの受信トレイの確認(21人)
    • デスクトップ,ドキュメント,共有フォルダなどの確認(24人)
  • メールアカウント,パスワード,ファイルの窃取

    • メールアカウントやパスワードの窃取(37人)
    • ファイルの窃取(8人)
  • バックドアの設置

    • NanoCore 以外のマルウェアへの感染(12人)

多くのオペレータは,ユーザの偵察を行い,自分にとって有用なユーザであるかを確認しているようでした.また,メールのアカウント情報やパスワードの窃取が多く,これらが主な侵入目的であると考えられます.一部のオペレータは,侵入後に NanoCore 以外のマルウェアに感染させていました.NanoCore に感染してしまった場合,別のマルウェアにも感染してしまっている可能性があります.

なお,今回の実験で確認できたオペレータの侵入後の行動,2次感染に使用されたマルウェア,使用されたツール,使用されたテクニックについては,付録に記載しています.

次に,今回の実験で観測したほとんど何もせずに去ってしまったオペレータについて考えられる原因をまとめました.

  • 原因1: オペレータにとって有用でないユーザだと判断された可能性がある

    • メールやブラウザの閲覧履歴の確認

      • 空であった場合にすぐに立ち去ってしまうオペレータを確認した.
      • 有用でないユーザだと判断された可能性がある.
    • 動作環境のチェック

      • systeminfo コマンドを使用した環境のチェックや特定の OS でしか動作しないマルウェアが実行されたケースを確認した.
      • オペレータに解析環境だと気づかれた可能性がある.
  • 原因2: そもそも日本はターゲットでなかった可能性がある

    • 日本語環境に戸惑っているオペレータを何人か確認した.

      • OS の言語設定の変更を試みるが,結局変更できずに立ち去ってしまった.
      • 侵入後,内部からメールの送信を試みたが,JIS キーボードであったため,メールアドレスの「@」が入力できず,立ち去ってしまった.
    • C2 サーバの主な稼働時間が日本時間と異なる

      • 最も多く稼働していた時間帯は,18:00 ~ 3:00(UTC+9)でした.
      • 今回の実験は,平日の 9:00~18:00(UTC+9)の間に行っていました.

今後,同様の実験を行う場合,より長い時間活動してもらえるような環境に調整していく必要があります.

おわりに

NanoCore は,比較的容易に入手でき,多数の機能が搭載されているため,今でも攻撃者に使用されています.SPAM メールとして,NanoCore が添付されたメールが届く場合がありますので,ご注意ください.
NanoCore オペレータの誘引実験の際に作成した NanoCore 解析用のツールを GitHub に公開していますので,解析する際にご活用ください.また,NICT で観測した NanoCore C2 サーバの IoC 情報を CIRCL MISP Community 内で共有しています.

更新履歴

  • 2021年02月19日 初版

付録

オペレータの侵入後の行動

  • メール
    • Outlook を開く
    • 受信トレイを確認する
    • 送信済みアイテムを確認する
    • 下書きを確認する
    • ユーザのアカウント情報を確認する
    • 特定のメールを検索する
    • メールの送信を試みる
  • ブラウザ
    • Chrome や Internet Explorer を開く
    • Google アカウントへのログイン状況を確認する
    • 言語設定を英語に変更する
    • ブックマークを確認する
    • ブックマークされたページを開く
    • 特定のページを開く(PayPal,Alibaba,xvideos など)
    • 閲覧履歴を確認する
    • 特定のツールをダウンロードする
    • よくアクセスするページや最近閉じたタブを確認する
  • 権限昇格
    • 管理者権限を要求する
  • ファイルアクセス
    • デスクトップ上のファイルやフォルダを開く
    • 最近表示した場所を開く
    • ファイルを圧縮する
    • ネットワークドライブを確認する
    • ファイルを C2 サーバにアップロードする(最大で 221 個のファイルが窃取された)
    • 他のマルウェアを実行する
    • NanoCore クライアントを更新する
    • NanoCore クライアントをアンインストールする
    • スタートメニューからアプリやファイルを検索する
  • アカウント情報
    • ブラウザに登録されたパスワードを窃取する
    • メーラーに登録されたアカウント情報を窃取する
    • タスクバーのネットワークアイコンから通信状況を確認する
    • コントロールパネルのネットワークと共有センターを確認する
  • コマンド
    • ipconfig,net view コマンドを実行する
    • systeminfo コマンドを実行する
  • その他
    • NjRAT チャット機能で話しかけてくる
    • 操作できないようにするために画面をロックする

2次感染に使用されたマルウェア

  • 分類できたマルウェア

    • AsyncRAT4
    • LimeRAT5
    • Lokibot
    • Morphine
    • NetWire
    • NjRAT
    • Orcus
    • Remcos
    • VenomRAT6
  • 分類できなかったマルウェア

    • マルウェア1(ワーム)
      • autorun.inf を使って拡散する.
      • 正規の実行ファイルを改ざんし,ワーム経由で起動するようにする.
    • マルウェア2
      taskkill /f /im svchost.exe を実行するだけ?

使用されたツール

  • Disable-Windows-Defender7
  • Chrome-Password-Recovery8
  • LastActivityView9
  • Mail PassView10(NanoCore プラグインに組み込まれている)
  • WebBrowserView11(NanoCore プラグインに組み込まれている)
  • AnyDesk12
  • TeamViewer13

使用されたテクニック

  • Microsoft AMSI(Antimalware Scan Interface) Bypass14
    amsi.dll の AmsiScanBuffer にスキャンをバイパスするようにパッチを当てる
  • プロセス名の隠蔽
    taskmgr.exe にインジェクションし,asz$ から始まるプロセス名を隠蔽する

  1. Botconf: The Botnet Fighting Conference ↩︎

  2. JSAC: Japan Security Analyst Conference ↩︎

  3. サイバー攻撃誘引基盤"STARDUST"を開発 ↩︎

  4. GitHub - NYAN-x-CAT/AsyncRAT-C-Sharp ↩︎

  5. GitHub - NYAN-x-CAT/Lime-RAT ↩︎

  6. GitHub - mirkoBastianini/Quasar-RATの亜種 ↩︎

  7. GitHub - NYAN-x-CAT/Disable-Windows-Defender ↩︎

  8. GitHub - 0xfd3/Chrome-Password-Recovery ↩︎

  9. LastActivityView ↩︎

  10. Mail PassView ↩︎

  11. WebBrowserPassView ↩︎

  12. AnyDesk ↩︎

  13. TeamViewer ↩︎

  14. GitHub - rasta-mouse/msiScanBufferBypass/blob/master/ASBBypass/Program.cs(類似コード) ↩︎