📄 spp_sfportscan.c
字号:
case PS_PROTO_ICMP: case PS_PROTO_IP: if(MakeProtoInfo(proto, g_tmp_pkt->data, &ip_size)) return -1; break; case PS_PROTO_OPEN_PORT: if(MakeOpenPortInfo(proto, g_tmp_pkt->data, &ip_size, user)) return -1; break; default: return -1; } /* ** Let's finish up the IP header and checksum. */ g_tmp_pkt->iph->ip_len = htons((short)ip_size); g_tmp_pkt->iph->ip_csum = 0; g_tmp_pkt->iph->ip_csum = in_chksum_ip((u_short *)g_tmp_pkt->iph, (IP_HLEN(g_tmp_pkt->iph)<<2)); /* ** And we set the pcap headers correctly so they decode. */ g_tmp_pkt->pkth->caplen = ip_size + ETHERNET_HEADER_LEN; g_tmp_pkt->pkth->len = ip_size + ETHERNET_HEADER_LEN; return 0;}static int PortscanAlertTcp(Packet *p, PS_PROTO *proto, int proto_type){ int iCtr; unsigned int event_ref; int portsweep = 0; if(!proto) return -1; switch(proto->alerts) { case PS_ALERT_ONE_TO_ONE: event_ref = GeneratePSSnortEvent(p, GENERATOR_PSNG, PSNG_TCP_PORTSCAN, 0, 0, 3, PSNG_TCP_PORTSCAN_STR); break; case PS_ALERT_ONE_TO_ONE_DECOY: event_ref = GeneratePSSnortEvent(p,GENERATOR_PSNG, PSNG_TCP_DECOY_PORTSCAN,0,0,3,PSNG_TCP_DECOY_PORTSCAN_STR); break; case PS_ALERT_PORTSWEEP: event_ref = GeneratePSSnortEvent(p,GENERATOR_PSNG, PSNG_TCP_PORTSWEEP, 0, 0, 3, PSNG_TCP_PORTSWEEP_STR); portsweep = 1; break; case PS_ALERT_DISTRIBUTED: event_ref = GeneratePSSnortEvent(p,GENERATOR_PSNG, PSNG_TCP_DISTRIBUTED_PORTSCAN, 0, 0, 3, PSNG_TCP_DISTRIBUTED_PORTSCAN_STR); break; case PS_ALERT_ONE_TO_ONE_FILTERED: event_ref = GeneratePSSnortEvent(p,GENERATOR_PSNG, PSNG_TCP_FILTERED_PORTSCAN,0,0,3, PSNG_TCP_FILTERED_PORTSCAN_STR); break; case PS_ALERT_ONE_TO_ONE_DECOY_FILTERED: event_ref = GeneratePSSnortEvent(p,GENERATOR_PSNG, PSNG_TCP_FILTERED_DECOY_PORTSCAN, 0,0,3, PSNG_TCP_FILTERED_DECOY_PORTSCAN_STR); break; case PS_ALERT_PORTSWEEP_FILTERED: event_ref = GeneratePSSnortEvent(p,GENERATOR_PSNG, PSNG_TCP_PORTSWEEP_FILTERED,0,0,3, PSNG_TCP_PORTSWEEP_FILTERED_STR); portsweep = 1; return 0; case PS_ALERT_DISTRIBUTED_FILTERED: event_ref = GeneratePSSnortEvent(p,GENERATOR_PSNG, PSNG_TCP_FILTERED_DISTRIBUTED_PORTSCAN, 0, 0, 3, PSNG_TCP_FILTERED_DISTRIBUTED_PORTSCAN_STR); break; default: return 0; } /* ** Set the current event reference information for any open ports. */ proto->event_ref = event_ref; proto->event_time.tv_sec = p->pkth->ts.tv_sec; proto->event_time.tv_usec = p->pkth->ts.tv_usec; /* ** Only log open ports for portsweeps after the alert has been ** generated. */ if(proto->open_ports_cnt && !portsweep) { for(iCtr = 0; iCtr < proto->open_ports_cnt; iCtr++) { PS_PKT ps_pkt; memset(&ps_pkt, 0x00, sizeof(PS_PKT)); ps_pkt.pkt = (void *)p; if(MakePortscanPkt(&ps_pkt, proto, PS_PROTO_OPEN_PORT, (void *)&proto->open_ports[iCtr])) return -1; g_tmp_pkt->pkth->ts.tv_usec += 1; GenerateOpenPortEvent(g_tmp_pkt,GENERATOR_PSNG,PSNG_OPEN_PORT, 0,0,3, proto->event_ref, &proto->event_time, PSNG_OPEN_PORT_STR); } } return 0;}static int PortscanAlertUdp(Packet *p, PS_PROTO *proto, int proto_type){ if(!proto) return -1; switch(proto->alerts) { case PS_ALERT_ONE_TO_ONE: GeneratePSSnortEvent(p, GENERATOR_PSNG, PSNG_UDP_PORTSCAN, 0, 0, 3, PSNG_UDP_PORTSCAN_STR); break; case PS_ALERT_ONE_TO_ONE_DECOY: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_UDP_DECOY_PORTSCAN, 0, 0, 3, PSNG_UDP_DECOY_PORTSCAN_STR); break; case PS_ALERT_PORTSWEEP: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_UDP_PORTSWEEP, 0, 0, 3, PSNG_UDP_PORTSWEEP_STR); break; case PS_ALERT_DISTRIBUTED: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_UDP_DISTRIBUTED_PORTSCAN, 0, 0, 3, PSNG_UDP_DISTRIBUTED_PORTSCAN_STR); break; case PS_ALERT_ONE_TO_ONE_FILTERED: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_UDP_FILTERED_PORTSCAN,0,0,3, PSNG_UDP_FILTERED_PORTSCAN_STR); break; case PS_ALERT_ONE_TO_ONE_DECOY_FILTERED: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_UDP_FILTERED_DECOY_PORTSCAN, 0,0,3, PSNG_UDP_FILTERED_DECOY_PORTSCAN_STR); break; case PS_ALERT_PORTSWEEP_FILTERED: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_UDP_PORTSWEEP_FILTERED,0,0,3, PSNG_UDP_PORTSWEEP_FILTERED_STR); break; case PS_ALERT_DISTRIBUTED_FILTERED: GeneratePSSnortEvent(p,GENERATOR_PSNG, PSNG_UDP_FILTERED_DISTRIBUTED_PORTSCAN, 0, 0, 3, PSNG_UDP_FILTERED_DISTRIBUTED_PORTSCAN_STR); break; default: break; } return 0;}static int PortscanAlertIp(Packet *p, PS_PROTO *proto, int proto_type){ if(!proto) return -1; switch(proto->alerts) { case PS_ALERT_ONE_TO_ONE: GeneratePSSnortEvent(p, GENERATOR_PSNG, PSNG_IP_PORTSCAN, 0, 0, 3, PSNG_IP_PORTSCAN_STR); break; case PS_ALERT_ONE_TO_ONE_DECOY: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_IP_DECOY_PORTSCAN, 0, 0, 3, PSNG_IP_DECOY_PORTSCAN_STR); break; case PS_ALERT_PORTSWEEP: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_IP_PORTSWEEP, 0, 0, 3, PSNG_IP_PORTSWEEP_STR); break; case PS_ALERT_DISTRIBUTED: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_IP_DISTRIBUTED_PORTSCAN, 0, 0, 3, PSNG_IP_DISTRIBUTED_PORTSCAN_STR); break; case PS_ALERT_ONE_TO_ONE_FILTERED: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_IP_FILTERED_PORTSCAN,0,0,3, PSNG_IP_FILTERED_PORTSCAN_STR); break; case PS_ALERT_ONE_TO_ONE_DECOY_FILTERED: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_IP_FILTERED_DECOY_PORTSCAN, 0,0,3, PSNG_IP_FILTERED_DECOY_PORTSCAN_STR); break; case PS_ALERT_PORTSWEEP_FILTERED: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_IP_PORTSWEEP_FILTERED,0,0,3, PSNG_IP_PORTSWEEP_FILTERED_STR); break; case PS_ALERT_DISTRIBUTED_FILTERED: GeneratePSSnortEvent(p,GENERATOR_PSNG, PSNG_IP_FILTERED_DISTRIBUTED_PORTSCAN, 0, 0, 3, PSNG_IP_FILTERED_DISTRIBUTED_PORTSCAN_STR); break; default: break; } return 0;}static int PortscanAlertIcmp(Packet *p, PS_PROTO *proto, int proto_type){ if(!proto) return -1; switch(proto->alerts) { case PS_ALERT_PORTSWEEP: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_ICMP_PORTSWEEP, 0, 0, 3, PSNG_ICMP_PORTSWEEP_STR); break; case PS_ALERT_PORTSWEEP_FILTERED: GeneratePSSnortEvent(p,GENERATOR_PSNG,PSNG_ICMP_PORTSWEEP_FILTERED,0,0,3, PSNG_ICMP_PORTSWEEP_FILTERED_STR); break; default: break; } return 0;}static int PortscanAlert(PS_PKT *ps_pkt, PS_PROTO *proto, int proto_type){ Packet *p; if(!ps_pkt || !ps_pkt->pkt) return -1; p = (Packet *)ps_pkt->pkt; if(proto->alerts == PS_ALERT_OPEN_PORT) { if(MakePortscanPkt(ps_pkt, proto, PS_PROTO_OPEN_PORT, (void *)&p->sp)) return -1; GenerateOpenPortEvent(g_tmp_pkt,GENERATOR_PSNG,PSNG_OPEN_PORT,0,0,3, proto->event_ref, &proto->event_time, PSNG_OPEN_PORT_STR); } else { if(MakePortscanPkt(ps_pkt, proto, proto_type, NULL)) return -1; switch(proto_type) { case PS_PROTO_TCP: PortscanAlertTcp(g_tmp_pkt, proto, proto_type); break; case PS_PROTO_UDP: PortscanAlertUdp(g_tmp_pkt, proto, proto_type); break; case PS_PROTO_ICMP: PortscanAlertIcmp(g_tmp_pkt, proto, proto_type); break; case PS_PROTO_IP: PortscanAlertIp(g_tmp_pkt, proto, proto_type); break; } } return 0;}static void PortscanDetect(Packet *p, void *context){ PS_PKT ps_pkt; if(!p || !p->iph || (p->packet_flags & PKT_REBUILT_STREAM)) return; if(!(p->preprocessors & PP_SFPORTSCAN)) { return; } memset(&ps_pkt, 0x00, sizeof(PS_PKT)); ps_pkt.pkt = (void *)p; ps_detect(&ps_pkt); if(ps_pkt.scanner && ps_pkt.scanner->proto[ps_pkt.proto_idx].alerts && (ps_pkt.scanner->proto[ps_pkt.proto_idx].alerts != PS_ALERT_GENERATED)) { PortscanAlert(&ps_pkt, &ps_pkt.scanner->proto[ps_pkt.proto_idx], ps_pkt.proto); } if(ps_pkt.scanned && ps_pkt.scanned->proto[ps_pkt.proto_idx].alerts && (ps_pkt.scanned->proto[ps_pkt.proto_idx].alerts != PS_ALERT_GENERATED)) { PortscanAlert(&ps_pkt, &ps_pkt.scanned->proto[ps_pkt.proto_idx], ps_pkt.proto); } return;}static void FatalErrorNoOption(u_char *option){ FatalError("%s(%d) => No argument to '%s' config option.\n", file_name, file_line, option); return;}static void FatalErrorNoEnd(char *option){ FatalError("%s(%d) => No ending brace to '%s' config option.\n", file_name, file_line, option);}static void FatalErrorInvalidArg(char *option){ FatalError("%s(%d) => Invalid argument to '%s' config option.\n", file_name, file_line, option);}static void FatalErrorInvalidOption(char *option){ FatalError("%s(%d) => Invalid option '%s' to portscan preprocessor.\n", file_name, file_line, option);}static void ParseProtos(int *protos){ char *pcTok; if(!protos) return; *protos = 0; pcTok = strtok(NULL, DELIMITERS); while(pcTok) { if(!strcasecmp(pcTok, "tcp")) *protos |= PS_PROTO_TCP; else if(!strcasecmp(pcTok, "udp")) *protos |= PS_PROTO_UDP; else if(!strcasecmp(pcTok, "icmp")) *protos |= PS_PROTO_ICMP; else if(!strcasecmp(pcTok, "ip")) *protos |= PS_PROTO_IP; else if(!strcasecmp(pcTok, "all")) *protos = PS_PROTO_ALL; else if(!strcasecmp(pcTok, TOKEN_ARG_END)) return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -