Vai al contenuto

15. Manual Network Connections

Gli strumenti di penetration testing wireless richiedono solitamente di disabilitare i network manager perché interferiscono con il corretto funzionamento degli strumenti.

In alcuni casi, però, dobbiamo avere Internet contemporaneamente o talvolta persino condividerla. Sebbene ciò possa di solito essere fatto con i network manager, impareremo a configurarlo manualmente poiché sono disabilitati.

È ovvio che servono interfacce di rete separate da quelle usate per il penetration testing.

15.1. Connecting to an Access Point

Su Linux esistono diversi client wireless. Il più comune è wpa_supplicant,1 poiché è comunemente usato dai network manager nelle varie distribuzioni Linux per connettersi alle reti Wi-Fi, anche se non hanno alcuna crittografia o usano ancora WEP.

wpa_supplicant può essere usato tramite un'interfaccia a riga di comando, con wpa_cli, oppure con file di configurazione contenenti le impostazioni della rete. In un file di configurazione di esempio, ogni connessione di rete è definita all'interno di un elemento network.

Text Only
network={
  ssid="hotel_wifi"
  scan_ssid=1
}

Listing 1 - Configurazione wpa_supplicant semplice per una rete aperta

L'esempio sopra consente al sistema di connettersi a una rete Open chiamata "hotel_wifi", come indicato nella seconda riga, e wpa_supplicant è istruito, nella terza riga, a cercare prima gli SSID.

Connettersi a una rete WPA-PSK è un po' più articolato. Dobbiamo aggiungere due parametri all'interno dell'elemento network:

Text Only
network={
  ssid="home_network"
  scan_ssid=1
  psk="correct battery horse staple"
  key_mgmt=WPA-PSK
}

Listing 2 - Configurazione wpa_supplicant semplice per una rete WPA o WPA2-PSK

wpa_supplicant sceglierà automaticamente tra TKIP e CCMP in base alla disponibilità, ma è possibile forzarne uno o l'altro aggiungendo pairwise=CCMP o pairwise=TKIP alla configurazione se necessario.

wpa_supplicant supporta WPA3, OWE e può gestire anche reti WPA Enterprise; tuttavia, questi argomenti esulano dall'ambito di questo modulo. Il file di configurazione fornito con il codice sorgente di wpa_supplicant2 offre diversi esempi per varie impostazioni di rete, inclusi WPA3, OWE e WPA Enterprise.

Warning

Un'alternativa rapida e semplice è wpa_passphrase.3 Questo strumento può generare un file di configurazione per una rete WPA-PSK di base. Richiede almeno un parametro, l'ESSID. Il secondo parametro, la passphrase, è opzionale per motivi di sicurezza. Se il secondo parametro viene omesso, chiederà la passphrase. Questo strumento restituirà il contenuto di un file di configurazione. Possiamo reindirizzare l'output su un file con 'wpa_passphrase home_network > home_network.conf'

Usando l'esempio nel listing sopra, creeremo un file chiamato wifi-client.conf. Ora dobbiamo avviare wpa_supplicant con un paio di parametri. Per connetterci alla rete, dobbiamo avviare wpa_supplicant con l'interfaccia di rete usando -i e il file di configurazione con -c. Supponendo che l'interfaccia sia wlan0, il comando e l'output saranno simili ai seguenti.

Text Only
kali@kali:~$ sudo wpa_supplicant -i wlan0 -c wifi-client.conf
Successfully initialized wpa_supplicant
wlan0: SME: Trying to authenticate with 00:ef:78:be:0d:98 (SSID='home_network' freq=2437 MHz)
wlan0: Trying to associate with 00:ef:78:be:0d:98 (SSID='home_network' freq=2437 MHz)
wlan0: Associated with 00:ef:78:be:0d:98
wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
wlan0: WPA: Key negotiation completed with 00:ef:78:be:0d:98 [PTK=CCMP GTK=CCMP]
wlan0: CTRL-EVENT-CONNECTED - Connection to 00:ef:78:be:0d:98 completed [id=0 id_str=]
...

Listing 3 - Connessione a home_network

Ora che abbiamo confermato di poterci connettere correttamente alla rete, possiamo aggiungere -B al comando wpa_supplicant per eseguirlo in background.

Una volta connessi, di solito richiediamo un lease DHCP usando dhclient:

Text Only
kali@kali:~$ sudo dhclient wlan0

Listing 4 - Ottenimento di un lease DHCP su wlan0

1 (Jouni Malinen, 2013), https://w1.fi/wpa_supplicant/ ↩︎

2 (Jouni Malinen and contributors, 2019, 2019), https://w1.fi/cgit/hostap/tree/wpa_supplicant/wpa_supplicant.conf ↩︎

3 (linux.die.net), https://linux.die.net/man/8/wpa_passphrase ↩︎

15.2. Setting up an Access Point

Configurare un access point richiede due interfacce di rete distinte e prevede cinque passaggi:

  1. Configurare l'accesso a Internet sul sistema.
  2. Impostare un IP statico per l'interfaccia wireless.
  3. Configurare un server DHCP per fornire la configurazione IP automatica ai client Wi-Fi.
  4. Aggiungere il routing per fornire accesso a Internet ai client Wi-Fi.
  5. Configurare l'interfaccia Wi-Fi in modalità AP.

15.2.1. Internet Access

Per prima cosa dobbiamo avere accesso a Internet sul sistema. Non importa davvero se avviene via Ethernet, Wi-Fi o mobile broadband.

Ethernet è abbastanza semplice da configurare e, nella maggior parte dei casi, ci basta ottenere un lease DHCP come nel Listing 4.

Se la connessione è Wi-Fi, possiamo fare riferimento alla sezione precedente per configurarla. È importante notare che, sebbene sia possibile fare client e AP su una singola interfaccia Wi-Fi, la configurazione è un po' più articolata, ha limitazioni e potrebbe non funzionare correttamente (gli adattatori Wi-Fi consigliati per questo corso offrono questa capacità). Pertanto, dobbiamo fare attenzione nella scelta dell'interfaccia da usare per l'access point, poiché non tutti gli adattatori Wi-Fi supportano quella modalità. Possiamo usare iw per visualizzare quali modalità supporta ciascuna interfaccia wireless.

Text Only
kali@kali:~$ sudo iw list
...
        Supported interface modes:
                 * IBSS
                 * managed
                 * AP
                 * AP/VLAN
                 * monitor
                 * mesh point
                 * P2P-client
                 * P2P-GO
                 * outside context of a BSS
...

Listing 5 - Elenco delle modalità supportate su tutte le interfacce wireless

Non tratteremo il mobile broadband, poiché il supporto degli adattatori (o la sua assenza) varia da un operatore telefonico all'altro. Un router mobile broadband con Ethernet o Wi-Fi elimina tutta la complessità di gestire una connessione cellulare mobile.

15.2.2. Static IP on Access Point Wireless Interface

Ora dobbiamo scegliere un indirizzo IP che non entri in conflitto con la rete e il CIDR dell'interfaccia appena configurata per Internet. La maggior parte dei router offre un IP nell'intervallo 192.168.1.0/24, quindi useremo l'intervallo 10.0.0.0/24 e imposteremo l'interfaccia wireless dell'access point su 10.0.0.1. Supponiamo che l'interfaccia sia wlan0.

Text Only
kali@kali:~$ sudo ip link set wlan0 up

kali@kali:~$ sudo ip addr add 10.0.0.1/24 dev wlan0

Listing 6 - Impostazione dell'indirizzo IP su wlan0

15.2.3. DHCP Server

Configureremo il server DHCP sull'interfaccia wireless (wlan0) usando dnsmasq,1 che è un server DNS e DHCP. Creeremo il seguente file di configurazione e lo salveremo come dnsmasq.conf.

Text Only
# Main options
# http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html
domain-needed
bogus-priv
no-resolv
filterwin2k
expand-hosts
domain=localdomain
local=/localdomain/
# Only listen on this address. When specifying an 
# interface, it also listens on localhost.
# We don't want to interrupt any local resolution
listen-address=10.0.0.1

# DHCP range
dhcp-range=10.0.0.100,10.0.0.199,12h
dhcp-lease-max=100
# Router: wlan0
dhcp-option=option:router,10.0.0.1
dhcp-authoritative

# DNS: Primary and secondary Google DNS
server=8.8.8.8
server=8.8.4.4

Listing 7 - File di configurazione dnsmasq, dnsmasq.conf

Le opzioni listen-address e router corrispondono all'indirizzo della nostra interfaccia wlan0. dhcp-range sarà un intervallo di indirizzi IP che vogliamo assegnare ai nostri client, seguito dalla durata del lease. Le due voci server sono i server DNS upstream.

Ora che la configurazione di dnsmasq è completa, eseguiremo dnsmasq con --conf-file seguito dal percorso del nostro file di configurazione.

Text Only
kali@kali:~$ sudo dnsmasq --conf-file=dnsmasq.conf

Listing 8 - Avvio di dnsmasq

Dopo l'avvio, dnsmasq creerà un file contenente il suo process ID in /var/run/dnsmasq.pid, che ci permette di trovare e terminare il processo quando abbiamo finito. Ispezioneremo syslog2 per confermare che sia partito correttamente.

Text Only
kali@kali:~$ sudo tail /var/log/syslog | grep dnsmasq
Nov 10 19:36:39 kali dnsmasq[158592]: started, version 2.82 cachesize 150
Nov 10 19:36:39 kali dnsmasq[158592]: compile time options: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect inotify dumpfile
Nov 10 19:36:39 kali dnsmasq-dhcp[158592]: DHCP, IP range 10.0.0.100 -- 10.0.0.199, lease time 12h
Nov 10 19:36:39 kali dnsmasq[158592]: using nameserver 8.8.4.4#53
Nov 10 19:36:39 kali dnsmasq[158592]: using nameserver 8.8.8.8#53
...

Listing 9 - Verifica di dnsmasq in syslog

1 (Simon Kelley, 2021), http://www.thekelleys.org.uk/dnsmasq/doc.html ↩︎

2 (Stackify, 2020), https://stackify.com/syslog-101/ ↩︎

15.2.4. Routing

Ora dobbiamo abilitare il routing e aggiungere alcune regole firewall per poter agire da router e consentire ai client di raggiungere Internet. Per prima cosa dobbiamo abilitare l'IP forwarding, che possiamo fare impostando la variabile kernel ip_forward su "1".

Text Only
kali@kali:~$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Listing 10 - Abilitazione dell'IP forwarding

Sebbene tecnicamente questo dovrebbe bastare per inoltrare i pacchetti verso Internet, i nostri client hanno un intervallo di indirizzi IP diverso da quello della nostra connessione Internet. Poiché Internet non sa dove instradare il traffico di ritorno, i pacchetti verranno scartati. Per risolvere questa situazione, dobbiamo mascherare il nostro IP facendolo apparire come proveniente dall'interfaccia Internet, operazione eseguita con una singola regola firewall.

Per prima cosa dobbiamo installare nftables.1

Text Only
kali@kali:~$ sudo apt install nftables

Listing 11 - Installazione di nftables

Aggiungeremo una regola per mascherare gli indirizzi IP dei nostri client Wi-Fi quando il traffico va dall'interfaccia wireless a una con Internet, come fa il nostro router di casa. Scambierà l'indirizzo IP del client con l'indirizzo dell'interfaccia da cui esce il pacchetto. Il kernel tiene traccia delle connessioni in memoria così sa a chi appartiene un pacchetto quando torna indietro.

Il primo comando aggiunge la tabella NAT.2 Il secondo aggiunge una chain per postrouting necessaria perché masquerade modifica l'indirizzo IP dopo che la decisione di routing è stata presa e subito prima che esca. L'ultimo è la regola che esegue il masquerade. Lo farà quando il pacchetto corrisponde a alcuni criteri: per qualsiasi traffico diretto all'interfaccia di output (oifname), eth0, e con indirizzi IP di destinazione (daddr) non nell'intervallo 10.0.0.1/24 (che è l'intervallo dei nostri client).

Text Only
kali@kali:~$ sudo nft add table nat

kali@kali:~$ sudo nft 'add chain nat postrouting { type nat hook postrouting priority 100 ; }'

kali@kali:~$ sudo nft add rule ip nat postrouting oifname "eth0" ip daddr != 10.0.0.1/24 masquerade

Listing 12 - Masquerade con nftables

1 (nftables, 2021), https://wiki.nftables.org/wiki-nftables/index.php/Main_Page ↩︎

2 (Wikipedia, 2021), https://en.wikipedia.org/wiki/Network_address_translation ↩︎

15.2.5. Access Point Mode

Ora ci resta solo da configurare e attivare l'access point. È ovvio che se volessimo solo fornire Internet a un client cablato, ci basta sostituire tutte le istanze di wlan0 nei comandi dei passaggi precedenti con l'interfaccia ethX che vogliamo usare e saltare questo passaggio.

Per una semplice rete 802.11n WPA2 PSK chiamata "BTTF" sul canale 11 con "GreatScott" come passphrase, la configurazione è la seguente:

Text Only
interface=wlan0
ssid=BTTF
channel=11

# 802.11n
hw_mode=g
ieee80211n=1

# WPA2 PSK with CCMP
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=GreatScott

Listing 13 - Configurazione hostapd, hostapd.conf

Ora dobbiamo eseguire hostapd e fornire un solo parametro, il suo file di configurazione.

Text Only
kali@kali:~$ sudo hostapd hostapd.conf
Configuration file: hostapd.conf
Using interface wlan0 with hwaddr 00:af:8d:09:23:f9 and ssid "BTTF"
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED
...
wlan0: STA 00:e4:89:02:7a:0f IEEE 802.11: authenticated
wlan0: STA 00:e4:89:02:7a:0f IEEE 802.11: associated (aid 1)
wlan0: AP-STA-CONNECTED 00:e4:89:02:7a:0f
wlan0: STA 00:e4:89:02:7a:0f RADIUS: starting accounting session 7F52FE0899A8A460
wlan0: STA 00:e4:89:02:7a:0f WPA: pairwise key handshake completed (RSN)

Listing 14 - Avvio di hostapd con la nostra configurazione AP

Ora che vediamo hostapd avviarsi e i client connettersi correttamente, possiamo in seguito eseguirlo in background usando il parametro -B prima del nome del file di configurazione.