Added command prompt [f]inish to instruct hashcat to finish the current attack and quit afterwards

pull/2785/head
Jens Steube 3 years ago
parent 7baad686fa
commit 32b40d5c53

@ -20,6 +20,8 @@
- Added hash-mode: RAR3-p (Compressed) - Added hash-mode: RAR3-p (Compressed)
- Added hash-mode: RAR3-p (Uncompressed) - Added hash-mode: RAR3-p (Uncompressed)
- Added hash-mode: RSA/DSA/EC/OPENSSH Private Keys - Added hash-mode: RSA/DSA/EC/OPENSSH Private Keys
- Added hash-mode: SolarWinds Orion v2
- Added hash-mode: SolarWinds Serv-U
- Added hash-mode: SQLCipher - Added hash-mode: SQLCipher
- Added hash-mode: Stargazer Stellar Wallet XLM - Added hash-mode: Stargazer Stellar Wallet XLM
- Added hash-mode: Stuffit5 - Added hash-mode: Stuffit5
@ -27,13 +29,12 @@
- Added hash-mode: Umbraco HMAC-SHA1 - Added hash-mode: Umbraco HMAC-SHA1
- Added hash-mode: sha1($salt.sha1($pass.$salt)) - Added hash-mode: sha1($salt.sha1($pass.$salt))
- Added hash-mode: sha1(sha1($pass).$salt) - Added hash-mode: sha1(sha1($pass).$salt)
- Added hash-mode: SolarWinds Orion v2
- Added hash-mode: SolarWinds Serv-U
## ##
## Features ## Features
## ##
- Added command prompt [f]inish to instruct hashcat to finish the current attack and quit afterwards
- Added support for true UTF8 to UTF16 conversion in kernel crypto library - Added support for true UTF8 to UTF16 conversion in kernel crypto library
- Added option --hash-info to show generic information for each hash-mode - Added option --hash-info to show generic information for each hash-mode
- Removed option --example-hashes, now is an alias of --hash-info - Removed option --example-hashes, now is an alias of --hash-info

@ -15,6 +15,7 @@ int hashcat_session_pause (hashcat_ctx_t *hashcat_ctx);
int hashcat_session_resume (hashcat_ctx_t *hashcat_ctx); int hashcat_session_resume (hashcat_ctx_t *hashcat_ctx);
int hashcat_session_bypass (hashcat_ctx_t *hashcat_ctx); int hashcat_session_bypass (hashcat_ctx_t *hashcat_ctx);
int hashcat_session_checkpoint (hashcat_ctx_t *hashcat_ctx); int hashcat_session_checkpoint (hashcat_ctx_t *hashcat_ctx);
int hashcat_session_finish (hashcat_ctx_t *hashcat_ctx);
int hashcat_session_quit (hashcat_ctx_t *hashcat_ctx); int hashcat_session_quit (hashcat_ctx_t *hashcat_ctx);
int hashcat_session_destroy (hashcat_ctx_t *hashcat_ctx); int hashcat_session_destroy (hashcat_ctx_t *hashcat_ctx);

@ -77,11 +77,13 @@ void hc_signal (void (callback) (int));
int mycracked (hashcat_ctx_t *hashcat_ctx); int mycracked (hashcat_ctx_t *hashcat_ctx);
int myabort_runtime (hashcat_ctx_t *hashcat_ctx); int myabort_runtime (hashcat_ctx_t *hashcat_ctx);
int myabort_checkpoint (hashcat_ctx_t *hashcat_ctx); int myabort_checkpoint (hashcat_ctx_t *hashcat_ctx);
int myabort_finish (hashcat_ctx_t *hashcat_ctx);
int myabort (hashcat_ctx_t *hashcat_ctx); int myabort (hashcat_ctx_t *hashcat_ctx);
int myquit (hashcat_ctx_t *hashcat_ctx); int myquit (hashcat_ctx_t *hashcat_ctx);
int bypass (hashcat_ctx_t *hashcat_ctx); int bypass (hashcat_ctx_t *hashcat_ctx);
int SuspendThreads (hashcat_ctx_t *hashcat_ctx); int SuspendThreads (hashcat_ctx_t *hashcat_ctx);
int ResumeThreads (hashcat_ctx_t *hashcat_ctx); int ResumeThreads (hashcat_ctx_t *hashcat_ctx);
int stop_at_checkpoint (hashcat_ctx_t *hashcat_ctx); int stop_at_checkpoint (hashcat_ctx_t *hashcat_ctx);
int finish_after_attack (hashcat_ctx_t *hashcat_ctx);
#endif // _THREAD_H #endif // _THREAD_H

@ -209,6 +209,7 @@ typedef enum status_rc
STATUS_ABORTED_CHECKPOINT = 10, STATUS_ABORTED_CHECKPOINT = 10,
STATUS_ABORTED_RUNTIME = 11, STATUS_ABORTED_RUNTIME = 11,
STATUS_ERROR = 13, STATUS_ERROR = 13,
STATUS_ABORTED_FINISH = 14,
} status_rc_t; } status_rc_t;
@ -2348,6 +2349,7 @@ typedef struct status_ctx
bool shutdown_outer; bool shutdown_outer;
bool checkpoint_shutdown; bool checkpoint_shutdown;
bool finish_shutdown;
hc_thread_mutex_t mux_dispatcher; hc_thread_mutex_t mux_dispatcher;
hc_thread_mutex_t mux_counter; hc_thread_mutex_t mux_counter;

@ -270,10 +270,16 @@ static int inner2_loop (hashcat_ctx_t *hashcat_ctx)
myabort_checkpoint (hashcat_ctx); myabort_checkpoint (hashcat_ctx);
} }
if ((status_ctx->devices_status == STATUS_RUNNING) && (status_ctx->finish_shutdown == true))
{
myabort_finish (hashcat_ctx);
}
if ((status_ctx->devices_status != STATUS_CRACKED) if ((status_ctx->devices_status != STATUS_CRACKED)
&& (status_ctx->devices_status != STATUS_ERROR) && (status_ctx->devices_status != STATUS_ERROR)
&& (status_ctx->devices_status != STATUS_ABORTED) && (status_ctx->devices_status != STATUS_ABORTED)
&& (status_ctx->devices_status != STATUS_ABORTED_CHECKPOINT) && (status_ctx->devices_status != STATUS_ABORTED_CHECKPOINT)
&& (status_ctx->devices_status != STATUS_ABORTED_FINISH)
&& (status_ctx->devices_status != STATUS_ABORTED_RUNTIME) && (status_ctx->devices_status != STATUS_ABORTED_RUNTIME)
&& (status_ctx->devices_status != STATUS_QUIT) && (status_ctx->devices_status != STATUS_QUIT)
&& (status_ctx->devices_status != STATUS_BYPASS)) && (status_ctx->devices_status != STATUS_BYPASS))
@ -1234,6 +1240,7 @@ int hashcat_session_execute (hashcat_ctx_t *hashcat_ctx)
if (rc_final == 0) if (rc_final == 0)
{ {
if (status_ctx->devices_status == STATUS_ABORTED_FINISH) rc_final = 5;
if (status_ctx->devices_status == STATUS_ABORTED_RUNTIME) rc_final = 4; if (status_ctx->devices_status == STATUS_ABORTED_RUNTIME) rc_final = 4;
if (status_ctx->devices_status == STATUS_ABORTED_CHECKPOINT) rc_final = 3; if (status_ctx->devices_status == STATUS_ABORTED_CHECKPOINT) rc_final = 3;
if (status_ctx->devices_status == STATUS_ABORTED) rc_final = 2; if (status_ctx->devices_status == STATUS_ABORTED) rc_final = 2;
@ -1278,6 +1285,11 @@ int hashcat_session_checkpoint (hashcat_ctx_t *hashcat_ctx)
return stop_at_checkpoint (hashcat_ctx); return stop_at_checkpoint (hashcat_ctx);
} }
int hashcat_session_finish (hashcat_ctx_t *hashcat_ctx)
{
return finish_after_attack (hashcat_ctx);
}
int hashcat_session_quit (hashcat_ctx_t *hashcat_ctx) int hashcat_session_quit (hashcat_ctx_t *hashcat_ctx)
{ {
return myabort (hashcat_ctx); return myabort (hashcat_ctx);

@ -32,6 +32,8 @@ static const char *ST_0010 = "Aborted (Checkpoint)";
static const char *ST_0011 = "Aborted (Runtime)"; static const char *ST_0011 = "Aborted (Runtime)";
static const char *ST_0012 = "Running (Checkpoint Quit requested)"; static const char *ST_0012 = "Running (Checkpoint Quit requested)";
static const char *ST_0013 = "Error"; static const char *ST_0013 = "Error";
static const char *ST_0014 = "Aborted (Finish)";
static const char *ST_0015 = "Running (Quit after attack requested)";
static const char *ST_9999 = "Unknown! Bug!"; static const char *ST_9999 = "Unknown! Bug!";
static const char UNITS[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' }; static const char UNITS[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
@ -267,6 +269,11 @@ const char *status_get_status_string (const hashcat_ctx_t *hashcat_ctx)
{ {
return ST_0012; return ST_0012;
} }
if (status_ctx->finish_shutdown == true)
{
return ST_0015;
}
} }
switch (devices_status) switch (devices_status)
@ -284,6 +291,7 @@ const char *status_get_status_string (const hashcat_ctx_t *hashcat_ctx)
case STATUS_ABORTED_CHECKPOINT: return ST_0010; case STATUS_ABORTED_CHECKPOINT: return ST_0010;
case STATUS_ABORTED_RUNTIME: return ST_0011; case STATUS_ABORTED_RUNTIME: return ST_0011;
case STATUS_ERROR: return ST_0013; case STATUS_ERROR: return ST_0013;
case STATUS_ABORTED_FINISH: return ST_0014;
} }
return ST_9999; return ST_9999;
@ -2197,6 +2205,7 @@ int status_ctx_init (hashcat_ctx_t *hashcat_ctx)
status_ctx->shutdown_outer = false; status_ctx->shutdown_outer = false;
status_ctx->checkpoint_shutdown = false; status_ctx->checkpoint_shutdown = false;
status_ctx->finish_shutdown = false;
status_ctx->hashcat_status_final = (hashcat_status_t *) hcmalloc (sizeof (hashcat_status_t)); status_ctx->hashcat_status_final = (hashcat_status_t *) hcmalloc (sizeof (hashcat_status_t));

@ -18,8 +18,8 @@
static const size_t TERMINAL_LINE_LENGTH = 79; static const size_t TERMINAL_LINE_LENGTH = 79;
static const char *PROMPT_ACTIVE = "[s]tatus [p]ause [b]ypass [c]heckpoint [q]uit => "; static const char *PROMPT_ACTIVE = "[s]tatus [p]ause [b]ypass [c]heckpoint [f]inish [q]uit => ";
static const char *PROMPT_PAUSED = "[s]tatus [r]esume [b]ypass [c]heckpoint [q]uit => "; static const char *PROMPT_PAUSED = "[s]tatus [r]esume [b]ypass [c]heckpoint [f]inish [q]uit => ";
void welcome_screen (hashcat_ctx_t *hashcat_ctx, const char *version_tag) void welcome_screen (hashcat_ctx_t *hashcat_ctx, const char *version_tag)
{ {
@ -292,6 +292,27 @@ static void keypress (hashcat_ctx_t *hashcat_ctx)
break; break;
case 'f':
event_log_info (hashcat_ctx, NULL);
finish_after_attack (hashcat_ctx);
if (status_ctx->finish_shutdown == true)
{
event_log_info (hashcat_ctx, "Finish enabled. Will quit after this attack.");
}
else
{
event_log_info (hashcat_ctx, "Finish disabled. Will continue after this attack.");
}
event_log_info (hashcat_ctx, NULL);
if (quiet == false) send_prompt (hashcat_ctx);
break;
case 'q': case 'q':
event_log_info (hashcat_ctx, NULL); event_log_info (hashcat_ctx, NULL);

@ -144,6 +144,21 @@ int myabort_checkpoint (hashcat_ctx_t *hashcat_ctx)
return 0; return 0;
} }
int myabort_finish (hashcat_ctx_t *hashcat_ctx)
{
status_ctx_t *status_ctx = hashcat_ctx->status_ctx;
status_ctx->devices_status = STATUS_ABORTED_FINISH;
status_ctx->run_main_level1 = false;
status_ctx->run_main_level2 = false;
status_ctx->run_main_level3 = false;
status_ctx->run_thread_level1 = false;
status_ctx->run_thread_level2 = false;
return 0;
}
int myabort_runtime (hashcat_ctx_t *hashcat_ctx) int myabort_runtime (hashcat_ctx_t *hashcat_ctx)
{ {
status_ctx_t *status_ctx = hashcat_ctx->status_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx;
@ -209,6 +224,9 @@ int bypass (hashcat_ctx_t *hashcat_ctx)
status_ctx->run_thread_level1 = false; status_ctx->run_thread_level1 = false;
status_ctx->run_thread_level2 = false; status_ctx->run_thread_level2 = false;
status_ctx->checkpoint_shutdown = false;
status_ctx->finish_shutdown = false;
return 0; return 0;
} }
@ -242,7 +260,7 @@ int ResumeThreads (hashcat_ctx_t *hashcat_ctx)
int stop_at_checkpoint (hashcat_ctx_t *hashcat_ctx) int stop_at_checkpoint (hashcat_ctx_t *hashcat_ctx)
{ {
status_ctx_t *status_ctx = hashcat_ctx->status_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx;
if (status_ctx->devices_status != STATUS_RUNNING) return -1; if (status_ctx->devices_status != STATUS_RUNNING) return -1;
@ -282,3 +300,35 @@ int stop_at_checkpoint (hashcat_ctx_t *hashcat_ctx)
return 0; return 0;
} }
int finish_after_attack (hashcat_ctx_t *hashcat_ctx)
{
status_ctx_t *status_ctx = hashcat_ctx->status_ctx;
if (status_ctx->devices_status != STATUS_RUNNING) return -1;
// Enable or Disable
if (status_ctx->finish_shutdown == false)
{
status_ctx->finish_shutdown = true;
status_ctx->run_main_level1 = false;
status_ctx->run_main_level2 = false;
status_ctx->run_main_level3 = false;
status_ctx->run_thread_level1 = true;
status_ctx->run_thread_level2 = true;
}
else
{
status_ctx->finish_shutdown = false;
status_ctx->run_main_level1 = true;
status_ctx->run_main_level2 = true;
status_ctx->run_main_level3 = true;
status_ctx->run_thread_level1 = true;
status_ctx->run_thread_level2 = true;
}
return 0;
}

Loading…
Cancel
Save