--- connecter.c.orig Fri Oct 26 23:47:25 2001 +++ connecter.c Mon Oct 29 18:11:49 2001 @@ -55,7 +55,7 @@ int scanhost(struct argument *arg, char *buf, size_t size) { - int res, sock, j; + int res, sock, j, sockrsh, retval=0; struct addrinfo hints, *ai; char firstline[255]; char ntop[NI_MAXHOST]; @@ -66,13 +66,13 @@ break; default: strlcpy(buf, "", size); - return (-1); + retval = -1; } sock = socket(arg->a_type, SOCK_STREAM, 0); if (sock == -1) { strlcpy(buf, "", size); - return (-1); + retval = -1; } memset(&hints, 0, sizeof(hints)); @@ -80,7 +80,7 @@ hints.ai_socktype = SOCK_STREAM; if (getaddrinfo(ntop, "22", &hints, &ai) != 0) { strlcpy(buf, "", size); - return (-1); + retval = -1; } alarm(CONNECTWAIT); @@ -95,46 +95,53 @@ case EHOSTUNREACH: #endif strlcpy(buf, "", size); - return (-1); + retval = -1; case ECONNREFUSED: strlcpy(buf, "", size); - return (-1); + retval = -1; case ENETUNREACH: strlcpy(buf, "", size); - return (-1); + retval = -1; default: - snprintf(buf, size, "<%s>", strerror(errno)); - return (-1); + strlcpy(buf, strerror(errno), size); + retval = -1; } } - - /* Read other side\'s version identification. */ + if (retval != -1) { + + /* Read other side\'s version identification. */ for (j = 0; j < MAXITER; j++) { - int i; + int i; for (i = 0; i < size - 1; i++) { int len = -1; - if (!j && !i) - alarm (LONGWAIT); - else - alarm (SHORTWAIT); - while ((len = read(sock, &buf[i], 1)) == -1) { - if (len == -1 && errno == EINTR) - break; - } - alarm(0); + if (!j && !i) + alarm (LONGWAIT); + else + alarm (SHORTWAIT); + while ((len = read(sock, &buf[i], 1)) == -1) { + if (len == -1 && errno == EINTR) + break; + } + alarm(0); if (len < 0 && !j) { - close(sock); - strlcpy(buf, "", size); - return (-1); - } else if (len != 1 && !j) { - close(sock); + close(sock); + strlcpy(buf, "", size); + return (-1); + } else if (len != 1 && !j) { + close(sock); strlcpy(buf, "", size); - return (-1); - } else if (len != 1) { - j = MAXITER; - break; - } - + return (-1); + } else if (len != 1) { + j = MAXITER; + break; + } + + if (buf[i] == '\r') { + } else if (len != 1) { + j = MAXITER; + break; + } + if (buf[i] == '\r') { buf[i] = 0; continue; @@ -147,14 +154,82 @@ buf[size - 1] = 0; if (strncmp(buf, "SSH-", 4) == 0) break; - if (j == 0) - strlcpy(firstline, buf, sizeof(firstline)); + if (j == 0) + strlcpy(firstline, buf, sizeof(firstline)); } - if (j >= MAXITER) - strlcpy(buf, firstline, size); - else if (ssh_sendident) + + + if (j >= MAXITER) + strlcat(buf, firstline, size); + else if (ssh_sendident) atomicio(write, sock, SSHMAPVERSION, sizeof(SSHMAPVERSION)); - close(sock); + close(sock); + } + + /* do the telnet scan */ + retval = 0; + + sock = socket(arg->a_type, SOCK_STREAM, 0); + if (sock == -1) { + strlcat(buf, ", ", size); + retval = -1; + } + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + if (getaddrinfo(ntop, "23", &hints, &ai) != 0) { + strlcat(buf, ", ", size); + retval = -1; + } + + alarm(CONNECTWAIT); + res = connect(sock, ai->ai_addr, ai->ai_addrlen); + alarm(0); + if (res == -1) { + close(sock); + strlcat(buf, ", 0", size); + retval = -1; + } + if (retval != -1) { + strlcat(buf, ", 1", size); + /* while not needed, helps identify source for loggers */ + atomicio(write, sock, SSHMAPVERSION, sizeof(SSHMAPVERSION)); + close(sock); + } + + /* do the rsh scan */ + retval = 0; + + sockrsh = socket(arg->a_type, SOCK_STREAM, 0); + if (sockrsh == -1) { + strlcat(buf, ", ", size); + retval = -1; + } + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + if (getaddrinfo(ntop, "513", &hints, &ai) != 0) { + strlcat(buf, ", ", size); + retval = -1; + } + + alarm(CONNECTWAIT); + res = connect(sockrsh, ai->ai_addr, ai->ai_addrlen); + alarm(0); + if (res == -1) { + close(sockrsh); + strlcat(buf, ", 0", size); + retval = -1; + } + if (retval != -1) { + strlcat(buf, ", 1", size); + /* helps identify source as this scanner */ + atomicio(write, sockrsh, SSHMAPVERSION, sizeof(SSHMAPVERSION)); + close(sockrsh); + } + return (0); } @@ -178,7 +253,7 @@ scanhost(&arg, result, sizeof(result)); ipv4toa(buf, sizeof(buf), &arg.a_ipv4); - strlcat(buf, " ", sizeof(buf)); + strlcat(buf, ", ", sizeof(buf)); strlcat(buf, result, sizeof(buf)); atomicio(write, writefd, buf, strlen(buf) + 1);