今日表示しない

トップへ戻る

トップへ戻る

脅威インテリジェンス

脅威インテリジェンス

脅威インテリジェンス

Gomir FamilyKimsuky

Gomir FamilyKimsuky

Gomir FamilyKimsuky

エンキホワイトハット

エンキホワイトハット

コンテンツ

コンテンツ

コンテンツ

概要

  • 2025年から継続しているKimsukyによる韓国国内のグループウェア開発会社を狙った攻撃を追跡した。

  • Kimsukyは外部からアクセス可能なメールサーバーの脆弱性を悪用したり、役職員を対象としたスピアフィッシングを行ったりして社内インフラを掌握した。

  • Gomir/HttpTroyをベースにした新規マルウェア2種を確保し、BirdTroy、DriveTroyと命名した。

  • Kimsukyはグループウェア開発会社の侵害後も、顧客企業のグループウェアサーバーを侵害したり、社内インフラの資格情報を奪取したりするなど、攻撃的な企業間伝播とラテラルムーブメントを試みた。

  • マルウェアの特徴、攻撃インフ​​ラ、攻撃ツールなど、過去のKimsukyの攻撃事例との共通点が多数確認された。

1. 概要

ENKI Whitehatの脅威研究チームは、2025年から2026年初頭にかけて、国内企業グループウェア開発企業の内部ネットワークに侵入し、ラテラルムーブメント(横展開)および顧客企業への侵入を試みた北朝鮮を背景に持つ攻撃グループ「Kimsuky」の攻撃事例を追跡した。分析の結果、攻撃者は脆弱性の悪用やスピアフィッシングなどの初期侵入経路を通じて外部ネットワークと接続されたサーバーの制御権を確保し、Gomirおよび様々な亜種のマルウェアをインストールした。

攻撃者はGoogleドライブをC&Cサーバーとして悪用したり、新しいカスタムプロトコルを実装するなどして(Gomir)マルウェアの通信方式を大幅に変更し、検知回避を効果的に試みた。また、侵害したグループウェア開発企業の製品を使用している顧客企業のサーバーに直接侵入したほか、グループウェアのログインページを改ざんして役職員のアカウント情報を流出させるなど、積極的なラテラルムーブメントを試みた。

本レポートは、攻撃に使用されたGomir、BirdTroy、DriveTroyを検出できる検出スクリプトおよびYARAルールを併せて提供する。

2. 背景

本報告書で分析されたGomirマルウェア系統は、過去にKimsukyのTrollStealerキャンペーンで初めて報告された。2024年のS2Wの報告事例では、KimsukyがGo言語をベースに作成されたTrollStealerとGoBearを正常な証明書で署名して流布していた状況が確認された。その後、AhnLabの報告事例でも同タイプのマルウェアが流布されており、Endoorと命名された。その後、Symantecの続報レポートにおいて、WindowsターゲットであるGoBearマルウェアのLinuxターゲットの亜種であるGomirが分析された。

Kimsukyは過去にも、韓国国内企業の新インフラを対象に攻撃を行っていた。2024年にAhnLabが報告したSmallTigerマルウェアの流布事例では、国内の複数企業を対象に攻撃が行われ、過去にKimsukyグループが使用したマルウェアも同時に確認された。前述のTrollStealerキャンペーンにおいても、国内の建設関連協会のホームページにて、セキュリティプログラムのインストールプロセスにマルウェアが挿入されていた事実が確認されている。

3. 初期侵入

2025년 11월に確認されたグループウェア開発会社Aの侵害事例では、外部からアクセス可能なメールサーバーの遠隔コード実行脆弱性を介してGomirがインストールされた事実が確認された。ただし、攻撃者が該当の脆弱性情報を事前にどのような経路で入手したかは確認されていない。

취약점 악용 Gomir 설치 사례

caption - 脆弱性を悪用したGomirのインストール事例

2025년 12월に確認されたグループウェア製品開発会社Bの侵害事例では、所属する役職員のPCを介して社内インフラへの初期侵入が行われた。インストールされたマルウェアは、2025년 9월にGen Digitalによって報告された実績があるHttpTroyの亜種であることが確認された。詳細な挙動については、該当の報告書を参照されたい。過去のHttpTroyの流布事例に照らし合わせると、攻撃者はスピアフィッシングなどのソーシャルエンジニアリング手法を使用して、役職員のPCにマルウェアをインストールしたものと推定される。本攻撃事例で使用されたHttpTroyの主要情報は以下の表の通りである。

| **MD5** | 633c3076c396f2200048d1b62da204d2 |
| --- | --- |
| Export 関数 | hello |
| C&C サーバー | hxxps://auth.samecloud.o-r[.]kr/index.php |
| タスク名 (持続性) | AhnlabUpdate

| **MD5** | 633c3076c396f2200048d1b62da204d2 |
| --- | --- |
| Export 関数 | hello |
| C&C サーバー | hxxps://auth.samecloud.o-r[.]kr/index.php |
| タスク名 (持続性) | AhnlabUpdate

| **MD5** | 633c3076c396f2200048d1b62da204d2 |
| --- | --- |
| Export 関数 | hello |
| C&C サーバー | hxxps://auth.samecloud.o-r[.]kr/index.php |
| タスク名 (持続性) | AhnlabUpdate

caption - 攻撃に使用されたHttpTroy亜種の基本情報

攻撃者はHttpTroyを介してDWAgent、プロキシツールなどの追加の攻撃ツールをインストールした。DWAgentは、リモートデスクトップおよびシステム管理のためのオープンソースの遠隔接続ツールであり、攻撃者はこれを悪用して感染した被害者のWindows PCをWeb UIを介して遠隔制御した。攻撃者は config.json に自身の アカウント情報を記録し、DWAgentの構成要素全体をzip圧縮して被害者のサーバーにインストールし、実行した。攻撃に使用されたDWAgentの config.json は以下の通りである。

{
 "enabled": true,
 "key": "sUgmupzJnAcroInrxqXO",
 "listen_port": 7950,
 "nodes": [
  {
   "id": "ND896147",
   "port": "443",
   "server": "node896147.dwservice[.]net"
  },
  {
   "id": "ND828765",
   "port": "443",
   "server": "node828765.dwservice[.]net"
  },
  {
   "id": "ND449013",
   "port": "443",
   "server": "node449013.dwservice[.]net"
  }
 ],
 "password": "eJxLL09OrQorcisqzM7ITa8qcvVzcQ50Tsr1KisoS0oHALaSC5E=",
 "url_primary": "https://www.dwservice[.]net/"

{
 "enabled": true,
 "key": "sUgmupzJnAcroInrxqXO",
 "listen_port": 7950,
 "nodes": [
  {
   "id": "ND896147",
   "port": "443",
   "server": "node896147.dwservice[.]net"
  },
  {
   "id": "ND828765",
   "port": "443",
   "server": "node828765.dwservice[.]net"
  },
  {
   "id": "ND449013",
   "port": "443",
   "server": "node449013.dwservice[.]net"
  }
 ],
 "password": "eJxLL09OrQorcisqzM7ITa8qcvVzcQ50Tsr1KisoS0oHALaSC5E=",
 "url_primary": "https://www.dwservice[.]net/"

{
 "enabled": true,
 "key": "sUgmupzJnAcroInrxqXO",
 "listen_port": 7950,
 "nodes": [
  {
   "id": "ND896147",
   "port": "443",
   "server": "node896147.dwservice[.]net"
  },
  {
   "id": "ND828765",
   "port": "443",
   "server": "node828765.dwservice[.]net"
  },
  {
   "id": "ND449013",
   "port": "443",
   "server": "node449013.dwservice[.]net"
  }
 ],
 "password": "eJxLL09OrQorcisqzM7ITa8qcvVzcQ50Tsr1KisoS0oHALaSC5E=",
 "url_primary": "https://www.dwservice[.]net/"

プロキシツールは、攻撃者が容易なラテラルムーブメント(横展開)およびクローズドネットワークへのアクセスのためにインストールした。このプロキシツールは yamux (TCPセッションマルチプレクサー) ライブラリをベースに実装されており、リレーアドレスにTCP接続を確立し、yamuxストリームを受け入れる。その後、各ストリームに対してターゲットアドレスに

4. マルウェア解析

4.1. Gomir

本キャンペーンにおいて、攻撃者は初期侵入後に社内インフラの制御権を確保した上で、Gomirをインストールした。Gomirは2024年に初めて報告されたGoBearマルウェアのLinuxターゲット亜種であり、Go言語で記述されたRATマルウェアである。分析されたGomirマルウェアはUPX 3.96でパッキングされており、Goモジュールのパスは以下の通りである。

  • Goモジュール: local[.]github[.]com/Github-Lin/Main

Gomir Go 모듈 관련 문자열

caption - Gomir Goモジュール関連の文字列

実行時にコマンドライン引数を確認し、引数が install であれば、まず永続性確保のルーチンに進入し、それ以外の場合は即座にC&C通信ループを開始する。永続性確保のルーチンでは、getegidで有効グループIDを確認し、ルート権限であればsystemdサービスを、そうでなければcronジョブを登録する。ルート権限の場合、以下のプロセスを経てsystemdサービス方式で永続性を確保する。

  1. /var/log/rsyslogdへの自己コピー、権限0777

  2. /etc/systemd/system/rsyslogd.service ユニットの作成

  3. systemctl daemon-reloadsystemctl reenable rsyslogdsystemctl start rsyslogd

  4. オリジナル(元ファイル)の削除

ルート権限でない場合、以下のプロセスを経てcrontab方式で永続性を確保する。

  1. crontab -l で既存の内容を読み込み、*/10 * * * * <自己のパス> の項目を追加して cron.txt に記録

  2. crontab cron.txt の実行

  3. cron.txt を削除した後に再実行

永続性確保の後(またはinstallの指定がない場合は即座に)、C&Cサーバー通信ループに進入し、ボットIDを生成する。ボットIDは、ユーザー名、ホスト名、MACアドレスを結合した文字列のMD5上位5バイトを16進数でエンコードし、固定プレフィックス XX- と結合して XX-[0-9a-f]{10} の形式で生成される。

Gomir 봇 ID 생성 루틴

caption - Gomir ボットID生成ルーチン

マルウェアは、実行時に二重実行を防ぐためにTCPリスナーを並行して駆動する。通常モードはTCP 19838ポート、installモードはTCP 19837ポートを占有し、すでにポートが使用中の場合は二重実行と判断して終了する。

Gomir 포트 점유 루틴

caption - Gomir ポート占有ルーチン

Gomirは、C&Cサーバーとのメイン通信ループにおいてHTTPS POST方式を使用し、C&CサーバーのURLは以下の通りである。

  • C&Cサーバー: hxxps://commit[.]hanbiro[.]o-r[.]kr/index.php

POSTパラメータは <プレフィックス>[a-zA-Z0-9]{9} の形式であり、固定プレフィックス1文字の後ろに要求ごとにランダム生成される9文字が追加される。コマンド受信要求パラメータの構成は、下表の通りである。

| プレフィックス |  | 説明 |
| --- | --- | --- |
| a | 2 | 要求タイプ |
| b | ボットID + "1" | 被害者識別子 |
| c | - | 未確認

| プレフィックス |  | 説明 |
| --- | --- | --- |
| a | 2 | 要求タイプ |
| b | ボットID + "1" | 被害者識別子 |
| c | - | 未確認

| プレフィックス |  | 説明 |
| --- | --- | --- |
| a | 2 | 要求タイプ |
| b | ボットID + "1" | 被害者識別子 |
| c | - | 未確認

caption - Gomir コマンド受信要求パラメータ

サーバー応答の最初のバイトが S(0x53)であれば、残りのデータを標準のBase64の "+/" の代わりに "-_" を用いるURL-safe Base64でデコードする。デコード結果の最初の4バイトを復号キーとし、残りのデータに対して (ciphertext - key[i%4]) mod 255 を適用する。ただし、0x00バイトは変換しない。

コマンド結果の送信時には、ランダムな4バイトのキーを生成して各バイトに (plaintext + key[i%4]) mod 255 演算を適用する。ただし、0x00バイトは変換しない。暗号化された結果の前に、暗号化に使用した4バイトのキーを結合した上で、URL-safe Base64でエンコードする。結果送信の要求パラメータ構成は、下表の通りである。

| プレフィックス |  | 説明 |
| --- | --- | --- |
| x | 1 | 要求タイプ |
| y | ボットID + "2" | 被害者識別子 |
| z | URL-safe Base64(key || ciphertext) | 暗号化された実行結果

| プレフィックス |  | 説明 |
| --- | --- | --- |
| x | 1 | 要求タイプ |
| y | ボットID + "2" | 被害者識別子 |
| z | URL-safe Base64(key || ciphertext) | 暗号化された実行結果

| プレフィックス |  | 説明 |
| --- | --- | --- |
| x | 1 | 要求タイプ |
| y | ボットID + "2" | 被害者識別子 |
| z | URL-safe Base64(key || ciphertext) | 暗号化された実行結果

caption - Gomir コマンド結果送信要求パラメータ

GomirがC&Cサーバーから受信したコマンドコードに応じて呼び出すハンドラー関数と、これによって実行される動作は下表の通りである。特徴的な点として、UploadおよびDownloadのハンドラー名がC&Cサーバーを主体として命名されている。

| コマンドコード | ハンドラー | 機能 |
| --- | --- | --- |
| 01 | Process_Sleep | 指定時間待機 |
| 02 | Process_Cmd | シェルコマンド実行 |
| 03 | Process_Pwd | カレントディレクトリ調査 |
| 04 | Process_Cd | ディレクトリ変更 |
| 05 | Process_Conn | TCP接続テスト |
| 06 | Process_Exit | 終了 |
| 07 | Process_Where | 実行元のパス調査 |
| 08 | Process_Dirsize | ディレクトリサイズ調査 |
| 09 | Process_GetInfo | システム情報調査 |
| 10 | - | シェルパス変更 |
| 11 | - | コードページ設定 |
| 12 | Process_Hibernate | 特定の日時まで休止(Asia/Seoul タイムゾーン) |
| 13 | "Not implemented on Linux!" 送信 | 元のWindowsマルウェアの痕跡(スクリーンショット) |
| 14 | Process_PForward_Add | プロキシ追加 |
| 15 | Process_PForward_List | プロキシ一覧調査 |
| 30 | Process_Upload | C&Cサーバーから被害システムへのファイル送信 |
| 31 | Process_Download | 被害システムからC&Cサーバーへのファイル送信 |
| その他 | "Unknown Command!\r\n" 送信

| コマンドコード | ハンドラー | 機能 |
| --- | --- | --- |
| 01 | Process_Sleep | 指定時間待機 |
| 02 | Process_Cmd | シェルコマンド実行 |
| 03 | Process_Pwd | カレントディレクトリ調査 |
| 04 | Process_Cd | ディレクトリ変更 |
| 05 | Process_Conn | TCP接続テスト |
| 06 | Process_Exit | 終了 |
| 07 | Process_Where | 実行元のパス調査 |
| 08 | Process_Dirsize | ディレクトリサイズ調査 |
| 09 | Process_GetInfo | システム情報調査 |
| 10 | - | シェルパス変更 |
| 11 | - | コードページ設定 |
| 12 | Process_Hibernate | 特定の日時まで休止(Asia/Seoul タイムゾーン) |
| 13 | "Not implemented on Linux!" 送信 | 元のWindowsマルウェアの痕跡(スクリーンショット) |
| 14 | Process_PForward_Add | プロキシ追加 |
| 15 | Process_PForward_List | プロキシ一覧調査 |
| 30 | Process_Upload | C&Cサーバーから被害システムへのファイル送信 |
| 31 | Process_Download | 被害システムからC&Cサーバーへのファイル送信 |
| その他 | "Unknown Command!\r\n" 送信

| コマンドコード | ハンドラー | 機能 |
| --- | --- | --- |
| 01 | Process_Sleep | 指定時間待機 |
| 02 | Process_Cmd | シェルコマンド実行 |
| 03 | Process_Pwd | カレントディレクトリ調査 |
| 04 | Process_Cd | ディレクトリ変更 |
| 05 | Process_Conn | TCP接続テスト |
| 06 | Process_Exit | 終了 |
| 07 | Process_Where | 実行元のパス調査 |
| 08 | Process_Dirsize | ディレクトリサイズ調査 |
| 09 | Process_GetInfo | システム情報調査 |
| 10 | - | シェルパス変更 |
| 11 | - | コードページ設定 |
| 12 | Process_Hibernate | 特定の日時まで休止(Asia/Seoul タイムゾーン) |
| 13 | "Not implemented on Linux!" 送信 | 元のWindowsマルウェアの痕跡(スクリーンショット) |
| 14 | Process_PForward_Add | プロキシ追加 |
| 15 | Process_PForward_List | プロキシ一覧調査 |
| 30 | Process_Upload | C&Cサーバーから被害システムへのファイル送信 |
| 31 | Process_Download | 被害システムからC&Cサーバーへのファイル送信 |
| その他 | "Unknown Command!\r\n" 送信

caption - Gomir コマンドコード一覧

1415のプロキシ機能は、前述のyamuxベースのプロキシツールと事実上同じ機能を実行する。認証キーとして使用された bf215181b5140522137b3d4f6b73544agithub のMD5ハッシュであり、Goモジュールのパス(local.github.com)とともに、攻撃者が一貫して使用するキーワードであることが確認されている。

Gomir 프록시 인증 키

caption - Gomir プロキシ認証キー

3031のファイル送受信機能は、ハンドラー関数名のUpload、Downloadにおける主体がC&Cサーバーに合わせられている点が特徴的である。コマンド受信後、[a-zA-Z0-9]{10} 形式のセッショントークンを生成してC&Cサーバーに送信し、以降その送信が完了するまでボットIDの代わりにセッショントークンを用いてC&Cサーバーと通信する。ファイル転送時に使用されるコマンドコードは下表の通りである。

| コマンドコード | 説明 |
| --- | --- |
| 20 | データチャンク |
| 21 | 送信完了 (EOF) |
| 22 | エラー |
| OK | 受信確認 (ACK)

| コマンドコード | 説明 |
| --- | --- |
| 20 | データチャンク |
| 21 | 送信完了 (EOF) |
| 22 | エラー |
| OK | 受信確認 (ACK)

| コマンドコード | 説明 |
| --- | --- |
| 20 | データチャンク |
| 21 | 送信完了 (EOF) |
| 22 | エラー |
| OK | 受信確認 (ACK)

caption - Gomir ファイル送受信コマンドコード一覧

4.2. BirdTroy

BirdTroyは、GomirとHttpTroyの特徴を同時に兼ね備えた新しいタイプのRATマルウェアであり、これまで一般に公開された分析事例がないことが確認されている。ビルドモジュールのパスが Bird/module である点から、攻撃者が Bird という名前で開発したマルウェアと推測され、HttpTroyと類似したコマンドコードおよび機能が識別されたため、BirdTroyと命名された。

BirdTroy Go 모듈 경로

caption - BirdTroy Goモジュールパス

実行時にコマンドライン引数を解析し、マルウェアの動作に使用する。各引数が担当する機能は下表の通りである。

| コマンドライン引数 | 機能 |
| --- | --- |
| -url  | C&CサーバーのURL (デフォルト値: hxxps://69[.]10[.]50[.]165:8443) |
| -method  | 送信プロトコルの選択 (http または http3, デフォルト値: http) |
| -m | マルチモード: ボットIDに multi_ プレフィックスを追加 |
| -i | インストールモード: C&Cサーバー通信ループに進入する前に永続性確保のルーチンを実行

| コマンドライン引数 | 機能 |
| --- | --- |
| -url  | C&CサーバーのURL (デフォルト値: hxxps://69[.]10[.]50[.]165:8443) |
| -method  | 送信プロトコルの選択 (http または http3, デフォルト値: http) |
| -m | マルチモード: ボットIDに multi_ プレフィックスを追加 |
| -i | インストールモード: C&Cサーバー通信ループに進入する前に永続性確保のルーチンを実行

| コマンドライン引数 | 機能 |
| --- | --- |
| -url  | C&CサーバーのURL (デフォルト値: hxxps://69[.]10[.]50[.]165:8443) |
| -method  | 送信プロトコルの選択 (http または http3, デフォルト値: http) |
| -m | マルチモード: ボットIDに multi_ プレフィックスを追加 |
| -i | インストールモード: C&Cサーバー通信ループに進入する前に永続性確保のルーチンを実行

caption - BirdTroy コマンドライン引数一覧

実行ファイルの絶対パスに .tmp 拡張子を付与したファイルを、二重実行防止に用いる。syscall.Flockによって該当ファイルに対して排他ロック(LOCK_EX|LOCK_NB)を試行し、ロック取得に失敗した場合は終了する。同一ファイルはボットIDの保存先としても活用される。ファイルが存在しないか、空である場合は、<[a-zA-Z0-9]{10}> 形式のボットIDを生成し、同一のパスファイルに保存する。

BirdTroy 중복 실행 방지 루틴

caption - BirdTroy 二重実行防止ルーチン

-i フラグが指定されている場合、Gomirと完全に同一の永続性確保ルーチンが実行されるが、これはBirdTroyがGomirのソースコードをベースに変更が加えられた亜種マルウェアであることを明確に示している。永続性確保の完了後(または -i が指定されていない場合は即座に)、C&C通信ループに進入する。

BirdTroyは、カスタムパケットを構成してC&Cサーバーと通信する。パケット全体をBase64でエンコードした後に Content-Type: application/json ヘッダーを伴い、HTTP POST方式で送信する。送信プロトコルとしてhttp3を指定すると、github.com/quic-go/quic-go ライブラリベースのHTTP/3(QUIC)送信を使用する。HTTP/3(QUIC)はUDPベースのプロトコルであり、TCPポート443を対象とする従来のネットワークセキュリティ機器によるトラフィック検査を回避することができる。C&Cサーバーとの通信時に使用されるパケットの構造は以下の通りである。

type PACKET struct {
    Type     uint8    // パケットタイプ
    ChatID   uint8    // セッション識別子
    Num      uint8    // シーケンス番号
    Checksum uint32   // MD5の先頭4バイト (整合性検証)
    Data     []byte   // ペイロード

type PACKET struct {
    Type     uint8    // パケットタイプ
    ChatID   uint8    // セッション識別子
    Num      uint8    // シーケンス番号
    Checksum uint32   // MD5の先頭4バイト (整合性検証)
    Data     []byte   // ペイロード

type PACKET struct {
    Type     uint8    // パケットタイプ
    ChatID   uint8    // セッション識別子
    Num      uint8    // シーケンス番号
    Checksum uint32   // MD5の先頭4バイト (整合性検証)
    Data     []byte   // ペイロード

パケットのDataフィールドに対するチェックサムは、MD5ハッシュの上位4バイトをbig-endianのuint32として解釈した値である。パケットの最初の1バイトに保存されるパケットタイプ情報は下表の通りであり、タイプ3は存在しない。

| タイプ | 用途 |
| --- | --- |
| 1 | セッションの初期化 (ボットID送信) |
| 2 | サーバー応答 (ChatIDの割り当て) |
| 4 | Keepalive |
| 5 | コマンド / 結果 |
| 6 | ファイル受信開始 |
| 7 | EOF (送信完了) |
| 8 | 接続終了通知 / 再送信要求 |
| 9 | データチャンク |
| 10 | ACK |
| 11 | ファイル送信開始

| タイプ | 用途 |
| --- | --- |
| 1 | セッションの初期化 (ボットID送信) |
| 2 | サーバー応答 (ChatIDの割り当て) |
| 4 | Keepalive |
| 5 | コマンド / 結果 |
| 6 | ファイル受信開始 |
| 7 | EOF (送信完了) |
| 8 | 接続終了通知 / 再送信要求 |
| 9 | データチャンク |
| 10 | ACK |
| 11 | ファイル送信開始

| タイプ | 用途 |
| --- | --- |
| 1 | セッションの初期化 (ボットID送信) |
| 2 | サーバー応答 (ChatIDの割り当て) |
| 4 | Keepalive |
| 5 | コマンド / 結果 |
| 6 | ファイル受信開始 |
| 7 | EOF (送信完了) |
| 8 | 接続終了通知 / 再送信要求 |
| 9 | データチャンク |
| 10 | ACK |
| 11 | ファイル送信開始

caption - BirdTroy パケットタイプ情報

通信フローの全体概要図は以下の図を参照されたい。

BirdTroy 통신 흐름 개요도

caption - BirdTroy 通信フロー概要図

タイプ5で受信したコマンド文字列は空白で分割され、最初のトークンがコマンドコードとして使用される。ファイル送受信機能のコマンドコードおよびハンドラー関数名は、Gomirと同様にC&Cサーバーを主体として記述されている。コマンドコードに応じて呼び出されるハンドラー関数および実行される動作は、下表の通りである。

| コマンドコード | ハンドラー関数 | 機能 |
| --- | --- | --- |
| up | Bird_module_file.UploadFile | C&Cサーバーから被害システムへのファイル送信 |
| down | Bird_module_file.DownFile | 被害システムからC&Cサーバーへのファイル送信 |
| sleep | time.Sleep | N時間の待機 |
| delete | Bird_module_shell.Selfdelete | 自己削除 |
| screen | Bird_module_file.ScreenDown | スクリーンショット撮影およびアップロード |
| その他 | Bird_module_shell.RunShell | シェルコマンドの実行

| コマンドコード | ハンドラー関数 | 機能 |
| --- | --- | --- |
| up | Bird_module_file.UploadFile | C&Cサーバーから被害システムへのファイル送信 |
| down | Bird_module_file.DownFile | 被害システムからC&Cサーバーへのファイル送信 |
| sleep | time.Sleep | N時間の待機 |
| delete | Bird_module_shell.Selfdelete | 自己削除 |
| screen | Bird_module_file.ScreenDown | スクリーンショット撮影およびアップロード |
| その他 | Bird_module_shell.RunShell | シェルコマンドの実行

| コマンドコード | ハンドラー関数 | 機能 |
| --- | --- | --- |
| up | Bird_module_file.UploadFile | C&Cサーバーから被害システムへのファイル送信 |
| down | Bird_module_file.DownFile | 被害システムからC&Cサーバーへのファイル送信 |
| sleep | time.Sleep | N時間の待機 |
| delete | Bird_module_shell.Selfdelete | 自己削除 |
| screen | Bird_module_file.ScreenDown | スクリーンショット撮影およびアップロード |
| その他 | Bird_module_shell.RunShell | シェルコマンドの実行

caption - BirdTroy コマンドコード一覧

4.3. DriveTroy

DriveTroyはGoogleドライブをC&Cサーバーとして悪用するバックドアであり、永続性確保やコマンドコード等においてGomirとの多くの類似性が確認されていることから、攻撃者が新たに作成したGomirの亜種マルウェアであると判断される。ビルドパスは C:/Users/jira/go/src/jira/payload/ と記録されている。

DriveTroy Go 모듈 경로

caption - DriveTroy Goモジュールパス

実行時に、自分自身のファイル末尾部分からGoogleドライブ通信に使用される設定データを抽出する。ファイル末尾の4バイトをASCII文字列として読み取って設定のサイズ(バイト数)を取得し、該当サイズ分だけ前に遡って暗号化された設定データを読み取る。設定データはRC4暗号化された後、Gomirで使用されたものと同様のURL-safe Base64 (”+/“ の代わりに “-_”) でエンコードされた状態であり、RC4キーと復号された設定情報は以下の通りである。

  • RC4キー: @st34GMEgfesy4R#r21f

| 項目 |  |
| --- | --- |
| uid | E8C46207 |
| client_id | 368946970262-i4nsp00cnj1olit05i14v6u2lngpvugv.apps.googleusercontent.com |
| client_secret | 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 |
| refresh_token | 1//0eAl3kWDUNkxHCgYIARAAGA4SNwF-L9IrQd8BchULcAyKaEsz-Qk7URxr2QtcZj6v5_eJXh1fo-UY3H2Y8Qkrq3ltOWFul1PuwTo |
| 項目 |  |
| --- | --- |
| uid | E8C46207 |
| client_id | 368946970262-i4nsp00cnj1olit05i14v6u2lngpvugv.apps.googleusercontent.com |
| client_secret | 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 |
| refresh_token | 1//0eAl3kWDUNkxHCgYIARAAGA4SNwF-L9IrQd8BchULcAyKaEsz-Qk7URxr2QtcZj6v5_eJXh1fo-UY3H2Y8Qkrq3ltOWFul1PuwTo |
| 項目 |  |
| --- | --- |
| uid | E8C46207 |
| client_id | 368946970262-i4nsp00cnj1olit05i14v6u2lngpvugv.apps.googleusercontent.com |
| client_secret | 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 |
| refresh_token | 1//0eAl3kWDUNkxHCgYIARAAGA4SNwF-L9IrQd8BchULcAyKaEsz-Qk7URxr2QtcZj6v5_eJXh1fo-UY3H2Y8Qkrq3ltOWFul1PuwTo |

caption - DriveTroy Googleアカウント認証情報

上記認証情報によって確認された攻撃者のGoogleアカウント情報は下表の通りである。


| 項目 | 情報 |
| --- | --- |
| email | vcenter[.]secmail@gmail[.]com |
| username | mo mo

| 項目 | 情報 |
| --- | --- |
| email | vcenter[.]secmail@gmail[.]com |
| username | mo mo

| 項目 | 情報 |
| --- | --- |
| email | vcenter[.]secmail@gmail[.]com |
| username | mo mo

caption - DriveTroy Googleアカウント情報

Engineの初期化後、CreateSessionを呼び出して hxxps://api[.]ipify[.]org に対しHTTP GET要求を送信し、被害システムの外部IPアドレスを問い合わせる。取得したIPをRC4で暗号化し、さらにURL-safe Base64でエンコードしてGoogleドライブに E8C46207.ses というファイル名でアップロードする。通信データの暗号化に使用されるRC4キーは、設定データの復号に使用されたキーと同じである。

세션 파일 업로드 루틴

caption - セッションファイルアップロードルーチン

その後の通信ループにおいて、Googleドライブの E8C46207.cmd ファイルを1秒間隔でダウンロードしてコマンドを受信する。受信データはURL-safe Base64でデコードされた後にRC4で復号され、先頭の2バイトがASCII形式のコマンドコード、残りの部分がコマンドデータとなる。実行結果は同様にRC4で暗号化され、URL-safe Base64でエンコードされて E8C46207.res というファイル名でGoogleドライブにアップロードされる。

구글 드라이브 폴링 루틴

caption - Googleドライブポーリング(polling)ルーチン

コマンドコードの構成はGomirに類似しているが、まだコマンドコードおよび機能のうち8種のみが実装されており、GomirおよびBirdTroyとは異なりRecvやUploadの主体が被害システム基準で記述されている。コマンドコードに応じて実行される動作は、下表の通りである。

| コマンドコード | ハンドラー | 機能 |
| --- | --- | --- |
| 00 | GetBasicInfo | システム情報の収集 (user, os, path) |
| 01 | ShellRun | シェルコマンド実行 |
| 02 | RecvFile | GDriveから被害者PCへとファイルをダウンロード |
| 03 | UploadFile | 被害者PCからGDriveへとファイルをアップロード |
| 04 | Sleep | 指定された時間の待機 |
| 05 | AutoRun | 永続性の確保 (systemd/crontab) |
| 06 | Die | 自己削除 + 終了 |
| 07 | ConnCheck | TCP接続テスト

| コマンドコード | ハンドラー | 機能 |
| --- | --- | --- |
| 00 | GetBasicInfo | システム情報の収集 (user, os, path) |
| 01 | ShellRun | シェルコマンド実行 |
| 02 | RecvFile | GDriveから被害者PCへとファイルをダウンロード |
| 03 | UploadFile | 被害者PCからGDriveへとファイルをアップロード |
| 04 | Sleep | 指定された時間の待機 |
| 05 | AutoRun | 永続性の確保 (systemd/crontab) |
| 06 | Die | 自己削除 + 終了 |
| 07 | ConnCheck | TCP接続テスト

| コマンドコード | ハンドラー | 機能 |
| --- | --- | --- |
| 00 | GetBasicInfo | システム情報の収集 (user, os, path) |
| 01 | ShellRun | シェルコマンド実行 |
| 02 | RecvFile | GDriveから被害者PCへとファイルをダウンロード |
| 03 | UploadFile | 被害者PCからGDriveへとファイルをアップロード |
| 04 | Sleep | 指定された時間の待機 |
| 05 | AutoRun | 永続性の確保 (systemd/crontab) |
| 06 | Die | 自己削除 + 終了 |
| 07 | ConnCheck | TCP接続テスト

caption - DriveTroy コマンドコード一覧

コマンド 05 を受信した際、永続性を確保する動作を実行する。GomirおよびBirdTroyの永続性確保ルーチンとは、下表のような違いがある。

| **項目** | Gomir / BirdTroy | DriveTroy |
| --- | --- | --- |
| root検証ロジック | getegid | /etc/shadow 読み取り |
| サービス名 | rsyslogd | syslogd, logd, cachelogd, cachemond, monlogd からランダムに選択 |
| ExecStart | /bin/sh -c "/var/log/rsyslogd" | <自身のパス> & |
| Restart | always | on-failure |
| 一時ファイル | cron.txt (カレントディレクトリ) | /tmp/[a-zA-Z0-9]{6}

| **項目** | Gomir / BirdTroy | DriveTroy |
| --- | --- | --- |
| root検証ロジック | getegid | /etc/shadow 読み取り |
| サービス名 | rsyslogd | syslogd, logd, cachelogd, cachemond, monlogd からランダムに選択 |
| ExecStart | /bin/sh -c "/var/log/rsyslogd" | <自身のパス> & |
| Restart | always | on-failure |
| 一時ファイル | cron.txt (カレントディレクトリ) | /tmp/[a-zA-Z0-9]{6}

| **項目** | Gomir / BirdTroy | DriveTroy |
| --- | --- | --- |
| root検証ロジック | getegid | /etc/shadow 読み取り |
| サービス名 | rsyslogd | syslogd, logd, cachelogd, cachemond, monlogd からランダムに選択 |
| ExecStart | /bin/sh -c "/var/log/rsyslogd" | <自身のパス> & |
| Restart | always | on-failure |
| 一時ファイル | cron.txt (カレントディレクトリ) | /tmp/[a-zA-Z0-9]{6}

caption - 永続性確保ルーチンの比較

5. 後続の後戻り攻撃活動

5.1. 顧客企業の被害事例

分析の過程で、攻撃者が制御権を確保したグループウェア開発企業の内部情報を流出させ、当該企業の製品を使用する顧客企業のインフラに侵入した事例が多数確認された。これらの事例から、攻撃者がグループウェア開発企業を主なターゲットに据え、内部設定情報やソースコードを確保した上で、企業間の感染拡大を狙っていたことが明らかになった。

5.1.1. ケースA

メールサーバーの脆弱性によりGomirマルウェアがインストールされていたグループウェア開発企業AのSaaS型顧客企業グループウェアサーバーに、Gomirマルウェアがインストールされた形跡が確認された。詳細な侵入経路を確認することはできなかったが、グループウェア開発企業のインフラを探索してSaaS型グループウェアサーバーに対する設定情報などを確保した後、追加の侵入を進行したと推定される。本顧客企業の被害事例における侵入のタイムラインは以下の通りである。

Case A 타임라인

caption - ケースAのタイムライン

5.1.2. ケースB

DriveTroyの実行ログがアップロードされる攻撃者のGoogleドライブを監視していたところ、侵害されたグループウェア開発企業Bの顧客企業に対する追加の侵害の兆候が確認された。DriveTroyのインストールが確認された日の翌日に、別の被害サーバーにおけるidコマンドの実行結果が捉えられた。

공격자 구글 드라이브의 고객사 서버 정보

caption - 攻撃者のGoogleドライブにある顧客企業のサーバー情報

この時に確認されたユーザー名が、前日にアップロードされたグループウェア開発企業BのVOC(Voice of Customer)サーバーのディレクトリ一覧結果におけるディレクトリ名と同一であった。追加感染したサーバーは、既存で感染していたグループウェア開発企業Bの製品を使用するオンプレミス型の顧客企業のサーバーであることが確認された。これは、攻撃者がグループウェア開発企業BのVOCサーバーに保存されていた顧客企業のサーバー情報や認証キーなどを通じて顧客企業のインフラへの侵入に成功した後、DriveTroyをインストールしてリモートコマンドを実行した痕跡であると推定される。

공격자 구글 드라이브의 개발사 VOC 서버 디렉토리 정보

caption - 攻撃者のGoogleドライブにある開発企業VOCサーバーのディレクトリ情報

その後、追加で確認された情報によると、攻撃者は数日後に同一のグループウェア製品を使用している別の顧客企業Zのメールを、グループウェアのアカウントを使用して不正に閲覧した。本顧客企業の被害事例における侵入のタイムラインは以下の通りである。

Case B 타임라인

caption - ケースBのタイムライン

5.2. グループウェアログインページの改ざん

分析の過程で、侵害されたグループウェア開発企業のうち1社の社内グループウェアログインページのHTMLコードから、入力されたIDとパスワードの情報を攻撃者のC&CサーバーへHTTPS POSTで送信するコードが確認された。

기존 그룹웨어 로그인 페이지

caption - 従来のグループウェアログインページ

조작된 그룹웨어 로그인 페이지

caption - 改ざんされたグループウェアログインページ

攻撃者がグループウェアサーバーの制御権を確保したとしても、役職員のパスワードはサーバーにハッシュ化された状態で保存されているため、DBの奪取だけでは平文のパスワードを直接確保することはできない。したがって、攻撃者は直接グループウェアにログインして追加の探索を継続するためにログインページを改変し、役職員のグループウェアログイン情報の流出を試みた。侵害された当時、当該被害サーバーのログインプロセスにはOTPなどの二要素認証システムが存在していなかったため、攻撃者は流出したアカウント情報を利用して社内インフラを容易に探索できたと推定される。

6. Kimsukyとの関連性

6.1. マルウェアの特徴

前述の背景セクションで言及したように、Gomirマルウェアは過去、KimsukyのTrollStealerキャンペーンで初めて報告された。分析の過程で新たに確保したBirdTroyとDriveTroyは、C&Cインフラおよび詳細な動作方式に変化が見られたものの、Gomirマルウェアといくつかの機能的な類似性が確認された。以下は、3つのマルウェアの類似点を比較した表である。

| **項目** | Gomir | BirdTroy | DriveTroy |
| --- | --- | --- | --- |
| 言語 | Go | Go | Go |
| 対象OS | Linux | Linux | Linux |
| インストールモード進入 | install引数 | -iフラグ | コマンドコード 05 |
| root判定 | getegid | getegid | /etc/shadowの読み取り |
| 持続性 | systemdまたはcrontab | systemdまたはcrontab | systemdまたはcrontab |
| systemdサービス名 | rsyslogd | rsyslogd | syslogd、logd、cachelogd、cachemond、monlogdの中からランダムに選択 |
| コマンドコード形式 | 2バイトASCII数字 | 単語 | 2バイトASCII数字 |
| ファイル送受信ハンドラ名の主体 | C&Cサーバ基準 | C&Cサーバ基準 | 被害システム基準

| **項目** | Gomir | BirdTroy | DriveTroy |
| --- | --- | --- | --- |
| 言語 | Go | Go | Go |
| 対象OS | Linux | Linux | Linux |
| インストールモード進入 | install引数 | -iフラグ | コマンドコード 05 |
| root判定 | getegid | getegid | /etc/shadowの読み取り |
| 持続性 | systemdまたはcrontab | systemdまたはcrontab | systemdまたはcrontab |
| systemdサービス名 | rsyslogd | rsyslogd | syslogd、logd、cachelogd、cachemond、monlogdの中からランダムに選択 |
| コマンドコード形式 | 2バイトASCII数字 | 単語 | 2バイトASCII数字 |
| ファイル送受信ハンドラ名の主体 | C&Cサーバ基準 | C&Cサーバ基準 | 被害システム基準

| **項目** | Gomir | BirdTroy | DriveTroy |
| --- | --- | --- | --- |
| 言語 | Go | Go | Go |
| 対象OS | Linux | Linux | Linux |
| インストールモード進入 | install引数 | -iフラグ | コマンドコード 05 |
| root判定 | getegid | getegid | /etc/shadowの読み取り |
| 持続性 | systemdまたはcrontab | systemdまたはcrontab | systemdまたはcrontab |
| systemdサービス名 | rsyslogd | rsyslogd | syslogd、logd、cachelogd、cachemond、monlogdの中からランダムに選択 |
| コマンドコード形式 | 2バイトASCII数字 | 単語 | 2バイトASCII数字 |
| ファイル送受信ハンドラ名の主体 | C&Cサーバ基準 | C&Cサーバ基準 | 被害システム基準

caption - マルウェアの特徴比較

6.2. 攻撃インフラの関連性

本レポートで分析されたすべてのマルウェアには、同一のC&CサーバHTTPS証明書が適用されていた。これは、最近のKimsukyの攻撃事例で繰り返し確認されているXAMPPデフォルトのHTTPS証明書である。当該HTTPS証明書の詳細情報は以下の表の通りである。

| Fingerprint | Subject DN | Names |
| --- | --- | --- |
| 9de541b039cfdb96c7810df49efd958b28cc2df73e314f67c1a91469a2b19796 | C=DE, ST=Berlin, L=Berlin, O=Apache Friends, CN=localhost | localhost

| Fingerprint | Subject DN | Names |
| --- | --- | --- |
| 9de541b039cfdb96c7810df49efd958b28cc2df73e314f67c1a91469a2b19796 | C=DE, ST=Berlin, L=Berlin, O=Apache Friends, CN=localhost | localhost

| Fingerprint | Subject DN | Names |
| --- | --- | --- |
| 9de541b039cfdb96c7810df49efd958b28cc2df73e314f67c1a91469a2b19796 | C=DE, ST=Berlin, L=Berlin, O=Apache Friends, CN=localhost | localhost

caption - HTTPS証明書情報

IPの観点でも、Kimsukyが好むASNとの一致が確認された。本レポートで識別されたC&CサーバIPは、すべてKimsukyが繰り返し使用してきた以下の2つのASNに属している。

  • ASN: 19318, 26666

XAMPPデフォルト証明書と確認された2つのASNは、個別にはKimsuky独自の指標とは言えないが、両方の要素が同時に現れた場合、Kimsukyインフを識別する有効な根拠となった。

さらに、DriveTroyのビルドパスで確認されたWindowsユーザー名 jira は、2026年にENKI Whitehatが報告したKimsukyのHttpSpy配布事例で分析されたマルウェア loadDll.dll のpdbパスおよび、おとり文書の「最終保存者」項目にも現れていた。これは、同じ攻撃者が2種類の攻撃キャンペーンを運営しているか、あるいは2つのキャンペーンの脅威アクターが同じ開発環境を共有している近い関係にあるという事実を明らかにしている。

HttpSpy 유포 사례의 미끼 문서 정보

caption - HttpSpy配布事例のおとり文書情報

6.3. 攻撃ツール

攻撃に使用されたDWAgentは、以前から北朝鮮を背景に持つ攻撃グループが侵入したWindows環境に便利にアクセスするためにしばしば使用してきたリモート制御ツールである。KasperskyのPebbleDashクラスター分析でも、Kimsukyが当該ツールを使用した事例が確認されている。

さらに、分析の過程で確保したプロキシツールのうち、認証キーとして「아무도몰라(誰も知らない)」のハングル英字入力キー変換文字列である dkanehahffk が使用されたバージョンが確認された。これは、当該ツールの開発者が韓国語(ハングル)に精通しているという事実を示している。

프록시 도구 한영 변환 인증 키

caption - プロキシツール ハングル英字キー変換認証キー

7. 対応策

今回の事例における初期侵入の一部は、外部からアクセス可能なメールサーバーのリモートコード実行脆弱性を介して行われた。このような経路を事前に防ぐためには、定期的な模擬ペネトレーションテスト(Pentest)によって、外部の攻撃対象領域(アタックサーフェス)と横方向の移動(ラテラルムーブメント)経路を点検する必要がある。

また、攻撃者はログインページを改ざんして資格情報を窃取し、さらなる侵入に悪用したが、侵害当時は二要素認証が導入されていなかったため、窃取されたアカウントで即座にログインできる状態であった。TOTPなどの二要素認証を導入することで、資格情報が流出したとしても、それを利用した内部への侵入を遮断することができる。

最後に、攻撃者はVOCサーバーに保存されていた顧客企業のディレクトリ情報を足がかりにして、顧客企業へと侵入を拡大させた。企業向けソフトウェア開発会社は、顧客企業のインフラを保護するために以下のような措置を講じる必要がある。

  • 保存された顧客企業の認証キーおよびアクセス情報の暗号化

  • 内部管理システムと運用サーバー間のアクセス分離

  • 顧客企業サーバーへのアクセスに関する監査ログの強化

  • 侵害発生時に顧客企業へ通知するプロセスの確立

分析されたGomir、BirdTroy、DriveTroyの検知ルールは、付録Dに添付している。

8. おわりに

本報告書は、2025年から2026年初頭にかけて、北朝鮮を背景に持つ攻撃グループが韓国国内の企業インフラに侵入し、ラテラルムーブメント(横展開)およびサプライチェーン攻撃を実行した事例を分析したものである。攻撃者はスピアフィッシングや脆弱性の悪用を通じて初期侵入に成功した後、Gomirをはじめとする多様なマルウェアを活用してLinuxサーバー環境まで攻撃範囲を拡大した。特に、グループウェア開発会社のVOCサーバーから顧客企業のサーバー情報を窃取し、顧客企業のインフラまで侵害した痕跡が確認された。また、グループウェアのログインページを改ざんして役職員の認証情報(クレデンシャル)を収集するなど、単一の侵害を組織全体へと拡散させる積極的なラテラルムーブメントの痕跡が観察された。

マルウェアの側面においては、Google ドライブをC&Cチャネルとして活用したり、カスタムプロトコルを実装したりするなど、検知回避のための通信方式の進化が顕著であった。新たに確認されたBirdTroyとDriveTroyは、GomirやHttpTroyとコマンドコード構造およびコードパターンを共有しており、同一の脅威アクターが継続的にツールを開発・拡張していることを示している。

9. 付録

付録 A. MITRE ATT&CK

| Tactics | Techniques |
| --- | --- |
| Initial Access | T1566: Phishing-nT1190: Exploit Public-Facing Application-nT1199: Trusted Relationship |
| Execution | T1059.004: Command and Scripting Interpreter: Unix Shell-nT1204.002: User Execution: Malicious File |
| Persistence | T1543.002: Create or Modify System Process: Systemd Service-nT1053.003: Scheduled Task/Job: Cron |
| Stealth | T1027.002: Obfuscated Files or Information: Software Packing-nT1027.013: Obfuscated Files or Information: Encrypted/Encoded File-nT1036.004: Masquerading: Masquerade Task or Service-nT1140: Deobfuscate/Decode Files or Information-nT1070.004: Indicator Removal: File Deletion |
| Credential Access | T1056.003: Input Capture: Web Portal Capture |
| Discovery | T1082: System Information Discovery-nT1083: File and Directory Discovery-nT1016: System Network Configuration Discovery-nT1049: System Network Connections Discovery |
| Lateral Movement | T1021: Remote Services-nT1078: Valid Accounts-nT1570: Lateral Tool Transfer |
| Collection | T1005: Data from Local System-nT1113: Screen Capture |
| Command and Control | T1071.001: Application Layer Protocol: Web Protocols-nT1132.001: Data Encoding: Standard Encoding-nT1573.001: Encrypted Channel: Symmetric Cryptography-nT1090: Proxy-nT1102.002: Web Service: Bidirectional Communication |
| Exfiltration | T1041: Exfiltration Over C2 Channel-nT1567.002: Exfiltration to Cloud Storage

| Tactics | Techniques |
| --- | --- |
| Initial Access | T1566: Phishing-nT1190: Exploit Public-Facing Application-nT1199: Trusted Relationship |
| Execution | T1059.004: Command and Scripting Interpreter: Unix Shell-nT1204.002: User Execution: Malicious File |
| Persistence | T1543.002: Create or Modify System Process: Systemd Service-nT1053.003: Scheduled Task/Job: Cron |
| Stealth | T1027.002: Obfuscated Files or Information: Software Packing-nT1027.013: Obfuscated Files or Information: Encrypted/Encoded File-nT1036.004: Masquerading: Masquerade Task or Service-nT1140: Deobfuscate/Decode Files or Information-nT1070.004: Indicator Removal: File Deletion |
| Credential Access | T1056.003: Input Capture: Web Portal Capture |
| Discovery | T1082: System Information Discovery-nT1083: File and Directory Discovery-nT1016: System Network Configuration Discovery-nT1049: System Network Connections Discovery |
| Lateral Movement | T1021: Remote Services-nT1078: Valid Accounts-nT1570: Lateral Tool Transfer |
| Collection | T1005: Data from Local System-nT1113: Screen Capture |
| Command and Control | T1071.001: Application Layer Protocol: Web Protocols-nT1132.001: Data Encoding: Standard Encoding-nT1573.001: Encrypted Channel: Symmetric Cryptography-nT1090: Proxy-nT1102.002: Web Service: Bidirectional Communication |
| Exfiltration | T1041: Exfiltration Over C2 Channel-nT1567.002: Exfiltration to Cloud Storage

| Tactics | Techniques |
| --- | --- |
| Initial Access | T1566: Phishing-nT1190: Exploit Public-Facing Application-nT1199: Trusted Relationship |
| Execution | T1059.004: Command and Scripting Interpreter: Unix Shell-nT1204.002: User Execution: Malicious File |
| Persistence | T1543.002: Create or Modify System Process: Systemd Service-nT1053.003: Scheduled Task/Job: Cron |
| Stealth | T1027.002: Obfuscated Files or Information: Software Packing-nT1027.013: Obfuscated Files or Information: Encrypted/Encoded File-nT1036.004: Masquerading: Masquerade Task or Service-nT1140: Deobfuscate/Decode Files or Information-nT1070.004: Indicator Removal: File Deletion |
| Credential Access | T1056.003: Input Capture: Web Portal Capture |
| Discovery | T1082: System Information Discovery-nT1083: File and Directory Discovery-nT1016: System Network Configuration Discovery-nT1049: System Network Connections Discovery |
| Lateral Movement | T1021: Remote Services-nT1078: Valid Accounts-nT1570: Lateral Tool Transfer |
| Collection | T1005: Data from Local System-nT1113: Screen Capture |
| Command and Control | T1071.001: Application Layer Protocol: Web Protocols-nT1132.001: Data Encoding: Standard Encoding-nT1573.001: Encrypted Channel: Symmetric Cryptography-nT1090: Proxy-nT1102.002: Web Service: Bidirectional Communication |
| Exfiltration | T1041: Exfiltration Over C2 Channel-nT1567.002: Exfiltration to Cloud Storage

キャプション - MITRE ATT&CK

付録 B. IOC(侵害指標)

MD5

| MD5 | 情報 |
| --- | --- |
| e6c6fa32da47d9341b778bfa424abb4c | Gomir (UPX packed) |
| b1c72139f2cdd9419562369fc6ced4fc | Gomir |
| 84e9b066bebd49036b7fc71b5f5f8d83 | Gomir |
| e911f8f7c49476806ada37f3ebb7a28a | Gomir |
| aa61e76255a6e13313439655bc02bdf5 | Gomir |
| ca98a51cebdc802d255030b4baa44ca0 | BirdTroy |
| c2e37232556357944a04edf1dec3934b | BirdTroy |
| a452a860f973c7a43ea804c17e9427d2 | DriveTroy |
| 633c3076c396f2200048d1b62da204d2 | HttpTroy |
| dff787bce68c7653495f153c0534cb96 | DWAgent.zip

| MD5 | 情報 |
| --- | --- |
| e6c6fa32da47d9341b778bfa424abb4c | Gomir (UPX packed) |
| b1c72139f2cdd9419562369fc6ced4fc | Gomir |
| 84e9b066bebd49036b7fc71b5f5f8d83 | Gomir |
| e911f8f7c49476806ada37f3ebb7a28a | Gomir |
| aa61e76255a6e13313439655bc02bdf5 | Gomir |
| ca98a51cebdc802d255030b4baa44ca0 | BirdTroy |
| c2e37232556357944a04edf1dec3934b | BirdTroy |
| a452a860f973c7a43ea804c17e9427d2 | DriveTroy |
| 633c3076c396f2200048d1b62da204d2 | HttpTroy |
| dff787bce68c7653495f153c0534cb96 | DWAgent.zip

| MD5 | 情報 |
| --- | --- |
| e6c6fa32da47d9341b778bfa424abb4c | Gomir (UPX packed) |
| b1c72139f2cdd9419562369fc6ced4fc | Gomir |
| 84e9b066bebd49036b7fc71b5f5f8d83 | Gomir |
| e911f8f7c49476806ada37f3ebb7a28a | Gomir |
| aa61e76255a6e13313439655bc02bdf5 | Gomir |
| ca98a51cebdc802d255030b4baa44ca0 | BirdTroy |
| c2e37232556357944a04edf1dec3934b | BirdTroy |
| a452a860f973c7a43ea804c17e9427d2 | DriveTroy |
| 633c3076c396f2200048d1b62da204d2 | HttpTroy |
| dff787bce68c7653495f153c0534cb96 | DWAgent.zip

caption - MD5

IP

  • 69[.]10[.]50[.]165

  • 208[.]73[.]202[.]29

  • 163[.]245[.]195[.]172

URLs

  • hxxps://auth[.]samecloud[.]o-r[.]kr/index.php

  • hxxps://commit[.]hanbiro[.]o-r[.]kr/index.php

  • hxxps://oobe[.]webjine[.]o-r[.]kr/index.php

  • hxxps://global[.]webjine[.]o-r[.]kr/index.php

  • hxxp://www[.]ilskdeid[.]o-r[.]kr:8000/

  • hxxps://oauth[.]shacloud[.]o-r[.]kr:8443

  • hxxps://69[.]10[.]50[.]165:8443

付録 C. メタデータ

攻撃者のGoogleアカウントトークンおよび情報

| 項目 | 情報 |
| --- | --- |
| client_id | 368946970262-i4nsp00cnj1olit05i14v6u2lngpvugv.apps.googleusercontent.com |
| client_secret | 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 |
| refresh_token | 1//0eAl3kWDUNkxHCgYIARAAGA4SNwF-L9IrQd8BchULcAyKaEsz-Qk7URxr2QtcZj6v5_eJXh1fo-UY3H2Y8Qkrq3ltOWFul1PuwTo |
| email | vcenter[.]secmail@gmail[.]com |
| username | mo mo

| 項目 | 情報 |
| --- | --- |
| client_id | 368946970262-i4nsp00cnj1olit05i14v6u2lngpvugv.apps.googleusercontent.com |
| client_secret | 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 |
| refresh_token | 1//0eAl3kWDUNkxHCgYIARAAGA4SNwF-L9IrQd8BchULcAyKaEsz-Qk7URxr2QtcZj6v5_eJXh1fo-UY3H2Y8Qkrq3ltOWFul1PuwTo |
| email | vcenter[.]secmail@gmail[.]com |
| username | mo mo

| 項目 | 情報 |
| --- | --- |
| client_id | 368946970262-i4nsp00cnj1olit05i14v6u2lngpvugv.apps.googleusercontent.com |
| client_secret | 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 |
| refresh_token | 1//0eAl3kWDUNkxHCgYIARAAGA4SNwF-L9IrQd8BchULcAyKaEsz-Qk7URxr2QtcZj6v5_eJXh1fo-UY3H2Y8Qkrq3ltOWFul1PuwTo |
| email | vcenter[.]secmail@gmail[.]com |
| username | mo mo

キャプション - 攻撃者のGoogleアカウントトークンおよび情報

RC4 キー

  • @st34GMEgfesy4R#r21f

付録 D. YARA ルール

rule BirdTroy_Linux {
    meta:
        description = "BirdTroy - Go-based Linux backdoor (Bird/module namespace)"
        date = "2026-05-28"
        hash1 = "ca98a51cebdc802d255030b4baa44ca0"
        hash2 = "c2e37232556357944a04edf1dec3934b"
    strings:
        $ns1 = "Bird/module/packet."
        $ns2 = "Bird/module/autorun."
        $ns3 = "Bird/module/shell."
        $ns4 = "Bird/module/protocol."
        $resp1 = "success upload file"
        $resp2 = "usege: sleep [hour]"
        $resp3 = "delete success"
        $code_bswap = { 8B 00 0F C8 48 81 C4 B8 00 00 00 5D C3 }
    condition:
        uint32(0) == 0x464C457F and (
            3 of ($ns*) or
            (2 of ($resp*) and 1 of ($ns*)) or
            ($code_bswap and 1 of ($ns*))
        )
}

rule DriveTroy_Linux {
    meta:
        description = "DriveTroy - Go-based Linux backdoor abusing Google Drive"
        date = "2026-05-28"
        hash = "a452a860f973c7a43ea804c17e9427d2"
    strings:
        $ns1 = "jira/payload/gdrive."
        $ns2 = "jira/payload/common."
        $ns3 = "jira/payload/common/transfer."
        $svc1 = "cachelogd"
        $svc2 = "cachemond"
        $svc3 = "monlogd"
        $build = "C:/Users/jira/go/src/jira/payload/"
        $code_tail = { 48 C7 C3 FC FF FF FF B9 02 00 00 00 0F 1F 00 E8 }
        $code_shadow = { 48 8D 05 ?? ?? ?? ?? BB 0B 00 00 00 E8 ?? ?? ?? ?? 48 85 FF 74 07 }
    condition:
        uint32(0) == 0x464C457F and (
            2 of ($ns*) or
            $build or
            2 of ($svc*) or
            ($code_tail and $code_shadow)
        )
}

rule Gomir_Linux {
    meta:
        description = "Gomir - Go-based Linux backdoor (Github-Lin/Main/Kernel)"
        date = "2026-06-02"
        hash1 = "b1c72139f2cdd9419562369fc6ced4fc"
        hash2 = "84e9b066bebd49036b7fc71b5f5f8d83"
        hash3 = "e911f8f7c49476806ada37f3ebb7a28a"
        hash4 = "aa61e76255a6e13313439655bc02bdf5"
    strings:
        $ns1 = "local.github.com/Github-Lin/Main/Kernel."
        $ns2 = "local.github.com/Github-Lin/Main/exe"
        $cmd1 = "Not implemented on Linux!"
        $cmd2 = "Unknown Command!\r\n"
        $cmd3 = "Invalid Param!\r\n"
        $persist1 = "/etc/systemd/system/rsyslogd.service"
        $persist2 = "systemctl reenable rsyslogd"
        $code_mod255 = { 48 B8 81 80 80 80 80 80 80 80 49 89 D3 49 F7 E8 }
        $code_sleep = { 48 B8 00 10 A5 D4 E8 00 00 00 E8 ?? ?? ?? ?? EB EF }
        $code_uid = { 48 83 F9 05 7D 3B 0F B6 74 0C 46 89 F7 40 C0 EE 04 }
    condition:
        uint32(0) == 0x464C457F and (
            1 of ($ns*) or
            (2 of ($cmd*) and 1 of ($persist*)) or
            $code_mod255 or
            ($code_sleep and 1 of ($ns*, $persist*)) or
            ($code_uid and 1 of ($ns*, $persist

rule BirdTroy_Linux {
    meta:
        description = "BirdTroy - Go-based Linux backdoor (Bird/module namespace)"
        date = "2026-05-28"
        hash1 = "ca98a51cebdc802d255030b4baa44ca0"
        hash2 = "c2e37232556357944a04edf1dec3934b"
    strings:
        $ns1 = "Bird/module/packet."
        $ns2 = "Bird/module/autorun."
        $ns3 = "Bird/module/shell."
        $ns4 = "Bird/module/protocol."
        $resp1 = "success upload file"
        $resp2 = "usege: sleep [hour]"
        $resp3 = "delete success"
        $code_bswap = { 8B 00 0F C8 48 81 C4 B8 00 00 00 5D C3 }
    condition:
        uint32(0) == 0x464C457F and (
            3 of ($ns*) or
            (2 of ($resp*) and 1 of ($ns*)) or
            ($code_bswap and 1 of ($ns*))
        )
}

rule DriveTroy_Linux {
    meta:
        description = "DriveTroy - Go-based Linux backdoor abusing Google Drive"
        date = "2026-05-28"
        hash = "a452a860f973c7a43ea804c17e9427d2"
    strings:
        $ns1 = "jira/payload/gdrive."
        $ns2 = "jira/payload/common."
        $ns3 = "jira/payload/common/transfer."
        $svc1 = "cachelogd"
        $svc2 = "cachemond"
        $svc3 = "monlogd"
        $build = "C:/Users/jira/go/src/jira/payload/"
        $code_tail = { 48 C7 C3 FC FF FF FF B9 02 00 00 00 0F 1F 00 E8 }
        $code_shadow = { 48 8D 05 ?? ?? ?? ?? BB 0B 00 00 00 E8 ?? ?? ?? ?? 48 85 FF 74 07 }
    condition:
        uint32(0) == 0x464C457F and (
            2 of ($ns*) or
            $build or
            2 of ($svc*) or
            ($code_tail and $code_shadow)
        )
}

rule Gomir_Linux {
    meta:
        description = "Gomir - Go-based Linux backdoor (Github-Lin/Main/Kernel)"
        date = "2026-06-02"
        hash1 = "b1c72139f2cdd9419562369fc6ced4fc"
        hash2 = "84e9b066bebd49036b7fc71b5f5f8d83"
        hash3 = "e911f8f7c49476806ada37f3ebb7a28a"
        hash4 = "aa61e76255a6e13313439655bc02bdf5"
    strings:
        $ns1 = "local.github.com/Github-Lin/Main/Kernel."
        $ns2 = "local.github.com/Github-Lin/Main/exe"
        $cmd1 = "Not implemented on Linux!"
        $cmd2 = "Unknown Command!\r\n"
        $cmd3 = "Invalid Param!\r\n"
        $persist1 = "/etc/systemd/system/rsyslogd.service"
        $persist2 = "systemctl reenable rsyslogd"
        $code_mod255 = { 48 B8 81 80 80 80 80 80 80 80 49 89 D3 49 F7 E8 }
        $code_sleep = { 48 B8 00 10 A5 D4 E8 00 00 00 E8 ?? ?? ?? ?? EB EF }
        $code_uid = { 48 83 F9 05 7D 3B 0F B6 74 0C 46 89 F7 40 C0 EE 04 }
    condition:
        uint32(0) == 0x464C457F and (
            1 of ($ns*) or
            (2 of ($cmd*) and 1 of ($persist*)) or
            $code_mod255 or
            ($code_sleep and 1 of ($ns*, $persist*)) or
            ($code_uid and 1 of ($ns*, $persist

rule BirdTroy_Linux {
    meta:
        description = "BirdTroy - Go-based Linux backdoor (Bird/module namespace)"
        date = "2026-05-28"
        hash1 = "ca98a51cebdc802d255030b4baa44ca0"
        hash2 = "c2e37232556357944a04edf1dec3934b"
    strings:
        $ns1 = "Bird/module/packet."
        $ns2 = "Bird/module/autorun."
        $ns3 = "Bird/module/shell."
        $ns4 = "Bird/module/protocol."
        $resp1 = "success upload file"
        $resp2 = "usege: sleep [hour]"
        $resp3 = "delete success"
        $code_bswap = { 8B 00 0F C8 48 81 C4 B8 00 00 00 5D C3 }
    condition:
        uint32(0) == 0x464C457F and (
            3 of ($ns*) or
            (2 of ($resp*) and 1 of ($ns*)) or
            ($code_bswap and 1 of ($ns*))
        )
}

rule DriveTroy_Linux {
    meta:
        description = "DriveTroy - Go-based Linux backdoor abusing Google Drive"
        date = "2026-05-28"
        hash = "a452a860f973c7a43ea804c17e9427d2"
    strings:
        $ns1 = "jira/payload/gdrive."
        $ns2 = "jira/payload/common."
        $ns3 = "jira/payload/common/transfer."
        $svc1 = "cachelogd"
        $svc2 = "cachemond"
        $svc3 = "monlogd"
        $build = "C:/Users/jira/go/src/jira/payload/"
        $code_tail = { 48 C7 C3 FC FF FF FF B9 02 00 00 00 0F 1F 00 E8 }
        $code_shadow = { 48 8D 05 ?? ?? ?? ?? BB 0B 00 00 00 E8 ?? ?? ?? ?? 48 85 FF 74 07 }
    condition:
        uint32(0) == 0x464C457F and (
            2 of ($ns*) or
            $build or
            2 of ($svc*) or
            ($code_tail and $code_shadow)
        )
}

rule Gomir_Linux {
    meta:
        description = "Gomir - Go-based Linux backdoor (Github-Lin/Main/Kernel)"
        date = "2026-06-02"
        hash1 = "b1c72139f2cdd9419562369fc6ced4fc"
        hash2 = "84e9b066bebd49036b7fc71b5f5f8d83"
        hash3 = "e911f8f7c49476806ada37f3ebb7a28a"
        hash4 = "aa61e76255a6e13313439655bc02bdf5"
    strings:
        $ns1 = "local.github.com/Github-Lin/Main/Kernel."
        $ns2 = "local.github.com/Github-Lin/Main/exe"
        $cmd1 = "Not implemented on Linux!"
        $cmd2 = "Unknown Command!\r\n"
        $cmd3 = "Invalid Param!\r\n"
        $persist1 = "/etc/systemd/system/rsyslogd.service"
        $persist2 = "systemctl reenable rsyslogd"
        $code_mod255 = { 48 B8 81 80 80 80 80 80 80 80 49 89 D3 49 F7 E8 }
        $code_sleep = { 48 B8 00 10 A5 D4 E8 00 00 00 E8 ?? ?? ?? ?? EB EF }
        $code_uid = { 48 83 F9 05 7D 3B 0F B6 74 0C 46 89 F7 40 C0 EE 04 }
    condition:
        uint32(0) == 0x464C457F and (
            1 of ($ns*) or
            (2 of ($cmd*) and 1 of ($persist*)) or
            $code_mod255 or
            ($code_sleep and 1 of ($ns*, $persist*)) or
            ($code_uid and 1 of ($ns*, $persist

エンキホワイトハット

エンキホワイトハット

ENKI ホワイトハット
ENKI ホワイトハット

オフェンシブセキュリティの専門企業として、攻撃者の視点から次元の異なるセキュリティを提示します。

オフェンシブセキュリティの専門企業として、攻撃者の視点から次元の異なるセキュリティを提示します。

隙のないセキュリティ設計の始まり、NO.1ホワイトハッカーのノウハウから

インシデント発生前、
今すぐ備えましょう

隙のないセキュリティ設計の始まり、
No.1ホワイトハッカーのノウハウから

インシデント発生前、
今すぐ備えましょう

隙のないセキュリティ設計の始まり、
No.1ホワイトハッカーのノウハウから

インシデント発生前、
今すぐ備えましょう

購読する

コンテンツが役に立ったら?
エンキーレターを購読しましょう!

Copyright © 2025. ENKI WhiteHat Co., Ltd. All rights reserved.

Copyright © 2025. ENKI WhiteHat Co., Ltd. All rights reserved.

Copyright © 2025. ENKI WhiteHat Co., Ltd. All rights reserved.