
# مشروع مختبر الأمن السيبراني CMPT733 II: إضافة GDB لاستغلالات الكومة مستوحاة من CVE-2021-3156

مشروع مختبر الأمن السيبراني CMPT733 - الجزء الثاني
.
├── README.md
├── heaplens.png
├── heaplens.py
├── logs
│ ├── sudoedit-#.txt
│ └── ...
└── tests
├── Makefile
├── env-in-heap
└── ...
README.md: هنا!heaplens.py: السكربت الرئيسيlogs/: يحتوي على بعض السجلات النموذجية التي التقطناها أثناء التطوير والاختبارtests/: يحتوي على بعض الملفات الثنائية (وأكوادها المصدرية) للاختبارفيما يلي قائمة بالأشياء (والإصدارات) التي استخدمناها لاختبار الاستغلال. يجب أن تكون مثبتة بالفعل في الجهاز الافتراضي. في حال كان أي شيء مفقودًا، اتبع التعليمات أدناه.
python 3.8.10glibc 2.34gdb 9.2gef 2022.01
gef مفعّلاً تحت المستخدم الجذر، ألقِ نظرة على /root/.gdbinit~/.gdbinitsudo (لتشغيل heaplens على sudo)مطلوب ملف ثنائي لـ sudo مع تمكين التصحيح. تم تثبيت ملف ثنائي مُجهّز مسبقًا مع رموز التصحيح في الجهاز الافتراضي.
cyberlab@ubuntu:~$ which sudo
/usr/local/bin/sudo
cyberlab@ubuntu:~$ sudo --version
Sudo version 1.8.31
Sudoers policy plugin version 1.8.31
Sudoers file grammar version 46
Sudoers I/O plugin version 1.8.31
cyberlab@ubuntu:~$ sudoedit -s /
sudoedit: /: not a regular file # sudo is vulnerable
تم هذا بالفعل في الجهاز الافتراضي. في حال كان الإعداد خاطئًا، يمكنك اتباع التعليمات هنا لتحميل Heaplens.
ابدأ gef وعدّل الإعدادات:
gef➤ gef config gef.extra_plugins_dir <path to>/heaplens
gef➤ gef save
gef➤ q
يجب أن يحدّث هذا الملف ~/.gef.rc أو /root/.gef.rc (تحت المستخدم الجذر).
أضف هذا السطر في ~/.gdbinit أو /root/.gdbinit:
source <path to>/heaplens/heaplens.py
يُقترح تشغيل gdb تحت المستخدم الجذر عند تصحيح البرامج المميزة:
$ sudo su
# gdb
يتم توفير رسائل مساعدة لجميع الأوامر. يمكنك الوصول إليها عبر <command> -h في GDB.
heaplensيجمع معلومات الكومة من دوال تخصيص وإلغاء تخصيص الذاكرة، بما في ذلك malloc و realloc و calloc و free.
الفكرة العامة هي أنه من خلال ربط هذه الدوال، يمكننا أتمتة عملية فحص وتحديث مكدس الاستدعاءات بالإضافة إلى عنوان الإرجاع لتخصيص الذاكرة. من خلال فحص التتبعات، يمكننا رؤية أي قطعة يتم تخصيصها بواسطة foo() في بعض ملفات C، ويمكننا التحقيق أكثر، على سبيل المثال عن طريق فحص القطع المجاورة، للعثور على أهداف مناسبة لاستغلال الكومة.
كما يدعم إضافة نقاط توقف مخصصة في المنتصف إذا كان المستخدم مهتمًا بتخطيط كومة وسيط.
الأمر نفسه ليس مفصلاً للغاية وستحتاج إلى استخدام heaplens-dump لطباعة النتائج.
heaplens -h
usage: [-h] [-b BREAKPOINT] [-v]
Collect heap info from memory (de)allocation functions.
optional arguments:
-h, --help show this help message and exit
-b BREAKPOINT, --breakpoint BREAKPOINT
stop the executions here (execute br {breakpoint} in gdb) (default: None)
-v, --verbose increase output verbosity (default: False)
مثال على الإخراج:
gef➤ file sudoedit
gef➤ heaplens -b set_cmnd -- -s '\\' $(python3 -c 'print("A"*65535)')
----------------------------
Initializing Heaplens
----------------------------
Temporary breakpoint 1 at 0x5840: file ../../src/src/sudo.c, line 136.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
usage: sudoedit [-AknS] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...
[Inferior 1 (process 82934) exited with code 01]
Setting breakpoint at set_cmnd...
Function "set_cmnd" not defined.
Breakpoint 2 (set_cmnd) pending.
Hooking free function...
Breakpoint 3 at 0x7f25cc163700: free. (2 locations)
Hooking malloc function...
Breakpoint 4 at 0x7f25cc163110: malloc. (2 locations)
Hooking realloc function...
Breakpoint 5 at 0x7f25cc163eb0: realloc. (2 locations)
Hooking calloc function...
Breakpoint 6 at 0x7f25cc164b40: calloc. (2 locations)
Running -s '\' $(python3 -c 'print("A"*65535)')...
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 2, set_cmnd () at ../../../src/plugins/sudoers/sudoers.c:804
804 ../../../src/plugins/sudoers/sudoers.c: No such file or directory.
Removing breakpoints from mem_bkps...
heaplens-dumpيفرّغ سجلات Heaplens. نوفر خيارات لكتابة النتائج إلى ملف، والإخراج بتنسيق JSON، وفرز القطع حسب عناوينها. في التفريغ، سيكون لكل قطعة عنوانها وحجمها وتتبّع الاستدعاءات ودالة تخصيص الذاكرة المرتبطة بها مسجلة بطريقة أكثر قابلية للقراءة.
heaplens-dump -h
usage: [-h] [-o OUTPUT] [--json] [-s]
Dump Heaplens logs. Writes to stdout by default.
optional arguments:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
write to file at path {output} (default: None)
--json dump in json (default: False)
-s, --sort sort the chunks by their addresses (default: False)
مثال على الإخراج:
gef➤ heaplens-dump
----------------------------
Dumping...
----------------------------
...
[malloc] Chunk 3 @ 0x55f3908ed2a0 | size 0xc
Trace:
#0 __GI___strdup (s=0x7fff6fb3b8dc "en_US.UTF-8") at strdup.c:44
#1 0x00007f285df363c5 in _nl_load_locale_from_archive (category=category@entry=0xc, namep=namep@entry=0x7fff6fb29f50) at loadarchive.c:464
#2 0x00007f285df351fe in _nl_find_locale (locale_path=0x0, locale_path_len=0x0, category=category@entry=0xc, name=name@entry=0x7fff6fb29f50) at findlocale.c:152
#3 0x00007f285df34925 in __GI_setlocale (locale=<optimized out>, category=<optimized out>) at setlocale.c:337
#4 __GI_setlocale (category=<optimized out>, locale=<optimized out>) at setlocale.c:217
#5 0x000055f3901d5965 in main (argc=0x4, argv=0x7fff6fb2a298, envp=0x7fff6fb2a2c0) at ../../src/src/sudo.c:1430
...
Dump complete.
heaplens-chunksيخرج نسخة معدلة قليلاً من heap chunks من gef.
هذا يوسّع heap chunks الخاص بـ GEF (الذي يعرض عناوين القطع وأعلامها وأحجامها وبياناتها الوصفية) من خلال دمج معلومات حول القطع الحرة من heap bins (الذي يسرد القطع المخصصة سابقًا والمحررة من صناديق glibc). يوفر GEF ميزات تساعد في فحص الكومة مثل الاثنين المذكورين، ولكن من الممل الجمع بينهما. على مستوى عالٍ، يجمع هذا الأمر عناوين القطع الحرة من الأخير، ويصنفها في نتيجة الأول.
heaplens-chunks -h
usage: [-h] [--nocolor]
A modified `heap chunks` with info about free chunks.
optional arguments:
-h, --help show this help message and exit
--nocolor disable ANSI color codes
مثال على الإخراج:
gef➤ heaplens-chunks
Showing current heap info with freed chunks:
...
Chunk(addr=0x55dd7f91ddb0, size=0xed0, flags=PREV_INUSE) ← free chunk
[0x000055dd7f91ddb0 e0 fb ba e1 f8 7f 00 00 e0 fb ba e1 f8 7f 00 00 ...............]
Chunk(addr=0x55dd7f91ec80, size=0x50, flags=! PREV_INUSE)
[0x000055dd7f91ec80 2f 75 73 72 2f 6c 6f 63 61 6c 2f 73 62 69 6e 3a /usr/local/sbin]
Chunk(addr=0x55dd7f91ecd0, size=0x4010, flags=PREV_INUSE) ← free chunk
[0x000055dd7f91ecd0 f0 02 bb e1 f8 7f 00 00 f0 02 bb e1 f8 7f 00 00 ...............]
Chunk(addr=0x55dd7f922ce0, size=0x50, flags=! PREV_INUSE)
[0x000055dd7f922ce0 90 02 91 7f dd 55 00 00 00 00 00 00 00 00 00 00 .....U.........]
Chunk(addr=0x55dd7f922d30, size=0x2da0, flags=PREV_INUSE) ← free chunk
[0x000055dd7f922d30 d0 02 bb e1 f8 7f 00 00 d0 02 bb e1 f8 7f 00 00 ...............]
Chunk(addr=0x55dd7f925ad0, size=0x110, flags=! PREV_INUSE) ← free chunk
[0x000055dd7f925ad0 00 00 00 00 00 00 00 00 10 f0 90 7f dd 55 00 00 .............U.]
Chunk(addr=0x55dd7f925be0, size=0x30, flags=PREV_INUSE)
[0x000055dd7f925be0 00 00 00 00 00 00 00 00 d2 78 b7 7e dd 55 00 00 .........x.~.U.]
Chunk(addr=0x55dd7f925c10, size=0x20, flags=PREV_INUSE)
[0x000055dd7f925c10 65 6e 5f 55 53 2e 55 54 46 2d 38 00 00 00 00 00 en_US.UTF-8....]
Chunk(addr=0x55dd7f925c30, size=0xa3e0, flags=PREV_INUSE) ← top chunk
heaplens-clearيمسح جميع السجلات/البيانات الداخلية التي تم جمعها واستخدامها بواسطة heaplens.
heaplens-clear -h
usage: [-h] [-v]
Clear Heaplens logs.
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity
heaplens-list-envيسرد متغيرات البيئة المخزنة والمحررة في الكومة. إنه مفيد بشكل خاص عندما تريد إجراء تهيئة الكومة (heap grooming) لأن هذه المتغيرات قد تؤثر على تخطيط الكومة.
heaplens-list-env -h
usage: [-h] [-v] [--prefix PREFIX] [--suffix SUFFIX] [-b BREAKPOINT] [-s SKIP]
List environment variables that might affect the heap layout.
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity
--prefix PREFIX environment variable value prefix
--suffix SUFFIX environment variable value suffix
-b BREAKPOINT, --breakpoint BREAKPOINT
stop the executions here (execute br {breakpoint} in gdb)
-s SKIP, --skip SKIP skip this environment variable
مثال على الإخراج:
gef➤ file sudoedit
Reading symbols from sudoedit...
gef➤ heaplens-list-env -s LC_ALL -b set_cmnd --prefix C.UTF-8@ -- -s \\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
...
1st execution. Found following environment variable:
['LOCPATH', 'LC_ALL', 'LC_IDENTIFICATION', 'LANG', 'LC_MEASUREMENT', 'LC_TELEPHONE', 'LC_ADDRESS', 'LC_NAME', 'LC_PAPER', 'LC_MESSAGES', 'LC_MONETARY', 'LC_COLLATE', 'LC_TIME', 'LC_NUMERIC', 'LC_CTYPE', 'TZ', 'SHELL', 'LANGUAGE']
...
2nd execution. Possible environment variables for heap grooming:
['LC_IDENTIFICATION', 'LC_COLLATE', 'TZ', 'LC_TIME', 'LANGUAGE', 'LC_NAME', 'LOCPATH', 'LC_MESSAGES', 'LC_NUMERIC', 'LC_ADDRESS', 'LC_TELEPHONE', 'LC_MONETARY', 'LC_MEASUREMENT', 'LC_CTYPE', 'LC_PAPER']
لبناء سكربتات حالات الاختبار (مبنية في الجهاز الافتراضي)
$ cd tests
$ make all
tests/heap-dumpgef➤ file tests/heap-dump
gef➤ heaplens -b breakme
gef➤ heaplens-dump
sudoedit إلى output.txtgef➤ file sudoedit
gef➤ heaplens -b set_cmnd -- -s \\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
gef➤ heaplens-dump -o output.txt
tests/env-in-heapgef➤ file tests/env-in-heap
gef➤ heaplens-list-env
...
----------------------------
2nd execution. Possible environment variables for heap grooming:
['ENV_IN_HEAP']
----------------------------
sudoeditgef➤ file sudoedit
gef➤ heaplens-list-env -s LC_ALL -b set_cmnd --prefix C.UTF-8@ -- -s \\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
...
----------------------------
1st execution. Found following environment variable:
['LOCPATH', 'LC_ALL', 'LC_IDENTIFICATION', 'LANG', 'LC_MEASUREMENT', 'LC_TELEPHONE', 'LC_ADDRESS', 'LC_NAME', 'LC_PAPER', 'LC_MESSAGES', 'LC_MONETARY', 'LC_COLLATE', 'LC_TIME', 'LC_NUMERIC', 'LC_CTYPE', 'TZ', 'SHELL', 'LANGUAGE']
----------------------------
...
----------------------------
2nd execution. Possible environment variables for heap grooming:
['LC_CTYPE', 'LC_PAPER', 'LC_MONETARY', 'TZ', 'LC_ADDRESS', 'LC_MEASUREMENT', 'LC_IDENTIFICATION', 'LC_COLLATE', 'LC_NUMERIC', 'LC_MESSAGES', 'LC_TIME', 'LANGUAGE', 'LC_NAME', 'LOCPATH', 'LC_TELEPHONE']
----------------------------
يرجى الرجوع إلى صفحة المشكلات لمزيد من التفاصيل.