
Этот репозиторий предоставляет учебную среду для понимания того, как работает эксплойт RCE в Exim для CVE-2018-6789.
Это набор файлов, скриптов, заметок и т.д. для создания среды, в которой можно исследовать Exim RCE (CVE-2018-6789). Его можно использовать для отладки Exim, написания эксплойтов, трассировки вызовов функций Exim, изучения пользовательской системы управления памятью Exim (storeblocks), понимания того, как работает реальный эксплойт, и т.д.
Он предназначен только для академических целей!
vagrant-libvirt)Загрузите исходный код Exim, выполнив
$ git submodule update --init
В корневом каталоге находится Vagrantfile. В качестве провайдера виртуализации он использует libvirt. Образ загружается напрямую с зеркала Fedora через box_url, поскольку загрузки из 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. Чтобы создать и запустить Docker-образ для Exim, выполните следующие команды внутри вашей VM (vagrant ssh)
[vagrant@localhost ~]$ cd /vagrant
[vagrant@localhost vagrant]$ ./scripts/reset_docker.sh
Первый запуск займёт гораздо больше времени, потому что Exim будет собран из исходного кода. Если вы изменяете отладочные скрипты или другие файлы, которые будут скопированы в Docker-контейнер, вы всегда можете использовать ./scripts/reset_docker.sh для пересборки Docker-образа. Разумеется, вы также можете просто вырезать нужные строки из скрипта и выполнить их как отдельные команды.
Когда всё будет готово, вы должны увидеть консоль root:
Successfully tagged exim:latest
787f310ef922a1e519cf8bb47f1c4fed5f510da705e7ceefd48f160c980e969c
root@787f310ef922:/opt#
Странные строки на вашей машине могут выглядеть иначе, но теперь вы находитесь в Debian Docker-контейнере, работающем в Fedora VM на вашем хосте.
Сначала вы можете создать две SSH-сессии с помощью vagrant ssh в двух окнах терминала. Одна может использоваться для запуска эксплойтов и взаимодействия с Exim по SMTP. Другая — для запуска, выполнения, отладки и т.д. Exim внутри Docker-контейнера. В 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 должен подключить gdb к работающему процессу демона Exim и выдать результат, похожий на этот:
...
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. Вы можете использовать Ctrl+C, чтобы прервать процесс и передать управление gdb. Вы также можете запустить один из предоставленных скриптов эксплойтов, чтобы проверить, всё ли работает как ожидается:
Первый терминал:
[vagrant@localhost ~]$ cd /vagrant/sploits/
[vagrant@localhost sploits]$ ./sploit_0.py
[+] Opening connection to localhost on port 25: Done
Второй терминал: