
यह रिपॉजिटरी यह समझने के लिए एक सीखने का वातावरण प्रदान करती है कि CVE-2018-6789 के लिए Exim RCE एक्सप्लॉइट कैसे काम करता है।
यह Exim RCE (CVE-2018-6789) की जाँच करने के लिए एक वातावरण तैयार करने हेतु फ़ाइलों, स्क्रिप्ट्स, नोट्स, ... का एक समूह है। इसका उपयोग Exim को डीबग करने, एक्सप्लॉइट लिखने, Exim फ़ंक्शन कॉल्स को ट्रेस करने, Exim के कस्टम मेमोरी प्रबंधन (storeblocks) के बारे में जानने, यह पता लगाने के लिए किया जा सकता है कि वास्तविक दुनिया का एक्सप्लॉइट कैसे काम करता है, ...
इसका उपयोग केवल शैक्षणिक उद्देश्यों के लिए किया जाना चाहिए!
vagrant-libvirt प्लगइन)Exim का सोर्स कोड डाउनलोड करने के लिए यह निष्पादित करें
$ git submodule update --init
रूट निर्देशिका में एक Vagrantfile है। यह वर्चुअलाइज़ेशन प्रदाता के रूप में libvirt का उपयोग करता है। बॉक्स को box_url के माध्यम से सीधे Fedora के मिरर से खींचा जाता है क्योंकि Vagrant Cloud डाउनलोड वर्तमान में टूटे हुए हैं (HCP माइग्रेशन); Fedora वहाँ केवल libvirt और VirtualBox बॉक्स प्रकाशित करता है (कोई VMware नहीं), और एक सीधा box_url प्रदाता-विशिष्ट होता है, इसलिए यह सेटअप केवल libvirt को लक्षित करता है।
# -*- mode: ruby -*-
# vi: set ft=ruby :
memory = 8192 # in MiB
cpus = 4
Vagrant.configure("2") do |config|
# Vagrant Cloud downloads are broken; pull the box from Fedora's mirror
config.vm.box = "fedora-44-cloud-base"
config.vm.box_url = "https://download.fedoraproject.org/pub/fedora/linux/releases/44/Cloud/x86_64/images/Fedora-Cloud-Base-Vagrant-libvirt-44-1.7.x86_64.vagrant.libvirt.box"
config.vm.provider "libvirt" do |lv|
lv.memory = memory
lv.cpus = cpus
end
config.vm.provision "shell", inline: <<-SHELL
/vagrant/scripts/setup_vm.sh
SHELL
end
आप कॉन्फ़िगरेशन को अपनी इच्छानुसार बदल सकते हैं, लेकिन ध्यान रखें कि, उदाहरण के लिए, setup_vm.sh स्क्रिप्ट पैकेज स्थापित करने के लिए dnf का उपयोग करती है। यदि आप Ubuntu का उपयोग करना चाहते हैं, तो आपको dnf install पंक्तियों को apt-get install से बदलना होगा और पैकेज नामों को तदनुसार समायोजित करना होगा। हालाँकि, इस बात की कोई गारंटी नहीं है कि सेटअप सही ढंग से काम करेगा।
जब आप अपने कॉन्फ़िगरेशन से संतुष्ट हों, तो बस यह चलाएँ:
$ vagrant up
मशीन सेट अप करने के लिए और उसके बाद
$ vagrant ssh
इससे जुड़ने के लिए। यदि आप नहीं जानते कि Vagrant का उपयोग कैसे करें, तो यहाँ देखें: https://www.vagrantup.com/intro/getting-started/
Vagrant वर्तमान निर्देशिका (यानी आपके द्वारा अभी क्लोन किया गया रिपॉजिटरी) को एक साझा निर्देशिका के रूप में /vagrant में मैप करता है। Exim के लिए Docker इमेज बनाने और चलाने के लिए निम्न कमांड अपने VM के अंदर (vagrant ssh) दर्ज करें
[vagrant@localhost ~]$ cd /vagrant
[vagrant@localhost vagrant]$ ./scripts/reset_docker.sh
पहली बार इसमें अधिक समय लगेगा क्योंकि Exim को स्रोत से बनाया जाएगा। यदि आप डीबगिंग स्क्रिप्ट या अन्य फ़ाइलों को संशोधित करते हैं जिन्हें डॉकर कंटेनर में कॉपी किया जाएगा, तो आप Docker इमेज को फिर से बनाने के लिए हमेशा ./scripts/reset_docker.sh का उपयोग कर सकते हैं। निश्चित रूप से, आप स्क्रिप्ट से आवश्यक पंक्तियों को काटकर उन्हें अलग-अलग कमांड के रूप में भी चला सकते हैं।
जब सब कुछ हो जाए, तो आपको एक रूट कंसोल दिखाई देना चाहिए:
Successfully tagged exim:latest
787f310ef922a1e519cf8bb47f1c4fed5f510da705e7ceefd48f160c980e969c
root@787f310ef922:/opt#
अजीब स्ट्रिंग्स आपकी मशीन पर अलग दिख सकती हैं, लेकिन अब आप अपने होस्ट मशीन पर Fedora VM में चल रहे Debian Docker कंटेनर में हैं।
सबसे पहले, आप दो टर्मिनल विंडो में vagrant ssh के साथ दो SSH सत्र बना सकते हैं। एक का उपयोग एक्सप्लॉइट चलाने और SMTP के माध्यम से Exim के साथ बातचीत करने के लिए किया जा सकता है। दूसरे का उपयोग Docker कंटेनर के भीतर Exim को शुरू करने, चलाने, डीबग करने, ... के लिए किया जाता है। VM में ASLR अक्षम है ताकि आप विश्वसनीय ब्रेकपॉइंट सेट कर सकें जो डीबगिंग सत्रों के दौरान नहीं बदलते हैं।
उदाहरण सत्र:
पहला टर्मिनल:
$ vagrant ssh
[vagrant@localhost vagrant]$
दूसरा टर्मिनल:
$ vagrant ssh
[vagrant@localhost vagrant]$ cd /vagrant
[vagrant@localhost vagrant]$ ./scripts/reset_docker.sh
...
# now you are inside the Debian Docker container
root@99296cf63016:/opt# ./run_exim.sh
root@99296cf63016:/opt# ./attach_exim.sh
run_exim.sh स्क्रिप्ट समाप्त हो जाती है और Exim पृष्ठभूमि में चलता है। ./attach_exim.sh स्क्रिप्ट को चल रहे Exim डेमॉन प्रोसेस में gdb संलग्न करना चाहिए और आपको इस तरह का आउटपुट देना चाहिए:
...
pwndbg: loaded 170 commands. Type pwndbg [filter] for a list.
pwndbg: created $rebase, $ida gdb functions (can be used with print/break)
Attaching to process 14
Reading symbols from /usr/exim/bin/exim-4.89_1-1-fc6d6586-XX-1...done.
...
0x00007ffff6b7f5e3 in __select_nocancel () at ../sysdeps/unix/syscall-template.S:84
84 ../sysdeps/unix/syscall-template.S: No such file or directory.
Breakpoint 1 at 0x5555555c03d2: file smtp_in.c, line 1762.
Breakpoint 2 at 0x5555555c051d: file smtp_in.c, line 1884.
Breakpoint 3 at 0x55555556a2c8: file base64.c, line 154.
Breakpoint 4 at 0x5555555c6aca: file smtp_in.c, line 3690.
Exim चल रहा है और अनुरोधों की प्रतीक्षा कर रहा है। जो ब्रेकपॉइंट सेट किए गए थे, वे debugging/breakpoints फ़ाइल से आते हैं। आप प्रोसेस को बाधित करने और gdb को नियंत्रण देने के लिए Ctrl+C का उपयोग कर सकते हैं। आप यह परीक्षण करने के लिए प्रदान की गई एक्सप्लॉइट स्क्रिप्ट में से एक भी चला सकते हैं कि सब कुछ अपेक्षा के अनुसार काम कर रहा है या नहीं:
पहला टर्मिनल:
[vagrant@localhost ~]$ cd /vagrant/sploits/
[vagrant@localhost sploits]$ ./sploit_0.py
[+] Opening connection to localhost on port 25: Done
दूसरा टर्मिनल: