You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							661 lines
						
					
					
						
							25 KiB
						
					
					
				
			
		
		
	
	
							661 lines
						
					
					
						
							25 KiB
						
					
					
				# --- SDE-COPYRIGHT-NOTE-BEGIN --- | 
						|
# This copyright note is auto-generated by ./scripts/Create-CopyPatch. | 
						|
# | 
						|
# Filename: package/.../sancp/sancp-1.6.1-stable-prelude-3.diff | 
						|
# Copyright (C) 2007 The OpenSDE Project | 
						|
# | 
						|
# More information can be found in the files COPYING and README. | 
						|
# | 
						|
# This patch file is dual-licensed. It is available under the license the | 
						|
# patched project is licensed under, as long as it is an OpenSource license | 
						|
# as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms | 
						|
# of the GNU General Public License as published by the Free Software | 
						|
# Foundation; either version 2 of the License, or (at your option) any later | 
						|
# version. | 
						|
# --- SDE-COPYRIGHT-NOTE-END --- | 
						|
 | 
						|
diff -ruN sancp-1.6.1-stable.vanilla/Makefile sancp-1.6.1-stable/Makefile | 
						|
--- sancp-1.6.1-stable.vanilla/Makefile	2007-07-07 00:46:11.000000000 +0200 | 
						|
+++ sancp-1.6.1-stable/Makefile	2007-07-24 13:44:01.000000000 +0200 | 
						|
@@ -9,7 +9,7 @@ | 
						|
  | 
						|
  | 
						|
 # LINUX and BSD CFLAGS | 
						|
-CFLAGS = -O3 -I/usr/include/pcap -I/usr/local/include/pcap  -I./ -L/usr/lib/libsocket.so  -g -L/opt/csw/lib -ggdb | 
						|
+CFLAGS = -g -O3 -I/usr/include/pcap -I/usr/local/include/pcap  -I./ -L/usr/lib/libsocket.so  -g -L/opt/csw/lib -ggdb `libprelude-config --cflags` | 
						|
  | 
						|
 # LINUX  LFLAGS | 
						|
 LFLAGS = -lresolv -lnsl -lpcap -L/usr/lib/libpcap.so.0.6.2 | 
						|
@@ -41,10 +41,10 @@ | 
						|
 bsd : | 
						|
 	@(echo "#define PLATFORM_BSD" > platform.h) | 
						|
 	@make final | 
						|
-	g++ -Wall $(BFLAGS) $(CFLAGS) -o sancp sancp.o  misc_functs.o check_packet.o statefull_logging.o build_acl.o apply_rule.o decode.o pcap_functions.o pcapFileHandle.o fileHandle.o MemoryPool.o permissions.o outputFileHandle.o help.o | 
						|
+	g++ -Wall $(BFLAGS) $(CFLAGS) -o sancp sancp.o  misc_functs.o check_packet.o statefull_logging.o build_acl.o apply_rule.o decode.o pcap_functions.o pcapFileHandle.o fileHandle.o MemoryPool.o permissions.o outputFileHandle.o help.o `libprelude-config --libs` `libprelude-config --ldflags` | 
						|
  | 
						|
 linux : | 
						|
 	@(echo "#define PLATFORM_LINUX" > platform.h) | 
						|
 	@make final | 
						|
-	g++ -Wall $(LFLAGS) $(CFLAGS) -o sancp sancp.o misc_functs.o check_packet.o statefull_logging.o build_acl.o apply_rule.o decode.o pcap_functions.o pcapFileHandle.o fileHandle.o MemoryPool.o permissions.o outputFileHandle.o help.o | 
						|
+	g++ -Wall $(LFLAGS) $(CFLAGS) -o sancp sancp.o misc_functs.o check_packet.o statefull_logging.o build_acl.o apply_rule.o decode.o pcap_functions.o pcapFileHandle.o fileHandle.o MemoryPool.o permissions.o outputFileHandle.o help.o `libprelude-config --libs` `libprelude-config --ldflags` | 
						|
  | 
						|
diff -ruN sancp-1.6.1-stable.vanilla/apply_rule.cc sancp-1.6.1-stable/apply_rule.cc | 
						|
--- sancp-1.6.1-stable.vanilla/apply_rule.cc	2007-07-05 18:12:20.000000000 +0200 | 
						|
+++ sancp-1.6.1-stable/apply_rule.cc	2007-07-24 13:44:01.000000000 +0200 | 
						|
@@ -47,6 +47,12 @@ | 
						|
 				tc->tcplag=myacl->tcplag;	 | 
						|
 				tc->status=myacl->status;	 | 
						|
 				tc->rid=myacl->rid;	 | 
						|
+				tc->prelude_impact_severity=myacl->prelude_impact_severity; | 
						|
+				tc->prelude_impact_completion=myacl->prelude_impact_completion; | 
						|
+				tc->prelude_impact_type=myacl->prelude_impact_type; | 
						|
+				tc->prelude_confidence_rating=myacl->prelude_confidence_rating; | 
						|
+ | 
						|
+ | 
						|
  | 
						|
 				if(myacl->pmode==OMODE_UNIQ) | 
						|
 				{ | 
						|
@@ -112,6 +118,10 @@ | 
						|
 			nc->rgid=myacl->rgid;	 | 
						|
 			nc->zone=myacl->zone;	 | 
						|
 			nc->node=myacl->node;	 | 
						|
+			nc->prelude_impact_severity=myacl->prelude_impact_severity; | 
						|
+			nc->prelude_impact_completion=myacl->prelude_impact_completion; | 
						|
+			nc->prelude_impact_type=myacl->prelude_impact_type; | 
						|
+			nc->prelude_confidence_rating=myacl->prelude_confidence_rating; | 
						|
 			myacl->ctr++;	 | 
						|
 			return; | 
						|
 		} | 
						|
@@ -130,6 +140,10 @@ | 
						|
 	nc->timeout=gVars.default_timeout;	 | 
						|
 	nc->tcplag=gVars.default_tcplag;	 | 
						|
 	nc->node=gVars.default_node;	 | 
						|
+	nc->prelude_impact_severity=gVars.prelude_impact_severity; | 
						|
+	nc->prelude_impact_completion=gVars.prelude_impact_completion; | 
						|
+	nc->prelude_impact_type=gVars.prelude_impact_type; | 
						|
+	nc->prelude_confidence_rating=gVars.prelude_confidence_rating; | 
						|
 	gVars.default_ctr++; | 
						|
 #ifdef DEBUG | 
						|
 	printf("Setting stats: %d  pcap: %d realtime: %d limit: %d timeout: %d tcplag: %d\n", nc->stats, nc->pcap, nc->realtime, nc->limit, nc->timeout, nc->tcplag); | 
						|
diff -ruN sancp-1.6.1-stable.vanilla/build_acl.cc sancp-1.6.1-stable/build_acl.cc | 
						|
--- sancp-1.6.1-stable.vanilla/build_acl.cc	2007-07-05 18:12:20.000000000 +0200 | 
						|
+++ sancp-1.6.1-stable/build_acl.cc	2007-07-24 13:44:01.000000000 +0200 | 
						|
@@ -1168,6 +1168,62 @@ | 
						|
 	fprintf(stdout,"Didn't set default for %s to %s\n",tok,tmp); | 
						|
 #endif | 
						|
 	} | 
						|
+	if(strcmp(tok,"prelude_impact_severity")==0) | 
						|
+	{ | 
						|
+		if((tmp = get_tok(&rules,accept))==NULL) | 
						|
+		{ | 
						|
+			syslog(LOG_ERR,"Format error, prelude_impact_severity specified but none provided, using prelude_impact_severity %s\n",PRELUDE_IMPACT_SEVERITY); | 
						|
+			free(rule); | 
						|
+			return; | 
						|
+		} | 
						|
+		gVars.prelude_impact_severity = strdup(tmp); | 
						|
+		free(rule); | 
						|
+	} | 
						|
+	if(strcmp(tok,"prelude_impact_completion")==0) | 
						|
+	{ | 
						|
+		if((tmp = get_tok(&rules,accept))==NULL) | 
						|
+		{ | 
						|
+			syslog(LOG_ERR,"Format error, prelude_impact_completion specified but none provided, using prelude_impact_completion %s\n",PRELUDE_IMPACT_COMPLETION); | 
						|
+			free(rule); | 
						|
+			return; | 
						|
+		} | 
						|
+		gVars.prelude_impact_completion = strdup(tmp); | 
						|
+		free(rule); | 
						|
+	} | 
						|
+	if(strcmp(tok,"prelude_impact_type")==0) | 
						|
+	{ | 
						|
+		if((tmp = get_tok(&rules,accept))==NULL) | 
						|
+		{ | 
						|
+			syslog(LOG_ERR,"Format error, prelude_impact_type specified but none provided, using prelude_impact_type %s\n",PRELUDE_IMPACT_TYPE); | 
						|
+			free(rule); | 
						|
+			return; | 
						|
+		} | 
						|
+		gVars.prelude_impact_type = strdup(tmp); | 
						|
+		free(rule); | 
						|
+	} | 
						|
+	if(strcmp(tok,"prelude_confidence_rating")==0) | 
						|
+	{ | 
						|
+		if((tmp = get_tok(&rules,accept))==NULL) | 
						|
+		{ | 
						|
+			syslog(LOG_ERR,"Format error, prelude_confidence_rating specified but none provided, using prelude_confidence_rating %s\n",PRELUDE_CONFIDENCE_RATING); | 
						|
+			free(rule); | 
						|
+			return; | 
						|
+		} | 
						|
+		gVars.prelude_confidence_rating = strdup(tmp); | 
						|
+		free(rule); | 
						|
+	} | 
						|
+	if(strcmp(tok,"prelude_profile")==0) | 
						|
+	{ | 
						|
+		if((tmp = get_tok(&rules,accept))==NULL) | 
						|
+		{ | 
						|
+			syslog(LOG_ERR,"Format error, prelude_profile specified but none provided, using prelude_profile %s\n",PRELUDE_PROFILE); | 
						|
+			free(rule); | 
						|
+			return; | 
						|
+		} | 
						|
+		gVars.prelude_profile = strdup(tmp); | 
						|
+		free(rule); | 
						|
+	} | 
						|
+ | 
						|
 } | 
						|
  | 
						|
 void parse_var(char *c_rule, char *accept) | 
						|
@@ -1426,6 +1482,10 @@ | 
						|
 		}else{ | 
						|
 			n_acl->fH = 0; | 
						|
 		} | 
						|
+		n_acl->prelude_impact_severity = gVars.prelude_impact_severity; | 
						|
+		n_acl->prelude_impact_completion = gVars.prelude_impact_completion; | 
						|
+		n_acl->prelude_impact_type = gVars.prelude_impact_type; | 
						|
+		n_acl->prelude_confidence_rating = gVars.prelude_confidence_rating; | 
						|
  | 
						|
 		// FIELD 0 - required - Get the h_proto | 
						|
                 n_acl->h_proto_h = 0xFFFF; | 
						|
@@ -2061,6 +2121,46 @@ | 
						|
 				n_acl->retro = true; | 
						|
 				continue; | 
						|
 			} | 
						|
+			if(strcmp(tok,"severity")==0) | 
						|
+			{ | 
						|
+				if((tmp = get_tok(rules,accept))==NULL) | 
						|
+				{ | 
						|
+					syslog(LOG_ERR,"Format error, severity specified but no option provided%s\n",rule); | 
						|
+					return; | 
						|
+				} | 
						|
+				n_acl->prelude_impact_severity = strdup(tmp); | 
						|
+				continue; | 
						|
+			} | 
						|
+			if(strcmp(tok,"completion")==0) | 
						|
+			{ | 
						|
+				if((tmp = get_tok(rules,accept))==NULL) | 
						|
+				{ | 
						|
+					syslog(LOG_ERR,"Format error, completion specified but no option provided%s\n",rule); | 
						|
+					return; | 
						|
+				} | 
						|
+				n_acl->prelude_impact_completion = strdup(tmp); | 
						|
+				continue; | 
						|
+			} | 
						|
+			if(strcmp(tok,"type")==0) | 
						|
+			{ | 
						|
+				if((tmp = get_tok(rules,accept))==NULL) | 
						|
+				{ | 
						|
+					syslog(LOG_ERR,"Format error, type specified but no option provided%s\n",rule); | 
						|
+					return; | 
						|
+				} | 
						|
+				n_acl->prelude_impact_type = strdup(tmp); | 
						|
+				continue; | 
						|
+			} | 
						|
+			if(strcmp(tok,"confidence")==0) | 
						|
+			{ | 
						|
+				if((tmp = get_tok(rules,accept))==NULL) | 
						|
+				{ | 
						|
+					syslog(LOG_ERR,"Format error, confidence specified but no option provided%s\n",rule); | 
						|
+					return; | 
						|
+				} | 
						|
+				n_acl->prelude_confidence_rating = strdup(tmp); | 
						|
+				continue; | 
						|
+			} | 
						|
 			syslog(LOG_ERR,"Skipping, invalid option in rule: %s %s\n", tok,*rules); | 
						|
 			return; | 
						|
 		} | 
						|
diff -ruN sancp-1.6.1-stable.vanilla/docs/README sancp-1.6.1-stable/docs/README | 
						|
--- sancp-1.6.1-stable.vanilla/docs/README	2007-07-06 03:33:14.000000000 +0200 | 
						|
+++ sancp-1.6.1-stable/docs/README	2007-07-24 13:44:01.000000000 +0200 | 
						|
@@ -277,6 +277,10 @@ | 
						|
   		 strip-80211  { disable|enable } | 
						|
   		 node <number> | 
						|
   		 debug_pcap_raw  { disable|enable } | 
						|
+                 prelude_impact_severity [string] | 
						|
+                 prelude_impact_completion [string] | 
						|
+                 prelude_impact_type [string] | 
						|
+                 prelude_confidence_rating [string] | 
						|
  | 
						|
   known_port syntax: | 
						|
   -----------------------: | 
						|
@@ -310,6 +314,9 @@ | 
						|
 			b) tagging options  | 
						|
 				i.e. status=16 rid=1112 node=2  | 
						|
  | 
						|
+                        c) prelude options | 
						|
+                                i.e. severity=severe, completion=succeeded, type=other, confidence=high | 
						|
+ | 
						|
   [<ether protocol>[-<end_range>] [<src_ip{/<CIDR>|<dotted>}>] [<dst_ip{/<CIDR>|<dotted>}>] [{tcp|udp|icmp|<proto number>[-<end_range>] }] | 
						|
   [<src_port>{-[<end_port_range>]}] [<dst_port>{-[<end_port_range>]}]  | 
						|
   { ignore | stats [{log|pass}] | realtime [{log|pass}] | | 
						|
diff -ruN sancp-1.6.1-stable.vanilla/gvars.h sancp-1.6.1-stable/gvars.h | 
						|
--- sancp-1.6.1-stable.vanilla/gvars.h	2007-07-05 18:12:20.000000000 +0200 | 
						|
+++ sancp-1.6.1-stable/gvars.h	2007-07-24 13:44:01.000000000 +0200 | 
						|
@@ -17,7 +17,8 @@ | 
						|
 /* Make certain all id's are represented in the same order (as strings) in fmtnames[] */ | 
						|
 /* 'null' is a place holder - in the list for field 0 */  | 
						|
  | 
						|
-enum id {null,sancp_id,start_time_gmt,start_time_local,stop_time_gmt,stop_time_local,erased_time_gmt,erased_time_local,eth_proto_hex,eth_proto,ip_proto,src_ip_decimal,src_ip_dotted,src_port,dst_ip_decimal,dst_ip_dotted,dst_port,duration,timeout,src_pkts,dst_pkts,src_bytes,dst_bytes,sflags_hex,sflags,sflags_1,sflags_2,sflags_U,sflags_A,sflags_P,sflags_R,sflags_S,sflags_F,dflags_hex,dflags,dflags_1,dflags_2,dflags_U,dflags_A,dflags_P,dflags_R,dflags_S,dflags_F,cflags_hex,cflags,cflags_DA,cflags_SA,cflags_DR,cflags_SR,cflags_DF,cflags_SF,ip_len_s,ip_ttl_s,ip_df_s,tcp_wss_s,tcp_mss_s,tcp_wscale_s,tcp_sack_ok_s,tcp_nop_s,ip_len_d,ip_ttl_d,ip_df_d,tcp_wss_d,tcp_mss_d,tcp_wscale_d,tcp_sack_ok_d,tcp_nop_d,total_bytes,collect,collected,climit,tcplag,pcap,realtime,stats,reversed,hash,rid,rgid,node,zone,status,retro,src_mac,dst_mac }; | 
						|
+enum id | 
						|
+{null,sancp_id,start_time_gmt,start_time_local,stop_time_gmt,stop_time_local,erased_time_gmt,erased_time_local,eth_proto_hex,eth_proto,ip_proto,src_ip_decimal,src_ip_dotted,src_port,dst_ip_decimal,dst_ip_dotted,dst_port,duration,timeout,src_pkts,dst_pkts,src_bytes,dst_bytes,sflags_hex,sflags,sflags_1,sflags_2,sflags_U,sflags_A,sflags_P,sflags_R,sflags_S,sflags_F,dflags_hex,dflags,dflags_1,dflags_2,dflags_U,dflags_A,dflags_P,dflags_R,dflags_S,dflags_F,cflags_hex,cflags,cflags_DA,cflags_SA,cflags_DR,cflags_SR,cflags_DF,cflags_SF,ip_len_s,ip_ttl_s,ip_df_s,tcp_wss_s,tcp_mss_s,tcp_wscale_s,tcp_sack_ok_s,tcp_nop_s,ip_len_d,ip_ttl_d,ip_df_d,tcp_wss_d,tcp_mss_d,tcp_wscale_d,tcp_sack_ok_d,tcp_nop_d,total_bytes,collect,collected,climit,tcplag,pcap,realtime,stats,reversed,hash,rid,rgid,node,zone,status,retro,src_mac,dst_mac,prelude_impact_sevirty,prelude_impact_completion,prelude_impact_type,prelude_confidence_rating,prelude_profile }; | 
						|
  | 
						|
 struct cnx_queue { | 
						|
 	struct cnx *head; | 
						|
@@ -102,5 +103,10 @@ | 
						|
 	int stdout_fmt_len; | 
						|
 	pcap_t *ph;      // pcap handle | 
						|
 	struct pcap_pkthdr *g_pkthdr;// | 
						|
+	char *prelude_impact_severity; | 
						|
+	char *prelude_impact_completion; | 
						|
+	char *prelude_impact_type; | 
						|
+	char *prelude_confidence_rating; | 
						|
+	char *prelude_profile; | 
						|
 }; | 
						|
  | 
						|
diff -ruN sancp-1.6.1-stable.vanilla/sancp.cc sancp-1.6.1-stable/sancp.cc | 
						|
--- sancp-1.6.1-stable.vanilla/sancp.cc	2007-07-05 18:12:20.000000000 +0200 | 
						|
+++ sancp-1.6.1-stable/sancp.cc	2007-07-24 13:44:01.000000000 +0200 | 
						|
@@ -48,7 +48,40 @@ | 
						|
 	//char dfltfmt[]= { sancp_id,start_time_gmt,src_mac,dst_mac,eth_proto,src_ip_dotted,dst_ip_dotted,ip_proto,src_port,dst_port }; | 
						|
 	char dfltfmt_human_readable[]= { sancp_id,start_time_gmt,stop_time_gmt,erased_time_gmt,eth_proto,ip_proto,src_ip_dotted,src_port,dst_ip_dotted,dst_port,duration,timeout,src_pkts,dst_pkts,src_bytes,dst_bytes,sflags_hex,dflags_hex,cflags_hex,ip_len_s,ip_ttl_s,ip_df_s,tcp_wss_s,tcp_mss_s,tcp_wscale_s,tcp_sack_ok_s,tcp_nop_s,ip_len_d,ip_ttl_d,ip_df_d,tcp_wss_d,tcp_mss_d,tcp_wscale_d,tcp_sack_ok_d,tcp_nop_d,total_bytes,collect,collected,climit,tcplag,pcap,realtime,stats,reversed,hash,rid,rgid,node,zone,status,retro,src_mac,dst_mac }; | 
						|
  | 
						|
+prelude_client_t *client; | 
						|
+static idmef_analyzer_t *idmef_analyzer; | 
						|
  | 
						|
+int sancp_alert_init(prelude_client_t *client)  | 
						|
+{ | 
						|
+        int ret; | 
						|
+        prelude_string_t *string; | 
						|
+         | 
						|
+        idmef_analyzer = prelude_client_get_analyzer(client); | 
						|
+        if ( ! idmef_analyzer ) | 
						|
+                return -1; | 
						|
+         | 
						|
+        ret = idmef_analyzer_new_model(idmef_analyzer, &string); | 
						|
+        if ( ret < 0 ) | 
						|
+                return -1; | 
						|
+        prelude_string_set_constant(string, PRELUDE_ANALYZER_MODEL); | 
						|
+ | 
						|
+        ret = idmef_analyzer_new_class(idmef_analyzer, &string); | 
						|
+        if ( ret < 0 ) | 
						|
+                return -1; | 
						|
+        prelude_string_set_constant(string, PRELUDE_ANALYZER_CLASS); | 
						|
+ | 
						|
+        ret = idmef_analyzer_new_manufacturer(idmef_analyzer, &string); | 
						|
+        if ( ret < 0 ) | 
						|
+                return -1; | 
						|
+        prelude_string_set_constant(string, PRELUDE_ANALYZER_MANUFACTURER); | 
						|
+ | 
						|
+        ret = idmef_analyzer_new_version(idmef_analyzer, &string); | 
						|
+        if ( ret < 0 ) | 
						|
+                return -1; | 
						|
+        prelude_string_set_constant(string, VERSION); | 
						|
+ | 
						|
+        return 0; | 
						|
+} | 
						|
 /*************  | 
						|
  *  Main     *  | 
						|
  *************/ | 
						|
@@ -56,6 +89,7 @@ | 
						|
 int main(int argc, char *argv[]) { | 
						|
 	extern struct gvars gVars; | 
						|
 	int cKey; | 
						|
+	int ret; | 
						|
 	pid_t pid=0; | 
						|
  | 
						|
 	/* | 
						|
@@ -102,6 +136,14 @@ | 
						|
 	gVars.stdout_delimiter=DEFAULT_DELIMITER; | 
						|
 	gVars.stdout_eor=DEFAULT_EOR; | 
						|
  | 
						|
+	gVars.prelude_impact_severity=PRELUDE_IMPACT_SEVERITY; | 
						|
+	gVars.prelude_impact_completion=PRELUDE_IMPACT_COMPLETION; | 
						|
+	gVars.prelude_impact_type=PRELUDE_IMPACT_TYPE; | 
						|
+	gVars.prelude_confidence_rating=PRELUDE_CONFIDENCE_RATING; | 
						|
+	gVars.prelude_profile=PRELUDE_PROFILE; | 
						|
+ | 
						|
+	 | 
						|
+ | 
						|
 	for(cKey=0; cKey<HASH_KEYS; cKey++) | 
						|
 	{ | 
						|
 		gVars.cnx_head[cKey]=NULL; | 
						|
@@ -116,6 +158,8 @@ | 
						|
  | 
						|
 	parse_args(argc, argv); | 
						|
  | 
						|
+ | 
						|
+ | 
						|
 	if(gVars.human_readable){ | 
						|
              if(gVars.realtime_fmt_len!=sizeof(dfltfmt_human_readable)){ | 
						|
         	free(gVars.realtime_fmt); | 
						|
@@ -143,7 +187,15 @@ | 
						|
  | 
						|
            setsid(); | 
						|
         } | 
						|
+	prelude_log_set_flags((prelude_log_flags_t)PRELUDE_LOG_FLAGS_SYSLOG); | 
						|
      } | 
						|
+ | 
						|
+	/* Initialize prelude */ | 
						|
+	ret = prelude_init(&argc, argv); | 
						|
+	if (ret < 0) { | 
						|
+		prelude_perror(ret, "unable to initialize the prelude library"); | 
						|
+		exit_all(0); | 
						|
+	} | 
						|
 	/* Retrieve the last cnxid from cache file if we haven't already in parse_args() */ | 
						|
  | 
						|
 	if(!gVars.cnx_id) | 
						|
@@ -197,6 +249,29 @@ | 
						|
  | 
						|
 	build_config(1); | 
						|
  | 
						|
+	/* Create prelude sensor */ | 
						|
+         | 
						|
+	ret = prelude_client_new(&client, gVars.prelude_profile); | 
						|
+	if ( ! client ) { | 
						|
+		prelude_perror(ret, "Unable to create a prelude client object"); | 
						|
+		exit_all(0); | 
						|
+	} | 
						|
+ | 
						|
+	/* Start prelude sensor */ | 
						|
+	sancp_alert_init(client); | 
						|
+	ret = prelude_client_start(client); | 
						|
+	if ( ret < 0 ) { | 
						|
+		prelude_perror(ret, "Unable to start prelude client"); | 
						|
+		exit_all(0); | 
						|
+	} | 
						|
+ | 
						|
+	ret = prelude_client_set_flags(client, (prelude_client_flags_t) | 
						|
+		(PRELUDE_CLIENT_FLAGS_ASYNC_SEND|PRELUDE_CLIENT_FLAGS_ASYNC_TIMER)); | 
						|
+	if ( ret < 0 ) { | 
						|
+		fprintf(stderr, "Unable to set asynchronous send and timer.\n"); | 
						|
+		exit_all(0); | 
						|
+	} | 
						|
+ | 
						|
 	/* Open files for output */ | 
						|
 	/* Be r3al l33t h3r3 */ | 
						|
  | 
						|
diff -ruN sancp-1.6.1-stable.vanilla/sancp.h sancp-1.6.1-stable/sancp.h | 
						|
--- sancp-1.6.1-stable.vanilla/sancp.h	2007-07-06 06:18:04.000000000 +0200 | 
						|
+++ sancp-1.6.1-stable/sancp.h	2007-07-24 13:44:01.000000000 +0200 | 
						|
@@ -47,6 +47,10 @@ | 
						|
 #include "gvars.h" | 
						|
 #endif | 
						|
  | 
						|
+#include <libprelude/prelude.h> | 
						|
+#include <libprelude/prelude-log.h> | 
						|
+#include <netdb.h> | 
						|
+ | 
						|
 #define NCP_H | 
						|
 #define Y 'Y' | 
						|
 #define N 'N' | 
						|
@@ -79,6 +83,7 @@ | 
						|
 	struct vars *next; | 
						|
 }; | 
						|
  | 
						|
+extern prelude_client_t *client; | 
						|
 int main(int argc, char *argv[]); | 
						|
 struct cnx *process(struct cnx*, int len, u_char * pkt); | 
						|
 char * createPcapFileName(); | 
						|
@@ -185,6 +190,15 @@ | 
						|
 #define OMODE_RULE 5 | 
						|
 #define OMODE_UNIQ 6 | 
						|
  | 
						|
+#define PRELUDE_IMPACT_SEVERITY "medium" | 
						|
+#define PRELUDE_IMPACT_COMPLETION "succeeded" | 
						|
+#define PRELUDE_IMPACT_TYPE "other" | 
						|
+#define PRELUDE_CONFIDENCE_RATING "high" | 
						|
+#define PRELUDE_ANALYZER_MODEL "Sancp" | 
						|
+#define PRELUDE_ANALYZER_CLASS "NIDS" | 
						|
+#define PRELUDE_ANALYZER_MANUFACTURER "http://www.metre.net/sancp.html" | 
						|
+#define PRELUDE_PROFILE "sancp" | 
						|
+ | 
						|
 // Need to distinguish between classes of variables | 
						|
 #define VCLASS_0 1	// eth_proto class vars | 
						|
 #define VCLASS_1 2	// ip_addr class vars | 
						|
@@ -276,6 +290,10 @@ | 
						|
     u_int16_t rgid; | 
						|
     u_int16_t node; | 
						|
     u_int16_t zone; | 
						|
+    char *prelude_impact_severity; | 
						|
+    char *prelude_impact_completion; | 
						|
+    char *prelude_impact_type; | 
						|
+    char *prelude_confidence_rating; | 
						|
     CBuffer *CBufferPtr; | 
						|
     struct acl *next; | 
						|
 }; | 
						|
@@ -314,6 +332,10 @@ | 
						|
         u_int16_t rgid; | 
						|
 	u_int16_t node; | 
						|
 	u_int16_t zone; | 
						|
+    	char *prelude_impact_severity; | 
						|
+    	char *prelude_impact_completion; | 
						|
+    	char *prelude_impact_type; | 
						|
+    	char *prelude_confidence_rating; | 
						|
     	CBuffer *CBufferPtr; | 
						|
 	struct os_info os_info; | 
						|
 	struct os_info os_info2; | 
						|
diff -ruN sancp-1.6.1-stable.vanilla/statefull_logging.cc sancp-1.6.1-stable/statefull_logging.cc | 
						|
--- sancp-1.6.1-stable.vanilla/statefull_logging.cc	2007-07-05 18:12:20.000000000 +0200 | 
						|
+++ sancp-1.6.1-stable/statefull_logging.cc	2007-07-24 13:44:01.000000000 +0200 | 
						|
@@ -183,6 +183,208 @@ | 
						|
     snprintf(buf,len,"%s",currenttime); | 
						|
 } | 
						|
  | 
						|
+static int add_idmef_object(idmef_message_t *message, const char *object, const char *value) | 
						|
+{ | 
						|
+        int ret; | 
						|
+        idmef_value_t *val; | 
						|
+        idmef_path_t *path; | 
						|
+         | 
						|
+        ret = idmef_path_new(&path, object); | 
						|
+        if ( ret < 0 ) | 
						|
+                return -1; | 
						|
+ | 
						|
+        ret = idmef_value_new_from_path(&val, path, value); | 
						|
+        if ( ret < 0 ) { | 
						|
+                idmef_path_destroy(path); | 
						|
+                return -1; | 
						|
+        } | 
						|
+ | 
						|
+        ret = idmef_path_set(path, message, val); | 
						|
+ | 
						|
+        idmef_value_destroy(val); | 
						|
+        idmef_path_destroy(path); | 
						|
+         | 
						|
+        return ret; | 
						|
+} | 
						|
+ | 
						|
+#define IDMEF(x) { \ | 
						|
+    int ret = (x); \ | 
						|
+    if (ret < 0) { idmef_message_destroy(idmef); printf("error\n"); return; } \ | 
						|
+    } | 
						|
+ | 
						|
+void record_prelude(struct cnx *cn) { | 
						|
+    char LOG[MAXENTRYLEN]; | 
						|
+ | 
						|
+    idmef_message_t *idmef; | 
						|
+    idmef_alert_t *alert; | 
						|
+    idmef_time_t *time; | 
						|
+ | 
						|
+    struct servent *sourceservent; | 
						|
+    struct protoent *protoent; | 
						|
+ | 
						|
+    IDMEF(idmef_message_new(&idmef)); | 
						|
+    IDMEF(idmef_message_new_alert(idmef, &alert)); | 
						|
+ | 
						|
+    /* alert.detecttime */ | 
						|
+    if (cn->start_time) { | 
						|
+        IDMEF(idmef_time_new_from_time(&time, &cn->start_time)); | 
						|
+    } else { | 
						|
+        /* using the curen time */ | 
						|
+        IDMEF(idmef_time_new_from_gettimeofday(&time)); | 
						|
+    } | 
						|
+    idmef_alert_set_detect_time(alert, time); | 
						|
+ | 
						|
+    /* alert.createtime */ | 
						|
+    time = NULL; | 
						|
+    IDMEF(idmef_time_new_from_gettimeofday(&time)); | 
						|
+    idmef_alert_set_create_time(alert, time); | 
						|
+ | 
						|
+    /* alert.analyzer */ | 
						|
+    idmef_alert_set_analyzer(alert,idmef_analyzer_ref(prelude_client_get_analyzer(client)),0); | 
						|
+ | 
						|
+    /* alert.classification.text */ | 
						|
+    add_idmef_object(idmef, "alert.classification.text",  | 
						|
+        "Unauthorized network connectivity"); | 
						|
+ | 
						|
+    /* alert.messageid */ | 
						|
+    snprintf(LOG,MAXENTRYLEN,"%lld",cn->cid); | 
						|
+    add_idmef_object(idmef, "alert.messageid", LOG); | 
						|
+ | 
						|
+    /* alert.impact.severity */ | 
						|
+    add_idmef_object(idmef, "alert.assessment.impact.severity", | 
						|
+        cn->prelude_impact_severity); | 
						|
+ | 
						|
+    /* alert.impact.completion */ | 
						|
+    add_idmef_object(idmef, "alert.assessment.impact.completion", | 
						|
+        cn->prelude_impact_completion); | 
						|
+ | 
						|
+    /* alert.impact.type */ | 
						|
+    add_idmef_object(idmef, "alert.assessment.impact.type", | 
						|
+        cn->prelude_impact_type); | 
						|
+ | 
						|
+    /* alert.confidence.rating */ | 
						|
+    add_idmef_object(idmef, "alert.assessment.confidence.rating", | 
						|
+        cn->prelude_confidence_rating); | 
						|
+ | 
						|
+    /* alert.additionaldata(0) */ | 
						|
+    add_idmef_object(idmef, "alert.additionaldata(0).type", "integer"); | 
						|
+    add_idmef_object(idmef, "alert.additionaldata(0).meaning", "status"); | 
						|
+    snprintf(LOG,MAXENTRYLEN,"%u",cn->status); | 
						|
+    add_idmef_object(idmef, "alert.additionaldata(0).integer", LOG); | 
						|
+ | 
						|
+    /* alert.additionaldata(1) */ | 
						|
+    add_idmef_object(idmef, "alert.additionaldata(1).type", "integer"); | 
						|
+    add_idmef_object(idmef, "alert.additionaldata(1).meaning", "Network node"); | 
						|
+    snprintf(LOG,MAXENTRYLEN,"%u",cn->node); | 
						|
+    add_idmef_object(idmef, "alert.additionaldata(1).integer", LOG); | 
						|
+ | 
						|
+    /* IP versios */ | 
						|
+    if (cn->h_proto == 8) { | 
						|
+        add_idmef_object(idmef, "alert.source(0).service.ip_version", "4"); | 
						|
+        add_idmef_object(idmef, "alert.target(0).service.ip_version", "4"); | 
						|
+    } else { | 
						|
+         /* bail out */ | 
						|
+        idmef_message_destroy(idmef); | 
						|
+        return; | 
						|
+    } | 
						|
+ | 
						|
+    /* alert.source(0).node.address(0) (ip address) */ | 
						|
+    if(cn->reversed==CNX_REVERSED){ | 
						|
+        snprintf_inaddr_toa(LOG,MAXENTRYLEN,(struct in_addr*) &cn->d_ip,'\0'); | 
						|
+    }else{       | 
						|
+        snprintf_inaddr_toa(LOG,MAXENTRYLEN,(struct in_addr*) &cn->s_ip,'\0'); | 
						|
+    } | 
						|
+    add_idmef_object(idmef, "alert.source(0).node.address(0).category",  | 
						|
+        "ipv4-addr"); | 
						|
+    add_idmef_object(idmef, "alert.source(0).node.address(0).address", LOG); | 
						|
+ | 
						|
+    /* alert.source(0).node.address(1) (mac address) */ | 
						|
+    add_idmef_object(idmef, "alert.source(0).node.address(1).category", "mac"); | 
						|
+    { | 
						|
+        struct myether_addr *es=(struct myether_addr *)&cn->eth_hdr.ether_shost; | 
						|
+        snprintf(LOG,MAXENTRYLEN,"%0x:%0x:%0x:%0x:%0x:%0x",es->octet[0],es->octet[1],es->octet[2],es->octet[3],es->octet[4],es->octet[5]); | 
						|
+    } | 
						|
+    add_idmef_object(idmef, "alert.source(0).node.address(1).address", LOG); | 
						|
+ | 
						|
+    protoent = getprotobynumber(cn->proto); | 
						|
+ | 
						|
+    /* alert.source(0).iana_protocol_number */ | 
						|
+    snprintf(LOG,MAXENTRYLEN,"%u",(cn->proto)); | 
						|
+    add_idmef_object(idmef, "alert.source(0).service.iana_protocol_number", LOG); | 
						|
+ | 
						|
+    /* alert.target(0).iana_protocol_number */ | 
						|
+    add_idmef_object(idmef, "alert.target(0).service.iana_protocol_number", LOG); | 
						|
+ | 
						|
+ | 
						|
+    if (protoent) { | 
						|
+    /* alert.source(0).iana_protocol_name */ | 
						|
+        add_idmef_object(idmef, "alert.source(0).service.iana_protocol_name", | 
						|
+            protoent->p_name); | 
						|
+ | 
						|
+    /* alert.target(0).iana_protocol_name */ | 
						|
+        add_idmef_object(idmef, "alert.target(0).service.iana_protocol_name", | 
						|
+            protoent->p_name); | 
						|
+ | 
						|
+    /* alert.source(0).service */ | 
						|
+        setservent(1); | 
						|
+        if(cn->reversed==CNX_REVERSED){ | 
						|
+            snprintf(LOG,MAXENTRYLEN,"%u",ntohs(cn->d_port)); | 
						|
+            sourceservent = getservbyport(ntohs(cn->d_port), protoent->p_name);  | 
						|
+        }else{ | 
						|
+            snprintf(LOG,MAXENTRYLEN,"%u",ntohs(cn->s_port)); | 
						|
+            sourceservent = getservbyport(ntohs(cn->s_port), protoent->p_name);  | 
						|
+        } | 
						|
+ | 
						|
+        if (sourceservent && sourceservent->s_name)  | 
						|
+            add_idmef_object(idmef, "alert.source(0).service.name", | 
						|
+             sourceservent->s_name ); | 
						|
+        add_idmef_object(idmef, "alert.source(0).service.port", | 
						|
+            LOG); | 
						|
+        add_idmef_object(idmef, "alert.source(0).service.protocol", | 
						|
+            protoent->p_name); | 
						|
+ | 
						|
+    /* alert.target(0).service */ | 
						|
+        if(cn->reversed==CNX_REVERSED){ | 
						|
+            snprintf(LOG,MAXENTRYLEN,"%u",ntohs(cn->s_port)); | 
						|
+            sourceservent = getservbyport(ntohs(cn->s_port), protoent->p_name);  | 
						|
+        }else{ | 
						|
+            snprintf(LOG,MAXENTRYLEN,"%u",ntohs(cn->d_port)); | 
						|
+            sourceservent = getservbyport(ntohs(cn->d_port), protoent->p_name);  | 
						|
+        } | 
						|
+ | 
						|
+        if (sourceservent && sourceservent->s_name)  | 
						|
+            add_idmef_object(idmef, "alert.target(0).service.name", | 
						|
+             sourceservent->s_name ); | 
						|
+        add_idmef_object(idmef, "alert.target(0).service.port", | 
						|
+            LOG); | 
						|
+        add_idmef_object(idmef, "alert.target(0).service.protocol", | 
						|
+            protoent->p_name); | 
						|
+    }    | 
						|
+/* | 
						|
+*/ | 
						|
+ | 
						|
+    /* alert.target(0).node.address(0) (ip address) */ | 
						|
+    if(cn->reversed==CNX_REVERSED){ | 
						|
+        snprintf_inaddr_toa(LOG,MAXENTRYLEN,(struct in_addr*) &cn->s_ip,'\0'); | 
						|
+    }else{       | 
						|
+        snprintf_inaddr_toa(LOG,MAXENTRYLEN,(struct in_addr*) &cn->d_ip,'\0'); | 
						|
+    } | 
						|
+    add_idmef_object(idmef, "alert.target(0).node.address(0).category",  | 
						|
+        "ipv4-addr"); | 
						|
+    add_idmef_object(idmef, "alert.target(0).node.address(0).address", LOG); | 
						|
+ | 
						|
+    /* alert.target(0).node_address(1) (mac address) */ | 
						|
+    add_idmef_object(idmef, "alert.target(0).node.address(1).category", "mac"); | 
						|
+    { | 
						|
+        struct myether_addr *es=(struct myether_addr *)&cn->eth_hdr.ether_dhost; | 
						|
+        snprintf(LOG,MAXENTRYLEN,"%0x:%0x:%0x:%0x:%0x:%0x",es->octet[0],es->octet[1],es->octet[2],es->octet[3],es->octet[4],es->octet[5]); | 
						|
+    } | 
						|
+    add_idmef_object(idmef, "alert.target(0).node.address(1).address", LOG); | 
						|
+ | 
						|
+    prelude_client_send_idmef(client, idmef);  | 
						|
+    idmef_message_destroy(idmef); | 
						|
+} | 
						|
+ | 
						|
  | 
						|
 void record(struct cnx *cn, outputFileHandle *fH)  | 
						|
 { | 
						|
@@ -199,8 +401,15 @@ | 
						|
  | 
						|
 	char eor=fH->getEor(); | 
						|
      | 
						|
+    /* do we want prelude alert generation for this record? */ | 
						|
+ | 
						|
     bzero(LOG,MAXENTRYLEN); | 
						|
  | 
						|
+    if (fH == gVars.sfH) { | 
						|
+        record_prelude(cn); | 
						|
+    } | 
						|
+ | 
						|
+ | 
						|
  | 
						|
 /* | 
						|
  * Structure of a 48-bit Ethernet address.
 | 
						|
 |