
TP-Link Omada ER605ルーターのDDNSクライアントデーモン(cmxddnsd)を介した認証前のリモートコード実行エクスプロイト
TP-Link Omada ER605のDDNSクライアントデーモン(cmxddnsd)がComexe DDNSサービスを使用するように設定されている場合を標的とした、Proof-of-Concept(PoC)エクスプロイトチェーン。
⚠️ 法律/倫理: このリポジトリは許可されたセキュリティ研究および管理されたラボでの再現のみを目的としています。所有していない、または明示的な許可がないシステムに対して使用しないでください。
このPoCは、以下の3つを組み合わせた連鎖的アプローチを示しています。
このチェーンは、以下の公開された問題に対応しています。
| CVE | ZDI Advisory | タイプ(ZDI/NVDによる説明) | チェーンにおけるハイレベルな役割 |
|---|
| CVE-2024-5244 | ZDI-24-503 | 難読化によるセキュリティへの依存(DDNSメッセージへのアクセス/スプーフィングが可能) | 正当なDDNSメッセージの作成/スプーフィングを可能にする |
| CVE-2024-5243 | ZDI-24-502 | DNS名の処理におけるバッファオーバーフロー | DNS名に関連する状態への影響/汚染、およびASLRバイパスリーク経路の実現に使用 |
| CVE-2024-5242 | ZDI-24-501 | DDNSエラーコードの処理におけるスタックベースのバッファオーバーフロー | ROPベースのRCEのための制御フローハイジャックプリミティブとして使用 |
注: このREADMEはCVE ↔ 問題の説明をZDI/NVDの表現に合わせています。実際のエクスプロイトの振り付けはファームウェアのビルドやローカルでの再現の詳細によって異なる場合があります。詳細については、
exploit.pyおよびこのリポジトリ内の分析ノートを参照してください。
< ER605(UN)_V2_2.2.42.2.2ER605(UN)_V2_2.2.4 Build 20240119(以降)ZDIは、Comexe DDNSが有効/設定されている場合の影響をネットワーク隣接と説明しています。実際には、再現には通常、ルーターのDDNS/DNSトラフィック経路を十分に観察および操作して、以下を実行できる必要があります。
このリポジトリは、管理されたラボの外部でそのようなポジショニングを実現するためのステップバイステップの運用ガイダンスを意図的に避けています。
┌─────────────────┐ ┌─────────────────────────┐
│ TP-Link ER605 │ │ 攻撃者 │
│ (cmxddnsd) │ │ (許可されたラボ設定) │
└───────┬─────────┘ └───────────┬─────────────┘
│ │
│ (1) DDNSメッセージのスプーフィング/なりすまし│ CVE-2024-5244
│<-----------------------------------------│
│ │
│ (2) 解析時のオーバーフローがDNS名に関連 │ CVE-2024-5243
│ する状態に影響を与え、後にDNSクエリ │
│ 送信経路(例:sndDnsQuery)でリークが │
│ 発生しASLRをバイパス │
│<-----------------------------------------│
│ │
│ (3) エラーコードオーバーフローによる制御 │ CVE-2024-5242
│ フローハイジャック → ROP → system(command)│
│<-----------------------------------------│
主要な分離点:
_chkPktに近い解析ロジック)。exploit.py — ラボ再現で使用するPoC実装(ビルド固有の定数/オフセットを埋める必要あり)。README.md — このドキュメント。このPoCには、対象のファームウェアとlibcに依存するビルド固有の値(例:オフセット、ガジェットの位置、リークの解釈)が必要です。これらの値は意図的にプレースホルダーとして残されており、テストされたビルドの分析を通じて導出する必要があります。
プレースホルダーの例(exploit.pyを参照):
system()のオフセット解析ロジックにおける繰り返し現れるアンチパターンは、デリミタから導出された長さを使用して攻撃者が制御するフィールドデータをコピーする際に、宛先バッファサイズに適切に制限しないことです(概念的には以下)。
char *end = strchr(ptr, '\x01'); // デリミタ
int len = end - ptr; // 攻撃者が影響を与える長さ
memcpy_or_strncpy(dest, ptr, len); // 境界チェック欠如 -> オーバーフロー
このPoCは、MIPS delay slotに対応した以下のようなガジェット形状を使用します。
move $t9, $s0
jalr $t9
move $a0, $s1 ; delay slot
レジスタ退避の上書きにより$s0と$s1を制御することで、コンパクトなsystem(command)呼び出しシーケンスを実現します。
実際のペイロード構築は、以下の要因によって制約されます。
\x01)、およびこの再現で使用される正確な制約については、exploit.pyを参照してください。
このコードとドキュメントは、教育目的および許可されたセキュリティ研究のためにのみ提供されています。明示的な許可なしに使用することは禁止されており、違法となる可能性があります。