PDA

View Full Version : Domandona iptables e nemesis


oro125
24-11-2009, 16:00
Ciao a tutti, ho il seguente script di esempio con cui configuro un firewall iptables su una Debian 5.0.


##VARIABILI
IPTABLES="/sbin/iptables"
LOCAL_IP="192.168.0.10"

##DEFAULT RULE
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

##CHAIN DI OUTPUT
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP -d 0/0 --dport 12345 -j DROP
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP -d 0/0 --dport 12345 -j LOG --log-prefix "PORTA 12345:"
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP --sport 1024: -d 0/0 --dport 1024: -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP --sport 1024: -d 0/0 --dport 1024: -m state --state NEW,ESTABLISHED -j LOG --log-prefix "FTP DATA CONNECTION OUT:"


##CHAIN DI INPUT
$IPTABLES -A INPUT -p TCP -s 0/0 --sport 1024: -d $LOCAL_IP --dport 1024: -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p TCP -s 0/0 --sport 1024: -d $LOCAL_IP --dport 1024: -m state --state RELATED,ESTABLISHED -j LOG --log-prefix "FTP DATA INPUT: "



Lo script permette l'instaurazione di connessioni dalle porte >=1024 verso host esterni, bloccando solamente le connessioni in uscita dirette alla porta 12345.

Lo script provato in vari modi usando per esempio netcat e telnet sembra funzionare correttamente, ma provando a generare un pacchetto con nemesis per testarne il funzionamento il pacchetto in questione esce come niente fosse dal FW!!! Come mai questo strano comportamento con nemesis? sembra che nemesis riesca a bypassare iptables.

Questo è il comando che ho usato per generare il pacchetto di prova con nemesis:

nemesis tcp -d eth0 -v -a 123456789 -s 987654321 -f S -x 5555 -y 12345 -P - -S 192.168.0.10 -D 192.168.0.13 -I 123 -T 10


Qualcuno può aiutarmi a trovare il problema?


Ciao a tutti e grazie

Gimli[2BV!2B]
24-11-2009, 19:18
La tua affermazione riguardo all'uscita indisturbata è dovuta alla mancanza di righe di log che iniziano con "PORTA 12345:"? Oppure dall'altra parte intercetti i pacchetti?

Prova ad invertire le regole; prima logga, poi scarta:
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP -d 0/0 --dport 12345 -j LOG --log-prefix "PORTA 12345:"
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP -d 0/0 --dport 12345 -j DROP

Il drop interrompe la valutazione della catena, quindi la regola di log non dovrebbe essere eseguita a causa della posizione in cui l'hai messa.

oro125
24-11-2009, 20:00
;29819181']La tua affermazione riguardo all'uscita indisturbata è dovuta alla mancanza di righe di log che iniziano con "PORTA 12345:"? Oppure dall'altra parte intercetti i pacchetti?

Prova ad invertire le regole; prima logga, poi scarta:
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP -d 0/0 --dport 12345 -j LOG --log-prefix "PORTA 12345:"
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP -d 0/0 --dport 12345 -j DROP

Il drop interrompe la valutazione della catena, quindi la regola di log non dovrebbe essere eseguita a causa della posizione in cui l'hai messa.

Si è vero le regole andrebbero tutte invertite LOG e DROP intendo, cmq io per la prova ho intercettato i pacchetti sulla macchina diciamo destinataria... quindi non mi sono basato sui LOG.

Ciao

Gimli[2BV!2B]
24-11-2009, 20:20
Le linee di log compaiono?
Non conosco nemesis e non ho ancora controllato la sua man, i dati corretti li vedo in gioco...

Prova a fare un RETURN, che dovrebbe comunque interrompere la valutazione della catena facendo ricadere i pacchetti nella policy di default, l'OUTPUT DROP:
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP -d 0/0 --dport 12345 -j RETURN

oro125
24-11-2009, 20:34
;29820091']Le linee di log compaiono?
Non conosco nemesis e non ho ancora controllato la sua man, i dati corretti li vedo in gioco...

Prova a fare un RETURN, che dovrebbe comunque interrompere la valutazione della catena facendo ricadere i pacchetti nella policy di default, l'OUTPUT DROP:
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP -d 0/0 --dport 12345 -j RETURN

Domani appena riesco provo a sistemare le regole di LOG mettendole prima delle altre e il RETURN

Cmq guardando questo schema di netfilter:

_____
Ingresso / \ Uscita
-->[Decisioni]-->|FORWARD|------>
[di routing] \_____/ ^
| |
v ____
___ / \
/ \ |OUTPUT|
|INPUT| \____/
\___/ ^
| |
----> Processi locali --


Per i processi le mier regole funzionano... è solo usando nemesis o packit che le regole sembrano essere bypassate, sembrerebbe come se facessero l'inject del pacchetto subito dopo la chain di output evitando il filtraggio.

Gimli[2BV!2B]
24-11-2009, 22:13
Ho controllato nemesis, si appoggia alle librerie libnet e libpcap.

libcap è una simpatica bestiola (http://www.tcpdump.org/): in entrata intercetta tutto il traffico prima di netfilter, in uscita ha la stessa libertà... quindi, sì nemesis bypassa iptables.

Un esempio di riferimento a questa cosa. (http://seclists.org/tcpdump/2004/q1/299)

oro125
24-11-2009, 23:07
;29821939']Ho controllato nemesis, si appoggia alle librerie libnet e libpcap.

libcap è una simpatica bestiola (http://www.tcpdump.org/): in entrata intercetta tutto il traffico prima di netfilter, in uscita ha la stessa libertà... quindi, sì nemesis bypassa iptables.

Un esempio di riferimento a questa cosa. (http://seclists.org/tcpdump/2004/q1/299)

Ecco!!! allora non sono io pazzo! :asd: Grazie mille dell'aiuto cmq!

Non c'è quindi modo di fare lavorare libpcap prima della chain di output?

Lo stesso problema quindi mi si verifica all'inverso con tcpdump o tshark che sia... :muro:

oro125
25-11-2009, 17:40
Svelato il mistero!!! :asd:

Se usiamo con nemesis l'opzione:


-d eth0

nemesis apre un canale RAW con l'interfaccia di rete riuscendo a bypassare anche netfilter, questo sia in ingresso che in uscita.


# nemesis tcp -d eth0 -S 192.168.0.10 -x 5000 -D 192.168.0.13 -y 457

TCP Packet Injected

Se non si specifica l'interfaccia netfilter non apre il canale RAW e fa passare il pacchetto in uscita verso netfilter che quindi lo droppa.

# nemesis tcp -S 192.168.0.10 -x 5000 -D 192.168.0.13 -y 457
ERROR: Incomplete packet injection. Only wrote -1 bytes.

TCP Injection Failure



Ciao

P.S. Il test postato in questa pagina non si riferisce allo script sopra riportato ma ad un'altro che posto di seguito, cmq la sostanza non cambia


##VARIABILI
LOCAL_IP="192.168.0.10"
SERVER_IP="192.168.0.13"
IPTABLES="/sbin/iptables"

##DEFAULT POLICY
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP

##CHAIN DI INPUT
$IPTABLES -A INPUT -p TCP -s 0/0 --sport 456 -d $LOCAL_IP --dport 1024: -m state --state RELATED,ESTABLISHED -j LOG --log-prefix "IN FROM TCP456:"
$IPTABLES -A INPUT -p TCP -s 0/0 --sport 456 -d $LOCAL_IP --dport 1024: -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p TCP -s 0/0 --sport 2000:3000 -d $LOCAL_IP --dport 1024: -m state --state RELATED,ESTABLISHED -j LOG --log-prefix "IN FROM TCP2k3k:"
$IPTABLES -A INPUT -p TCP -s 0/0 --sport 2000:3000 -d $LOCAL_IP --dport 1024: -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p UDP -s $SERVER_IP --sport 53 -d $LOCAL_IP --dport 1024: -j LOG --log-prefix "DNS QUERY RESPONSE:"
$IPTABLES -A INPUT -p UDP -s $SERVER_IP --sport 53 -d $LOCAL_IP --dport 1024: -j ACCEPT
$IPTABLES -A INPUT -p TCP -s 0/0 --sport 21 -d $LOCAL_IP --dport 1024: -m state --state RELATED,ESTABLISHED -j LOG --log-prefix "FTP COMMAND IN"
$IPTABLES -A INPUT -p TCP -s 0/0 --sport 21 -d $LOCAL_IP --dport 1024: -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p TCP -s 0/0 --sport 20 -d $LOCAL_IP --dport 1024: -m state --state NEW,ESTABLISHED -j LOG --log-prefix "FTP DATA IN:"
$IPTABLES -A INPUT -p TCP -s 0/0 --sport 20 -d $LOCAL_IP --dport 1024: -m state --state NEW,ESTABLISHED -j ACCEPT

##CHAIN DI OUTPUT
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP --sport 1024: -d 0/0 --dport 456 -m state --state NEW,ESTABLISHED -j LOG --log-prefix "OUT TO TCP456:"
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP --sport 1024: -d 0/0 --dport 456 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP --sport 1024: -d 0/0 --dport 2000:3000 -m state --state NEW,ESTABLISHED -j LOG --log-prefix "OUT TO TCP2000:3000:"
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP --sport 1024: -d 0/0 --dport 2000:3000 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p UDP -s $LOCAL_IP --sport 1024: -d $SERVER_IP --dport 53 -j LOG --log-prefix "DNS QUERY OUT:"
$IPTABLES -A OUTPUT -p UDP -s $LOCAL_IP --sport 1024: -d $SERVER_IP --dport 53 -j ACCEPT
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP --sport 1024: -d 0/0 --dport 21 -m state --state NEW,ESTABLISHED -j LOG --log-prefix "FTP COMMAND OUT:"
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP --sport 1024: -d 0/0 --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP --sport 1024: -d 0/0 --dport 20 -m state --state RELATED,ESTABLISHED -j LOG --log-prefix "FTP DATA IN:"
$IPTABLES -A OUTPUT -p TCP -s $LOCAL_IP --sport 1024: -d 0/0 --dport 20 -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p ICMP -s $LOCAL_IP ! --icmp-type 8/0 -j LOG --log-prefix "ICMP ECHO REQ OUT:"
$IPTABLES -A OUTPUT -p ICMP -s $LOCAL_IP ! --icmp-type 8/0 -j ACCEPT