eko nº2:(wux.c):13/05/2001 << Back To eko nº 2
/* * WU-FTPD Scanner by ca0s / Ezkracho Team * * http://www.ezkracho.com.ar */ #include <stdio.h> #include <unistd.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #include <string.h> #include <malloc.h> #include <sys/time.h> #include <sys/types.h> #define TIMEOUT 10 #define CHILDS 20 pid_t wait(int *status); /* Nombre del archivo default del log del scan. */ char logfile[128] = "wux-scan.log"; int verbose = 0; int sockfd; /* Si no logra conectarse en el tiempo marcado en */ /* TIMEOUT cierra el socket. */ void connect_timeout() { close(sockfd); exit(-1); } void ScanTarget(struct in_addr ip) { FILE *unf; int sockfd, yeah = 0; char buffer[1024], ruffer[1024]; struct sockaddr_in address; memset(&address, '\0', sizeof(address)); memcpy (&address.sin_addr, &ip, 4); address.sin_port = htons(21); if ((sockfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { printf("\n(!) Esteee eemmmm... maldito socket #$^#!#@~!\n\n"); exit(0); } signal(SIGALRM, connect_timeout); alarm(TIMEOUT); if ( connect(sockfd, (struct sockaddr *)&address, sizeof(address)) == -1 ) { alarm(0); exit(0); } memset(buffer, '\0', strlen(buffer)); recv(sockfd, buffer, 1024, 0); /* Banners de los wu vulnerables por los que busca, en caso de querer */ /* agregar nuevas versiones este es el lugar. */ if (strstr(buffer, "wu-2.4.2")) { memset(ruffer, '\0', strlen(ruffer)); strcpy(ruffer, "]--> wu-2.4.2\n"); yeah++; } if (strstr(buffer, "Version wu-2.4.2-academ[BETA-1")) { memset(ruffer, '\0', strlen(ruffer)); strcpy(ruffer, "]--> Posible version vulnerable del wu-2.4.2\n"); yeah++; } if (strstr(buffer, "wu-2.6.0(1)")) { memset(ruffer, '\0', strlen(ruffer)); strcpy(ruffer, "]--> wu-2.6.0(1)\n"); yeah++; } if ((strstr(buffer, "Mon Feb 28")) || (strstr(buffer, "Wed Aug 9"))) { memset(ruffer, '\0', strlen(ruffer)); strcpy(ruffer, "]--> Posible version vulnerable del wu-2.6.0(1)\n"); yeah++; } if (strstr(buffer, "wu-2.6.1")) { memset(ruffer, '\0', strlen(ruffer)); strcpy(ruffer, "]--> wu-2.6.1\n"); yeah++; } if (yeah != 0) { if (verbose == 1) printf("\n[ %s %s\n", inet_ntoa(ip), ruffer); if ((unf = fopen(logfile, "aw+")) == NULL) { printf("\n(!) Fallo al abrir el archivo %s.\n\n", logfile); exit(0); } fprintf(unf, "[ %s %s", inet_ntoa(ip), ruffer); fclose(unf); } alarm(0); exit(0); } void CheckTarget(char *targetfile) { FILE *foo; char buffer[100]; struct in_addr ip; int hijus = 1; if ((foo = fopen(targetfile, "r")) == NULL) { printf("\n(!) Fallo al abrir el archivo %s.\n\n", targetfile); exit(0); } while (fgets(buffer, sizeof(buffer), foo) != NULL) { if (buffer[strlen(buffer)-1] == '\n') buffer[strlen(buffer)-1] = '\0'; if (inet_aton(buffer, &ip) == 0) { printf("\n(!) %s: con que inventando direcciones IP?\n\n", buffer); exit(0); } if (hijus < CHILDS) { switch (fork()) { case 0: ScanTarget(ip); exit(0); case -1: printf("\n(!) Esteee eemmmm... maldito fork() #$^#!#@~!\n\n"); exit(-1); default: hijus++; break; } } else { wait(NULL); hijus--; } } while(hijus--) wait(NULL); fclose(foo); } void FukinHelp(char *argv) { printf("\nWU-FTPD Scanner by ca0s / Ezkracho Team\n\n"); printf("Uso: %s <Lista de IPs> [Opcion] [Argumento]\n\n", argv); printf("Opciones:\n"); printf(" -o <Archivo de Salida> Guarda el log del scan.\n"); printf(" -v Imprime en pantalla el progreso del scan.\n\n"); printf("Ejemplos:\n"); printf(" [root@foo]# %s targets.txt -v -o scan-1.log\n", argv); printf(" [root@foo]# %s targets.txt &\n\n", argv); } int main(int argc, char *argv[]) { int opcion; char targetfile[128]; if (argc < 2) { FukinHelp(argv[0]); exit(0); } if (strlen(argv[1]) > 128) { printf("\n(!) El nombre del archivo de targets es demasiado largo.\n\n"); exit(0); } else { strcpy(targetfile, argv[1]); } while ((opcion = getopt(argc, argv, "vo:")) != EOF) { switch (opcion) { case 'v': verbose=1; break; case 'o': if (strlen(optarg) > 128) { printf("\n(!) El nombre del archivo de log es demasiado largo.\n\n"); exit(0); } memset(logfile, '\0', strlen(logfile)); strcpy(logfile, optarg); break; default: FukinHelp(argv[0]); exit(0); } } CheckTarget(targetfile); }