- 2024/09/06
- 脅威分析レポート
【脅威分析レポート】Cuckoo Spear 〜APT10に関連する国家レベルの脅威キャンペーン〜
Post by : Cybereason Security Services Team
この脅威分析レポートでは、サイバーリーズンが追跡している、Cuckoo Spearという名の新たに発見された国家レベルの脅威キャンペーンについて詳しく説明します。
本レポートでは、関連する脅威アクターがいかにして被害者のネットワーク上で数年にわたりステルス性を持続させているかについて概説すると共に、Cuckoo Spearで使用される戦略や、防御者がこのような攻撃をいかにして検知し防御できるかを明らかにします。サイバーリーズンは、複数のインシデントを関連付けることにより、Cuckoo SpearとAPT10侵入セット間の結び付きを確認しています。また、当該脅威グループの新しい武器庫と手法に関する新情報も公開しています。
重要なポイント
- 日本企業を標的にした国家支援型の脅威アクター:サイバーリーズンでは、さまざまな日本企業を標的とした脅威キャンペーンの類似した戦術、技術、手順(TTP)を観測しています。製造業、政府関連事業、および産業分野を標的とするこの攻撃は、サイバースパイ活動の一環であると評価されています。
- ステルス的で高度なマルウェアの使用:Cuckoo Spearは、多くの被害者に対して同じマルウェアを使用しています。このマルウェアは、以前LODEINFOと呼ばれていたマルウェアの新バージョンであり、APT10の武器庫に含まれています。
- NOOPLDRとNOOPDOOR:サイバーリーズンはLODEINFOとの類似性を確認しましたが、複数のケースで確認されたマルウェアには、次のような2つの新たな発見がありました。
‒ NOOPLDR(2つの異なる方法を使用:C#言語で書かれたローダーとパーシステンス用のバックドア、およびDLLファイル)
‒ NOOPDOOR(C2サーバーへのローカルネットワーク中継機能を持つDGAベースのC2マルウェア) - パーシステンスの確立:サイバーリーズンでは、一部の被害者のネットワークに2~3年間、関連する脅威アクターが存在していたことを確認しました。
- おびき寄せの手法:潜在的な被害者をおびき寄せるために、これまでさまざまな手法が使われてきましたが、この脅威アクターは最初のアクセスベクターとして主にフィッシングを利用しています。
はじめに
2019年12月以来、過去数年間にわたって、サイバーセキュリティの状況は、LODEINFOマルウェアの出現と進化により、継続的に挑戦を受けてきました。最近の調査では、これらの攻撃の指揮に中国国家が支援している高度持続的脅威(APT)グループ(おそらくAPT10)が関与していることが示唆されています。
また、最近のさらなる調査により、LODEINFOを利用している脅威アクターと、NOOPDOORと呼ばれる新しいマルウェアファミリーとの結び付きが特定されました。サイバーリーズンでは、この脅威キャンペーンを「Cuckoo Spear」と命名しました。
本レポートにおいて、サイバーリーズンのチームは、Cuckoo Spearに関する複数の重要な側面を調査しています。これには次のものが含まれます。
- 高度に洗練されたマルウェアをロードするためにAPT10グループが採用した手法:NOOPDOORおよびNOOPLDRマルウェアの最新バージョンが持つ洗練された機能と戦術、およびその周辺機能を調査しました。
- 脅威アクターの武器庫に関する詳細な調査:最近のインシデント対応活動において、当社のチームは、脅威アクターが導入した最新の武器庫を明らかにした上で、それを慎重に分析しました。高度なリバースエンジニアリング技術を駆使したこの分析により、ステルス侵入、データ流出、パーシステントなアクセスを実現するために設計された高度なツール群が明らかになりました。
- 脅威ハンティングと防御のための戦略:オープンソースのインテリジェンスを活用することで、サイバーリーズンは、企業や組織がこれらのパーシステントな脅威を効果的にハンティングし、それらの脅威から組織を守る方法について実用的なインサイトを提供しています。
脅威アクターの特定
説明 | ||
---|---|---|
被害者 | 国 | 日本 |
インド | ||
台湾 | ||
業種 | 教育機関、政府関連事業、製造業 | |
TTP | 初期感染ベクター | スピアフィッシング |
外部公開型アプリケーションに対するエクスプロイト | ||
例:Array AG、FortiOS/FortiProxy、Proself | ||
手法 | DLLサイドローディング | |
MSBuild | ||
クライアント実行に対するエクスプロイト | ||
例:CVE-2013-3900 | ||
マルウェア | ダウンローダー/ | DOWNIISA |
マルウェアローダー | NOOPLDR | |
バックドア | LODEINFO | |
NOOPDOOR | ||
インフォ | MirrorStealer | |
スティーラー | MSRAStealer | |
ツール | Cobalt Strike |
▲NOOPDOORの背後にいる脅威アクターが利用している侵入セットの特徴
注:サイバーリーズンは、2024年1月初旬、同じ脅威アクターからの複数のハッキング事例に遭遇した後、この記事を書き始めました。脅威アクターは、当時公開されていなかった兵器化されたツールを使用していました。2024年1月22日の週には、Trend MicroとESETによる脅威インテリジェンスレポートが発表され、同様の調査結果が明らかとなりました。
Trend MicroとESETは、JSAC2024において、LODEINFOと新しいバックドアであるNOOPDOORを利用する脅威アクターに関する調査結果を発表しました。複数のキャンペーンで観測された侵入セットから、両社は、このキャンペーンの背後にいる脅威アクターをAPT10に関連するグループであると特定しました。
特に、Trend Microは、この脅威アクターを「Earth Kasha」であると特定しました。サイバーリーズン、ESET、およびTrend Microが観測したキャンペーンにおいて、NOOPDOORの背後にいる脅威アクターは、上記の表に示すような侵入セットを利用していました。
NOOPDOORの背後にいる脅威アクターは、当該キャンペーン中に、LODEINFOを利用しただけでなく、新しいバックドアを利用することで、ハッキングした企業ネットワークからデータを流出させました。こうした行為の背後にある意図は、おそらくスパイ活動です。なぜなら、この脅威アクターは重要なインフラ部門や教育機関を標的としており、多くの場合、これらの業種は情報収集のための標的となるからです。
■APT10
米国防総省によると、APT10は中国国家が支援するタイプの洗練されたサイバースパイグループであり、2006年から活動しているとのことです。情報セキュリティ関係のコミュニティでは、このグループの目的は、関連するターゲットに対する情報を収集することにより、中国の国家安全保障の目標をサポートすることであると広く考えられています。APT10は、多くの場合、通信、製造、各種公共部門など、さまざまな重要インフラ部門を標的とします。
■Cuckoo Spear
サイバーリーズンは、このキャンペーンを「Cuckoo Spear」と名付けました。Cuckoo Spearは、APT10侵入セットに関連があります。なぜなら、脅威アクター「Earth Kasha」と「MirrorFace」が引き起こしたさまざまなインシデントの間には、複数のつながりがあるためです。これには、APT10の古い武器庫(LODEINFO)と、本レポートで紹介する新しい武器庫の両方が含まれています。
この脅威アクターの特定は、主に次の4つの側面に基づいて行われます。
- 使用された武器庫:これは主にNOOPLDRとNOOPDOORです。これらは2024年1月に初めて広く知られるようになったものですが、侵入先のネットワーク上に最長で2年以上も残っていました。
- LODEINFOマルウェア:このマルウェアは、NOOPLDR/NOOPDOORが関与するインシデントにおいて特定されたものであり、両者を結び付けるものとなっています。
- C2インフラとして使用されたドメイン:これらのドメインは、他のAPT10キャンペーンと多くの類似性を示しています。
- 手法の類似性:脅威アクターが攻撃を実施するために採用している手法が、似通っているかどうかを判定します。
■武器庫
このセクションでは、Cuckoo Spearに関連する武器庫について説明します。ここで紹介する事項は、サイバーリーズンが関与した各種のインシデントと、それらのインシデント同士を結び付ける関連性において観測されたものです。
バックドア | インシデントA | インシデントB | インシデントC | インシデントD |
Cobalt Strike GOSICLOADER | あり | |||
LODEINFO | あり | |||
NOOPLDR-DLL | あり | あり | ||
NOOPLDR-C# | あり | あり | あり | |
DOWNJPIT | あり | |||
インシデントの開始時期 | 2021年4月 | 2021年5月 | 2021年11月 | 2023年10月 |
■用語
サイバーリーズンは、Trend MicroとESETにより確立された命名規則を再利用しており、ローダーをNOOPLDRと名付けました。この名前は、その後にロードされるバックドアであるNOOPDOORを参照しています。本レポートで使用されている名前は次の通りです。
- キャンペーン:Cuckoo Spear
- 侵入セット:APT10
- 脅威アクター:Earth Kasha / MirroFace
- LODEINFO:NOOPLDRとNOOPDOORが発見されたインシデントで特定された初期マルウェア
- NOOPLDR-C#:NOOPDOORをロードするC#ローダー
- NOOPLDR-DLL:NOOPDOORをロードするDLL
- NOOPDOOR:コマンド&コントロール用ビーコンとして機能する、ロードされたシェルコード
■LODEINFO
▲LODEINFOの実行フロー
LODEINFOとは、JPCERTによりそのブログで命名されたものであり、2019年から活動していることが知られているバックドアです。脅威アクターは、しばしばDLLサイドローディングを利用してLODEINFOを導入します。これは、LODEINFOローダーのDLLを正規の実行ファイルにロードするという方法です。この実行フローでは、LODEINFOのシェルコードをロードし、メモリ内でバックドアを実行しようとします。現在知られているLODEINFOのバージョンはv0.7.3であり、2023年10月に初めてネット上に出回っていることが観測されました。
LODEINFOの興味深い点として、開発者がバージョンアップデート後にC2コマンドの機能を変更することが挙げられます。多くの場合、バージョンアップデート後には、以前サポートされていたコマンドが削除されます。たとえば、v0.6.3からv0.6.6までの間、開発者はファイルを削除するC2コマンド(rm)を取り除いていましたが、v0.6.8以降になると、この機能が復活することになりました。伊藤忠サイバー&インテリジェンス株式会社が提供するバックドアコマンドの比較グラフには、バックドアコマンドの詳細情報とバージョンv0.6.5、v0.7.1、v0.7.2/v0.7.3における変更点が示されています。
■GOSICLoader
GOSICLoaderはGolangベースのマルウェアローダーであり、Cobalt Strikeのロードを担当するものです。このローダーはDLLサイドローディングを悪用することで、GOSICLoaderをJetBrainsプラグインプロセスである正規プロセスjcef_helper.exeへとロードします。
▲GOSICLoaderの実行フロー
■DOWNJPIT
DOWNJPITは、Kasperskyにより名付けられたファイルレス型のダウンローダーです。DOWNJPITは、LODEINFOのダウンロード、復号化、そして実行を担当します。
▲DOWNJPITの実行フロー(HITCON 2021においてKaspersky社が発表したもの)
DOWNJPITは、Cuckoo Spearに関連するインシデントの1つで確認されています。
■NOOPLDR / NOOPDOOR
▲NOOPLDR/NOOPDOORの実行フロー
本レポートにおいて、サイバーリーズンは、NOOPDOORと呼ばれる脅威アクターが利用する新しいバックドアを紹介しています。この名前は、ESETとTrend Microにより付けられたものです。NOOPDOORは、DGAベースのC2通信を利用する64ビットのモジュール式のバックドアです。このバックドアは、NOOPLDRと呼ばれるローダーを通じてロードされることが確認されており、次のような2種類のバリアントが存在するようです。
- C#:MSBuildタスクを利用するバリアント
- DLL:DLLサイドローディング手法を利用するバリアント
NOOPLDRはNOOPDOORの復号化と実行を担当するものであり、DGAを利用してC2サーバーとアクティブに通信します。
サイバーリーズンは、LODEINFOとNOOPDOORの両方を1つのケースで観測しました。さまざまな報告で言及されているように、脅威アクターは新しいキャンペーンにNOOPDOORを組み込み始めています。LODEINFOの分析およびこれらのキャンペーンの観測に基づくならば、LODEINFOはプライマリバックドアとして利用されるもののようであり、一方、NOOPDOORはセカンダリバックドアとして機能することで、被害者の企業ネットワーク内でパーシステンスを維持するものであると言えそうです。
分析
■観測された振る舞い/ TTP
このセクションでは、Cuckoo Spearキャンペーンに関連付けられるインシデントで観測されたすべての振る舞いについて概説します。
■初期アクセス
この脅威アクターについて書かれた本書以外のレポートでは、初期アクセスベクターとして使用される脆弱性として、下記のものに言及しています。
- CVE-2023-27997:FortiOSおよびFortiProxyに含まれている可能性のあるバッファオーバーフローの脆弱性です。この脆弱性を突くことで、攻撃者は任意のコマンドを実行できるようになります。
- CVE-2023-28461:Array Networks社のArray AGシリーズおよびvxAGに含まれている可能性のあるリモートコード実行(RCE)の脆弱性です。
- CVE-2023-45727:Proself Enterprise/Standard Edition、Proself Gateway Edition、およびProself Mail Sanitize Editionに含まれている可能性のある未認証のXML外部エンティティ(XXE)の脆弱性です。この脆弱性を突くことで、攻撃者は当該環境への不正なアクセス権を取得できるようになります。
Cuckoo Spearキャンペーンでは、これら3つの脆弱性のうち2つが初期アクセスベクターとして特定されています。
スピアフィッシングは、LODEINFOを利用する脅威アクターが採用している一般的な初期アクセス手法です。その一方で、多くの脅威アクターは、「脆弱性の悪用」へと戦術を変え始めています。
■パーシステンス
NOOPDOORは、まず被害者の端末上にロードされなければなりません。これはパーシステンスメカニズムを通じて実行されますが、サイバーリーズンでは、これが次のような3種類の方法を通じて実行されることを観測しました。
- スケジュールタスク
- WMIイベントコンシューマー
- Windowsサービス(サービスDLL)
■スケジュールタスク
脅威アクターは、スケジュールタスクを悪用することで、環境内のパーシステンスを維持します。スケジュールタスクにはMSBuildの実行が含まれており、これにより悪意あるXMLファイルがロードされ、実行時にNOOPDOORローダーがコンパイルされます。
▲スケジュールタスクを通じてMSBuildを実行
■WMIイベントコンシューマー
脅威アクターはWMIイベントコンシューマーを利用します。WMIイベントコンシューマーは、それがフィルタによってトリガーされた時点でメインアクションを実行します。その後、脅威アクターは、JScriptエンジンで実行されるように見えるActiveScriptを利用します。このWMIイベントに関するコンシューマーアクションにおいて、脅威アクターはNOOPDOORローダーのMSBuild実行を利用します。これは、同じくMSBuildを利用するスケジュールタスクと類似しています。
WMIイベントコンシューマーを利用することは、環境内でパーシステンスを維持するための代替手法です。
▲NOOPDOORにおけるWMIイベントコンシューマーの利用
srcons.exeは、ActiveScriptのようなスクリプティング向けのWMIイベントコンシューマのホスティングを担当するプロセスです。srcons.exeは、そのスクリプト内で宣言されている必要なプロセスを生成します。
▲NOOPLDR/NOOPDOORの攻撃ツリー
■Windowsサービス
また、脅威アクターは、署名されていないDLLファイルをロードする悪意あるサービスを作成することによって、環境内でのパーシステンスを維持します。
このケースでは、署名されていないDLLファイルがC:\Windows\System32\フォルダに書き込まれます。レジストリ内にエントリが見つかるということは、このDLLがサービスDLLを介してsvchost.exeプロセスの下でロードされていることを意味します。
▲IRツールVelociraptorの画面からの抜粋
上記のスクリーンショットは、DssSvcという名前のサービスと、C:\Windows\System32\pgodb100.dllに設定されているServiceDllを含むレジストリキーを示していますが、これは実際にはNOOPLDR(DLLバージョン)を指しています。DLLローダーの分析については、「武器庫の分析」の章をご覧ください。
サービスDLLを使用してパーシステンスを維持する手法の1つとして、svchost.exeによりホスティングされる新しいWindowsサービスを作成することが挙げられます。このプロセスの概要を下記に示します。
- 脅威アクターがNOOPLDR(DLLバージョン)ファイルをディスク上にドロップする:システムのリブート時に実行されるコードを含むDLL(例:pgodb100.dll)は、C:\Windows\System32\にあります。
- 新しいサービスを作成する:svchost.exeに設定されたbinPathを使用して、新しいサービス(例:DssSvc)を確立します。
- ServiceDll値を追加する:ステップ1で削除したDLLを指すServiceDll値をDssSvcサービスに含めます。
- レジストリを変更する:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchostを変更し、サービスのローディンググループを指定します。
- サービスを開始する:DssSvcサービスを開始します。
- 実行:DssSvcが起動されると、そのサービスDLL(この例ではpgodb100.dll)がsvchost.exeプロセスへとロードされます。
この方法は、Windowsサービスインフラを利用して、カスタムDLLをsvchost.exeへとロードすることでパーシステンスを実現するものです。これにより、システムの再起動時に指定されたコードが実行されることを保証できます。
検知の観点から言えば、防御者は、次のプロセスの下で、署名されていないDLLのローディングを探すことができます。
- svchost.exe -k netsvcs
コマンド&コントロール
■ドメイン生成アルゴリズム(DGA)
サイバーリーズンでは、DGAにより作成された複数のドメインを観測しました。下記のセクションでは、これらのドメインについて詳しく説明します。
▲DGAのサンプル
■内部ピボットへの接続
外部IPアドレスに接続するC2ドメインとは別に、サイバーリーズンは、感染した端末同士の間での内部C2通信も観測しています。
サイバーリーズンは、NOOPDOORをインジェクトされたプロセスが下記のTCPポートをリッスンしていることを確認しました。
- 5984
- 47000
- 8532
これらのポートを利用することで、脅威アクターは、外部のC2が利用できない場合に内部端末に接続することで、内部サーバーに対するC2接続を合理化できます。この内部サーバーが、インターネットとの唯一の通信ポイントとなります。
▲ポート5984経由でNOOPDOORと内部通信
また、これにより、脅威アクターは、インターネットに接続されていない端末や、アウトバウンドのネットワーク機能が制限されている端末を遠隔操作することも可能となります。
■C2サーバーとドメイン
サイバーリーズンが観測したさまざまなケースにおいて、ドメイン生成アルゴリズム(DGA)が使用されていました。例としては次のものが挙げられます。
- www.[DGA][.]com([DGA]は、現在の日付やLODEINFOにハードコーディングされているC2のURLなどのパラメータに基づいて生成されたドメインです)
- www.[DGA][.]net([DGA]は上記に同じです)
- [DGA].[C2 domain].com
▲NO-IPサービスの利用
多くの場合、脅威アクターは、コマンド&コントロール(C2)インフラストラクチャを管理するために、No-IPのようなダイナミックDNSサービスを使用します。C2サーバーのIPアドレスは頻繁に変更される可能性があるため、ダイナミックDNSサービスを使用することで、マルウェアや侵入先のシステムとの一貫した通信を維持できます。
その性質上、IPアドレスは定期的に変更されるため、サイバーセキュリティシステムがダイナミックDNSサービスに関連するIPアドレスを追跡し、ブラックリスト化することはより困難になります。このようなダイナミックな性質を利用することで、脅威アクターは、IPブラックリストに依拠したセキュリティツールによる検知を回避できるようになります。脅威アクターは冗長なシステムを構築することで、1つのドメインが停止されるかまたはブロックされた場合でも、他のドメインがまだ稼働していることを保証できます。
サイバーリーズンは、これらの攻撃の背後にいる脅威アクターが、NO-IPと同様のサービスを通じて、下記のドメインを利用していたことを突き止めました。
- 3utilities[.]com
- onthewifi[.]com
- redirectme[.]net
- serveblog[.]net
- zapto[.]org
- hopto[.]org
■特定ドメインの使用
これらのNO-IPドメインに加えて、サイバーリーズンは、さらに別のドメインが使用されているのを目撃しています。これらのドメインは、主にNAMECHEAPやTucowsなどの企業により登録されていたものです。
■インフラストラクチャのIPアドレス
下記のスクリーンショットは、各インシデントの観測期間中に解決されたドメインに結び付けられていたIPアドレスをリストしたものです。
▲Cuckoo Spearが使用した解決済みのIPアドレス(VirusTotalの画面より)
これらのIPアドレスのほとんどは、AkamaiやAS-CHOOPAのようなホスティングサービスを通じて、日本でホスティングされています。日本以外では、下記の国が挙げられます。
- 米国(Cloudflare)
- ドイツ
- オランダ
- ベトナム
ラテラルムーブメント
■スケジュールタスク
Cuckoo Spearのある例では、脅威アクターはスケジュールタスクを利用して、侵入した環境内でラテラルムーブメントを実施していました。彼らはschtasks.exeを悪用してスケジュールタスクを作成します。その後、このスケジュールタスクは、起動時にMSBuildを実行してC#ローダーを実行するようなスケジュールタスクを作成します。
▲リモート端末上でスケジュールタスクを作成
スケジュールタスクの作成が完了すると、schtasks.exeの別のインスタンスが、リモート端末上で作成されたタスクを即座に実行します。
■防御回避
脅威アクターは、NOOPDOORとNOOPLDRの両方において、複数の防御回避手法を導入しました。詳細については、「武器庫の分析」のセクションをご覧ください。
攻撃ツールとは別に、脅威アクターはターゲットシステムのイベントログも削除しました。
■検出アクティビティ
また、脅威アクターは、ポストエクスプロイテーションに関連する振る舞いも見せていました。例としては、net.exeコマンドを使ったActive Directoryの検出や、ping.exeやnslookup.exeツールを使ったローカルネットワークの検出などが挙げられます。
- Msbuild.exe:このコマンドは、パーシステンス機能の結果として生成されるものであり、プロセスの生成後にpcwrun.exe内にNOOPLOADERをインジェクトします。
‒Pcwrun.exe、またはC:\Windows\System32\内に存在するもう1つの任意の実行ファイル:このプロセスは、msbuild.exeによってロードされたコードにより作成されます。先述したように、このプロセス名はC2の構成により異なります。 - net user Administrator /domain:ドメイン管理者アカウントに関連するActive Directoryを検出します。
- nslookup:このコマンドは、ネットワーク上の既存の端末とその内部IPアドレスを検出するために使用されます。
- ping -n 1 [redacted]:このコマンドは、脅威アクターにより検索される内部端末の指定のIPアドレスへの接続をチェックするために使用されます。
- tasklist /v:tasklist.exeの下にあるこのコマンドラインは、実行中のプロセスに関する詳細な情報が収集されていることを意味します。これらは、偵察を目的としているか、またはインジェクションの対象となるプロセスや終了させるプロセスを見つけることを目的としている可能性があります。
▲ポストエクスプロイテーション活動の攻撃ツリー
あるインシデントでは、脅威アクターは、ポストエクスプロイテーション活動の一環として下記のCMDコマンドを利用しました。
これらの調査結果は、2023年に発表されたJPCERTによる調査結果と非常によく似ています。
▲出典:https://jsac.jpcert.or.jp/archive/2023/pdf/JSAC2023_1_6_minakawa-saika-kubokawa_en.pdf
武器庫の分析
このセクションでは、Cuckoo SpearのツールであるNOOPLDRとNOOPDOORのリバースエンジニアリングを取り上げます。
■DLLローダーNOOPLDR-DLLの分析
サイバーリーズンは、NOOPLDR-DLLのバリアントが、下記に示すように、異なる方法で悪意あるコードをロードしていることを明らかにしました。
▲サービスとしてロードする DLLサイドローディング
■機能
NOOPLDR-DLLには次の機能があります。
- サービスとして登録することにより、パーシステンスを確立
- 制御フローの平坦化によりコードを難読化
- XOR演算により文字列を符号化
- プロセスを作成し、レジストリから取得したシェルコードをインジェクトする
- 動的なカスタムシステムコールにより、ユーザモードのフックを回避する
■サービスのパーシステンス
サイバーリーズンは、C:\Windows\System32配下にある複数の署名されていないDLLファイルのテレメトリを観測しました。これらのファイルはコマンドsvchost.exe -k netsvcsにより開始されたサービスの一部としてロードされたものです。これにより、最終的に多数のNOOPDOORペイロードが任意のプロセスへとインジェクトされました。さらに調査を進めると、悪意あるDLLファイルは、正規のDLLのセグメントを変更することにより作成されることが判明しました。変更されたセクションには、下記に示すように、エクスポートテーブル内でランダムに生成された関数名が付けられます。
▲ランダムに生成された関数名を含むエクスポートテーブル
この悪意あるエクスポート関数は、当該サービスのServiceMain関数として呼び出されます。ServiceMain関数は、サービスのエントリポイントとなるものであり、SVCHOSTインスタンス内で実行されるサービスDLLに実装されています。
▲ServiceMain関数
■制御フローの平坦化
正規の関数を含むDLLファイル全体が、制御フローの平坦化により大幅に難読化されていました。これは、防御者による分析作業を遅らせることを目的としたものだと思われます。
▲NOOPLDRで観測された制御フローの平坦化
■XOR演算による文字列の符号化
サービスの登録とレジストリへの問い合わせに使用される文字列は、XOR演算により符号化された後、バイナリの.rdataセクション内にハードコーディングされているバイトを使って復号化されます。
▲NOOPLDRにおけるXOR演算を使った暗号化
すべての文字列を復号化するスクリプトを作成することにより、サービスの設定、レジストリキーのパス、そしてWindowsサービスを開始しセキュリティ記述子を設定するコマンドに関連する情報が明らかになります。
■NOOPDOORにおけるシェルコードの復号化
NOOPLDRはWinAPIコールを実行することにより、複数の異なるレジストリキーから暗号化されたシェルコードを取得します。サイバーリーズンが観測したレジストリキーのパスのリストは、下記のようになります。
復号化メソッドは、MachineIdの最初の16バイトを含む初期化ベクトル(IV)を持つAES-CBCモードを利用します。これは、advapi32.dllの標準的なWinAPIを使用して、SHA1ハッシュに基づいてAESキーを導出します。SHA1ハッシュは、下記のようなデータの組み合わせから作成されます。
1. 下記に含まれているMachineId値
HKEY_LOCAL_MACHINE\\Software\\Microsoft\\SQMClient
2. 1個のNULLバイト
3. .textおよび.rdataセクション内にハードコーディングされている複数のバイト
▲OOPLDR内にハードコーディングされている複数のバイト
4. シェルコードを含んでいるレジストリキー名
たとえば、ハッシュ化されるデータは下記のようになります。
▲ハッシュ化される前のデータ
ハッシュ化されると、そのハッシュオブジェクトはCryptDeriveKey関数に渡され、復号化に使われる鍵が作られます。
■システムコールによるコードインジェクション
C:\Windows\System32下にある実行ファイルをダミープロセスとして起動することにより、次のような共通のWinAPIパターンを通じて、復号化されたNOOPDOORをインジェクトできます。
1. CreateProcess
2. VirtualAlloc
3. 3WriteProcessMemory
4. 4CreateRemoteThread
ただし、ネイティブAPIは、カスタムシステムコールと共に実装されています。このようなカスタムシステムコールでは、SSN(システム・サービス番号)が個々の呼び出しの直前に動的にロードされます。ほとんどのSSNは、多くのWindowsバージョンを通じて一貫性がありますが、一部にはそうでないものもあります。
悪意あるコードは、各システムコールの正しい値を解決します。たとえば、NtCreateThreadExはWindows 10のバージョン1709では「0xBA」となります。
▲NOOPLDRにおけるカスタムシステムコール
ネイティブAPIはプロセスのメモリ空間から直接呼び出されるため、NTDLLやkernel32のユーザーモードフックは、このようなインジェクションの検知には効果がありません。
これら2つのDLL間の興味深い違いとして、「CreateProcess > NtWriteVirtualMemory」を使用するバージョンのDLLとは異なり、DLLサイドローディングを使用するバージョンのDLLはローカルコードインジェクションを実行することが挙げられます。
このDLLは、復号化されたシェルコードをプロセスメモリ内に動的に割り当てた後、システムコールNtProtectVirtualMemoryを使用して保護を変更し、新しく割り当てられたNOOPDOORコードを実行します。
▲復号化されたNOOPDOOR(デバッガでの表示)
C#で書かれたローダーNOOPLDR-C#の分析
このC#コードは、一般的にC:\Windows\System32フォルダ内にあるXMLファイルに格納されています。場合によっては、このXMLファイルが他のフォルダに格納されていることもあります。このコードは高度に難読化されていますが、サイバーリーズンでは、その仕組みを特定するために難読化を解除しました。
主に、このコードはMicrosoft Windowsのツールであるmsbuild.exeを使ってロードされます。msbuild.exeは、1つのコマンドでコードをコンパイルして実行します。コマンドラインmsbuild.exe [NOOPLDR XML FILE NAME].xmlは通常、TTPのセクションで述べたように、スケジュールタスク、サービス、またはWMIイベントコンシューマーなどのパーシステンスメカニズムを通じて、被害者のシステムに組み込まれます。
▲NOOPLDR-C#の実行フロー
■機能
NOOPLDR-C#には次の機能があります。
- コードの難読化
- kernel32.dllのMTimeを含むコードに基づくタイムストンピング
- 特定の.datファイルまたはレジストリから、シェルコード / ローダブルコードをロードする
- 該当する被害者デバイスごとに固有の設定を含んでいる
サイバーリーズンが分析したNOOPLDR-C#のサンプルは、端末によってそれぞれ異なっていました。ローダーによっては、関数の構成が異なっているものや、異なるレジストリハイブからシェルコードをロードするものもありました(具体的には、HKCUからロードするか、それともHKLMからロードするかの違いです)。
■MSBuildプロジェクトファイルスキーマの参照
各項目は、LOLBin msbuild.exeによる解釈が行えるように、Microsoftによるプロジェクトファイル形式を使用しています。このバイナリは、.csprojファイル(ここではXMLとリネームされている)を受け取り、それをコンパイルして実行します。
▲出典:https://lolbas-project.github.io/lolbas/Binaries/Msbuild/
このXMLファイルは、私たちの分析の出発点となるものであり、次のようなコードで始まります。
上記のC#コードは、分析を複雑にするために大幅に難読化されています。
■C#コードの難読化
この分析を開始するには、ローダーの難読化を解除する必要があります。オリジナルのファイルは、最初は次のように見えます。
▲難読化されたコード
シンプルなIDEを使うならば、C#のコードヒューリスティックを使用することで、コードを適切にインデントすることが可能となります。
▲VSCodeでインデントされたコードの抜粋
次のフェーズは、各変数およびパラメータの名前を変更することです。WinAPI関数はC#コードから呼び出されるため、ランダムに命名された各変数を、適切な名前の変数へとマッピングすることが可能です。
次のフェーズでは、少々手動による操作が必要となります。これは、コードの仕組みを理解しようとすることにより、オリジナルの変数名を推測することが目的であるためです。最終的には、この操作を通じて、より理解しやすいコードを生成できます。
▲難読化されていないコードからの抜粋
最初に呼び出される関数はExecute()です。
▲最初に呼び出される関数とC#コードフローの始まり
■暗号化されたシェルコードの取得
ClInI関数の目的は、パラメータとして渡されたDATファイルからシェルコードを取得すること、またはシェルコードがすでにWindowsレジストリに保存されている場合には同レジストリからシェルコードを取得することです。
▲ClInI関数の最初の部分
この関数はまず、端末名とソルト値に基づいてハッシュを作成します。サイバーリーズンは、NOOPLDR-C#のバージョンによっては、このようなハッシュが存在しない場合があることに気付きました。
また、値MachineIdは、キーHKLM\Software\Microsoft\SQMClientから取得されます。
端末名とソルト値の両方が連結され、そこからSHA256が計算されます。
これにより、プログラムがレジストリから取得しようとするキーの名前(最初の16バイトだけが使用される)をHKLM\Software\License\{SHA256(MachineName+SALT)}という形式で計算できるようになります。
続いて、プログラムは、関数のパラメータとして渡された.datファイルをロードしようと試みます。
- 同ファイルが存在する場合、そこからシェルコードをロードします
- 同ファイルが存在しない場合、レジストリからシェルコードをロードします
サイバーリーズンは、このような処置は最初にシェルコードをレジストリにインジェクトするためのものだと推測しました。このことは、当該コードをさらに読み込んだ後に確認されました。
- 同ファイルが存在する場合、コードは最終的に暗号化されたシェルコードをレジストリに書き込んだ後、同DATファイルを削除します
これにより、脅威アクターは、探すのがより複雑なレジストリを除けば、ディスク上にシェルコードが保存されていなくても目的を達成できるようになります。Windowsのレジストリにシェルコードを保存することにより、攻撃者は、システム上で悪意あるコードを実行するための、ステルス的で、パーシステントな、潜在的に特権的な方法を利用できるようになります。これは、攻撃者にとって魅力的な選択肢となります。
この時点で、暗号化されたシェルコードの内容はメモリ上に取得され、使用可能な状態となります。
■完全性チェックとシェルコードの復号化
このコードはまず、シェルコードのSHA256ハッシュ(最初の32バイトを除く)と、ファイル/レジストリキーの先頭に格納されている値を比較します。
▲完全性チェック
このコードは、ファイル/レジストリ内のある地点で、SHA256チェックサム(一般に完全性チェックと呼ばれるもの)が、計算されたシェルコード自体のSHA256ハッシュと一致した場合にのみ、処理を続行します。その後、同コードはシェルコードを復号化するためのキーを計算します。
このキーは、レジストリ内にあるMachineID値と、前のステップで計算された端末名とソルト値のSHA384ハッシュになります。その後、同コードは、SHA384の最初の32バイトをキーとして、最後の16バイトを初期化ベクター(IV)として使用する古典的なAESルーチンを通じて、シェルコードの中身を復号化します。
▲復号化ルーチン
最後に、このコードは、復号化されたコンテンツの最初の10バイトを取り出し、それを次の3種類の変数に格納します。
- シェルコードが64ビットであるかどうかを示すブール型の変数
- シェルコードのサイズを表す符号なし整数型の変数
- シェルコードがデータの先頭に存在していない場合、シェルコードのオフセットを表す符号なし整数型の変数
▲3つの変数への格納
■データの再暗号化とレジストリへの書き込み
下記のロジックは、シェルコードが0以外のオフセットでロードされた場合に実行されます。
- このコードはSHA384キーを再計算し、AES暗号化関数を使用します
- その後、同コードはその内容をレジストリに書き込みます
- 何らかの理由でレジストリに書き込めない場合は、DATファイルに書き込みます
上記の処理が終了すると、同コードは復号化されたシェルコードを別のプロセスのメモリへとインジェクトします。
■ペイロードのインジェクション
このコードの次なる部分は、復号化されたシェルコードを新しく生成されたプロセスのメモリにインジェクトします。この部分に対応するコードを下記に示します。
▲リモートインジェクション関数
このインジェクションプロセスは、NOOPLDR-DLLのセクションで説明したものと同様です。
- スタートアップ情報の初期化
- プロセスの属性リストの初期化
- WinAPIコールCreateProcessによるプロセス作成
- VirtualAllocExとWriteProcessMemoryを通じた新しいプロセスでのメモリ割り当てと操作
- WinAPIコールCreateRemoteThreadによるリモートスレッドの作成
■設定の抽出
NOOPLDRのバージョンの設定を抽出するには、下記の要素を取得する必要があります。
- ロード可能なコードがロードされるプロセス名
- 端末に初めて感染した際に読み込まれるDATファイル
- シェルコードが格納されているレジストリのパス (HKLM\SOFTWARE\License)
サイバーリーズンは、レジストリキー名({XXXX-XXXX-XXXX})やMachineId値などのパラメータを使用してシェルコードを復号化する短いPythonスクリプトを作成しました。
■インジェクトされたシェルコード/ NOOPDOOR
このセクションでは、上記の方法でインジェクトされたシェルコードの分析について説明します。サイバーリーズンでは、このマルウェアがJSAC 2024で最近発掘されたことから、それはNOOPDOORであると特定しています。サイバーリーズンは、C2のURLや機能が異なる複数のNOOPDOORのバリアントを発見していますが、そのほとんどは下記のいずれかに分類されます。
- C2クライアント
- C2サーバー
また、サイバーリーズンは、これら2つの機能の両方を含む単一のシェルコードバイナリも観測しています。ただし、ほとんどの場合、クライアントとサーバーのシェルコードは分離されていました。
■NOOPDOORのC2クライアントに関する分析
機能
NOOPDOORのクライアントコードには次の機能があります。
- APIのハッシュ化 / ガベージバイトによる上書き
- アンチデバッギング
- URLconfigurationsに基づくDGA
- TCPを使用したカスタムネットワークプロトコル
- C2サーバーへのデータ流出
■WinAPIの解決
各コードは、関数名に対して右回転演算を実行し、ハードコーディングされたバイトに対してXOR演算を実行するようなWindows APIハッシュ化関数を共有していました。
▲動的なWinAPI解決のロジック
ハードコーディングされているバイト数はサンプルごとに異なりますが、各コードは、約250種類のAPI関数からなる大規模な構造体を作成します。
▲ロードされたWinAPI構造体の例
この構造体は、コード内の適切なAPIを呼び出すために使用されます。Cybereason IRチームは、このAPIハッシュ化関数を解決するスクリプトを作成することで、分析の高速化を実現しました。検知回避の手段として、APIの解決に関連する関数は0x00、0x20、0x90のようなガベージバイトで上書きされます。このため、メモリ上でスキャンされたシグネチャを使って明示的に検索することでは、同コードのこの部分を検知できません。
▲メモリ上にあるコードの違い
■アンチデバッギング機能
マルウェアの分析で使用される非常に多くのプロセス名が、スタック文字列として保存されています。これらのプロセスはCreateToolhelp32Snapshot APIを介して取得され、コードのメインルーチンが実行される前に検証されます。
■DGA
C2ドメイン名はURL文字列に基づいて生成されます。「#」の後の整数は、当該ドメインが次のバージョンで変化するまでの日数として機能します。サイバーリーズンでは、60日、90日、180日、364日、365日など、複数の日数のドメインを生成するコードを観測しています。C2のURL文字列には “http”が含まれていますが、これはDGA用のハッシュを作成するために使用されるだけで、実際の通信はカスタムTCPプロトコル経由で行われることにご注意ください。
▲DGA解決前のC2のURL
ドメインを生成するアルゴリズムは次の通りです。
1. 現在の日付/時刻が月曜日午前10時から午前11時(現地時間)の間であるかどうかを確認する
2. SystemTime構造体を取得し、それをFileTimeへと変換した後、年/月/日に基づいてEpochTimeへと変換する
3. URLの”#”の後に整数がある場合、その整数を使用して時間に対する演算を実行する
4. URLに”[]”が含まれている場合、ホスト名を挿入する
5. 変更されたFileTimeからSHA256を作成する
6. ステップ4の未解決のC2 URL文字列からSHA512を作成する
7. 作成したSHA256とステップ4の未解決のC2 URL文字列からSHA512を作成する
8. ステップ6と7の連結されたSHA512ハッシュからBase64を取得した後、最初の17バイトを取得する
9. Base64文字列から特殊文字、小文字、数字を取り除く
10. 未解決のC2 URLの”$a”部分をクリーンなBse64文字列でき換える
C2のRLは、下図に示すようにサブドメインである可能性もあります。この場合、サイバーリーズンは情実したものとは少々異なるアルゴリズムを観測しました。この場合、月曜日のチェックは存在せず、”#”の後に日数がない場合、ドメインはシステム時間に基づいて毎日変更されます。
▲解決前のC2 URL
サイバーリーズンのチームは、DGAのURLを解決するスクリプトを作成し、2023年から2025年までのドメインのリストを生成しました。IRの観点からは、ocouomors[.]comのようなサブドメインはwww.*.comよりもブロックするのが簡単です。リストが長くなりすぎるのを防ぐために、サイバーリーズンは後者のみを含めました。このスクリプトは、組織内で生成される可能性のあるその他のNOOPDOORドメインをブロックするために使用できます。
■C2へのデータ流出
このコードは、生成されたドメインにデータを流出させる機能だけでなく、追加のC2機能も備えています。JSAC2024でのESET Securityによるプレゼンテーションは、この機能をよく説明しています。
▲出典:https://jsac.jpcert.or.jp/archive/2024/pdf/JSAC2024_2_8_Breitenbacher_en.pdf
NOOPDOORの内部C2サーバーに関する分析
ロードされたペイロードのバリアントには、内部C2サーバーの可能性のあるコードが含まれていました。サイバーリーズンは、脅威アクターが、ネットワーク内で情報を集約しピボッティングを行うための手段として、このサーバーを利用したのではないかと疑っています。
■機能
NOOPDOORのC2サーバーには次の機能があります。
- APIのハッシュ化
- ファイアウォールルールの変更
- TCPを使用したカスタムプロトコル
- C2フレームワーク機能(アップロード/ダウンロード、ファイルの読み取り/書き込み、プロセスの作成など)
■ファイアウォールルールの追加
このコードは、ファイアウォールのCOMオブジェクトを使用するか、またはnetshコマンドを使用して、ルール名「Cortana」の下に新しいファイアウォールルールを追加します。
▲ファイアウォール名
WindowsファイアウォールAPIは、CoCreateInstanceによりロードされます。ここでは、COMファイアウォールのCLSIDである{304CE942-6E39-40D8-943A-B913C40C9CD4}がインターフェイスIDとして使用され、INetFwMgrインターフェイスのCLSIDである{F7898AF5-CAC4-4632-A2EC-DA06E5111AF2}がrclsidパラメータとして使用されます。
▲ファイアウォールAPIのロード
ファイアウォールAPIをロードするCOMオブジェクトメソッドが失敗した場合、このコードは、代わりに下記のnetshコマンドを実行します。
■サーバーコード
Windows Socket APIを使用して、ポート上で着信接続をリッスンします。
▲リスニングポート
サイバーリーズンは、次のような異なるポート上でリッスンするサンプルを観測しました。
- 5984
- 47000
- 8532
このコードは、受信したコマンドに基づいて、下記のいずれかの関数を実行します。
▲サーバー機能
■結論
日本の企業や組織においてCuckoo Spearが広く確認されたことを受けて、サイバーリーズンは、読者の皆様がCuckoo Spearの活動をより的確に識別できるようにするために、この脅威分析レポートを公開することを決定しました。本レポートを利用することで、脅威ハンターは、組織のネットワーク内におけるCuckoo Spearの活動を識別できる可能性が高くなります。
検知と防御
■検知
サイバーリーズンは、ネットワーク内におけるCuckoo Spearの存在を特定するためのハンティングクエリを提供しているほか、Cuckoo Spearに関連する侵害の痕跡(IOC)を公開しています。このIOCを利用することで、より的確にCuckoo Spearを検知し、Cuckoo Spearの活動をブロックできるようになります。
■インシデント対応
封じ込め、駆除、および復旧のプロセスが複雑になる可能性があるため、この脅威アクターがネットワーク上に存在していることが判明した時点で、専門のインシデント対応チームを雇用することを強くお勧めします。
■修正
多くのAPT関連のケースでは、調査が開始される数ヶ月~数年前から、脅威アクターがすでにネットワークへのアクセス権を獲得しています。このような脅威アクターを駆除するには、綿密な準備と効果的なセキュリティ対策が必要となります。
組織によって対策は異なりますが、Cybereason Security Servicesでは、一般的に、組織規模で下記の是正措置を実施することを推奨しています:
- ハッキングされていないクリーンなネットワークを準備すること
- インターネットとのやり取りを可能にするアクセス権をすべて無効にすること
- NOOPDOORに関連するすべてのC2ドメインとIPアドレスをブロックすること
- すべてのユーザーパスワードをリセットすること
- 感染した端末を再構築すること
- 再構築した端末をクリーンなネットワークに接続すること
著者について
Jin Ito(Cybereason IRチームのインシデント対応エンジニア)
Cybereason IRチームのインシデント対応エンジニア。元富士通のインシデントレスポンスエンジニアであり、GREM、GCFA、OSCPなどのサイバーセキュリティ認定資格を持つ。デジタルフォレンジックに従事する傍ら、マルウェアの作成とリバースエンジニアリングに強い関心を持つ。
Loïc Castel(Cybereason IRチームのインシデント対応アナリスト)
Cybereason IRチームのインシデント対応アナリスト。重要なインシデントやサイバー犯罪の分析および調査に従事。ANSSI (French National Agency for the Security of Information Systems) などの有名な組織でセキュリティ監査員を務めたほか、Atosではデジタルフォレンジックとインシデントレスポンスのリーダーとして勤務。デジタルフォレンジックとインシデント対応、さらに脆弱性調査などの攻撃的な側面に強い関心を持つ。
Kotaro Ogino(Cybereason Security OperationsチームのCTIアナリスト)
Cybereason Security OperationsチームのCTIアナリスト。脅威ハンティングおよびXDR(Extended Detection and Response)に従事。情報およびコンピューターサイエンスの理学士号取得。
【調査結果レポート】2024年版 ランサムウェア 〜ビジネスにもたらす真のコスト〜
サイバーリーズンでは、1,008名の企業のIT担当者を対象に、2024年度のランサムウェアがビジネスに及ぼす影響に関するグローバル調査を実施しました。
本レポートでは、詳細な調査結果を紹介するとともに、企業がとるべき対策として6つの核となる課題を取り上げて、それぞれの課題に対する推奨対策について紹介しています。
https://www.cybereason.co.jp/product-documents/survey-report/11873/