mirror of
https://github.com/vanhauser-thc/thc-hydra.git
synced 2025-08-20 21:33:51 -07:00
Add target_state_t enum
This commit is contained in:
parent
3ed91cd18f
commit
07d55e94af
1 changed files with 35 additions and 28 deletions
63
hydra.c
63
hydra.c
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue