
Este repositório fornece um ambiente de aprendizado para entender como um exploit RCE do Exim para CVE-2018-6789 funciona.
Este é um conjunto de ficheiros, scripts, notas, ... para configurar um ambiente para investigar o Exim RCE (CVE-2018-6789). Pode ser utilizado para depurar o Exim, escrever exploits, rastrear chamadas de funções do Exim, aprender sobre a gestão de memória personalizada do Exim (storeblocks), descobrir como funciona um exploit do mundo real, ...
Deve ser utilizado apenas para fins académicos!
vagrant-libvirt)Descarregue o código fonte do Exim executando
$ git submodule update --init
Existe um Vagrantfile no diretório raiz. Utiliza libvirt como fornecedor de virtualização. A box é obtida diretamente do espelho do Fedora via box_url porque as transferências do Vagrant Cloud estão atualmente quebradas (migração HCP); o Fedora publica apenas boxes libvirt e VirtualBox lá (sem VMware), e um box_url direto é específico do fornecedor, portanto esta configuração visa apenas libvirt.
# -*- mode: ruby -*-
# vi: set ft=ruby :
memory = 8192 # em MiB
cpus = 4
Vagrant.configure("2") do |config|
# Transferências do Vagrant Cloud estão quebradas; puxar a box do espelho do Fedora
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
Pode alterar a configuração conforme desejar, mas tenha em mente que, por exemplo, o script setup_vm.sh usa dnf para instalar pacotes. Se quiser usar Ubuntu, deve substituir as linhas dnf install por apt-get install e ajustar os nomes dos pacotes em conformidade. No entanto, não há garantia de que a configuração funcione corretamente.
Quando estiver satisfeito com a sua configuração, basta executar:
$ vagrant up
para configurar a máquina e depois
$ vagrant ssh
para se conectar a ela. Se não souber como usar o Vagrant, veja aqui: https://www.vagrantup.com/intro/getting-started/
O Vagrant mapeia o diretório atual (ou seja, o repositório que acabou de clonar) como um diretório partilhado para /vagrant. Para criar e executar a imagem Docker para o Exim, insira os seguintes comandos dentro da sua VM (vagrant ssh)
[vagrant@localhost ~]$ cd /vagrant
[vagrant@localhost vagrant]$ ./scripts/reset_docker.sh
A primeira vez demorará muito mais porque o Exim será compilado a partir do código fonte. Se modificar scripts de depuração ou outros ficheiros que serão copiados para o contentor docker, pode sempre usar ./scripts/reset_docker.sh para reconstruir a imagem Docker. Certamente, também pode extrair apenas as linhas necessárias do script e executá-las como comandos individuais.
Quando tudo estiver concluído, deverá ver uma consola root:
Successfully tagged exim:latest
787f310ef922a1e519cf8bb47f1c4fed5f510da705e7ceefd48f160c980e969c
root@787f310ef922:/opt#
As strings estranhas podem parecer diferentes na sua máquina, mas agora está num contentor Debian Docker a executar dentro de uma VM Fedora na sua máquina host.
Primeiro, pode criar duas sessões SSH com vagrant ssh em duas janelas de terminal. Uma pode ser usada para executar exploits e interagir com o Exim via SMTP. A outra é usada para iniciar, executar, depurar, ... o Exim dentro do contentor Docker. ASLR está desativado na VM, para que possa definir pontos de interrupção fiáveis que não mudem durante as sessões de depuração.
Exemplo de sessão:
Primeiro terminal:
$ vagrant ssh
[vagrant@localhost vagrant]$
Segundo terminal:
$ vagrant ssh
[vagrant@localhost vagrant]$ cd /vagrant
[vagrant@localhost vagrant]$ ./scripts/reset_docker.sh
...
# agora está dentro do contentor Debian Docker
root@99296cf63016:/opt# ./run_exim.sh
root@99296cf63016:/opt# ./attach_exim.sh
O script run_exim.sh termina e o Exim executa em segundo plano. O script ./attach_exim.sh deve anexar gdb ao processo do daemon Exim em execução e dar-lhe um resultado como este:
...
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.
O Exim está em execução e à espera de pedidos. Os pontos de interrupção que foram definidos vêm do ficheiro debugging/breakpoints. Pode usar Ctrl+C para interromper o processo e dar controlo ao gdb. Também pode executar um dos scripts de exploit fornecidos para testar se tudo está a funcionar como esperado:
Primeiro terminal:
[vagrant@localhost ~]$ cd /vagrant/sploits/
[vagrant@localhost sploits]$ ./sploit_0.py
[+] Opening connection to localhost on port 25: Done
Segundo terminal: