giovedì 5 agosto 2010

Aggirare un firewall con il port forwarding dinamico

Scenario 1: siamo connessi ad internet tramite un firewall con politiche restrittive che non permette il traffico verso i server di cui abbiamo bisogno e/o verso alcuni siti web.


Scenario 2: siamo connessi ad internet tramite una rete non fidata (internet cafè, lanparty, hackmeeting) e sospettiamo che il nostro traffico possa essere sniffato da qualche malintenzionato.


In questi casi, avendo a disposizione un account su un server SSH pubblico raggiungibile su una qualunque porta (anche diversa dalla stardard TCP/22) possiamo utilizzare il dynamic port forwarding, un sistema particolarmente comodo di veicolare traffico criptato bypassando eventuali restrizioni.


Il port forwarding dinamico (dynamic port forwarding) è un meccanismo trasparente che supporta il protocollo SOCKS4 o SOCKS5. Invece di configurare un port forwarding da porte specifiche dell’host locale verso porte specifiche del server remoto, esso permette di specificare un server SOCKS che può essere utilizzato dalle applicazioni. Il Client SSH apre una porta sull’host locale e simula un server SOCKS per ciascuna delle applicazioni opportunamente configurate. Quando queste applicazioni devono connettersi a servizi come HTTP, FTP, POP3, SMTP ecc., esse “parlano” al client SSH che simula un server SOCKS e crea un port forwarding verso il server SSH remoto, al quale inoltra il traffico crittografato dal protocollo SSH.


In pratica tutto il traffico in uscita dalle applicazioni configurate per usare il server SOCKS locale viene incapsulato nella connessione SSH verso il server remoto, da dove esce e viene poi veicolato verso i server di competenza. Per effetto di questo meccanismo otteniamo il duplice risultato di bypassare le eventuali regole restrittive del firewall (in quanto la connessione in uscita è solo verso il server SSH), e di criptare tutto il traffico dal client fino al server SSH, nascondendolo agli sguardi indiscreti.


Il requisito principale è un accesso shell via SSH a un server che possiamo raggiungere: potrebbe essere anche un computer a casa che abbiamo configurato per essere raggiungibile dall’esterno con varie tecniche, ad esempio DynDNS. Praticamente tutte le distribuzioni linux contengono OpenSSH, disponibile anche per Windows e su OS/X si abiliterà il login remoto. Il giochino funziona anche se avete un account su un server di un provider che fornisce una shell SSH, ad esempio DreamHost, e riuscite a raggiungerlo dalla vostra posizione. I client sono Putty per Windows e nativi negli altri casi.


Putty può essere usato tramite linea di comando o interfaccia grafica. La sintassi per la linea di comando è la seguente:


putty -ssh -D 9999 -P 80  serverssh.dominio.com


dove:



  • -ssh indica usare il protocollo SSH.

  • -D 9999 indica al client di ascoltare sulla porta 9999/TCP. Potete utilizzare qualunque porta libera sul vostro client: controllate con netstat -an -p TCP | findstr LISTENING (Windows) o netstat -an -p TCP | grep LISTEN (OS/X e linux).

  • -P 80 identifica la porta sulla quale è in ascolto il server SSH remoto. Se è la default TCP/22 non serve indicarla.

  • serverssh.dominio.com è il nome del server SSH. Si può usare anche l’indirizzo IP.


Se si usa l’interfaccia grafica bisogna stabilire una normale connessione, poi aggiungere un tunnel nel menu Connection –> SSH –>Tunnels compilando il campo “Source port” (la porta locale di ascolto),  lasciare vuoto “Destination”, scegliere “Dynamic” e cliccare su “Add”


La sintassi per linux e OS/X è:


ssh -D porta_locale utente@serverssh


Una volta autenticati e stabilita la connessione si può minimizzare la finestra della console senza chiuderla e passare alla configurazione delle applicazioni. In Windows si possono utilizzare tutte quelle che supportino l’utilizzo di un server SOCKS. Praticamente tutti i browser lo fanno e molti altri programmi hanno il supporto, per esempio Pidgin.


In Firefox la configurazione si fa tramite il menu Strumenti –> Opzioni –> Avanzate –> Rete  –> Impostazioni –> Configurazione manuale del proxy –> Host SOCKS e si specifica “localhost” (o 127.0.0.1) e la porta locale sulla quale ascolta il client SSH (9999 nell’esempio qui sopra).


Una comoda alternativa è rappresentata da una categora di tool chiamati socksifier, che permettono a qualunque applicativo di connettersi all’esterno tamite SOCKS. Uno dei più utilizzati per Windows è gratuito e si chiama WideCap. Su linux si può usare tsocks, avendo cura di modificare prima il file /etc/tsocks.conf specificando 127.0.0.1 nella variabile “server” e la porta desiderata in “server_port”.  Per OS/X il supporto è nativo: Preferenze di sistema –> Network –> scegliete l’interfaccia con la quale siete collegati ad internet –> Avanzate –> Proxy –> Abilitare “Proxy SOCKS” e compilare i capi “Server” (localhost) e porta (quella scelta precedentemente). In questo modo tutte le connessioni uscenti da quella scheda di rete transiteranno attraverso il proxy SOCKS, e non ci sarà bisogno di toccare la configurazione delle applicazioni poiché il meccanismo è completamente trasparente.


Questo è un breve screencast che mostra come utilizzare Putty e Firefox per ottenere un port forwarding dinamico.



(Utilizzate questi metodi con giudizio: bypassare le policy di sicurezza aziendali vi potrebbe mettere nei guai.)



Tags: , , ,


Nessun commento:

Posta un commento