* Dropping SYN with FIN flag set @ 2003-10-21 15:47 James Miller 2003-10-21 16:39 ` Chris Brenton 0 siblings, 1 reply; 8+ messages in thread From: James Miller @ 2003-10-21 15:47 UTC (permalink / raw) To: netfilter Hi folks.. sorry if this is a really dumb question.. please don't flame me too much. Nessus is always alerting on "Remote host does not discard TCP SYN packets which have the FIN flag set". What is the best way to close up this hole? Is there a global rule I could setup or do I need to set this on a per rule basis? something like '-p tcp --tcp-flags SYN,FIN -j DROP' Thanks, Jim ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Dropping SYN with FIN flag set 2003-10-21 15:47 Dropping SYN with FIN flag set James Miller @ 2003-10-21 16:39 ` Chris Brenton 2003-10-21 17:51 ` Jeffrey Laramie 0 siblings, 1 reply; 8+ messages in thread From: Chris Brenton @ 2003-10-21 16:39 UTC (permalink / raw) To: jimm; +Cc: netfilter On Tue, 2003-10-21 at 11:47, James Miller wrote: > > Nessus is always alerting on "Remote host does not discard TCP SYN packets > which have the FIN flag set". What is the best way to close up this hole? One of the nice things you get with iptables over many commercial offerings is the flexibility to deal with stuff like this. ;-) > something like '-p tcp --tcp-flags SYN,FIN -j DROP' Here is what I do: iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL SYN,ACK -j LOG --log-prefix " SYNACK " iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL SYN,ACK -j REJECT --reject-with icmp-host-unreachable iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL SYN,FIN -j LOG --log-prefix " SYNFINSCAN " iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL SYN,FIN -j REJECT --reject-with icmp-host-unreachable iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL FIN -j LOG --log-prefix " FINSCAN " iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL FIN -j REJECT --reject-with icmp-host-unreachable iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL NONE -j LOG --log-prefix " NULLSCAN " iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL NONE -j REJECT --reject-with icmp-host-unreachable iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL FIN,PSH,URG -j LOG --log-prefix " NMAPXMAS " iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL FIN,PSH,URG -j REJECT --reject-with icmp-host-unreachable I prefix these traffic patterns to make them easier to parse out of the logs, and the reject the traffic with a host unreachable. I like using type 3's rather than drops as it confuses the scanner on the other end and many times shuts it down (ie. scanner gives up thing the host is not on-line). HTH, C ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Dropping SYN with FIN flag set 2003-10-21 16:39 ` Chris Brenton @ 2003-10-21 17:51 ` Jeffrey Laramie 2003-10-21 18:56 ` Chris Brenton 0 siblings, 1 reply; 8+ messages in thread From: Jeffrey Laramie @ 2003-10-21 17:51 UTC (permalink / raw) To: netfilter Chris Brenton wrote: >Here is what I do: > >iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL SYN,ACK -j LOG >--log-prefix " SYNACK " >iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL SYN,ACK -j REJECT >--reject-with icmp-host-unreachable >iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL SYN,FIN -j LOG >--log-prefix " SYNFINSCAN " >iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL SYN,FIN -j REJECT >--reject-with icmp-host-unreachable >iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL FIN -j LOG >--log-prefix " FINSCAN " >iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL FIN -j REJECT >--reject-with icmp-host-unreachable >iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL NONE -j LOG >--log-prefix " NULLSCAN " >iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL NONE -j REJECT >--reject-with icmp-host-unreachable >iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL FIN,PSH,URG -j LOG >--log-prefix " NMAPXMAS " >iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL FIN,PSH,URG -j REJECT >--reject-with icmp-host-unreachable > > Hey Chris - I've taken a rudimentary stab at these kinds of rules with mixed success and your post brings up a couple of questions: Here are the rules I'm using now: # Chain to trap bad packets before they enter the system. $iptables -A Bad_Packet -p tcp -m state --state INVALID -j LOG --log-level debug $iptables -A Bad_Packet -p tcp -m state --state INVALID -j DROP $iptables -A Bad_Packet -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW $iptables -A Bad_Packet -p tcp ! --syn -m state --state NEW -j LOG --log-level $iptables -A Bad_Packet -p tcp ! --syn -m state --state NEW -j DROP 1. These obviously are different from your rules. Are these rules useful or should I just replace them with rules similar to yours? 2. I tried applying rules like these with -p all and I ended up trapping all kinds of local ICMP traffic and broke lots of things. Should I have these kinds of stateful rules for other protocols or doesn't that matter? Jeff ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Dropping SYN with FIN flag set 2003-10-21 17:51 ` Jeffrey Laramie @ 2003-10-21 18:56 ` Chris Brenton 2003-10-21 19:29 ` Tom Marshall 2003-10-21 20:35 ` Jeffrey Laramie 0 siblings, 2 replies; 8+ messages in thread From: Chris Brenton @ 2003-10-21 18:56 UTC (permalink / raw) To: netfilter On Tue, 2003-10-21 at 13:51, Jeffrey Laramie wrote: > > Hey Chris - Greetings! :) > I've taken a rudimentary stab at these kinds of rules with mixed success > and your post brings up a couple of questions: > > Here are the rules I'm using now: > > # Chain to trap bad packets before they enter the system. > $iptables -A Bad_Packet -p tcp -m state --state INVALID -j LOG > --log-level debug > $iptables -A Bad_Packet -p tcp -m state --state INVALID -j DROP On the up side, this combo should catch all the stuff I mention in my rules far more efficiently as you are only using a single rule. On the downside, you'll see a lot of false positives (like state table time-outs during the FIN/ACK exchange) and it does not categorize the flag combo for easy review later (as mine does). Also, are you trying to use --log-level to increase the amount of detail? If so, that switch actually sets the Syslog facility level. You can try using the IP or TCP options switch instead to get more detail. > $iptables -A Bad_Packet -p tcp --tcp-flags SYN,ACK SYN,ACK -m state > --state NEW > $iptables -A Bad_Packet -p tcp ! --syn -m state --state NEW -j LOG > --log-level > $iptables -A Bad_Packet -p tcp ! --syn -m state --state NEW -j DROP This should work (I have not tried it). I do similar except I don't use -m and place the rules after the state table gets processed (same effect except my way is dependent on the rule order not getting messed up). I also prefix the SYN/ACK log entries with " SPOOFING_FALLOUT " to make them easier to extract from my logs. > 1. These obviously are different from your rules. Are these rules > useful or should I just replace them with rules similar to yours? I actually have a method to my madness. Each morning I have a cron job kicks off to process the logs from the day before. The script has a ton of entires similar to the following: grep SYNFINSCAN cb5.txt > synfin-scan.txt grep -v SYNFINSCAN cb5.txt > cb6.txt grep FINSCAN cb6.txt > finscan.txt grep -v FINSCAN cb6.txt > cb7.txt grep NULLSCAN cb7.txt > nullscan.txt grep -v NULLSCAN cb7.txt > cb8.txt grep NMAPXMAS cb8.txt > nmapxmas.txt grep -v NMAPXMAS cb8.txt > cb9.txt Pretty easy to see what I'm doing. I'm leveraging the prefixing I mentioned in my last post to parse each traffic pattern into its own text file. This makes figuring out what happened in the logs far easier. It also helps to catch slow scans. For example if someone tries a FIN scan but only sends a probe every two hours, it still sticks out like a sore thumb using this method of review. Now with that said, the nice thing about a flexible tool is that you can use it any way that makes the most sense to you. The above works for me, your mileage may vary. ;-) > 2. I tried applying rules like these with -p all and I ended up > trapping all kinds of local ICMP traffic and broke lots of things. Humm. TCP is the only protocol (that I'm aware of) that actually uses flags, so this would be hard to do with other transports. For example you can't identify state with UDP, just direction and port. The problem with logging all invalid this way is that you end up throwing everything that does not hit a permitted port into the same bit bucket. For example: iptables -A FORWARD -i eth0 -p udp -s 0/0 --sport 1024:65535 -d 0/0 --dport 1433:1434 -j LOG --log-prefix " MS_SQL " iptables -A FORWARD -i eth0 -p udp -s 0/0 --sport 1024:65535 -d 0/0 --dport 1433:1434 -j REJECT --reject-with icmp-host-unreachable iptables -A FORWARD -i eth0 -p udp -s 0/0 --sport 500 -d 0/0 --dport 500 -j LOG --log-prefix " IPSEC_SCAN " iptables -A FORWARD -i eth0 -p udp -s 0/0 --sport 500 -d 0/0 --dport 500 -j REJECT --reject-with icmp-host-unreachable iptables -A FORWARD -i eth0 -p udp -d 0/0 --dport 135:139 -j LOG --log-prefix " MS_CRAP " iptables -A FORWARD -i eth0 -p udp -d 0/0 --dport 135:139 -j REJECT --reject-with icmp-host-unreachable Again, this just allows me to segregate all my traffic based on specific patterns so its easier to review. I use grep to extract these entries in a similar fashion to what I described about. To give you an idea how effective this is, on an average day I generate 70-80 MB worth of firewall log entries. Its not uncommon to have all of this traffic, except for maybe 100 KB, extracted into its own file. This means that I go from having 80 MB to 100 KB of log files that I actually have to put my thinking cap on to review. The rest is done automagically. As for breaking ICMP and others, could be you ended up letting through established traffic, but not related (related being ICMP type 3's, 4's, 5's and 11's). A quick review of your rules should show you if this is the case. HTH! C ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Dropping SYN with FIN flag set 2003-10-21 18:56 ` Chris Brenton @ 2003-10-21 19:29 ` Tom Marshall 2003-10-21 19:47 ` Chris Brenton 2003-10-21 20:35 ` Jeffrey Laramie 1 sibling, 1 reply; 8+ messages in thread From: Tom Marshall @ 2003-10-21 19:29 UTC (permalink / raw) To: Chris Brenton; +Cc: netfilter [-- Attachment #1: Type: text/plain, Size: 888 bytes --] > I actually have a method to my madness. Each morning I have a cron job > kicks off to process the logs from the day before. The script has a ton > of entires similar to the following: > > grep SYNFINSCAN cb5.txt > synfin-scan.txt > grep -v SYNFINSCAN cb5.txt > cb6.txt > grep FINSCAN cb6.txt > finscan.txt > grep -v FINSCAN cb6.txt > cb7.txt > grep NULLSCAN cb7.txt > nullscan.txt > grep -v NULLSCAN cb7.txt > cb8.txt > grep NMAPXMAS cb8.txt > nmapxmas.txt > grep -v NMAPXMAS cb8.txt > cb9.txt Don't know if you care or not, but you could do this much more efficiently with perl. If you don't want to do that, you can at least avoid the tempfiles by using the surrounding spaces in your patterns, eg. grep " FINSCAN " logfile > finscan.txt -- If you make people think they're thinking, they'll love you; but if you really make them think they'll hate you. [-- Attachment #2: Type: application/pgp-signature, Size: 240 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Dropping SYN with FIN flag set 2003-10-21 19:29 ` Tom Marshall @ 2003-10-21 19:47 ` Chris Brenton 0 siblings, 0 replies; 8+ messages in thread From: Chris Brenton @ 2003-10-21 19:47 UTC (permalink / raw) To: Tom Marshall; +Cc: netfilter On Tue, 2003-10-21 at 15:29, Tom Marshall wrote: > > Don't know if you care or not, but you could do this much more efficiently > with perl. I *totally* agree. I teach the SANS perimeter track (T2) and teach this method of log review. While I can teach people how to use grep in about 10 minutes, perl takes a wee bit longer. Using the same method I teach in class gives me a better chance to debug/improve/etc. > If you don't want to do that, you can at least avoid the > tempfiles by using the surrounding spaces in your patterns, eg. > > grep " FINSCAN " logfile > finscan.txt I like using temp files as it aids in debugging. Also, I kind of have to use the temp files as I '-v' out everything I have a pattern for and want to be able to see what ever is left (i.e. all the traffic I don't create a match pattern for). Thanks! C ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Dropping SYN with FIN flag set 2003-10-21 18:56 ` Chris Brenton 2003-10-21 19:29 ` Tom Marshall @ 2003-10-21 20:35 ` Jeffrey Laramie 2003-10-21 21:35 ` Chris Brenton 1 sibling, 1 reply; 8+ messages in thread From: Jeffrey Laramie @ 2003-10-21 20:35 UTC (permalink / raw) To: netfilter Chris Brenton wrote: >On Tue, 2003-10-21 at 13:51, Jeffrey Laramie wrote: > > >>Hey Chris - >> >> > >Greetings! :) > > > >>I've taken a rudimentary stab at these kinds of rules with mixed success >>and your post brings up a couple of questions: >> >>Here are the rules I'm using now: >> >># Chain to trap bad packets before they enter the system. >>$iptables -A Bad_Packet -p tcp -m state --state INVALID -j LOG >>--log-level debug >>$iptables -A Bad_Packet -p tcp -m state --state INVALID -j DROP >> >> > >On the up side, this combo should catch all the stuff I mention in my >rules far more efficiently as you are only using a single rule. On the >downside, you'll see a lot of false positives (like state table >time-outs during the FIN/ACK exchange) and it does not categorize the >flag combo for easy review later (as mine does). > > I only wish I had time to review my logs in that kind of detail. If I'm blocking the bad stuff, I'm happy! >Also, are you trying to use --log-level to increase the amount of >detail? If so, that switch actually sets the Syslog facility level. You >can try using the IP or TCP options switch instead to get more detail. > > > Actually it was a couple of previous posts, including one of your's, that got me thinking about logging. There were several questions about directing the iptables logs from /var/log/messages to a different file and the difficulty in splitting out the other kernel traffic. You answered one post described your system for handling logs and someone else (Jim from UCLA maybe?) answered another similar question by showing how to use log levels to split out iptables output from most other kernel logging. Not really knowing what I was doing, I thought, and I hacked , and I fixed what I hacked, and I thought some more, until I came up with my own system: WARNING! I have no clue! I mean it! Do not try this on a system you care about! 1. I changed my sylog.conf to split off kernel.debug level messages to the iptables.log file. I chose debug level since a production kernel rarely uses it and I get (almost) pure iptables entries this way: # Iptables messages kern.=debug -/var/log/iptables.log # save the rest in one file *.*;mail.none;news.none;kern.!=debug -/var/log/messages 2. In my filters I've created a separate rule for each of the major violations just like you've done. The only difference is I don't log the entry before dropping it. I already know what these entries are and I wouldn't know what to do with the logs anyway. 3. I run: iptables -L -n -v -x -Z > /var/log/iptables.report in a daily cron script. 4. I modified my logrotate script to mail me the messages and iptables.log file each day before rotating the logs. # Custom log rotation scripts. /var/log/messages /var/log/iptables.log { rotate 7 missingok daily mailfirst mail ServAdmn@Trans-Star.net create 0644 root root postrotate /etc/init.d/syslog reload endscript } Result: I have 3 files to review each morning. The /var/log/messages file has pure kernel entries in it. If things are going ok this file is pretty short and boring. If there's a kernel problem it's real obvious. The iptables.report shows all the traffic by rule. This tells me what rules are catching the most crap and which rules aren't used at all. I don't have the detailed log that you get, but I have the metrics and that tells me if there's any unusual activity. What's left in the iptables.log file is the interesting stuff I want to look at: usually scans, packets that should be getting through but aren't, and an occasional bit of internal mischief :-p > > >>2. I tried applying rules like these with -p all and I ended up >>trapping all kinds of local ICMP traffic and broke lots of things. >> >> > >Humm. TCP is the only protocol (that I'm aware of) that actually uses >flags, so this would be hard to do with other transports. For example >you can't identify state with UDP, just direction and port. The problem >with logging all invalid this way is that you end up throwing everything >that does not hit a permitted port into the same bit bucket. For >example: > >iptables -A FORWARD -i eth0 -p udp -s 0/0 --sport 1024:65535 -d 0/0 >--dport 1433:1434 -j LOG --log-prefix " MS_SQL " >iptables -A FORWARD -i eth0 -p udp -s 0/0 --sport 1024:65535 -d 0/0 >--dport 1433:1434 -j REJECT --reject-with icmp-host-unreachable >iptables -A FORWARD -i eth0 -p udp -s 0/0 --sport 500 -d 0/0 --dport 500 >-j LOG --log-prefix " IPSEC_SCAN " >iptables -A FORWARD -i eth0 -p udp -s 0/0 --sport 500 -d 0/0 --dport 500 >-j REJECT --reject-with icmp-host-unreachable >iptables -A FORWARD -i eth0 -p udp -d 0/0 --dport 135:139 -j LOG >--log-prefix " MS_CRAP " >iptables -A FORWARD -i eth0 -p udp -d 0/0 --dport 135:139 -j REJECT >--reject-with icmp-host-unreachable > >Again, this just allows me to segregate all my traffic based on specific >patterns so its easier to review. I use grep to extract these entries in >a similar fashion to what I described about. > >To give you an idea how effective this is, on an average day I generate >70-80 MB worth of firewall log entries. Its not uncommon to have all of >this traffic, except for maybe 100 KB, extracted into its own file. This >means that I go from having 80 MB to 100 KB of log files that I actually >have to put my thinking cap on to review. The rest is done >automagically. > >As for breaking ICMP and others, could be you ended up letting through >established traffic, but not related (related being ICMP type 3's, 4's, >5's and 11's). A quick review of your rules should show you if this is >the case. > > > I'll take a look, thanks. Jeff ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Dropping SYN with FIN flag set 2003-10-21 20:35 ` Jeffrey Laramie @ 2003-10-21 21:35 ` Chris Brenton 0 siblings, 0 replies; 8+ messages in thread From: Chris Brenton @ 2003-10-21 21:35 UTC (permalink / raw) To: Jeffrey Laramie; +Cc: netfilter On Tue, 2003-10-21 at 16:35, Jeffrey Laramie wrote: > > I only wish I had time to review my logs in that kind of detail. If I'm > blocking the bad stuff, I'm happy! Actually, that's kind of the point. I used to use Nokia boxes at my secure ISP and reviewing the logs was an all day event. By switching to iptables I was collecting more information, but spending about 1/10 the amount of time doing log review. It takes time to setup your logging rules and the cron script I described. Once its done however performing log review is a breeze. Let me give you (yet another) example. My perimeter includes all my accept rules for all legitimate FTP servers. After that, I have this set of rules: iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL SYN -d 0/0 --dport 21 -j LOG --log-prefix " FTP_SCAN " iptables -A FORWARD -i eth0 -p tcp --tcp-flags ALL SYN -d 0/0 --dport 21 -j REJECT --reject-with icmp-host-unreachable My script then parses the traffic like so: grep FTP_SCAN cb19.txt > ftp-scan.txt grep -v FTP_SCAN cb19.txt> cb20.txt Now, I know on a daily basis this ftp-scan.txt file is normally 40-75 KB in size (there are always script kiddies poking at FTP). When I see a file size in this range, I don't even bother looking at it. If one day I check the file and its 1 MB however, then I take the time to see if its one persistent IP (in which case I ban it) or from a number of different IPs (in which case there is a new tool and possibly a 0-day so I start investigating what's going on and if my FTP servers need patching). Log review really is a critical part of keeping your perimeter secure. There are lots of tricks you can play to help minimize the time you spend doing it. > Actually it was a couple of previous posts, including one of your's, > that got me thinking about logging. There were several questions about > directing the iptables logs from /var/log/messages to a different file > and the difficulty in splitting out the other kernel traffic. This is another "salt to taste" kind of thing. Some people do prefer to dump the firewall log entries to their own file. I personally do not. When I teach firewall log review my golden rule is "move aside everything you expect, focus on the stuff you do not". For example the script I keep mentioning pulls out all the traffic I expect my firewall to record. The last temp file gets renamed "interesting.txt" and that's the first file to get reviewed. Let's say someone SSH's to the box or assumes root level privileges. These log entires will end up in that "interesting.txt" file. Granted these are not true firewall log entries but if someone has whacked this critical piece of my infrastructure, I want to know about it ASAP. So leaving all the log entries in messages helps to facilitate this process. > I have 3 files to review each morning. The /var/log/messages file has > pure kernel entries in it. If things are going ok this file is pretty > short and boring. If there's a kernel problem it's real obvious. The > iptables.report shows all the traffic by rule. This is totally cool. Again, one of the things thats nice about a flexible tool is that everyone can customize it to suit the way they like to review the data. :) Thanks for the info! C ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2003-10-21 21:35 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2003-10-21 15:47 Dropping SYN with FIN flag set James Miller 2003-10-21 16:39 ` Chris Brenton 2003-10-21 17:51 ` Jeffrey Laramie 2003-10-21 18:56 ` Chris Brenton 2003-10-21 19:29 ` Tom Marshall 2003-10-21 19:47 ` Chris Brenton 2003-10-21 20:35 ` Jeffrey Laramie 2003-10-21 21:35 ` Chris Brenton
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.