patch: Port- and netscan detection for netfilter

Jan Engelhardt jengelh at linux01.gwdg.de
Fri Mar 16 22:29:42 CET 2007


On Mar 16 2007 16:40, Patrick McHardy wrote:
>
>> +++ linux-2.6.20.2/Documentation/ipt_PORTNETSCAN.txt
>> @@ -0,0 +1,389 @@
>> +Allgemein Informationen zum Modul ipt_PORTNETSCAN

If it's a match, make it lowercase.

>Luckily I speak german :)

Can't have that luxury.

>But seriously, we already had different portscan-detection matches
>submitted, but decided against merging them since its not clear
>what the benefit of detecting scans is. It clearly doesn't improve
>security since
>
>- you can just scan slow enough not to be detected

Speaking for chaostables, just have a look at section 9:
http://jengelh.hopto.org/p/chaostables/fw.html#se9
Either you scan so slowly that you do not get much of results, or you 
scan fast enough that you are detected.

>- you don't need to scan to crack something

move port 22 to rand(0,65535) and a scan is needed first to figure out 
where sshd is.


>diff -Naur linux-2.6.20.2.org/Documentation/ipt_PORTNETSCAN.txt linux-2.6.20.2/Documentation/ipt_PORTNETSCAN.txt
>--- linux-2.6.20.2.org/Documentation/ipt_PORTNETSCAN.txt	1970-01-01 01:00:00.000000000 +0100
>+++ linux-2.6.20.2/Documentation/ipt_PORTNETSCAN.txt	2007-03-10 14:33:15.000000000 +0100
>@@ -0,0 +1,389 @@
>+
>+--tree-depth [1|2|4|8|16|32]
>+Standard: --tree-depth 4
>+Diese Option gibt die Baumtiefe des Suchbaumes (Suchindex) (trace-tree /
>+berwachungsliste) an. Bei einer angegeben Baumtiefe von 1  wird  eine 
>+einfache  verkettete  Liste  als Suchindex verwendet. Bei eigenen
>+Testreihen hat sich eine Baumtiefe von vier als Optimum herausgestellt.
>+Bei den Tests wurde aber von mehr als 1000 gleichzeitigen Verbindungen
>+ausgegangen.
>+
>+--trace-time [Sekunden] (10-3600)
>+Standard: --trace-time 120 (2 Minuten)
>+Die Option trace-time gibt die Zeit in Sekunden an, welche eine Quelladresse
>+berwacht wird. Solange Pakete durch die Regel berprft  werden, beginnt
>+die berwachungszeit von neuem. Dies bedeutet, dass z.B. bei einem Wert von
>+20 in dieser Option der berwachungseintrag der Quelladresse erst dann 
>+entfernt wird, wenn dieser 120 Sekunden keine Prfung mehr erfordert hat,
>+d.h. dass in dieser Zeitspanne kein Paket durch die IpTables Regel zur 
>+berprfung an das Modul gesendet wurde. Dies ist in der Regel der Fall,
>+wenn der Rechner keine Verbindung mehr zum Zielsystem hat.

This sounds like -m recent --update ...

>+--block-time [Sekunden] (0-172800)
>+Standard: --block-time 3600 (1 Stunde)
>+Die Option block-time gibt die Zeit in Sekunden an, die die Quelladresse eines
>+Rechners gesperrt wird, falls eine der definierten Schwellwerte (Quotas) 
>+erfllt ist. Der Rechner wird im Falle des berschreitens eines Schwellwertes
>+(Quota) aus den berwachten Eintrgen gelscht und in die Ablehnungsliste 
>+verschoben. Diese Liste ist eine normale verkettete Liste im Speicher und
>+wird nicht zustzlich indiziert.

-m recent -j DROP

>+--clean-interval [Sekunden] (1-60)
>+Standard: --clean-interval 1 (1 Sekunde)
>+Diese Option legt das Intervall fest, nach dem veraltete Eintrge aus den 
>+berwachungs- und Ablehnungslisten gelscht werden. Zustzlich ist im Kernel
>+noch ein globales Intervall festgelegt, nach dem veraltete Eintrge aller
>+Konfigurationsumgebungen freigegeben werden.

-m recent --seconds

>+--port-scan-quota [Quota] (3-1000)
>+Standard: --port-scan-quota 10
>+Diese Option legt fest, ab welchem Schwellwert (Quota) ein Portscan erkannt 
>+wird. 
>+Ein Portscan wird angenommen bei Erfllung folgender Voraussetzung: 
>+(Zielports   /  Zieladressen)  > port-scan-quota

Sounds like -m psd.

>+Informationen ber den Modulzustand im proc-Dateisystem
>+-------------------------------------------------------

Use sysfs.

>+// Unabhngige Typdefinitionen

/* */

>+// StandardDefinitionen
>+#define DEFAULTTREEDEPTH        4              /* StandardTiefe des verwendeten Baumes */
>+#define DEFAULTDEBUGLEVEL       0              /* Debuglevel */
>+#define DEFAULTTRACETIME        120            /* 10 Minuten berwachen per Default (600 Sekunden = 10 Minuten) */
>+#define MAXTRACETIME            3600           /* 1 Stunde Maximal berwachungszeit (3600 Sekunden = 1 Stunde) */
>+#define DEFAULTCLEANINTERVAL    1              /* Jede Sekunde soll geprft werden, ob Eintrge veraltet sind */
>+#define MAXTCLEANINTERVAL       60             /* Maxmialer Wert fr clean-interval */
>+#define MAXUINT32               4294967295     /* Maximaler 32 BIT Unsigned Int */
>+#define MAXENDNODEENTRY         9999           /* Maximale Lnge in Vektoren der Werte DPT und DST einer EndNode */
>+#define DEFAULTPORTSCANQUOTA    10             /* Portscan Erkennung: Standardwert fr Verhltnis (Schwellwert) von Zieladresse zu Zielport (Zielports/Zieladressen) */
>+#define MAXPORTSCANQUOTA        1000           /* Maximalwert fr Schwellwert zur Portscan Erkennung */
>+#define DEFAULTNETSCANQUOTA     10             /* Netscan Erkennung: Standardwert fr Verhltnis (Schwellwert) von Zielport zur Zieladresse (Zieladressen/Zielports) */
>+#define MAXNETSCANQUOTA         1000           /* Maximalwert fr Schwellwert zur Netscan Erkennung */
>+#define DEFAULTBLOCKTIME        3600           /* Zeit, die ein Host als blockiert gilt, falls ein Port- oder Netscan erkannt wird */
>+#define MAXBLOCKTIME            172800         /* Maximale Zeit fr blocken einer Quelladresse (172800 = 2 Tage) */
>+#define DEFAULTDENYLISTCOUNT    10             /* Default Anzahl an Hosts in der DENY-LISTE (Blockierte Hosts) */
>+#define MINDENYLISTCOUNT        10             /* Minimale Anzahl an Hosts in der DENY-LISTE (Blockierte Hosts) */
>+#define MAXDENYLISTCOUNT        2000           /* Maximale Anzahl an Hosts in der DENY-LISTE (Blockierte Hosts) */
>+#define MINENDNODECOUNT         10             /* Minimale Anzahl an berwachten Eintrgen */
>+#define MAXENDNODECOUNT         20000          /* Maximale Anzahl an berwachten Eintrgen */
>+#define DEFAULTENDNODECOUNT     10000          /* Standard Anzahl an berwachten Eintrgen */
>+#define GLOBALCLEANUP           30             /* Globaler Cleanup-Interval */
>+#define DEFAULTCOMBINEDQUOTA    50             /* Schwellwert fr Zielhost + Zielports eines Quellrechners */
>+#define MAXCOMBINEDQUOTA        1000           /* Maximaler Schwellwert fr Zielhost + Zielports eines Quellrechners */ 
>+#define KERNELLINEMAX           1024           /* Maximale Lnge einer Ausgabezeile fr den Kernel (proc-Aufruf) */
>+#define KERNELPAGESIZE          4096           /* Pagesize im Kernel */
>+#define DEFAULTCHECKDENYENTRIES 0              /* Nur Deny-Liste berprfen */
>+
>+// Erkannte Probleme
>+#define REASONPORTSCAN       1                 /* Portscan wurde erkannt */
>+#define REASONNETSCAN        2                 /* Netscan wurde erkannt */
>+#define REASONCOMPINED       4                 /* Combined Scan wurde erkannt */
>+#define REASONUNKNOWN        1024

A ton of parameters you got there..

