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.
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:
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.
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:
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:
- Configurare l'accesso a Internet sul sistema.
- Impostare un IP statico per l'interfaccia wireless.
- Configurare un server DHCP per fornire la configurazione IP automatica ai client Wi-Fi.
- Aggiungere il routing per fornire accesso a Internet ai client Wi-Fi.
- 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.
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.
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.
# 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.
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.
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".
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
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).
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:
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.
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.