Add target_state_t enum

This commit is contained in:
Diadlo 2017-06-02 00:13:46 +03:00
commit 07d55e94af
No known key found for this signature in database
GPG key ID: 5AF9F2E29107C727

63
hydra.c
View file

@ -200,6 +200,13 @@ typedef struct {
time_t last_seen; time_t last_seen;
} hydra_head; } hydra_head;
typedef enum {
STATE_ACTIVE = 0,
STATE_FINISHED = 1,
STATE_ERROR = 2,
STATE_UNRESOLVED = 3
} target_state_t;
typedef struct { typedef struct {
char *target; char *target;
char ip[36]; char ip[36];
@ -210,7 +217,7 @@ typedef struct {
unsigned long int sent; unsigned long int sent;
int pass_state; int pass_state;
int use_count; int use_count;
int done; // 0 if active, 1 if finished scanning, 2 if error (for RESTOREFILE), 3 could not be resolved target_state_t done;
int fail_count; int fail_count;
int redo_state; int redo_state;
int redo; int redo;
@ -734,7 +741,7 @@ void hydra_restore_write(int print_msg) {
return; return;
for (i = 0; i < hydra_brains.targets; i++) for (i = 0; i < hydra_brains.targets; i++)
if (hydra_targets[j]->done != 1 && hydra_targets[j]->done != 3) if (hydra_targets[j]->done != STATE_FINISHED && hydra_targets[j]->done != STATE_UNRESOLVED)
j++; j++;
if (j == 0) { if (j == 0) {
process_restore = 0; process_restore = 0;
@ -776,7 +783,7 @@ void hydra_restore_write(int print_msg) {
if (hydra_options.colonfile == NULL || hydra_options.colonfile == empty_login) if (hydra_options.colonfile == NULL || hydra_options.colonfile == empty_login)
fck = fwrite(pass_ptr, hydra_brains.sizepass, 1, f); fck = fwrite(pass_ptr, hydra_brains.sizepass, 1, f);
for (j = 0; j < hydra_brains.targets; j++) for (j = 0; j < hydra_brains.targets; j++)
if (hydra_targets[j]->done != 1) { if (hydra_targets[j]->done != STATE_FINISHED) {
fck = fwrite(hydra_targets[j], sizeof(hydra_target), 1, f); fck = fwrite(hydra_targets[j], sizeof(hydra_target), 1, f);
fprintf(f, "%s\n%d\n%d\n", hydra_targets[j]->target == NULL ? "" : hydra_targets[j]->target, (int) (hydra_targets[j]->login_ptr - login_ptr), fprintf(f, "%s\n%d\n%d\n", hydra_targets[j]->target == NULL ? "" : hydra_targets[j]->target, (int) (hydra_targets[j]->login_ptr - login_ptr),
(int) (hydra_targets[j]->pass_ptr - pass_ptr)); (int) (hydra_targets[j]->pass_ptr - pass_ptr));
@ -1315,7 +1322,7 @@ void hydra_service_init(int target_no) {
if (x > 0 && x < 4) if (x > 0 && x < 4)
hydra_targets[target_no]->done = x; hydra_targets[target_no]->done = x;
else else
hydra_targets[target_no]->done = 2; hydra_targets[target_no]->done = STATE_ERROR;
hydra_brains.finished++; hydra_brains.finished++;
if (hydra_brains.targets == 1) if (hydra_brains.targets == 1)
exit(-1); exit(-1);
@ -1705,7 +1712,7 @@ void hydra_increase_fail_count(int target_no, int head_no) {
k++; k++;
if (k <= 1) { if (k <= 1) {
// we need to put this in a list, otherwise we fail one login+pw test // we need to put this in a list, otherwise we fail one login+pw test
if (hydra_targets[target_no]->done == 0 if (hydra_targets[target_no]->done == STATE_ACTIVE
&& hydra_targets[target_no]->redo <= hydra_options.max_use * 2 && hydra_targets[target_no]->redo <= hydra_options.max_use * 2
&& ((hydra_heads[head_no]->current_login_ptr != empty_login && hydra_heads[head_no]->current_pass_ptr != empty_login) && ((hydra_heads[head_no]->current_login_ptr != empty_login && hydra_heads[head_no]->current_pass_ptr != empty_login)
|| (hydra_heads[head_no]->current_login_ptr != NULL && hydra_heads[head_no]->current_pass_ptr != NULL))) { || (hydra_heads[head_no]->current_login_ptr != NULL && hydra_heads[head_no]->current_pass_ptr != NULL))) {
@ -1720,11 +1727,11 @@ void hydra_increase_fail_count(int target_no, int head_no) {
hydra_heads[head_no]->current_pass_ptr = empty_login; hydra_heads[head_no]->current_pass_ptr = empty_login;
} }
if (hydra_targets[target_no]->fail_count >= MAXFAIL + hydra_options.tasks * hydra_targets[target_no]->ok) { if (hydra_targets[target_no]->fail_count >= MAXFAIL + hydra_options.tasks * hydra_targets[target_no]->ok) {
if (hydra_targets[target_no]->done == 0 && hydra_options.max_use == hydra_targets[target_no]->failed) { if (hydra_targets[target_no]->done == STATE_ACTIVE && hydra_options.max_use == hydra_targets[target_no]->failed) {
if (hydra_targets[target_no]->ok == 1) if (hydra_targets[target_no]->ok == 1)
hydra_targets[target_no]->done = 2; // mark target as done by errors hydra_targets[target_no]->done = STATE_ERROR; // mark target as done by errors
else else
hydra_targets[target_no]->done = 3; // mark target as done by unable to connect hydra_targets[target_no]->done = STATE_UNRESOLVED; // mark target as done by unable to connect
hydra_brains.finished++; hydra_brains.finished++;
fprintf(stderr, "[ERROR] Too many connect errors to target, disabling %s://%s%s%s:%d\n", hydra_options.service, hydra_targets[target_no]->ip[0] == 16 fprintf(stderr, "[ERROR] Too many connect errors to target, disabling %s://%s%s%s:%d\n", hydra_options.service, hydra_targets[target_no]->ip[0] == 16
&& index(hydra_targets[target_no]->target, ':') != NULL ? "[" : "", hydra_targets[target_no]->target, hydra_targets[target_no]->ip[0] == 16 && index(hydra_targets[target_no]->target, ':') != NULL ? "[" : "", hydra_targets[target_no]->target, hydra_targets[target_no]->ip[0] == 16
@ -1737,7 +1744,7 @@ void hydra_increase_fail_count(int target_no, int head_no) {
} // we keep the last one alive as long as it make sense } // we keep the last one alive as long as it make sense
} else { } else {
// we need to put this in a list, otherwise we fail one login+pw test // we need to put this in a list, otherwise we fail one login+pw test
if (hydra_targets[target_no]->done == 0 if (hydra_targets[target_no]->done == STATE_ACTIVE
&& hydra_targets[target_no]->redo <= hydra_options.max_use * 2 && hydra_targets[target_no]->redo <= hydra_options.max_use * 2
&& ((hydra_heads[head_no]->current_login_ptr != empty_login && hydra_heads[head_no]->current_pass_ptr != empty_login) && ((hydra_heads[head_no]->current_login_ptr != empty_login && hydra_heads[head_no]->current_pass_ptr != empty_login)
|| (hydra_heads[head_no]->current_login_ptr != NULL && hydra_heads[head_no]->current_pass_ptr != NULL))) { || (hydra_heads[head_no]->current_login_ptr != NULL && hydra_heads[head_no]->current_pass_ptr != NULL))) {
@ -1832,8 +1839,8 @@ int hydra_send_next_pair(int target_no, int head_no) {
snpdone = 1; snpdone = 1;
} else { } else {
if (hydra_targets[target_no]->sent >= hydra_brains.todo + hydra_targets[target_no]->redo) { if (hydra_targets[target_no]->sent >= hydra_brains.todo + hydra_targets[target_no]->redo) {
if (hydra_targets[target_no]->done == 0) { if (hydra_targets[target_no]->done == STATE_ACTIVE) {
hydra_targets[target_no]->done = 1; hydra_targets[target_no]->done = STATE_FINISHED;
hydra_brains.finished++; hydra_brains.finished++;
if (verbose) if (verbose)
printf("[STATUS] attack finished for %s (waiting for children to complete tests)\n", hydra_targets[target_no]->target); printf("[STATUS] attack finished for %s (waiting for children to complete tests)\n", hydra_targets[target_no]->target);
@ -1873,8 +1880,8 @@ int hydra_send_next_pair(int target_no, int head_no) {
snpdone = 1; snpdone = 1;
} else { } else {
// if a pair does not complete after this point it is lost // if a pair does not complete after this point it is lost
if (hydra_targets[target_no]->done == 0) { if (hydra_targets[target_no]->done == STATE_ACTIVE) {
hydra_targets[target_no]->done = 1; hydra_targets[target_no]->done = STATE_FINISHED;
hydra_brains.finished++; hydra_brains.finished++;
if (verbose) if (verbose)
printf("[STATUS] attack finished for %s (waiting for children to complete tests)\n", hydra_targets[target_no]->target); printf("[STATUS] attack finished for %s (waiting for children to complete tests)\n", hydra_targets[target_no]->target);
@ -1883,7 +1890,7 @@ int hydra_send_next_pair(int target_no, int head_no) {
return -1; return -1;
} }
} else { // normale state, no redo } else { // normale state, no redo
if (hydra_targets[target_no]->done) { if (hydra_targets[target_no]->done != STATE_ACTIVE) {
loop_cnt = 0; loop_cnt = 0;
return -1; // head will be disabled by main while() return -1; // head will be disabled by main while()
} }
@ -2099,8 +2106,8 @@ int hydra_send_next_pair(int target_no, int head_no) {
if (!snpdone || hydra_targets[target_no]->skipcnt >= hydra_brains.countlogin) { if (!snpdone || hydra_targets[target_no]->skipcnt >= hydra_brains.countlogin) {
fck = write(hydra_heads[head_no]->sp[0], HYDRA_EXIT, sizeof(HYDRA_EXIT)); fck = write(hydra_heads[head_no]->sp[0], HYDRA_EXIT, sizeof(HYDRA_EXIT));
if (hydra_targets[target_no]->use_count <= 1) { if (hydra_targets[target_no]->use_count <= 1) {
if (hydra_targets[target_no]->done == 0) { if (hydra_targets[target_no]->done == STATE_ACTIVE) {
hydra_targets[target_no]->done = 1; hydra_targets[target_no]->done = STATE_FINISHED;
hydra_brains.finished++; hydra_brains.finished++;
if (verbose) if (verbose)
printf("[STATUS] attack finished for %s (waiting for children to complete tests)\n", hydra_targets[target_no]->target); printf("[STATUS] attack finished for %s (waiting for children to complete tests)\n", hydra_targets[target_no]->target);
@ -2250,7 +2257,7 @@ int hydra_select_target() {
int target_no = -1, i, j = -1000; int target_no = -1, i, j = -1000;
for (i = 0; i < hydra_brains.targets; i++) for (i = 0; i < hydra_brains.targets; i++)
if (hydra_targets[i]->use_count < hydra_options.tasks && hydra_targets[i]->done == 0) if (hydra_targets[i]->use_count < hydra_options.tasks && hydra_targets[i]->done == STATE_ACTIVE)
if (j < hydra_options.tasks - hydra_targets[i]->failed - hydra_targets[i]->use_count) { if (j < hydra_options.tasks - hydra_targets[i]->failed - hydra_targets[i]->use_count) {
target_no = i; target_no = i;
j = hydra_options.tasks - hydra_targets[i]->failed - hydra_targets[i]->use_count; j = hydra_options.tasks - hydra_targets[i]->failed - hydra_targets[i]->use_count;
@ -3840,7 +3847,7 @@ int main(int argc, char *argv[]) {
printf("[failed for %s] ", hydra_targets[i]->target); printf("[failed for %s] ", hydra_targets[i]->target);
else else
fprintf(stderr, "[ERROR] could not resolve address: %s\n", hydra_targets[i]->target); fprintf(stderr, "[ERROR] could not resolve address: %s\n", hydra_targets[i]->target);
hydra_targets[i]->done = 3; hydra_targets[i]->done = STATE_UNRESOLVED;
hydra_brains.finished++; hydra_brains.finished++;
} }
} else { } else {
@ -3862,7 +3869,7 @@ int main(int argc, char *argv[]) {
if ((strcmp(hydra_options.service, "socks5") == 0) || (strcmp(hydra_options.service, "sip") == 0)) { if ((strcmp(hydra_options.service, "socks5") == 0) || (strcmp(hydra_options.service, "sip") == 0)) {
fprintf(stderr, "[ERROR] Target %s resolves to an IPv6 address, however module %s does not support this. Maybe try \"-4\" option. Sending in patches helps.\n", fprintf(stderr, "[ERROR] Target %s resolves to an IPv6 address, however module %s does not support this. Maybe try \"-4\" option. Sending in patches helps.\n",
hydra_targets[i]->target, hydra_options.service); hydra_targets[i]->target, hydra_options.service);
hydra_targets[i]->done = 3; hydra_targets[i]->done = STATE_UNRESOLVED;
hydra_brains.finished++; hydra_brains.finished++;
} else { } else {
hydra_targets[i]->ip[0] = 16; hydra_targets[i]->ip[0] = 16;
@ -3887,7 +3894,7 @@ int main(int argc, char *argv[]) {
printf("[failed for %s] ", hydra_targets[i]->target); printf("[failed for %s] ", hydra_targets[i]->target);
else else
fprintf(stderr, "[ERROR] Could not resolve proxy address: %s\n", hydra_targets[i]->target); fprintf(stderr, "[ERROR] Could not resolve proxy address: %s\n", hydra_targets[i]->target);
hydra_targets[i]->done = 3; hydra_targets[i]->done = STATE_UNRESOLVED;
hydra_brains.finished++; hydra_brains.finished++;
} }
freeaddrinfo(res); freeaddrinfo(res);
@ -4064,15 +4071,15 @@ int main(int argc, char *argv[]) {
fflush(hydra_brains.ofp); fflush(hydra_brains.ofp);
} }
if (hydra_options.exit_found) { // option set says quit target after on valid login/pass pair is found if (hydra_options.exit_found) { // option set says quit target after on valid login/pass pair is found
if (hydra_targets[hydra_heads[head_no]->target_no]->done == 0) { if (hydra_targets[hydra_heads[head_no]->target_no]->done == STATE_ACTIVE) {
hydra_targets[hydra_heads[head_no]->target_no]->done = 1; // mark target as done hydra_targets[hydra_heads[head_no]->target_no]->done = STATE_FINISHED; // mark target as done
hydra_brains.finished++; hydra_brains.finished++;
printf("[STATUS] attack finished for %s (valid pair found)\n", hydra_targets[hydra_heads[head_no]->target_no]->target); printf("[STATUS] attack finished for %s (valid pair found)\n", hydra_targets[hydra_heads[head_no]->target_no]->target);
} }
if (hydra_options.exit_found == 2) { if (hydra_options.exit_found == 2) {
for (j = 0; j < hydra_brains.targets; j++) for (j = 0; j < hydra_brains.targets; j++)
if (hydra_targets[j]->done == 0) { if (hydra_targets[j]->done == STATE_ACTIVE) {
hydra_targets[j]->done = 1; hydra_targets[j]->done = STATE_FINISHED;
hydra_brains.finished++; hydra_brains.finished++;
} }
} }
@ -4210,18 +4217,18 @@ int main(int argc, char *argv[]) {
j = k = error = 0; j = k = error = 0;
for (i = 0; i < hydra_brains.targets; i++) for (i = 0; i < hydra_brains.targets; i++)
switch (hydra_targets[i]->done) { switch (hydra_targets[i]->done) {
case 3: case STATE_UNRESOLVED:
k++; k++;
break; break;
case 2: case STATE_ERROR:
if (hydra_targets[i]->ok == 0) if (hydra_targets[i]->ok == 0)
k++; k++;
else else
error++; error++;
break; break;
case 1: case STATE_FINISHED:
break; break;
case 0: case STATE_ACTIVE:
if (hydra_targets[i]->ok == 0) if (hydra_targets[i]->ok == 0)
k++; k++;
else else