
Dieses Repository bietet eine Lernumgebung, um zu verstehen, wie ein Exim-RCE-Exploit für CVE-2018-6789 funktioniert.
Dies ist eine Sammlung von Dateien, Skripten, Notizen, ... um eine Umgebung zur Untersuchung der Exim RCE (CVE-2018-6789) einzurichten. Sie kann verwendet werden, um Exim zu debuggen, Exploits zu schreiben, Exim-Funktionsaufrufe zu verfolgen, die benutzerdefinierte Speicherverwaltung von Exim (Storeblocks) zu erlernen, herauszufinden, wie ein realer Exploit funktioniert, ...
Sie sollte nur für akademische Zwecke verwendet werden!
vagrant-libvirt-Plugin)Laden Sie den Quellcode von Exim herunter, indem Sie Folgendes ausführen:
$ git submodule update --init
Es gibt eine Vagrantfile im Stammverzeichnis. Sie verwendet libvirt als Virtualisierungsanbieter. Die Box wird direkt von Fedoras Spiegel über box_url gezogen, da Vagrant Cloud Downloads derzeit defekt sind (HCP-Migration); Fedora veröffentlicht dort nur libvirt- und VirtualBox-Boxen (kein VMware), und eine direkte box_url ist anbieterspezifisch, daher zielt dieses Setup nur auf libvirt ab.
# -*- mode: ruby -*-
# vi: set ft=ruby :
memory = 8192 # in MiB
cpus = 4
Vagrant.configure("2") do |config|
# Vagrant Cloud Downloads sind defekt; Box von Fedoras Spiegel holen
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
Sie können die Konfiguration nach Belieben ändern, aber bedenken Sie, dass das Skript setup_vm.sh beispielsweise dnf zur Paketinstallation verwendet. Wenn Sie Ubuntu verwenden möchten, müssen Sie die dnf install-Zeilen durch apt-get install ersetzen und die Paketnamen entsprechend anpassen. Es gibt jedoch keine Garantie, dass die Einrichtung korrekt funktioniert.
Wenn Sie mit Ihrer Konfiguration zufrieden sind, führen Sie einfach Folgendes aus:
$ vagrant up
um die Maschine einzurichten, und danach:
$ vagrant ssh
um sich mit ihr zu verbinden. Wenn Sie nicht wissen, wie man Vagrant verwendet, werfen Sie einen Blick hier: https://www.vagrantup.com/intro/getting-started/
Vagrant bindet das aktuelle Verzeichnis (d.h. das Repository, das Sie gerade geklont haben) als gemeinsames Verzeichnis unter /vagrant ein. Um das Docker-Image für Exim zu erstellen und auszuführen, geben Sie die folgenden Befehle innerhalb Ihrer VM (vagrant ssh) ein:
[vagrant@localhost ~]$ cd /vagrant
[vagrant@localhost vagrant]$ ./scripts/reset_docker.sh
Der erste Durchlauf wird viel länger dauern, da Exim aus dem Quellcode erstellt wird. Wenn Sie Debugging-Skripte oder andere Dateien ändern, die in den Docker-Container kopiert werden, können Sie jederzeit ./scripts/reset_docker.sh verwenden, um das Docker-Image neu zu erstellen. Sie können natürlich auch die notwendigen Zeilen aus dem Skript extrahieren und als einzelne Befehle ausführen.
Wenn alles fertig ist, sollten Sie eine Root-Konsole sehen:
Successfully tagged exim:latest
787f310ef922a1e519cf8bb47f1c4fed5f510da705e7ceefd48f160c980e969c
root@787f310ef922:/opt#
Die seltsamen Zeichenfolgen können auf Ihrem Rechner anders aussehen, aber Sie befinden sich jetzt in einem Debian-Docker-Container, der in einer Fedora-VM auf Ihrem Host-Rechner läuft.
Erstellen Sie zunächst zwei SSH-Sitzungen mit vagrant ssh in zwei Terminalfenstern. Eines kann verwendet werden, um Exploits auszuführen und mit Exim über SMTP zu interagieren. Das andere wird verwendet, um Exim im Docker-Container zu starten, auszuführen, zu debuggen, ... ASLR ist in der VM deaktiviert, sodass Sie zuverlässige Haltepunkte setzen können, die sich während Debugging-Sitzungen nicht ändern.
Beispielsitzung:
Erstes Terminal:
$ vagrant ssh
[vagrant@localhost vagrant]$
Zweites Terminal:
$ vagrant ssh
[vagrant@localhost vagrant]$ cd /vagrant
[vagrant@localhost vagrant]$ ./scripts/reset_docker.sh
...
# Jetzt befinden Sie sich im Debian-Docker-Container
root@99296cf63016:/opt# ./run_exim.sh
root@99296cf63016:/opt# ./attach_exim.sh
Das Skript run_exim.sh wird beendet und Exim läuft im Hintergrund. Das Skript ./attach_exim.sh sollte gdb an den laufenden Exim-Daemon-Prozess anhängen und Ihnen eine Ausgabe wie diese geben:
...
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 läuft und wartet auf Anfragen. Die gesetzten Haltepunkte stammen aus der Datei debugging/breakpoints. Sie können Strg+C verwenden, um den Prozess zu unterbrechen und die Kontrolle an gdb zu übergeben. Sie könnten auch eines der bereitgestellten Exploit-Skripte ausführen, um zu testen, ob alles wie erwartet funktioniert:
Erstes Terminal:
[vagrant@localhost ~]$ cd /vagrant/sploits/
[vagrant@localhost sploits]$ ./sploit_0.py
[+] Opening connection to localhost on port 25: Done
Zweites Terminal: