This blob has been accessed 2,826 times via Git panel.
- #include "kalasag.h"
- #include "kalasag_io.h"
- #include "kalasag_util.h"
- /* Global variables */
- char gblScanDetectHost[MAXSTATE][IPMAXBUF];
- char gblKillRoute[MAXBUF];
- char gblKillHostsDeny[MAXBUF];
- char gblKillRunCmd[MAXBUF];
- char gblBlockedFile[MAXBUF];
- char gblHistoryFile[MAXBUF];
- char gblIgnoreFile[MAXBUF];
- char gblDetectionType[MAXBUF];
- int gblScanDetectCount = 0;
- int gblBlockTCP = 0;
- int gblBlockUDP = 0;
- int gblRunCmdFirst = 0;
- int gblResolveHost = 0;
- int gblConfigTriggerCount = 0;
- int main(int argc, char *argv[])
- {
- if (argc != 2) {
- Usage();
- Exit(ERROR);
- }
- if ((geteuid()) && (getuid()) != 0) {
- Exit(ERROR);
- }
- /* Cheesy arg parser. Some systems don't support getopt and I don't want to port it. */
- Usage();
- Exit(ERROR);
- } else {
- Start();
- /* This copies the startup type to a global for later use */
- if ((SafeStrncpy
- == NULL) {
- Log("adminalert: ERROR: Error setting internal scan detection type.\n");
- Exit(ERROR);
- } else if (CheckConfig() == FALSE) {
- Log("adminalert: ERROR: Configuration files are missing/corrupted. Shutting down.\n");
- ("ERROR: Check your syslog for a more detailed error message.\n");
- Exit(ERROR);
- } else if (InitConfig() == FALSE) {
- Log("adminalert: ERROR: Your config file is corrupted/missing mandatory option! Shutting down.\n");
- ("ERROR: Your config file is corrupted/missing mandatory option!\n");
- ("ERROR: Check your syslog for a more detailed error message.\n");
- Exit(ERROR);
- }
- #ifndef NODAEMON
- else if (DaemonSeed() == ERROR) {
- Log("adminalert: ERROR: could not go into daemon mode. Shutting down.\n");
- ("ERROR: could not go into daemon mode. Shutting down.\n");
- Exit(ERROR);
- }
- #endif
- }
- if (KalasagModeTCP() == ERROR) {
- Log("adminalert: ERROR: could not go into Kalasag mode. Shutting down.\n");
- Exit(ERROR);
- }
- }
- #ifdef SUPPORT_STEALTH
- if (KalasagStealthModeTCP() == ERROR) {
- Log("adminalert: ERROR: could not go into Kalasag mode. Shutting down.\n");
- Exit(ERROR);
- }
- if (KalasagAdvancedStealthModeTCP() == ERROR) {
- Log("adminalert: ERROR: could not go into Kalasag mode. Shutting down.\n");
- Exit(ERROR);
- }
- if (KalasagStealthModeUDP() == ERROR) {
- Log("adminalert: ERROR: could not go into Kalasag mode. Shutting down.\n");
- Exit(ERROR);
- }
- if (KalasagAdvancedStealthModeUDP() == ERROR) {
- Log("adminalert: ERROR: could not go into Kalasag mode. Shutting down.\n");
- Exit(ERROR);
- }
- }
- #endif
- if (KalasagModeUDP() == ERROR) {
- Log("adminalert: ERROR: could not go into Kalasag mode. Shutting down.\n");
- Exit(ERROR);
- }
- }
- Exit(TRUE);
- /* shuts up compiler warning */
- return (0);
- }
- /****************************************************************/
- /* Reads generic config options into global variables */
- /****************************************************************/
- int InitConfig(void)
- {
- FILE *input;
- char configToken[MAXBUF];
- gblBlockTCP = CheckFlag("BLOCK_TCP");
- gblBlockUDP = CheckFlag("BLOCK_UDP");
- gblResolveHost = CheckFlag("RESOLVE_HOST");
- if ((ConfigTokenRetrieve("SCAN_TRIGGER", configToken)) == FALSE) {
- Log("adminalert: ERROR: Could not read SCAN_TRIGGER option from config file. Disabling SCAN DETECTION TRIGGER");
- gblConfigTriggerCount = 0;
- } else {
- #ifdef DEBUG
- Log("debug: InitConfig: retrieved SCAN_TRIGGER option: %s \n",
- configToken);
- #endif
- }
- if ((ConfigTokenRetrieve("KILL_ROUTE", gblKillRoute)) == TRUE) {
- #ifdef DEBUG
- Log("debug: InitConfig: retrieved KILL_ROUTE option: %s \n",
- gblKillRoute);
- #endif
- } else {
- #ifdef DEBUG
- Log("debug: InitConfig: KILL_ROUTE option NOT FOUND.\n");
- #endif
- }
- if ((ConfigTokenRetrieve("KILL_HOSTS_DENY", gblKillHostsDeny)) == TRUE) {
- #ifdef DEBUG
- Log("debug: InitConfig: retrieved KILL_HOSTS_DENY option: %s \n",
- gblKillHostsDeny);
- #endif
- } else {
- #ifdef DEBUG
- Log("debug: InitConfig: KILL_HOSTS_DENY option NOT FOUND.\n");
- #endif
- }
- if ((ConfigTokenRetrieve("KILL_RUN_CMD", gblKillRunCmd)) == TRUE) {
- #ifdef DEBUG
- Log("debug: InitConfig: retrieved KILL_RUN_CMD option: %s \n",
- gblKillRunCmd);
- #endif
- /* Check the order we should run the KILL_RUN_CMD */
- /* Default is to run the command after blocking */
- gblRunCmdFirst = CheckFlag("KILL_RUN_CMD_FIRST");
- } else {
- #ifdef DEBUG
- Log("debug: InitConfig: KILL_RUN_CMD option NOT FOUND.\n");
- #endif
- }
- if ((ConfigTokenRetrieve("BLOCKED_FILE", gblBlockedFile)) == TRUE) {
- } else {
- Log("adminalert: ERROR: Blocked filename is too long to append detection type file extension: %s.\n", gblBlockedFile);
- return (FALSE);
- }
- #ifdef DEBUG
- Log("debug: InitConfig: retrieved BLOCKED_FILE option: %s \n",
- gblBlockedFile);
- Log("debug: CheckConfig: Removing old block file: %s \n",
- gblBlockedFile);
- #endif
- Log("adminalert: ERROR: Cannot delete blocked file on startup: %s.\n", gblBlockedFile);
- return (FALSE);
- } else
- } else {
- Log("InitConfig: Cannot retrieve BLOCKED_FILE option! Aborting\n");
- return (FALSE);
- }
- if ((ConfigTokenRetrieve("HISTORY_FILE", gblHistoryFile)) == TRUE) {
- #ifdef DEBUG
- Log("debug: InitConfig: retrieved HISTORY_FILE option: %s \n",
- gblHistoryFile);
- #endif
- } else {
- Log("InitConfig: Cannot retrieve HISTORY_FILE option! Aborting\n");
- return (FALSE);
- }
- if ((ConfigTokenRetrieve("IGNORE_FILE", gblIgnoreFile)) == TRUE) {
- #ifdef DEBUG
- Log("debug: InitConfig: retrieved IGNORE_FILE option: %s \n",
- gblIgnoreFile);
- #endif
- } else {
- Log("InitConfig: Cannot retrieve IGNORE_FILE option! Aborting\n");
- return (FALSE);
- }
- return (TRUE);
- }
- #ifdef SUPPORT_STEALTH
- /* Read in a TCP packet taking into account IP options and other */
- /* errors */
- int PacketReadTCP(int socket, struct iphdr *ipPtr, struct tcphdr *tcpPtr)
- {
- char packetBuffer[TCPPACKETLEN];
- struct in_addr addr;
- bzero(ipPtr, sizeof(struct iphdr));
- bzero(tcpPtr, sizeof(struct tcphdr));
- if (read(socket, packetBuffer, TCPPACKETLEN) == ERROR)
- return (ERROR);
- if ((ipPtr->ihl < 5) || (ipPtr->ihl > 15)) {
- addr.s_addr = (u_int) ipPtr->saddr;
- Log("attackalert: Illegal IP header length detected in TCP packet: %d from (possible) host: %s\n", ipPtr->ihl, inet_ntoa(addr));
- return (FALSE);
- } else {
- (struct tcphdr *) (packetBuffer + ((ipPtr->ihl) * 4)),
- sizeof(struct tcphdr));
- return (TRUE);
- }
- }
- /* Read in a UDP packet taking into account IP options and other */
- /* errors */
- int PacketReadUDP(int socket, struct iphdr *ipPtr, struct udphdr *udpPtr)
- {
- char packetBuffer[UDPPACKETLEN];
- struct in_addr addr;
- bzero(ipPtr, sizeof(struct iphdr));
- bzero(udpPtr, sizeof(struct udphdr));
- if (read(socket, packetBuffer, UDPPACKETLEN) == ERROR)
- return (ERROR);
- if ((ipPtr->ihl < 5) || (ipPtr->ihl > 15)) {
- addr.s_addr = (u_int) ipPtr->saddr;
- Log("attackalert: Illegal IP header length detected in UDP packet: %d from (possible) host: %s\n", ipPtr->ihl, inet_ntoa(addr));
- return (FALSE);
- } else {
- (struct udphdr *) (packetBuffer + ((ipPtr->ihl) * 4)),
- sizeof(struct udphdr));
- return (TRUE);
- }
- }
- /****************************************************************/
- /* Stealth scan detection Mode One */
- /* */
- /* This mode will read in a list of ports to monitor and will */
- /* then open a raw socket to look for packets matching the port. */
- /* */
- /****************************************************************/
- int KalasagStealthModeTCP(void)
- {
- struct sockaddr_in client, server;
- int portCount = 0, portCount2 = 0, ports[MAXSOCKS], ports2[MAXSOCKS];
- int count = 0, scanDetectTrigger = TRUE, gotBound = FALSE, result =
- TRUE;
- int openSockfd = 0, incomingPort = 0;
- char *temp, target[IPMAXBUF], configToken[MAXBUF];
- char resolvedHost[DNSMAXBUF], *packetType;
- struct in_addr addr;
- struct iphdr ip;
- struct tcphdr tcp;
- if ((ConfigTokenRetrieve("TCP_PORTS", configToken)) == FALSE) {
- Log("adminalert: ERROR: Could not read TCP_PORTS option from config file");
- return (ERROR);
- }
- /* break out the ports */
- for (count = 1; count < MAXSOCKS; count++) {
- else
- break;
- }
- portCount = count;
- } else {
- Log("adminalert: ERROR: No TCP ports supplied in config file. Aborting");
- return (ERROR);
- }
- /* ok, now check if they have a network daemon on the socket already, if they do */
- /* then skip that port because it will cause false alarms */
- for (count = 0; count < portCount; count++) {
- Log("adminalert: Going into stealth listen mode on TCP port: %d\n",
- ports[count]);
- if ((openSockfd = OpenTCPSocket()) == ERROR) {
- Log("adminalert: ERROR: could not open TCP socket. Aborting.\n");
- return (ERROR);
- }
- if (BindSocket(openSockfd, client, server, ports[count]) == ERROR)
- Log("adminalert: ERROR: Socket %d is in use and will not be monitored. Attempting to continue\n", ports[count]);
- else { /* well we at least bound to one socket so we'll continue */
- gotBound = TRUE;
- ports2[portCount2++] = ports[count];
- }
- close(openSockfd);
- }
- /* if we didn't bind to anything then abort */
- if (gotBound == FALSE) {
- Log("adminalert: ERROR: All supplied TCP sockets are in use and will not be listened to. Shutting down.\n");
- return (ERROR);
- }
- /* Open our raw socket for network IO */
- if ((openSockfd = OpenRAWTCPSocket()) == ERROR) {
- Log("adminalert: ERROR: could not open RAW TCP socket. Aborting.\n");
- return (ERROR);
- }
- Log("adminalert: Kalasag is now active and listening.\n");
- /* main detection loop */
- for (;;) {
- if (PacketReadTCP(openSockfd, &ip, &tcp) != TRUE)
- continue;
- incomingPort = ntohs(tcp.dest);
- /* check for an ACK/RST to weed out established connections in case the user */
- /* is monitoring high ephemeral port numbers */
- if ((tcp.ack != 1) && (tcp.rst != 1)) {
- /* this iterates the list of ports looking for a match */
- for (count = 0; count < portCount; count++) {
- if (incomingPort == ports2[count]) {
- if (SmartVerifyTCP(client, server, incomingPort) ==
- TRUE)
- break;
- /* copy the clients address into our buffer for nuking */
- addr.s_addr = (u_int) ip.saddr;
- SafeStrncpy(target, (char *) inet_ntoa(addr),
- IPMAXBUF);
- /* check if we should ignore this IP */
- result = NeverBlock(target, gblIgnoreFile);
- if (result == ERROR) {
- Log("attackalert: ERROR: cannot open ignore file. Blocking host anyway.\n");
- result = FALSE;
- }
- if (result == FALSE) {
- /* check if they've visited before */
- scanDetectTrigger = CheckStateEngine(target);
- if (scanDetectTrigger == TRUE) {
- if (gblResolveHost) { /* Do they want DNS resolution? */
- if (CleanAndResolve(resolvedHost, target)
- != TRUE) {
- Log("attackalert: ERROR: Error resolving host. \
- resolving disabled for this host.\n");
- target);
- }
- } else {
- target);
- }
- packetType = ReportPacketType(tcp);
- Log("attackalert: %s from host: %s/%s to TCP port: %d", packetType, resolvedHost, target, ports2[count]);
- /* Report on options present */
- if (ip.ihl > 5)
- Log("attackalert: Packet from host: %s/%s to TCP port: %d has IP options set (detection avoidance technique).", resolvedHost, target, ports2[count]);
- /* check if this target is already blocked */
- if (IsBlocked(target, gblBlockedFile) == FALSE) {
- /* toast the prick */
- if (DisposeTCP(target, ports2[count]) !=
- TRUE)
- Log("attackalert: ERROR: Could not block host %s/%s !!", resolvedHost, target);
- else
- WriteBlocked(target, resolvedHost,
- ports2[count],
- gblBlockedFile,
- gblHistoryFile, "TCP");
- } /* end IsBlocked check */
- else
- Log("attackalert: Host: %s/%s is already blocked Ignoring", resolvedHost, target);
- } /* end if(scanDetectTrigger) */
- } /* end if(never block) check */
- break; /* get out of for(count) loop above */
- } /* end if(incoming port) == protected port */
- } /* end for( check for protected port loop ) loop */
- } /* end if(TH_ACK) check */
- } /* end for( ; ; ) loop */
- } /* end KalasagStealthModeTCP */
- /****************************************************************/
- /* Advanced Stealth scan detection Mode One */
- /* */
- /* This mode will see what ports are listening below 1024 */
- /* and will then monitor all the rest. This is very sensitive */
- /* and will react on any packet hitting any monitored port, */
- /* regardless of TCP flags set */
- /* */
- /****************************************************************/
- int KalasagAdvancedStealthModeTCP(void)
- {
- struct sockaddr_in client, server;
- int result = TRUE, scanDetectTrigger = TRUE, hotPort = TRUE;
- int openSockfd = 0, incomingPort = 0, smartVerify = FALSE;
- unsigned int advancedPorts = 1024;
- unsigned int count = 0, inUsePorts[MAXSOCKS], portCount = 0;
- char target[IPMAXBUF], configToken[MAXBUF];
- char resolvedHost[DNSMAXBUF], *temp, *packetType;
- struct in_addr addr;
- struct iphdr ip;
- struct tcphdr tcp;
- if ((ConfigTokenRetrieve("ADVANCED_PORTS_TCP", configToken)) == FALSE) {
- Log("adminalert: ERROR: Could not read ADVANCED_PORTS_TCP option from config file. Assuming 1024.");
- advancedPorts = 1024;
- } else
- Log("adminalert: Advanced mode will monitor first %d ports",
- advancedPorts);
- /* try to bind to all ports below 1024, any that are taken we exclude later */
- for (count = 0; count < advancedPorts; count++) {
- if ((openSockfd = OpenTCPSocket()) == ERROR) {
- Log("adminalert: ERROR: could not open TCP socket. Aborting.\n");
- return (ERROR);
- }
- if (BindSocket(openSockfd, client, server, count) == ERROR)
- inUsePorts[portCount++] = count;
- close(openSockfd);
- }
- if ((ConfigTokenRetrieve("ADVANCED_EXCLUDE_TCP", configToken)) !=
- FALSE) {
- /* break out the ports */
- Log("adminalert: Advanced mode will manually exclude port: %d ", inUsePorts[portCount - 1]);
- for (count = 0; count < MAXSOCKS; count++) {
- Log("adminalert: Advanced mode will manually exclude port: %d ", inUsePorts[portCount - 1]);
- } else
- break;
- }
- }
- } else
- Log("adminalert: Advanced mode will manually exclude no ports");
- for (count = 0; count < portCount; count++)
- Log("adminalert: Advanced Stealth scan detection mode activated. Ignored TCP port: %d\n", inUsePorts[count]);
- /* open raw socket for reading */
- if ((openSockfd = OpenRAWTCPSocket()) == ERROR) {
- Log("adminalert: ERROR: could not open RAW TCP socket. Aborting.\n");
- return (ERROR);
- }
- Log("adminalert: Kalasag is now active and listening.\n");
- /* main detection loop */
- for (;;) {
- if (PacketReadTCP(openSockfd, &ip, &tcp) != TRUE)
- continue;
- incomingPort = ntohs(tcp.dest);
- /* don't monitor packets with ACK set (established) or RST */
- /* This could be a hole in some cases */
- if ((tcp.ack != 1) && (tcp.rst != 1)) {
- /* check if we should ignore this connection to this port */
- for (count = 0; count < portCount; count++) {
- if ((incomingPort == inUsePorts[count])
- || (incomingPort >= advancedPorts)) {
- hotPort = FALSE;
- break;
- } else
- hotPort = TRUE;
- }
- if (hotPort) {
- smartVerify = SmartVerifyTCP(client, server, incomingPort);
- if (smartVerify != TRUE) {
- addr.s_addr = (u_int) ip.saddr;
- SafeStrncpy(target, (char *) inet_ntoa(addr),
- IPMAXBUF);
- /* check if we should ignore this IP */
- result = NeverBlock(target, gblIgnoreFile);
- if (result == ERROR) {
- Log("attackalert: ERROR: cannot open ignore file. Blocking host anyway.\n");
- result = FALSE;
- }
- if (result == FALSE) {
- /* check if they've visited before */
- scanDetectTrigger = CheckStateEngine(target);
- if (scanDetectTrigger == TRUE) {
- if (gblResolveHost) { /* Do they want DNS resolution? */
- if (CleanAndResolve(resolvedHost, target)
- != TRUE) {
- Log("attackalert: ERROR: Error resolving host. \
- resolving disabled for this host.\n");
- target);
- }
- } else {
- target);
- }
- packetType = ReportPacketType(tcp);
- Log("attackalert: %s from host: %s/%s to TCP port: %d", packetType, resolvedHost, target, incomingPort);
- /* Report on options present */
- if (ip.ihl > 5)
- Log("attackalert: Packet from host: %s/%s to TCP port: %d has IP options set (detection avoidance technique).", resolvedHost, target, incomingPort);
- /* check if this target is already blocked */
- if (IsBlocked(target, gblBlockedFile) == FALSE) {
- /* toast the prick */
- if (DisposeTCP(target, incomingPort) !=
- TRUE)
- Log("attackalert: ERROR: Could not block host %s/%s!!", resolvedHost, target);
- else
- WriteBlocked(target, resolvedHost,
- incomingPort,
- gblBlockedFile,
- gblHistoryFile, "TCP");
- } /* end IsBlocked check */
- else
- Log("attackalert: Host: %s/%s is already blocked Ignoring", resolvedHost, target);
- } /* end if(scanDetectTrigger) */
- } /* end if(never block) check */
- } /* end if(smartVerify) */
- } /* end if(hotPort) */
- } /* end if(TH_ACK) */
- } /* end for( ; ; ) loop */
- }
- /* end KalasagAdvancedStealthModeTCP */
- /****************************************************************/
- /* UDP "stealth" scan detection */
- /* */
- /* This mode will read in a list of ports to monitor and will */
- /* then open a raw socket to look for packets matching the port. */
- /* */
- /****************************************************************/
- int KalasagStealthModeUDP(void)
- {
- struct sockaddr_in client, server;
- int portCount = 0, portCount2 = 0, ports[MAXSOCKS], ports2[MAXSOCKS],
- result = TRUE;
- int count = 0, scanDetectTrigger = TRUE, gotBound = FALSE;
- int openSockfd = 0, incomingPort = 0;
- char *temp, target[IPMAXBUF], configToken[MAXBUF];
- char resolvedHost[DNSMAXBUF];
- struct in_addr addr;
- struct iphdr ip;
- struct udphdr udp;
- if ((ConfigTokenRetrieve("UDP_PORTS", configToken)) == FALSE) {
- Log("adminalert: ERROR: Could not read UDP_PORTS option from config file");
- return (ERROR);
- }
- /* break out the ports */
- for (count = 1; count < MAXSOCKS; count++) {
- else
- break;
- }
- portCount = count;
- } else {
- Log("adminalert: ERROR: No UDP ports supplied in config file. Aborting");
- return (ERROR);
- }
- /* ok, now check if they have a network daemon on the socket already, if they do */
- /* then skip that port because it will cause false alarms */
- for (count = 0; count < portCount; count++) {
- Log("adminalert: Going into stealth listen mode on UDP port: %d\n",
- ports[count]);
- if ((openSockfd = OpenUDPSocket()) == ERROR) {
- Log("adminalert: ERROR: could not open UDP socket. Aborting.\n");
- return (ERROR);
- }
- if (BindSocket(openSockfd, client, server, ports[count]) == ERROR)
- Log("adminalert: ERROR: Socket %d is in use and will not be monitored. Attempting to continue\n", ports[count]);
- else {
- gotBound = TRUE;
- ports2[portCount2++] = ports[count];
- }
- close(openSockfd);
- }
- if (gotBound == FALSE) {
- Log("adminalert: ERROR: All supplied UDP sockets are in use and will not be listened to. Shutting down.\n");
- return (ERROR);
- }
- if ((openSockfd = OpenRAWUDPSocket()) == ERROR) {
- Log("adminalert: ERROR: could not open RAW UDP socket. Aborting.\n");
- return (ERROR);
- }
- Log("adminalert: Kalasag is now active and listening.\n");
- /* main detection loop */
- for (;;) {
- if (PacketReadUDP(openSockfd, &ip, &udp) != TRUE)
- continue;
- incomingPort = ntohs(udp.dest);
- /* this iterates the list of ports looking for a match */
- for (count = 0; count < portCount; count++) {
- if (incomingPort == ports2[count]) {
- if (SmartVerifyUDP(client, server, incomingPort) == TRUE)
- break;
- addr.s_addr = (u_int) ip.saddr;
- SafeStrncpy(target, (char *) inet_ntoa(addr), IPMAXBUF);
- /* check if we should ignore this IP */
- result = NeverBlock(target, gblIgnoreFile);
- if (result == ERROR) {
- Log("attackalert: ERROR: cannot open ignore file. Blocking host anyway.\n");
- result = FALSE;
- }
- if (result == FALSE) {
- /* check if they've visited before */
- scanDetectTrigger = CheckStateEngine(target);
- if (scanDetectTrigger == TRUE) {
- if (gblResolveHost) { /* Do they want DNS resolution? */
- if (CleanAndResolve(resolvedHost, target) !=
- TRUE) {
- Log("attackalert: ERROR: Error resolving host. \
- resolving disabled for this host.\n");
- target);
- }
- } else {
- target);
- }
- Log("attackalert: UDP scan from host: %s/%s to UDP port: %d", resolvedHost, target, ports2[count]);
- /* Report on options present */
- if (ip.ihl > 5)
- Log("attackalert: Packet from host: %s/%s to UDP port: %d has IP options set (detection avoidance technique).", resolvedHost, target, incomingPort);
- /* check if this target is already blocked */
- if (IsBlocked(target, gblBlockedFile) == FALSE) {
- if (DisposeUDP(target, ports2[count]) != TRUE)
- Log("attackalert: ERROR: Could not block host %s/%s!!", resolvedHost, target);
- else
- WriteBlocked(target, resolvedHost,
- ports2[count], gblBlockedFile,
- gblHistoryFile, "UDP");
- } /* end IsBlocked check */
- else {
- Log("attackalert: Host: %s/%s is already blocked Ignoring", resolvedHost, target);
- }
- } /* end if(scanDetectTrigger) */
- } /* end if(never block) check */
- break; /* get out of for(count) loop above */
- } /* end if(incoming port) == protected port */
- } /* end for( check for protected port loop ) loop */
- } /* end for( ; ; ) loop */
- } /* end KalasagStealthModeUDP */
- /****************************************************************/
- /* Advanced Stealth scan detection mode for UDP */
- /* */
- /* This mode will see what ports are listening below 1024 */
- /* and will then monitor all the rest. This is very sensitive */
- /* and will react on any packet hitting any monitored port. */
- /* This is a very dangerous option and is for advanced users */
- /* */
- /****************************************************************/
- int KalasagAdvancedStealthModeUDP(void)
- {
- struct sockaddr_in client, server;
- int result = TRUE, scanDetectTrigger = TRUE, hotPort = TRUE;
- int openSockfd = 0, incomingPort = 0, smartVerify = FALSE;
- unsigned int advancedPorts = 1024;
- unsigned int count = 0, inUsePorts[MAXSOCKS], portCount = 0;
- char target[IPMAXBUF], configToken[MAXBUF];
- char resolvedHost[DNSMAXBUF], *temp;
- struct in_addr addr;
- struct iphdr ip;
- struct udphdr udp;
- if ((ConfigTokenRetrieve("ADVANCED_PORTS_UDP", configToken)) == FALSE) {
- Log("adminalert: ERROR: Could not read ADVANCED_PORTS_UDP option from config file. Assuming 1024.");
- advancedPorts = 1024;
- } else
- Log("adminalert: Advanced mode will monitor first %d ports",
- advancedPorts);
- /* try to bind to all ports below 1024, any that are taken we exclude later */
- for (count = 0; count < advancedPorts; count++) {
- if ((openSockfd = OpenUDPSocket()) == ERROR) {
- Log("adminalert: ERROR: could not open UDP socket. Aborting.\n");
- return (ERROR);
- }
- if (BindSocket(openSockfd, client, server, count) == ERROR)
- inUsePorts[portCount++] = count;
- close(openSockfd);
- }
- if ((ConfigTokenRetrieve("ADVANCED_EXCLUDE_UDP", configToken)) !=
- FALSE) {
- /* break out the ports */
- Log("adminalert: Advanced mode will manually exclude port: %d ", inUsePorts[portCount - 1]);
- for (count = 0; count < MAXSOCKS; count++) {
- Log("adminalert: Advanced mode will manually exclude port: %d ", inUsePorts[portCount - 1]);
- } else
- break;
- }
- }
- } else
- Log("adminalert: Advanced mode will manually exclude no ports");
- for (count = 0; count < portCount; count++)
- Log("adminalert: Advanced Stealth scan detection mode activated. Ignored UDP port: %d\n", inUsePorts[count]);
- if ((openSockfd = OpenRAWUDPSocket()) == ERROR) {
- Log("adminalert: ERROR: could not open RAW UDP socket. Aborting.\n");
- return (ERROR);
- }
- Log("adminalert: Kalasag is now active and listening.\n");
- /* main detection loop */
- for (;;) {
- if (PacketReadUDP(openSockfd, &ip, &udp) != TRUE)
- continue;
- incomingPort = ntohs(udp.dest);
- /* check if we should ignore this connection to this port */
- for (count = 0; count < portCount; count++) {
- if ((incomingPort == inUsePorts[count])
- || (incomingPort >= advancedPorts)) {
- hotPort = FALSE;
- break;
- } else
- hotPort = TRUE;
- }
- if (hotPort) {
- smartVerify = SmartVerifyUDP(client, server, incomingPort);
- if (smartVerify != TRUE) {
- /* copy the clients address into our buffer for nuking */
- addr.s_addr = (u_int) ip.saddr;
- SafeStrncpy(target, (char *) inet_ntoa(addr), IPMAXBUF);
- /* check if we should ignore this IP */
- result = NeverBlock(target, gblIgnoreFile);
- if (result == ERROR) {
- Log("attackalert: ERROR: cannot open ignore file. Blocking host anyway.\n");
- result = FALSE;
- }
- if (result == FALSE) {
- /* check if they've visited before */
- scanDetectTrigger = CheckStateEngine(target);
- if (scanDetectTrigger == TRUE) {
- if (gblResolveHost) { /* Do they want DNS resolution? */
- if (CleanAndResolve(resolvedHost, target) !=
- TRUE) {
- Log("attackalert: ERROR: Error resolving host. \
- resolving disabled for this host.\n");
- target);
- }
- } else {
- target);
- }
- Log("attackalert: UDP scan from host: %s/%s to UDP port: %d", resolvedHost, target, incomingPort);
- /* Report on options present */
- if (ip.ihl > 5)
- Log("attackalert: Packet from host: %s/%s to UDP port: %d has IP options set (detection avoidance technique).", resolvedHost, target, incomingPort);
- /* check if this target is already blocked */
- if (IsBlocked(target, gblBlockedFile) == FALSE) {
- if (DisposeUDP(target, incomingPort) != TRUE)
- Log("attackalert: ERROR: Could not block host %s/%s!!", resolvedHost, target);
- else
- WriteBlocked(target, resolvedHost,
- incomingPort, gblBlockedFile,
- gblHistoryFile, "UDP");
- } /* end IsBlocked check */
- else
- Log("attackalert: Host: %s/%s is already blocked Ignoring", resolvedHost, target);
- } /* end if(scanDetectTrigger) */
- } /* end if(never block) check */
- } /* end if (smartVerify) */
- } /* end if(hotPort) */
- } /* end for( ; ; ) loop */
- }
- /* end KalasagAdvancedStealthModeUDP */
- #endif
- /****************************************************************/
- /* Classic detection Mode */
- /* */
- /* This mode will bind to a list of TCP sockets and wait for */
- /* connections to happen. Although the least prone to false */
- /* alarms, it also won't detect stealth scans */
- /* */
- /****************************************************************/
- int KalasagModeTCP(void)
- {
- struct sockaddr_in client, server;
- int length, portCount = 0, ports[MAXSOCKS];
- int openSockfd[MAXSOCKS], incomingSockfd, result = TRUE;
- int count = 0, scanDetectTrigger = TRUE, showBanner =
- FALSE, boundPortCount = 0;
- int selectResult = 0;
- char *temp, target[IPMAXBUF], bannerBuffer[MAXBUF],
- configToken[MAXBUF];
- char resolvedHost[DNSMAXBUF];
- fd_set selectFds;
- if ((ConfigTokenRetrieve("TCP_PORTS", configToken)) == FALSE) {
- Log("adminalert: ERROR: Could not read TCP_PORTS option from config file");
- return (ERROR);
- }
- /* break out the ports */
- for (count = 1; count < MAXSOCKS; count++) {
- else
- break;
- }
- portCount = count;
- } else {
- Log("adminalert: ERROR: No TCP ports supplied in config file. Aborting");
- return (ERROR);
- }
- /* read in the banner if one is given */
- if ((ConfigTokenRetrieve("PORT_BANNER", configToken)) == TRUE) {
- showBanner = TRUE;
- SafeStrncpy(bannerBuffer, configToken, MAXBUF);
- }
- /* setup select call */
- FD_ZERO(&selectFds);
- for (count = 0; count < portCount; count++) {
- Log("adminalert: Going into listen mode on TCP port: %d\n",
- ports[count]);
- if ((openSockfd[boundPortCount] = OpenTCPSocket()) == ERROR) {
- Log("adminalert: ERROR: could not open TCP socket. Aborting.\n");
- return (ERROR);
- }
- if (BindSocket
- (openSockfd[boundPortCount], client, server,
- ports[count]) == ERROR) {
- Log("adminalert: ERROR: could not bind TCP socket: %d. Attempting to continue\n", ports[count]);
- } else /* well we at least bound to one socket so we'll continue */
- boundPortCount++;
- }
- /* if we didn't bind to anything then abort */
- if (boundPortCount == 0) {
- Log("adminalert: ERROR: could not bind ANY TCP sockets. Shutting down.\n");
- return (ERROR);
- }
- length = sizeof(client);
- Log("adminalert: Kalasag is now active and listening.\n");
- /* main loop for multiplexing/resetting */
- for (;;) {
- /* set up select call */
- for (count = 0; count < boundPortCount; count++)
- FD_SET(openSockfd[count], &selectFds);
- selectResult =
- select(MAXSOCKS, &selectFds, NULL, NULL,
- (struct timeval *) NULL);
- /* something blew up */
- if (selectResult < 0) {
- Log("adminalert: ERROR: select call failed. Shutting down.\n");
- return (ERROR);
- } else if (selectResult == 0) {
- #ifdef DEBUG
- Log("Select timeout");
- #endif
- }
- /* select is reporting a waiting socket. Poll them all to find out which */
- else if (selectResult > 0) {
- for (count = 0; count < boundPortCount; count++) {
- if (FD_ISSET(openSockfd[count], &selectFds)) {
- incomingSockfd =
- accept(openSockfd[count],
- (struct sockaddr *) &client, &length);
- if (incomingSockfd < 0) {
- Log("attackalert: Possible stealth scan from unknown host to TCP port: %d (accept failed)", ports[count]);
- break;
- }
- /* copy the clients address into our buffer for nuking */
- SafeStrncpy(target,
- (char *) inet_ntoa(client.sin_addr),
- IPMAXBUF);
- /* check if we should ignore this IP */
- result = NeverBlock(target, gblIgnoreFile);
- if (result == ERROR) {
- Log("attackalert: ERROR: cannot open ignore file. Blocking host anyway.\n");
- result = FALSE;
- }
- if (result == FALSE) {
- /* check if they've visited before */
- scanDetectTrigger = CheckStateEngine(target);
- if (scanDetectTrigger == TRUE) {
- /* show the banner if one was selected */
- if (showBanner == TRUE)
- write(incomingSockfd, bannerBuffer,
- /* we don't need the bonehead anymore */
- close(incomingSockfd);
- if (gblResolveHost) { /* Do they want DNS resolution? */
- if (CleanAndResolve(resolvedHost, target)
- != TRUE) {
- Log("attackalert: ERROR: Error resolving host. \
- resolving disabled for this host.\n");
- target);
- }
- } else {
- target);
- }
- Log("attackalert: Connect from host: %s/%s to TCP port: %d", resolvedHost, target, ports[count]);
- /* check if this target is already blocked */
- if (IsBlocked(target, gblBlockedFile) == FALSE) {
- if (DisposeTCP(target, ports[count]) !=
- TRUE)
- Log("attackalert: ERROR: Could not block host %s !!", target);
- else
- WriteBlocked(target, resolvedHost,
- ports[count],
- gblBlockedFile,
- gblHistoryFile, "TCP");
- } else
- Log("attackalert: Host: %s is already blocked. Ignoring", target);
- }
- }
- close(incomingSockfd);
- break;
- } /* end if(FD_ISSET) */
- } /* end for() */
- } /* end else (selectResult > 0) */
- } /* end main for(; ; ) loop */
- /* not reached */
- close(incomingSockfd);
- }
- /****************************************************************/
- /* Classic detection Mode */
- /* */
- /* This mode will bind to a list of UDP sockets and wait for */
- /* connections to happen. Stealth scanning really doesn't apply */
- /* here. */
- /* */
- /****************************************************************/
- int KalasagModeUDP(void)
- {
- struct sockaddr_in client, server;
- int length, ports[MAXSOCKS], openSockfd[MAXSOCKS], result = TRUE;
- int count = 0, portCount = 0, selectResult = 0, scanDetectTrigger = 0;
- int boundPortCount = 0, showBanner = FALSE;
- char *temp, target[IPMAXBUF], bannerBuffer[MAXBUF],
- configToken[MAXBUF];
- char buffer[MAXBUF];
- char resolvedHost[DNSMAXBUF];
- fd_set selectFds;
- if ((ConfigTokenRetrieve("UDP_PORTS", configToken)) == FALSE) {
- Log("adminalert: ERROR: Could not read UDP_PORTS option from config file");
- return (ERROR);
- }
- /* break out the ports */
- for (count = 1; count < MAXSOCKS; count++) {
- else
- break;
- }
- portCount = count;
- } else {
- Log("adminalert: ERROR: No UDP ports supplied in config file. Aborting");
- return (ERROR);
- }
- /* read in the banner if one is given */
- if ((ConfigTokenRetrieve("PORT_BANNER", configToken)) == TRUE) {
- showBanner = TRUE;
- SafeStrncpy(bannerBuffer, configToken, MAXBUF);
- }
- /* setup select call */
- FD_ZERO(&selectFds);
- for (count = 0; count < portCount; count++) {
- Log("adminalert: Going into listen mode on UDP port: %d\n",
- ports[count]);
- if ((openSockfd[boundPortCount] = OpenUDPSocket()) == ERROR) {
- Log("adminalert: ERROR: could not open UDP socket. Aborting\n");
- return (ERROR);
- }
- if (BindSocket
- (openSockfd[boundPortCount], client, server,
- ports[count]) == ERROR) {
- Log("adminalert: ERROR: could not bind UDP socket: %d. Attempting to continue\n", ports[count]);
- } else /* well we at least bound to one socket so we'll continue */
- boundPortCount++;
- }
- /* if we didn't bind to anything then abort */
- if (boundPortCount == 0) {
- Log("adminalert: ERROR: could not bind ANY UDP sockets. Shutting down.\n");
- return (ERROR);
- }
- length = sizeof(client);
- Log("adminalert: Kalasag is now active and listening.\n");
- /* main loop for multiplexing/resetting */
- for (;;) {
- /* set up select call */
- for (count = 0; count < boundPortCount; count++)
- FD_SET(openSockfd[count], &selectFds);
- /* setup the select multiplexing (blocking mode) */
- selectResult =
- select(MAXSOCKS, &selectFds, NULL, NULL,
- (struct timeval *) NULL);
- if (selectResult < 0) {
- Log("adminalert: ERROR: select call failed. Shutting down.\n");
- return (ERROR);
- } else if (selectResult == 0) {
- #ifdef DEBUG
- Log("Select timeout");
- #endif
- }
- /* select is reporting a waiting socket. Poll them all to find out which */
- else if (selectResult > 0) {
- for (count = 0; count < portCount; count++) {
- if (FD_ISSET(openSockfd[count], &selectFds)) {
- /* here just read in one byte from the UDP socket, that's all we need to */
- /* know that this person is a jerk */
- if (recvfrom(openSockfd[count], buffer, 1, 0,
- (struct sockaddr *) &client, &length) < 0)
- {
- Log("adminalert: ERROR: could not accept incoming socket for UDP port: %d\n", ports[count]);
- break;
- }
- /* copy the clients address into our buffer for nuking */
- SafeStrncpy(target,
- (char *) inet_ntoa(client.sin_addr),
- IPMAXBUF);
- #ifdef DEBUG
- Log("debug: KalasagModeUDP: accepted UDP connection from: %s\n", target);
- #endif
- /* check if we should ignore this IP */
- result = NeverBlock(target, gblIgnoreFile);
- if (result == ERROR) {
- Log("attackalert: ERROR: cannot open ignore file. Blocking host anyway.\n");
- result = FALSE;
- }
- if (result == FALSE) {
- /* check if they've visited before */
- scanDetectTrigger = CheckStateEngine(target);
- if (scanDetectTrigger == TRUE) {
- /* show the banner if one was selected */
- if (showBanner == TRUE)
- sendto(openSockfd[count], bannerBuffer,
- (struct sockaddr *) &client,
- length);
- if (gblResolveHost) { /* Do they want DNS resolution? */
- if (CleanAndResolve(resolvedHost, target)
- != TRUE) {
- Log("attackalert: ERROR: Error resolving host. \
- resolving disabled for this host.\n");
- target);
- }
- } else {
- target);
- }
- Log("attackalert: Connect from host: %s/%s to UDP port: %d", resolvedHost, target, ports[count]);
- /* check if this target is already blocked */
- if (IsBlocked(target, gblBlockedFile) == FALSE) {
- if (DisposeUDP(target, ports[count]) !=
- TRUE)
- Log("attackalert: ERROR: Could not block host %s !!", target);
- else
- WriteBlocked(target, resolvedHost,
- ports[count],
- gblBlockedFile,
- gblHistoryFile, "UDP");
- } else
- Log("attackalert: Host: %s is already blocked. Ignoring", target);
- }
- }
- break;
- } /* end if(FD_ISSET) */
- } /* end for() */
- } /* end else (selectResult > 0) */
- } /* end main for(; ; ) loop */
- } /* end UDP Kalasag */
- /* kill the TCP connection depending on config option */
- int DisposeTCP(char *target, int port)
- {
- int status = TRUE;
- #ifdef DEBUG
- Log("debug: DisposeTCP: disposing of host %s on port %d with option: %d", target, port, gblBlockTCP);
- Log("debug: DisposeTCP: killRunCmd: %s", gblKillRunCmd);
- Log("debug: DisposeTCP: gblRunCmdFirst: %d", gblRunCmdFirst);
- Log("debug: DisposeTCP: killHostsDeny: %s", gblKillHostsDeny);
- Log("debug: DisposeTCP: killRoute: %s %d", gblKillRoute,
- #endif
- /* Should we ignore TCP from active response? */
- if (gblBlockTCP == 1) {
- /* run external command first, hosts.deny second, dead route last */
- if (gblRunCmdFirst) {
- if (KillRunCmd
- (target, port, gblKillRunCmd,
- gblDetectionType) != TRUE)
- status = FALSE;
- if (KillHostsDeny
- (target, port, gblKillHostsDeny,
- gblDetectionType) != TRUE)
- status = FALSE;
- if (KillRoute(target, port, gblKillRoute, gblDetectionType)
- != TRUE)
- status = FALSE;
- }
- /* run hosts.deny first, dead route second, external command last */
- else {
- if (KillHostsDeny
- (target, port, gblKillHostsDeny,
- gblDetectionType) != TRUE)
- status = FALSE;
- if (KillRoute(target, port, gblKillRoute, gblDetectionType)
- != TRUE)
- status = FALSE;
- if (KillRunCmd
- (target, port, gblKillRunCmd,
- gblDetectionType) != TRUE)
- status = FALSE;
- }
- } else if (gblBlockTCP == 2) {
- /* run external command only */
- if (KillRunCmd(target, port, gblKillRunCmd, gblDetectionType)
- != TRUE)
- status = FALSE;
- } else
- Log("attackalert: Ignoring TCP response per configuration file setting.");
- return (status);
- }
- /* kill the UDP connection depending on config option */
- int DisposeUDP(char *target, int port)
- {
- int status = TRUE;
- #ifdef DEBUG
- Log("debug: DisposeUDP: disposing of host %s on port %d with option: %d", target, port, gblBlockUDP);
- Log("debug: DisposeUDP: killRunCmd: %d", gblKillRunCmd);
- Log("debug: DisposeUDP: gblRunCmdFirst: %s", gblRunCmdFirst);
- Log("debug: DisposeUDP: killHostsDeny: %s", gblKillHostsDeny);
- Log("debug: DisposeUDP: killRoute: %s %d", gblKillRoute,
- #endif
- /* Should we ignore TCP from active response? */
- if (gblBlockUDP == 1) {
- /* run external command first, hosts.deny second, dead route last */
- if (gblRunCmdFirst) {
- if (KillRunCmd
- (target, port, gblKillRunCmd,
- gblDetectionType) != TRUE)
- status = FALSE;
- if (KillHostsDeny
- (target, port, gblKillHostsDeny,
- gblDetectionType) != TRUE)
- status = FALSE;
- if (KillRoute(target, port, gblKillRoute, gblDetectionType)
- != TRUE)
- status = FALSE;
- }
- /* run hosts.deny first, dead route second, external command last */
- else {
- if (KillHostsDeny
- (target, port, gblKillHostsDeny,
- gblDetectionType) != TRUE)
- status = FALSE;
- if (KillRoute(target, port, gblKillRoute, gblDetectionType)
- != TRUE)
- status = FALSE;
- if (KillRunCmd
- (target, port, gblKillRunCmd,
- gblDetectionType) != TRUE)
- status = FALSE;
- }
- } else if (gblBlockUDP == 2) {
- /* run external command only */
- if (KillRunCmd(target, port, gblKillRunCmd, gblDetectionType)
- != TRUE)
- status = FALSE;
- } else
- Log("attackalert: Ignoring UDP response per configuration file setting.");
- return (status);
- }
- /* duh */
- void Usage(void)
- {
- #ifdef SUPPORT_STEALTH
- #else
- #endif
- /*
- printf ("*** PLEASE READ THE DOCS BEFORE USING *** \n\n");
- */
- }
- /* our cheesy state engine to monitor who has connected here before */
- int CheckStateEngine(char *target)
- {
- int count = 0, scanDetectTrigger = TRUE;
- int gotOne = 0;
- /* This is the rather basic scan state engine. It maintains */
- /* an array of past hosts who triggered a connection on a port */
- /* when a new host arrives it is compared against the array */
- /* if it is found in the array it increments a state counter by */
- /* one and checks the remainder of the array. It does this until */
- /* the end is reached or the trigger value has been exceeded */
- /* This would probably be better as a linked list/hash table, */
- /* but for the number of hosts we are tracking this is just as good. */
- /* This will probably change in the future */
- gotOne = 1; /* our flag counter if we get a match */
- scanDetectTrigger = TRUE; /* set to TRUE until set otherwise */
- if (gblConfigTriggerCount > 0) {
- for (count = 0; count < MAXSTATE; count++) {
- /* if the array has the IP address then increment the gotOne counter and */
- /* check the trigger value. If it is exceeded break out of the loop and */
- /* set the detecttrigger to TRUE */
- /* compare the number of matches to the configured trigger value */
- /* if we've exceeded we can stop this noise */
- if (++gotOne >= gblConfigTriggerCount) {
- scanDetectTrigger = TRUE;
- #ifdef DEBUG
- Log("debug: CheckStateEngine: host: %s has exceeded trigger value: %d\n", gblScanDetectHost[count], gblConfigTriggerCount);
- #endif
- break;
- }
- } else
- scanDetectTrigger = FALSE;
- }
- /* now add the fresh meat into the state engine */
- /* if our array is still less than MAXSTATE large add it to the end */
- if (gblScanDetectCount < MAXSTATE) {
- SafeStrncpy(gblScanDetectHost[gblScanDetectCount], target,
- IPMAXBUF);
- gblScanDetectCount++;
- } else {
- /* otherwise tack it to the beginning and start overwriting older ones */
- gblScanDetectCount = 0;
- SafeStrncpy(gblScanDetectHost[gblScanDetectCount], target,
- IPMAXBUF);
- gblScanDetectCount++;
- }
- #ifdef DEBUG
- for (count = 0; count < MAXSTATE; count++)
- Log("debug: CheckStateEngine: state engine host: %s -> position: %d Detected: %d\n", gblScanDetectHost[count], count, scanDetectTrigger);
- #endif
- /* end catch to set state if gblConfigTriggerCount == 0 */
- if (gotOne >= gblConfigTriggerCount)
- scanDetectTrigger = TRUE;
- }
- if (gblConfigTriggerCount > MAXSTATE) {
- Log("securityalert: WARNING: Trigger value %d is larger than state engine capacity of %d.\n", gblConfigTriggerCount);
- Log("Adjust the value lower or recompile with a larger state engine value.\n", MAXSTATE);
- Log("securityalert: Blocking host anyway because of invalid trigger value");
- scanDetectTrigger = TRUE;
- }
- return (scanDetectTrigger);
- }
- #ifdef SUPPORT_STEALTH
- /* This takes a tcp packet and reports what type of scan it is */
- char *ReportPacketType(struct tcphdr tcpPkt)
- {
- static char packetDesc[MAXBUF];
- static char *packetDescPtr = packetDesc;
- if ((tcpPkt.syn == 0) && (tcpPkt.fin == 0) && (tcpPkt.ack == 0)
- && (tcpPkt.psh == 0) && (tcpPkt.rst == 0) && (tcpPkt.urg == 0))
- else if ((tcpPkt.fin == 1) && (tcpPkt.urg == 1) && (tcpPkt.psh == 1))
- else if ((tcpPkt.fin == 1) && (tcpPkt.syn != 1) && (tcpPkt.ack != 1)
- && (tcpPkt.psh != 1) && (tcpPkt.rst != 1)
- && (tcpPkt.urg != 1))
- else if ((tcpPkt.syn == 1) && (tcpPkt.fin != 1) && (tcpPkt.ack != 1)
- && (tcpPkt.psh != 1) && (tcpPkt.rst != 1)
- && (tcpPkt.urg != 1))
- else
- "Unknown Type: TCP Packet Flags: SYN: %d FIN: %d ACK: %d PSH: %d URG: %d RST: %d",
- tcpPkt.syn, tcpPkt.fin, tcpPkt.ack, tcpPkt.psh,
- tcpPkt.urg, tcpPkt.rst);
- return (packetDescPtr);
- }
- int
- SmartVerifyTCP(struct sockaddr_in client, struct sockaddr_in server,
- int port)
- {
- int testSockfd;
- /* Ok here is where we "Smart-Verify" the socket. If the port was previously */
- /* unbound, but now appears to have someone there, then we will skip responding */
- /* to this inbound packet. This a basic "stateful" inspection of the */
- /* the connection */
- if ((testSockfd = OpenTCPSocket()) == ERROR) {
- Log("adminalert: ERROR: could not open TCP socket to smart-verify.\n");
- return (FALSE);
- } else {
- if (BindSocket(testSockfd, client, server, port) == ERROR) {
- #ifdef DEBUG
- Log("debug: SmartVerify: Smart-Verify Port In Use: %d", port);
- #endif
- close(testSockfd);
- return (TRUE);
- }
- }
- close(testSockfd);
- return (FALSE);
- }
- int
- SmartVerifyUDP(struct sockaddr_in client, struct sockaddr_in server,
- int port)
- {
- int testSockfd;
- /* Ok here is where we "Smart-Verify" the socket. If the port was previously */
- /* unbound, but now appears to have someone there, then we will skip responding */
- /* to this inbound packet. This essentially is a "stateful" inspection of the */
- /* the connection */
- if ((testSockfd = OpenUDPSocket()) == ERROR) {
- Log("adminalert: ERROR: could not open UDP socket to smart-verify.\n");
- return (FALSE);
- } else {
- if (BindSocket(testSockfd, client, server, port) == ERROR) {
- #ifdef DEBUG
- Log("debug: SmartVerify: Smart-Verify Port In Use: %d", port);
- #endif
- close(testSockfd);
- return (TRUE);
- }
- }
- close(testSockfd);
- return (FALSE);
- }
- #endif /* SUPPORT_STEALTH */