>+struct ipt_PORTNETSCAN_info
>+{
>+        unsigned int tree_depth;
>+        unsigned int trace_time;
>+        unsigned int clean_interval;
>+        unsigned int port_scan_quota;
>+        unsigned int net_scan_quota;
>+        unsigned int max_deny_entries;
>+        unsigned int max_trace_entries;
>+        unsigned int block_time;
>+	unsigned int combined_quota;
>+	unsigned short check_deny_entries;
>+};
>[...]
>+struct IptGlobalConfStruct
>+{
>+	struct PortNetscanEnv * FirstPortNetscan;        // Speichert den ersten Konfigurationeintrag (Konfigurationsumgebung)
>+	struct KernelOutLinePuffer * FirstOutLine;       // Kernelausgabeliste: Bei proc_read-Aufruf ist dies der Zeiger auf das erste Element der noch auszugebenen Liste
>+	struct KernelOutLinePuffer * LastPrintOutLine;   // Kernelausgabeliste: Letztes ausgegebenes Elemet
>+	struct KernelOutLinePuffer * LastAddOutLine;     // Kernelausgabeliste: Letztes hinzugefgtes Element
>+	unsigned int FailBuffer;                         // Kernelausgabeliste: Bei nicht ausreichenden Puffer, werden hier die Anzahl der bereits verarbeiteten Bytes angegeben
>+	unsigned int Conf_Count;                         // Anzahl der Konfigurationseintrge
>+	time_t LastCleanup;                              // Letzer globaler Aufrumablauf (Unix-Zeit)
>+};

Please adhere to CodingStyle ;-)

A lot of structures.

>+struct TreeNode 
>+{ 
>+		struct TreeNode *         Parent;        // bergeordneter Eintrag in Suchbaum (NULL, wenn in oberster Ebene)
>+		void *                    Childs;        // untergeordneter Eintrag 
>+		struct TreeNode *         Prior;         // vorheriges Element in gleicher Hierachieebene (NULL, wenn erster Eintrag in Hierachieebene)
>+		struct TreeNode *         Next;          // nchstes Element in gleicher Hierachieebene (NULL, wenn letzer Eintrag)
>+		u_int32_t                 TreeValue;     // Anteil an Suchbegriff
>+};

Use #include <linux/rbtree.h> instead of reinwhenting the wheel, perhaps.

>+	  PORTNETSCAN is an iptables module for the detection of PORT-, NET 
>+	  and COMBINEDSCANS using quotas. The usage is described in the 
>+	  accompanying document located at Documentation/ipt_PORTNETSCAN.txt

What are netscans / combinedscans?

>+menu "IP: Netfilter Configuration"
>+	depends on INET && NETFILTER
>+
>+config NF_CONNTRACK_IPV4
>+	tristate "IPv4 connection tracking support (required for NAT)"
>+	depends on NF_CONNTRACK

!? No, this should not be here...

>+++ linux-2.6.20.2/net/ipv4/netfilter/Makefile.orig	2007-03-09 19:58:04.000000000 +0100

Should not be here.

>+int Kernel_CreateProcmemPuffer(void)
>+{
>+	// Functionsvariablen
>+	struct PortNetscanEnv * TEMP = IptGlobalConf.FirstPortNetscan;
>+	unsigned int COUNTER         = 0;
>+	u_int32_t * IPPARTS          = (u_int32_t*)_malloc( sizeof(u_int32_t) * 4, GFP_KERNEL);
>+	unsigned short PARTSIZE      = 8; /* 32/4* */
>+	unsigned int TEXTLEN         = 0;
>+	char STRINGBUFFER[KERNELLINEMAX];
>+	
>+
>+	if (IptGlobalConf.FirstOutLine == NULL )
>+	{
>+
>+		spin_lock(&PORTNETSCAN_SPINLOCK);
>+
>+		snprintf(STRINGBUFFER,KERNELLINEMAX-1,"# IpTables PORTNETSCAN MODUL\n# --------------------------\n#\n");
>+		TEXTLEN += Kernel_CreateProcmemPufferAddEntry(STRINGBUFFER);
>+
>+		snprintf(STRINGBUFFER,KERNELLINEMAX-1,"G\tCount_Global_Conf: %d\n",IptGlobalConf.Conf_Count);
>+		TEXTLEN += Kernel_CreateProcmemPufferAddEntry(STRINGBUFFER);
>+
>+		snprintf(STRINGBUFFER,KERNELLINEMAX-1,"U\tUpdating_Time(Unix): %u\n#\n",(unsigned int)getunixtime());	
>+		TEXTLEN += Kernel_CreateProcmemPufferAddEntry(STRINGBUFFER);

Blargh. Also note that proc files are limited to PAGE_SIZE, which is most
likely exceeded with all this info.




Too much code (and too much unused or duplicate code) for what it does. We've
got ipt_psd (checking scans/time) for long enough, and recently chaostables
(checking connection behavior) joined the scene. I think we really exploited
all methods by now.




Jan
-- 



More information about the netfilter-devel mailing list