PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : iptables state NEW und nicht SYN



bp
27.01.03, 20:17
also da neue packete sinnvollerweise das syn bit gesetzt haben sollen habe ich mir folgendes überlegt.

${IPTABLES} -A INPUT -p tcp --tcp-flags ! SYN (liste an flags die gesetzt sein müssen) -m state --state NEW -j MY_DROP

soweit so gut, alle packete mit state NEW und den flags ! SYN (= RST,ACK,FIN,URG,PSH) werden untersucht und im falle das die flags aus der liste zutreffen geblockt.
das problem ist nur das die liste der flags sehr viele kombinationen zuläßt, genau genommen sind es 31 kombinationen. Ausser dem SYN flag gibt es noch 5 weitere falgs, diese können einzeln oder in paaren gesetzt sein. D.H. laut kombinatorik, 5 aus 1 + 5 aus 2 + 5 aus 3 + 5 aus 4 + 5 aus 5 = 5 + 10 + 10 + 5 + 1 = 31.

Ich müsste also 31 regeln definieren.

Muss ich wirklich alle 5 übrigen flags (= ! SYN) in der liste der flags kombinieren oder genügt eine auswahl von diesen. Mache ich irgendwo einen logischen fehler? Ist es überhaupt sinnvoll alle neuen pakete die nicht das syn flag gesetzt haben zu blocken.

N.D.
28.01.03, 14:02
${IPTABLES} -A INPUT -p tcp --tcp-flags ! SYN (liste an flags die gesetzt sein müssen) -m state --state NEW -j MY_DROP

die pakete zu blocken, die new aber nicht syn gesetzt haben macht durchaus sinn.
da solche pakete zu 99% nicht zu einer normalen verbindung gehören.
sie deuten eher auf einen stealth portscan hin.

bp
28.01.03, 14:55
ich habe jetzt mal folgene funktion geschrieben für das blocken von portscans (noch nicht getestet). Vielleicht kanns ja jemand brauchen.

----beginn

# flags ! SYN = RST,ACK,FIN,URG,PSH
# einer typen:
one="RST ACK FIN URG PSH"

# zweier typen:
two="RST,ACK RST,FIN RST,URG RST,PSH ACK,FIN ACK,URG ACK,PSH FIN,URG FIN,PSH \ URG,PSH"

# dreier typen:
three="RST,ACK,FIN RST,ACK,URG RST,ACK,PSH RST,FIN,UEG RST,FIN,PSH RST,URG,PSH \ ACK,FIN,URG ACK,FIN,PSH ACK,URG,PSH FIN,URG,PSH"

# vierer Typen:
four="RST,ACK,FIN,URG RST,ACK,FIN,PSH RST,FIN,URG,PSH ACK,FIN,URG,PSH \ RST,ACK,URG,PSH"

# fünfer typen
five="RST,ACK,FIN,URG,PSH"


BlockScans $one $two $three $four $five

BlockScans()
{
${IPTABLES} -N MY_DROP
${IPTABLES} -A MY_DROP -m limit --limit 7200/h -j LOG \
--log-prefix "IPTABLES_POSSIBLE_PORTSCAN"
${IPTABLES} -A MY_DROP -j DROP

for i in $*
do
${IPTABLES} -A INPUT -p tcp --tcp-flags ! SYN $i -m state --state NEW -j MY_DROP
done
}

----ende

HangLoose
28.01.03, 15:03
moin moin

interessantes thema.

harry verwendet in seinen scripten ja auch entsprechende regeln, um portscans zu droppen.


# Stealth Scans etc. DROPpen
# Keine Flags gesetzt
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j MY_DROP

# SYN und FIN gesetzt
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -j MY_DROP

# SYN und RST gleichzeitig gesetzt
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -j MY_DROP

# FIN und RST gleichzeitig gesetzt
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags FIN,RST FIN,RST -j MY_DROP

# FIN ohne ACK
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ACK,FIN FIN -j MY_DROP

# PSH ohne ACK
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ACK,PSH PSH -j MY_DROP

# URG ohne ACK
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ACK,URG URG -j MY_DROP

was ich mich jetzt aber frage => ist solch ein *aufwand* überhaupt nötig. denn wenn man in seinem script auf connection tracking setzt, sollte der paketfilter doch, unabhängig von den tcp flags, erkennen ob die eingehenden pakete zu einer bestehenden verbindung gehören oder nicht.

somit müsste doch ein portscan, bei einer default policy DROP, auch ohne --tcp-flag regeln gedropt werden.


wenn ich davon ausgehe, das harry auf dem gebiet bedeutend mehr ahnung hat, frage ich mich wo mein denkfehler liegt?


Gruß HL

bp
28.01.03, 15:31
@hangloose

somit müsste doch ein portscan, bei einer default policy DROP, auch ohne --tcp-flag regeln gedropt werden.

das werden sie auch, aber nur wenn sie nicht doch noch irgendwo im laufenden script akzeptiert werden. Es ist also so eine spezifische vorselektion.

P.S. in meinem script oben muss man natürlich auf die zeilenumbrüche aufpassen.

bp
28.01.03, 19:00
na so der super script schreiber bin ich nicht !!!!
Aber hier kommt die korrigierte Form und bei mir läuft sie sogar.

--------------code
########################### alle nicht SYN flags ##########################
# flags ! SYN = RST,ACK,FIN,URG,PSH
# einer typen:
one="RST ACK FIN URG PSH"
#
# zweier typen:
two="RST,ACK RST,FIN RST,URG RST,PSH ACK,FIN ACK,URG ACK,PSH \
FIN,URG FIN,PSH URG,PSH"
#
# dreier typen:
three="RST,ACK,FIN RST,ACK,URG RST,ACK,PSH RST,FIN,URG RST,FIN,PSH \
RST,URG,PSH ACK,FIN,URG ACK,FIN,PSH ACK,URG,PSH FIN,URG,PSH"
#
# vierer Typen:
four="RST,ACK,FIN,URG RST,ACK,FIN,PSH RST,FIN,URG,PSH ACK,FIN,URG,PSH \
RST,ACK,URG,PSH"
#
# fünfer typen
five="RST,ACK,FIN,URG,PSH"
################################################## #####################

BlockScans $one $two $three $four $five

BlockScans()
{
${IPTABLES} -N MY_DROP
${IPTABLES} -A MY_DROP -m limit --limit 7200/h -j LOG --log-prefix "IPTABLES_POSSIBLE_PORTSCAN "
${IPTABLES} -A MY_DROP -j DROP

for i in $*
do
${IPTABLES} -A INPUT -p tcp --tcp-flags SYN,$i $i -m state --state NEW -j MY_DROP
done
}
-------code end

HangLoose
29.01.03, 11:52
Original geschrieben von bp
@hangloose


das werden sie auch, aber nur wenn sie nicht doch noch irgendwo im laufenden script akzeptiert werden. Es ist also so eine spezifische vorselektion.

P.S. in meinem script oben muss man natürlich auf die zeilenumbrüche aufpassen.

überzeugt mich noch nicht so ganz :). vielleicht läßt sich ja harry zu einem statement verleiten ;)


Gruß HL

bp
29.01.03, 12:10
ok nehmen wir mal an du hast in deinem script eine zeile stehen die, wie bei harry auch, so lautet:

iptables -A INPUT -i eth1 -m state --state NEW -p tcp --dport 443 -j ACCEPT

damit werden alle reinkommende pakete an port 80 die NEW sind erlaubt. Dabei ist es aber egal welche flags gesetzt sind, es geht nur darum das sie NEW sind. Wenn du nun vorher die ungültigen flags aussortierst bekommst du nur anfragen mit gesetztem SYN flag. OK?!

HangLoose
29.01.03, 12:22
hi

man muss mir das nur in leicht verständlichen worten erklären, dann kapier selbst ich das :D

du hast recht.


Gruß HL

scrat
01.02.03, 21:14
hmm für iptables gibt es doch das "psd" modul, welches speziell auf portscans ausgelegt ist und diese je nach einstellung blockt...

und der vorteil dieses modules ist, das der client, solange er einen portscan macht, komplett geblockt wird, also auch nicht auf die ports kommt die eigentlich offen sind, d.h. er kann nicht erkennen welche dienste nach aussen offen sind...

iptables -t nat -A PREROUTING -i ppp0 -d $INET_IP -m psd -j DROP

HangLoose
02.02.03, 00:32
hi scare

dafür mußt du aber den kernel patchen oder ist der mittlerweile schon aufgenommen? hast du das *teil* im einsatz?


Gruß HL

scrat
02.02.03, 02:12
jopp kernel patchen musst du... is aba kein prob...
www.netfilter.org
und da die patch-o-matic.tar.gz zu der aktuellen iptables version saugen...

da sin neben dem psd patch noch einige andere nützliche drin...
z.B. time patch... regel gilt nur von 12-14 uhr
etc...

jopp bei mir rennt es, schon seit einigen monaten & ohne fehler.... :)