
# 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:
...
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-clearheaplens द्वारा एकत्र और उपयोग किए गए सभी आंतरिक लॉग / डेटा साफ़ करें।
heaplens-clear -h
usage: [-h] [-v]
हीलेंस लॉग साफ़ करें।
optional arguments:
-h, --help यह सहायता संदेश दिखाएँ और बाहर निकलें
-v, --verbose आउटपुट वर्बोसिटी बढ़ाएँ
heaplens-list-envपर्यावरण चर सूचीबद्ध करें जो हीप में संग्रहीत और मुक्त किए जाते हैं। यह विशेष रूप से उपयोगी है जब आप हीप ग्रूमिंग करना चाहते हैं क्योंकि ये चर हीप लेआउट को प्रभावित कर सकते हैं।
heaplens-list-env -h
usage: [-h] [-v] [--prefix PREFIX] [--suffix SUFFIX] [-b BREAKPOINT] [-s SKIP]
पर्यावरण चर सूचीबद्ध करें जो हीप लेआउट को प्रभावित कर सकते हैं।
optional arguments:
-h, --help यह सहायता संदेश दिखाएँ और बाहर निकलें
-v, --verbose आउटपुट वर्बोसिटी बढ़ाएँ
--prefix PREFIX पर्यावरण चर मान उपसर्ग
--suffix SUFFIX पर्यावरण चर मान प्रत्यय
-b BREAKPOINT, --breakpoint BREAKPOINT
यहाँ निष्पादन रोकें (gdb में br {breakpoint} निष्पादित करें)
-s SKIP, --skip SKIP इस पर्यावरण चर को छोड़ें
उदाहरण आउटपुट:
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']
परीक्षण मामले स्क्रिप्ट बनाने के लिए (VM में निर्मित)
$ cd tests
$ make all
tests/heap-dump हीप लेआउट डंप करेंgef➤ file tests/heap-dump
gef➤ heaplens -b breakme
gef➤ heaplens-dump
sudoedit हीप लेआउट को output.txt में डंप करेंgef➤ file sudoedit
gef➤ heaplens -b set_cmnd -- -s \\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
gef➤ heaplens-dump -o output.txt
tests/env-in-heap में हीप ग्रूमिंग के लिए पर्यावरण चर सूचीबद्ध करेंgef➤ file tests/env-in-heap
gef➤ heaplens-list-env
...
----------------------------
2nd execution. Possible environment variables for heap grooming:
['ENV_IN_HEAP']
----------------------------
sudoedit में हीप ग्रूमिंग के लिए पर्यावरण चर सूचीबद्ध करेंgef➤ 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']
----------------------------
अधिक विवरण के लिए कृपया Issues पृष्ठ देखें।