void service_pop3(unsigned long int ip, int sp, unsigned char options, char *miscptr, FILE *fp, int port) { int run = 1, next_run, sock = -1; int myport = PORT_POP3, mysslport = PORT_POP3_SSL; hydra_register_socket(sp); if (memcmp(hydra_get_next_pair(), &HYDRA_EXIT, sizeof(HYDRA_EXIT)) == 0) return; while(1) { switch(run) { case 1: /* connect and service init function */ if (sock >= 0) sock = hydra_disconnect(sock); usleep(300000); if ((options & OPTION_SSL) == 0) { if (port != 0) myport = port; sock = hydra_connect_tcp(ip, myport); port = myport; } else { if (port != 0) mysslport = port; sock = hydra_connect_ssl(ip, mysslport); port = myport; } if (sock < 0) { fprintf(stderr, "Error: Child with pid %d terminating, can not connect\n", (int)getpid()); hydra_child_exit(); } buf = hydra_receive_line(sock); if (buf == NULL || buf[0] != '+') { /* check the first line */ fprintf(stderr,"Error: Not an POP3 protocol or service shutdown: %s\n", buf); hydra_child_exit(); exit(-1); } free(buf); next_run = 2; break; case 2: /* run the cracking function */ next_run = start_pop3(sock, port, options, miscptr, fp); break; case 3: /* clean exit */ if (sock >= 0) sock = hydra_disconnect(sock); hydra_child_exit(); return; default: fprintf(stderr,"Caught unknown return code, exiting!\n"); hydra_child_exit(); exit(-1); } run = next_run; } }
void service_pop3(char *ip, int sp, unsigned char options, char *miscptr, FILE *fp, int port) { int run = 1, next_run = 1, sock = -1, i; char *ptr = NULL; //extract data from the pool, ip is the key if (plist == NULL) if (service_pop3_init(ip, sp, options, miscptr, fp, port) != 0) hydra_child_exit(2); p = list_find(ip); if (p == NULL) { hydra_report(stderr, "[ERROR] Could not find ip %s in pool\n", hydra_address2string(ip)); return; } if (list_remove(p) != 0) hydra_report(stderr, "[ERROR] Could not find ip %s in pool to free memory\n", hydra_address2string(ip)); hydra_register_socket(sp); if (memcmp(hydra_get_next_pair(), &HYDRA_EXIT, sizeof(HYDRA_EXIT)) == 0) return; while (1) { switch (run) { case 1: /* connect and service init function */ if (sock >= 0) sock = hydra_disconnect(sock); // usleep(300000); if ((options & OPTION_SSL) == 0) { sock = hydra_connect_tcp(ip, port); } else { sock = hydra_connect_ssl(ip, port); } if (sock < 0) { if (verbose || debug) hydra_report(stderr, "[ERROR] Child with pid %d terminating, can not connect\n", (int) getpid()); hydra_child_exit(1); } buf = hydra_receive_line(sock); if (buf == NULL || buf[0] != '+') { /* check the first line */ if (verbose || debug) hydra_report(stderr, "[ERROR] Not an POP3 protocol or service shutdown: %s\n", buf); hydra_child_exit(2); } ptr = strstr(buf, "<"); if (ptr != NULL && buf[0] == '+') { if (ptr[strlen(ptr) - 1] == '\n') ptr[strlen(ptr) - 1] = 0; if (ptr[strlen(ptr) - 1] == '\r') ptr[strlen(ptr) - 1] = 0; strcpy(apop_challenge, ptr); } free(buf); #ifdef LIBOPENSSL if (!p->disable_tls) { /* check for STARTTLS, if available we may have access to more basic auth methods */ hydra_send(sock, "STLS\r\n", strlen("STLS\r\n"), 0); buf = hydra_receive_line(sock); if (buf[0] != '+') { hydra_report(stderr, "[ERROR] TLS negotiation failed, no answer received from STARTTLS request\n"); } else { free(buf); if ((hydra_connect_to_ssl(sock) == -1)) { if (verbose) hydra_report(stderr, "[ERROR] Can't use TLS\n"); p->disable_tls = 1; } else { if (verbose) hydra_report(stderr, "[VERBOSE] TLS connection done\n"); } } } #endif next_run = 2; break; case 2: /* run the cracking function */ next_run = start_pop3(sock, ip, port, options, miscptr, fp); break; case 3: /* clean exit */ if (sock >= 0) sock = hydra_disconnect(sock); hydra_child_exit(0); return; case 4: /* clean exit */ if (sock >= 0) sock = hydra_disconnect(sock); hydra_child_exit(2); return; default: hydra_report(stderr, "[ERROR] Caught unknown return code, exiting!\n"); hydra_child_exit(0); } run = next_run; } }