はじめに
NICT では,昨年5月頃より,NanoCore と呼ばれる RAT の C2 サーバの追跡やオペレータの誘引実験および行動分析を行っていました.本ブログでは,誘引実験の際に行った NanoCore の解析とオペレータの誘引実験の結果について共有します.
- NanoCore について
- NanoCore の解析(通信の復号と読み方について)
- 構成情報の抽出
- サーバとクライアント間の通信フロー
- NanoCore プラグイン
- C2サーバの稼働状況
- NanoCore オペレータの行動
なお,本ブログの内容は,Botconf20201,JSAC20212 で発表しております.
NanoCore について
NanoCore は,2013年に初めて登場した Remote Access Trojan(RAT)で,2021年現在でも未だに攻撃に使用されています.NanoCore には,画面共有,ファイルやパスワードの窃取,キーロガーなど,50 種類以上の機能が搭載されています.
現在最も使用されているバージョンは,NanoCore v1.2.2.0(図1)です.このバージョンは,DarkWeb 等にクラック版が既にリークされており,比較的簡単に入手することが可能です.今回は,このバージョンを対象に解析等を行いました.
NanoCore の解析(通信の復号と読み方について)
復号に使用する鍵の生成処理
NanoCore の通信や構成情報などのデータは,DES で暗号化されてます. 復号に使用する DES の Key と IV は,別の方式で暗号化された状態で格納されています.
まずは,DES Key/IV の復号方法について説明します. 暗号化された DES Key/IV は,図2 のようにリソースセクションに格納されており,Rijndael で暗号化されています.
Rijndael の復号に使用する Key/IV は,GUID を使って生成されます. GUID は,NanoCore Client 毎に設定されており,値は毎回異なります(図3).
GUID は,図4 のように PBKDF2(RFC2892)の Password と Salt に使用されます.PBKDF2 で Rijndael Key/IV を生成し,DES の Key/IV を復号します.
図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 のようになります.
復号後のデータの読み方
復号後のデータの構成について説明します.構成は,大きく分けて 3 パターンあります.
-
パターン 1(圧縮なし,プラグイン指定なし)
- 1 バイト目は,圧縮の有無を示すフラグです.0x00 の場合,データは圧縮されていません.
- 4 バイト目は,プラグインの使用の有無を示すフラグです.0x00 の場合,プラグインは使用されていません.
- 5 バイト目以降は,型番号,データの順に格納されます.型番号は,表1 の通りに変換されます.
-
パターン 2(圧縮なし,プラグイン指定あり)
- 1 バイト目は,圧縮の有無を示すフラグです.0x00 の場合,データは圧縮されていません.
- 4 バイト目は,プラグインの使用の有無を示すフラグです.0x01 の場合,プラグインが使用されています.
- 5 ~ 20 バイト目は,GUID であり,プラグインの識別に使用されます.GUID と対応するプラグインの種別は,表2 の通りです.
- 21 バイト目以降は,型番号,データの順に格納されます.型番号は,表1 の通りに変換されます.
-
パターン 3(圧縮あり)
- 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のような構成情報を抽出できます.
サーバとクライアント間の通信フロー
NanoCore C2 サーバとクライアント間の通信フローは,図12 の通りです.ただし,プラグインの有無によって動作が異なる場合があります.
- 初回通信
- GUID(
HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid
の値が送信される) - Identity(HostName\UserName)
- Group(Default)
- Version(1.2.2.0)
- GUID(
- プラグインの DLL のダウンロード
(C:\Users\<UserName>\AppData\Roaming\<GUID>\storage.dat
に暗号化された状態で保存される) - 感染端末情報の送信(CorePlugin)
- Role(Admin/User)
- OS Name
- OS Bits(64bit/32bit)
- Build Time
- Install Time
- File Name
- File Bits(64bit/32bit)
- セキュリティ設定の送信(SecurityPlugin)
- Anti-Virus
- Anti-Spyware
- Firewall
- ウィンドウ名の送信(定期的に送信される)
- IdleTime
- Window Name
NanoCore プラグイン
NanoCore のプラグインは,サーバアプリケーションの Plugins フォルダ以下に格納されています(図13).各ファイルは,別の方式で暗号化されています.
プラグインの DLL 抽出
NanoCore のサーバアプリケーションは,起動時に暗号化された DLL を復号してロードします.NanoCore プラグイン関連のDLLは,Assembly.Load() でロードされます.図14 のように Breakpoint を置き,メモリダンプを取ると DLL を抽出することができます.
今回の解析の場合は,図15 のような 32 個のファイルを抽出することができました.
抽出されたファイルのほとんどは,NanoCore プラグイン用に DLL でした.図16 のように各 DLL は,サーバ用とクライアント用のものに分かれています.クライアント用の DLL は,NanoCore 感染後にクライアントに対して送信されます.
プラグインの保存先
NanoCore に感染すると,C:\Users\<UserName>\AppData\Roaming\<GUID>\
にいくつかのファイルが生成されます.
プラグインは,storage.dat
に暗号化された状態で保存されます.DES で復号すると,図18 のようになり,BYTEARRAY 型でPEファイルが格納されていることが分かります.
図19 は,storage.dat
の BYTEARRAY を抽出した結果です.図15 で確認できた DLL と同様です.
各プラグインには,GUID が割り当てられており,図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 に示します.
-
C2 サーバの稼働時間
図23 は,サーバの死活監視を行い,1 時間毎にまとめたグラフです.NanoCore C2 サーバは,9:00 ~ 18:00(UTC)に多く稼働していることが分かります.
NanoCore オペレータの行動
STARDUST を用いた実験
NanoCore を利用するオペレータが侵入後にどのような動作をするのかを観測するために,STARDUST を用いたオペレータの誘引実験を行いました.
解析には,サイバー攻撃誘引基盤である STARDUST3 を使用しました.図24 の環境を STARDUST ネットワーク上に構築し,侵入してきたオペレータの行動を分析しました.
分析のために,NanoCore 専用のプロキシを用意し,オペレータのコマンドを常に監視できるような状態で解析を行いました.実験は,以下の手順で行っています.
- NanoCore 解析専用のクライアントをビルドし,解析環境上で動作させておく.
- スキャンで検出した C2 サーバすべてに接続し,コマンド待ち状態に遷移させておく.
- オペレータによるコマンドを受信したら,そのコマンドを解析環境上のクライアントにリダイレクトさせる.
実験結果
今回の実験では,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次感染に使用されたマルウェア
-
分類できたマルウェア
-
分類できなかったマルウェア
- マルウェア1(ワーム)
- autorun.inf を使って拡散する.
- 正規の実行ファイルを改ざんし,ワーム経由で起動するようにする.
- マルウェア2
taskkill /f /im svchost.exe を実行するだけ?
- マルウェア1(ワーム)
使用されたツール
- 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$ から始まるプロセス名を隠蔽する