Howto port knocking

Da PtLUG Wiki.
Jump to: navigation, search

<adsense> google_ad_client = "pub-6334840821237294"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text_image"; google_ad_channel = ""; </adsense>

Contents

[edit] Introduzione

Il port knocking è una tecnica che vi permette di stabilire una connessione, per esempio ssh, anche se il vostro sistema è protetto da una firewall (iptables). E tramite un certo ordine di invio di certi pacchetti a determinate porte (questa configurazione è da fare tra client/server ma la vedremo più avanti) e se tutte le condizioni si sono avverate il sistema ci aprirà la porta desiderata. Ovviamente quando abbiamo finito per richiudere la porta ci sarà la bussata di chiusura.

[edit] Installare i pacchetti necessari

Esistono diversi pacchetti che ci mettono a disposizione questa caratteristica interessante ma noi analizzeremo questo pacchetto. http://www.portknocking.org/distribution/portknocking-0.30.tgz è interamente scritto in Perl quindi dovrete averlo installato dopo averlo spacchettato con il solito:

tar xvzf portknocking-0.30.tgz

per visualizzare la guida fate:

./knockclient -man

se vi da questo:

-bash:./knockclient: /usr/local/bin/perl:bad interpreter: No such file o directory

errore nello script è specificata la directory sbagliata del perl quindi modificatela manualmente. ora riproviamoci se adesso l'errore è:

Can't locate nomemodulo.pm in @INC

eseguite da root:

perl -MCPAN -e shell

a questo punto se vi rende la shell cpan>

install Nome::Modulo

al posto di Nome::Modulo dovete mettere queste dipendenze Config::General , File::Tail , Crypt::CBC , Crypt::Blowfish , Math::VecStat , Net::Pcap , Netpacket , Pod::Usage , Schedule::At , Storable. Adesso dando ./knockclient -man. Per il server c'è lo script knockdaemon.


[edit] Configurazione

Ecco la parte più importante. La configurazione del client si fa tramite il file knockclient.conf (scommetto non l'avreste mai immaginato). Per prima cosa indichiamo a quale sistema vogliamo connetterci tramite l'opzione remote e poi in knock ci va messo il tipo di knock che vogliamo effettuare:

  • RAND valore casuale tra 0-255
  • THIS YEAR valore dato dall'anno modulo 256
  • THISDAY giorno modulo 256
  • THISHOUR ora modulo 256
  • THISMINUTE immaginate
  • THISSECOND .......
  • CHECKSUM somma di tutti i campi del knock modulo 256
  • CLIENT indirizzo ip pubblico del client
  • PORT porta che deve essere bloccata/sbloccata
  • FLAGm valore arbitrario tra 0-255 anche m(contatore) può assumere un valore tra 0-255

Per le varie impostazioni delle variabili:

  • client = xxx.xxx.xxx.xxx
  • port = 10000
  • flag0 = 12
  • flag1 = 134
  • encrypt = yes/no(consigliato si)
  • key = (chiave decidete voi)
  • cipher = Blowfish/IDEA/DES
  • timeout = (tempo di attesa tra l'invio dei pacchetti)
  • portspan = (range di porte)

Per la configurazione del client abbiamo finito adesso sta al server. Il file di configurazione è knockdaemon.conf vediamo i parametri fondamentali:

  • runmode = network/file la differenza è che nel primo caso abbiamo uno sniffing del dei dati dalla rete invece nel secondo verrà utilizzato il file di log consultato in real-time
  • interface = (interfaccia su cui verrà ascoltato il knock)
  • useethfilter = tcpconn(per esempio) ma dopo dovrà essere specificato questo blocco:
<ethfilter tcpconn>
proto = IP_PROTO_TCP
flags = SYN
dest_ip = yyy.yyy.yyy.yyy
</ethfilter>
l'unica da spiegare è dest_ip che restringe il campo di analisi a tutti i pacchetti ricevuti dall'ip che è l'interfaccia pubblica del server
  • knock deve essere uguale a quella indicata nel file di configurazione del server
  • adesso dobbiamo configurare l'azione che deve essere eseguita all ricezione di un knock corretto
<action>
condition = PORT == 10000 && FLAG0 == 12 && FLAG1 == 134
template = iptables_open
use = yes
</action>
  • dopo di che dobbiamo scrivere il blocco template che viene eseguito se la condizione è verificata
<template iptables_open>
system = "/sbin/iptables -i INPUT -p TCP -s IP --dport PORT -j ACCEPT"
</template>
  • per concludere la configurazione settate decrypt , key , cipher e portspan agli stessi valori del client

[edit] Conclusioni

E' vero questa tecnica non è assolutamente usata per un client (io stesso non la metterei mai) ma se si tratta di avere un po' di sicurezza in più perché no e poi fare esperienza fa sempre bene. Comunque io ho parlato soltanto bene di questa tecnica e quindi adesso un po' di critiche:

  • c'è la possibilità che a causa della latenza della rete i pacchetti non arrivino nell'ordine giusto
  • la massiccia richiesta da parte del client potrebbe diminuire le prestazioni del sistema. Un attacco DOS di piccole dimensioni

Comunque ci sono anche molti vantaggi.

  • non far vedere a malintenzionati i servizi a rischio tramite un port scan
  • la crittografazione dei dati per una maggior sicurezza ancora


Ciao

<adsense> google_ad_client = "pub-6334840821237294"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text_image"; google_ad_channel = ""; </adsense>

Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox