void service_imap(char *ip, int sp, unsigned char options, char *miscptr, FILE * fp, int port) { int run = 1, next_run = 1, sock = -1; int myport = PORT_IMAP, mysslport = PORT_IMAP_SSL, disable_tls = 0; char *buffer1 = "1 CAPABILITY\r\n"; 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(275000); 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 = mysslport; } if (sock < 0) { 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) || (strstr(buf, "OK") == NULL && buf[0] != '*')) { /* check the first line */ if (verbose || debug) hydra_report(stderr, "[ERROR] Not an IMAP protocol or service shutdown:\n"); if (buf != NULL) free(buf); hydra_child_exit(2); } free(buf); /* send capability request */ if (hydra_send(sock, buffer1, strlen(buffer1), 0) < 0) exit(-1); counter = 2; buf = imap_read_server_capacity(sock); if (buf == NULL) { hydra_child_exit(2); } #ifdef LIBOPENSSLNEW if (!disable_tls) { /* check for STARTTLS, if available we may have access to more basic auth methods */ if (strstr(buf, "STARTTLS") != NULL) { hydra_send(sock, "2 STARTTLS\r\n", strlen("2 STARTTLS\r\n"), 0); counter++; free(buf); buf = hydra_receive_line(sock); if (buf == NULL || (strstr(buf, " NO ") != NULL || strstr(buf, "failed") != NULL || strstr(buf, " BAD ") != NULL)) { if (verbose) hydra_report(stderr, "[VERBOSE] TLS negotiation failed\n"); } else { free(buf); if ((hydra_connect_to_ssl(sock) == -1)) { if (verbose) hydra_report(stderr, "[ERROR] Can't use TLS\n"); disable_tls = 1; run = 1; break; } else { if (verbose) hydra_report(stderr, "[VERBOSE] TLS connection done\n"); } /* ask again capability request but in TLS mode */ if (hydra_send(sock, "3 CAPABILITY\r\n", strlen("3 CAPABILITY\r\n"), 0) < 0) hydra_child_exit(2); buf = imap_read_server_capacity(sock); counter++; if (buf == NULL) hydra_child_exit(2); } } } #endif if ((strstr(buf, "LOGIN") == NULL) && (strstr(buf, "NTLM") != NULL)) { imap_auth_mechanism = AUTH_NTLM; } #ifdef LIBOPENSSLNEW if ((strstr(buf, "LOGIN") == NULL) && (strstr(buf, "SCRAM-SHA-1") != NULL)) { imap_auth_mechanism = AUTH_SCRAMSHA1; } if ((strstr(buf, "LOGIN") == NULL) && (strstr(buf, "DIGEST-MD5") != NULL)) { imap_auth_mechanism = AUTH_DIGESTMD5; } if ((strstr(buf, "LOGIN") == NULL) && (strstr(buf, "CRAM-SHA256") != NULL)) { imap_auth_mechanism = AUTH_CRAMSHA256; } if ((strstr(buf, "LOGIN") == NULL) && (strstr(buf, "CRAM-SHA1") != NULL)) { imap_auth_mechanism = AUTH_CRAMSHA1; } if ((strstr(buf, "LOGIN") == NULL) && (strstr(buf, "CRAM-MD5") != NULL)) { imap_auth_mechanism = AUTH_CRAMMD5; } #endif if ((strstr(buf, "LOGIN") == NULL) && (strstr(buf, "PLAIN") != NULL)) { imap_auth_mechanism = AUTH_PLAIN; } if (strstr(buf, "LOGIN") != NULL) { imap_auth_mechanism = AUTH_LOGIN; } free(buf); if ((miscptr != NULL) && (strlen(miscptr) > 0)) { int i; for (i = 0; i < strlen(miscptr); i++) miscptr[i] = (char) toupper((int) miscptr[i]); if (strncmp(miscptr, "CLEAR", 5) == 0) imap_auth_mechanism = AUTH_CLEAR; if (strncmp(miscptr, "LOGIN", 5) == 0) imap_auth_mechanism = AUTH_LOGIN; if (strncmp(miscptr, "PLAIN", 5) == 0) imap_auth_mechanism = AUTH_PLAIN; #ifdef LIBOPENSSLNEW if (strncmp(miscptr, "CRAM-MD5", 8) == 0) imap_auth_mechanism = AUTH_CRAMMD5; if (strncmp(miscptr, "CRAM-SHA1", 9) == 0) imap_auth_mechanism = AUTH_CRAMSHA1; if (strncmp(miscptr, "CRAM-SHA256", 11) == 0) imap_auth_mechanism = AUTH_CRAMSHA256; if (strncmp(miscptr, "DIGEST-MD5", 10) == 0) imap_auth_mechanism = AUTH_DIGESTMD5; if (strncmp(miscptr, "SCRAM-SHA1", 10) == 0) imap_auth_mechanism = AUTH_SCRAMSHA1; #endif if (strncmp(miscptr, "NTLM", 4) == 0) imap_auth_mechanism = AUTH_NTLM; } if (verbose) { switch (imap_auth_mechanism) { case AUTH_CLEAR: hydra_report(stderr, "[VERBOSE] using IMAP CLEAR LOGIN mechanism\n"); break; case AUTH_LOGIN: hydra_report(stderr, "[VERBOSE] using IMAP LOGIN AUTH mechanism\n"); break; case AUTH_PLAIN: hydra_report(stderr, "[VERBOSE] using IMAP PLAIN AUTH mechanism\n"); break; #ifdef LIBOPENSSLNEW case AUTH_CRAMMD5: hydra_report(stderr, "[VERBOSE] using IMAP CRAM-MD5 AUTH mechanism\n"); break; case AUTH_CRAMSHA1: hydra_report(stderr, "[VERBOSE] using IMAP CRAM-SHA1 AUTH mechanism\n"); break; case AUTH_CRAMSHA256: hydra_report(stderr, "[VERBOSE] using IMAP CRAM-SHA256 AUTH mechanism\n"); break; case AUTH_DIGESTMD5: hydra_report(stderr, "[VERBOSE] using IMAP DIGEST-MD5 AUTH mechanism\n"); break; case AUTH_SCRAMSHA1: hydra_report(stderr, "[VERBOSE] using IMAP SCRAM-SHA1 AUTH mechanism\n"); break; #endif case AUTH_NTLM: hydra_report(stderr, "[VERBOSE] using IMAP NTLM AUTH mechanism\n"); break; } } next_run = 2; break; case 2: /* run the cracking function */ next_run = start_imap(sock, ip, port, options, miscptr, fp); counter++; break; case 3: /* clean exit */ if (sock >= 0) sock = hydra_disconnect(sock); hydra_child_exit(0); return; default: hydra_report(stderr, "[ERROR] Caught unknown return code, exiting!\n"); hydra_child_exit(2); } run = next_run; } }
void service_imap(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_IMAP, mysslport = PORT_IMAP_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(275000); 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 = mysslport; } if (sock < 0) { 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 ) || ( strstr(buf, "OK") == NULL && buf[0] != '*')) { /* check the first line */ hydra_report(stderr, "Error: Not an IMAP protocol or service shutdown:\n"); if ( buf != NULL ) { free(buf); } hydra_child_exit(2); #ifdef PALM return; #else exit(-1); #endif } free(buf); counter = 1; next_run = 2; break; case 2: /* run the cracking function */ next_run = start_imap(sock, ip, port, options, miscptr, fp); counter++; break; case 3: /* clean exit */ if (sock >= 0) sock = hydra_disconnect(sock); hydra_child_exit(0); return; default: hydra_report(stderr, "Caught unknown return code, exiting!\n"); hydra_child_exit(0); #ifdef PALM return; #else exit(-1); #endif } run = next_run; } }