
# CMPT733 साइबर सुरक्षा लैब II परियोजना: CVE-2021-3156 से प्रेरित हीप शोषण के लिए GDB प्लगइन

CMPT733 साइबर सुरक्षा लैब II परियोजना
.
├── README.md
├── heaplens.png
├── heaplens.py
├── logs
│ ├── sudoedit-#.txt
│ └── ...
└── tests
├── Makefile
├── env-in-heap
└── ...
README.md: यहीं है!heaplens.py: मुख्य स्क्रिप्टlogs/: विकास और परीक्षण के दौरान हमारे द्वारा कैप्चर किए गए कुछ नमूना लॉग शामिल हैंtests/: परीक्षण के लिए कुछ बाइनरी (और उनके सोर्स कोड) शामिल हैंयह उन चीज़ों (और संस्करणों) की सूची है जिनका उपयोग हमने एक्सप्लॉइट का परीक्षण करने के लिए किया। वे VM में पहले से इंस्टॉल होने चाहिए। यदि कुछ भी गायब है, तो नीचे दिए गए निर्देशों का पालन करें।
python 3.8.10glibc 2.34gdb 9.2gef 2022.01
gef रूट के अंतर्गत सक्षम नहीं है, तो /root/.gdbinit देखें~/.gdbinit में हैsudo निर्भरताएँ (sudo पर heaplens चलाने के लिए)डिबगिंग सक्षम के साथ sudo का एक बाइनरी आवश्यक है। डिबग प्रतीकों के साथ एक पूर्व-निर्मित बाइनरी VM में इंस्टॉल की गई है।
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 कमजोर है
यह VM में पहले ही किया जा चुका है। यदि कॉन्फ़िगरेशन गलत है, तो आप हीलेंस लोड करने के लिए यहाँ दिए गए निर्देशों का पालन कर सकते हैं।
gef शुरू करें और कॉन्फ़िग संपादित करें:
gef➤ gef config gef.extra_plugins_dir <पथ>/heaplens
gef➤ gef save
gef➤ q
यह फ़ाइल ~/.gef.rc या /root/.gef.rc (रूट के अंतर्गत) को अपडेट करना चाहिए।
~/.gdbinit या /root/.gdbinit में यह पंक्ति जोड़ें:
source <पथ>/heaplens/heaplens.py
विशेषाधिकार प्राप्त प्रोग्रामों को डिबग करते समय रूट के अंतर्गत gdb चलाने की सलाह दी जाती है:
$ sudo su
# gdb
सभी कमांड के लिए सहायता संदेश प्रदान किए गए हैं। आप GDB में <command> -h के माध्यम से उन तक पहुँच सकते हैं।
heaplensमेमोरी आवंटन और विमोचन फ़ंक्शनों से हीप जानकारी एकत्र करता है, जिसमें malloc, realloc, calloc, और free शामिल हैं।
उच्च-स्तरीय विचार यह है कि इन फ़ंक्शनों को हुक करके, हम कॉल स्टैक के साथ-साथ मेमोरी आवंटन के रिटर्न पते की जाँच और अद्यतन करने की प्रक्रिया को स्वचालित कर सकते हैं। ट्रेस की जाँच करके, हम देख सकते हैं कि कुछ C फ़ाइलों में foo() द्वारा कौन सा चंक आवंटित किया गया है, और हम आगे की जाँच कर सकते हैं, जैसे कि आसन्न चंकों की जाँच करके, हीप एक्सप्लॉइटेशन के लिए उपयुक्त लक्ष्य खोजने के लिए।
यह बीच में कस्टम ब्रेकपॉइंट जोड़ने का भी समर्थन करता है यदि उपयोगकर्ता मध्यवर्ती हीप लेआउट में रुचि रखता है।
कमांड स्वयं बहुत वर्बोज़ नहीं है और परिणाम प्रिंट करने के लिए आपको heaplens-dump का उपयोग करने की आवश्यकता होगी।
heaplens -h
usage: [-h] [-b BREAKPOINT] [-v]
मेमोरी (डी)आवंटन फ़ंक्शनों से हीप जानकारी एकत्र करें।
optional arguments:
-h, --help यह सहायता संदेश दिखाएँ और बाहर निकलें
-b BREAKPOINT, --breakpoint BREAKPOINT
यहाँ निष्पादन रोकें (gdb में br {breakpoint} निष्पादित करें) (default: None)
-v, --verbose आउटपुट वर्बोसिटी बढ़ाएँ (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हीलेंस लॉग डंप करता है। हम परिणामों को फ़ाइल में लिखने, JSON प्रारूप का उपयोग करके आउटपुट देने और चंकों को उनके पतों द्वारा क्रमबद्ध करने के विकल्प प्रदान करते हैं। डंप में, प्रत्येक चंक का पता, आकार, बैकट्रेस और संबंधित मेमोरी आवंटन फ़ंक्शन अधिक पठनीय तरीके से दर्ज किया जाएगा।
heaplens-dump -h
usage: [-h] [-o OUTPUT] [--json] [-s]
हीलेंस लॉग डंप करें। डिफ़ॉल्ट रूप से stdout पर लिखता है।
optional arguments:
-h, --help यह सहायता संदेश दिखाएँ और बाहर निकलें
-o OUTPUT, --output OUTPUT
पथ {output} पर फ़ाइल में लिखें (default: None)
--json json में डंप करें (default: False)
-s, --sort चंकों को उनके पतों द्वारा क्रमबद्ध करें (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-chunksgef से heap chunks का थोड़ा संशोधित संस्करण आउटपुट करता है।
यह GEF के heap chunks (जो चंकों के पते, फ्लैग, आकार और मेटाडेटा दिखाता है) का विस्तार करता है, heap bins से मुक्त चंकों के बारे में जानकारी एकीकृत करके (जो glibc bins से पहले आवंटित और मुक्त किए गए चंकों को सूचीबद्ध करता है)। GEF हीप निरीक्षण में मदद करने वाली सुविधाएँ प्रदान करता है जैसे कि हमने दो का उल्लेख किया, लेकिन दोनों को संयोजित करना थकाऊ है। उच्च स्तर पर, यह कमांड बाद वाले से मुक्त चंकों के पते एकत्र करता है, और उन्हें पूर्व के परिणाम में लेबल करता है।
heaplens-chunks -h
usage: [-h] [--nocolor]
मुक्त चंकों के बारे में जानकारी के साथ एक संशोधित `heap chunks`।
optional arguments:
-h, --help यह सहायता संदेश दिखाएँ और बाहर निकलें
--nocolor ANSI रंग कोड अक्षम करें
उदाहरण आउटपुट:
gef➤ heaplens-chunks
Showing current heap info with freed chunks:
...