2023-03-15 20:22:10 +00:00
/**
* Author . . . . . . : See docs / credits . txt
* License . . . . . : MIT
2023-03-15 20:33:19 +00:00
*
* Note that this module is intended to crack only the master passphrase of a SecureCRT config stored in the 2 : format ( versions < 9.3 )
* See https : //github.com/HyperSine/how-does-SecureCRT-encrypt-password for decrypting passwords after you've cracked the master passphrase (or if there is no master passphrase)
2023-03-15 20:22:10 +00:00
*/
# include "common.h"
# include "types.h"
# include "modules.h"
# include "bitops.h"
# include "convert.h"
# include "shared.h"
static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL ;
static const u32 DGST_POS0 = 0 ;
static const u32 DGST_POS1 = 1 ;
static const u32 DGST_POS2 = 2 ;
static const u32 DGST_POS3 = 3 ;
2023-03-18 23:16:01 +00:00
static const u32 DGST_SIZE = DGST_SIZE_4_4 ;
2023-03-20 11:22:34 +00:00
static const u32 HASH_CATEGORY = HASH_CATEGORY_APPLICATION_DATABASE ;
2023-03-15 20:33:19 +00:00
static const char * HASH_NAME = " SecureCRT MasterPassphrase v2 " ;
2023-03-15 20:22:10 +00:00
static const u64 KERN_TYPE = 31400 ;
static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE
| OPTI_TYPE_PRECOMPUTE_INIT
| OPTI_TYPE_EARLY_SKIP
| OPTI_TYPE_NOT_ITERATED
| OPTI_TYPE_NOT_SALTED
| OPTI_TYPE_RAW_HASH ;
static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE
| OPTS_TYPE_HASH_COPY
| OPTS_TYPE_PT_ADD80
| OPTS_TYPE_PT_ADDBITS15 ;
static const u32 SALT_TYPE = SALT_TYPE_NONE ;
static const char * ST_PASS = " hashcat " ;
static const char * ST_HASH = " S: \" Config Passphrase \" =02:ded7137400e0a1004a12f1708453968ccc270908ba02ab0345c83690d1de3d9937587be66ad2a7fe8cc6cb16ecff02e61ac05e09d4f49f284efd24f6b16d6ae3 " ;
u32 module_attack_exec ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return ATTACK_EXEC ; }
u32 module_dgst_pos0 ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return DGST_POS0 ; }
u32 module_dgst_pos1 ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return DGST_POS1 ; }
u32 module_dgst_pos2 ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return DGST_POS2 ; }
u32 module_dgst_pos3 ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return DGST_POS3 ; }
u32 module_dgst_size ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return DGST_SIZE ; }
u32 module_hash_category ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return HASH_CATEGORY ; }
const char * module_hash_name ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return HASH_NAME ; }
u64 module_kern_type ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return KERN_TYPE ; }
u32 module_opti_type ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return OPTI_TYPE ; }
u64 module_opts_type ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return OPTS_TYPE ; }
u32 module_salt_type ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return SALT_TYPE ; }
const char * module_st_hash ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return ST_HASH ; }
const char * module_st_pass ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const user_options_t * user_options , MAYBE_UNUSED const user_options_extra_t * user_options_extra ) { return ST_PASS ; }
int module_hash_decode ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED void * digest_buf , MAYBE_UNUSED salt_t * salt , MAYBE_UNUSED void * esalt_buf , MAYBE_UNUSED void * hook_salt_buf , MAYBE_UNUSED hashinfo_t * hash_info , const char * line_buf , MAYBE_UNUSED const int line_len )
{
2023-03-18 23:16:01 +00:00
static const char * CONFIGPASSPHRASEV2_SIGNATURE = " S: \" Config Passphrase \" =02: " ; //The whole line is part of the format to prevent confusion with other similiar tokens also prefixed with 02: in the config files
2023-03-15 20:22:10 +00:00
static const char * CONFIGPASSPHRASEV2_SIGNATURE_UNDERSCORE = " S:_Config_Passphrase_=02: " ; //double quotes char messes up testing so we're also allowing underscore instead
u32 * digest = ( u32 * ) digest_buf ;
hc_token_t token ;
token . token_cnt = 2 ;
token . signatures_cnt = 2 ;
token . signatures_buf [ 0 ] = CONFIGPASSPHRASEV2_SIGNATURE ;
token . signatures_buf [ 1 ] = CONFIGPASSPHRASEV2_SIGNATURE_UNDERSCORE ;
token . len [ 0 ] = 25 ;
token . attr [ 0 ] = TOKEN_ATTR_FIXED_LENGTH
| TOKEN_ATTR_VERIFY_SIGNATURE ;
token . len_min [ 1 ] = 96 ;
token . len_max [ 1 ] = 160 ;
token . attr [ 1 ] = TOKEN_ATTR_VERIFY_LENGTH
| TOKEN_ATTR_VERIFY_HEX ;
const int rc_tokenizer = input_tokenizer ( ( const u8 * ) line_buf , line_len , & token ) ;
if ( rc_tokenizer ! = PARSER_OK ) return ( rc_tokenizer ) ;
const u8 * hash_pos = token . buf [ 1 ] ;
digest [ 0 ] = hex_to_u32 ( hash_pos + 0 ) ;
digest [ 1 ] = hex_to_u32 ( hash_pos + 8 ) ;
digest [ 2 ] = hex_to_u32 ( hash_pos + 16 ) ;
digest [ 3 ] = hex_to_u32 ( hash_pos + 24 ) ;
digest [ 0 ] = byte_swap_32 ( digest [ 0 ] ) ;
digest [ 1 ] = byte_swap_32 ( digest [ 1 ] ) ;
digest [ 2 ] = byte_swap_32 ( digest [ 2 ] ) ;
digest [ 3 ] = byte_swap_32 ( digest [ 3 ] ) ;
return ( PARSER_OK ) ;
}
int module_hash_encode ( MAYBE_UNUSED const hashconfig_t * hashconfig , MAYBE_UNUSED const void * digest_buf , MAYBE_UNUSED const salt_t * salt , MAYBE_UNUSED const void * esalt_buf , MAYBE_UNUSED const void * hook_salt_buf , MAYBE_UNUSED const hashinfo_t * hash_info , char * line_buf , MAYBE_UNUSED const int line_size )
{
const int line_len = snprintf ( line_buf , line_size , " %s " , hash_info - > orighash ) ;
return line_len ;
}
void module_init ( module_ctx_t * module_ctx )
{
module_ctx - > module_context_size = MODULE_CONTEXT_SIZE_CURRENT ;
module_ctx - > module_interface_version = MODULE_INTERFACE_VERSION_CURRENT ;
module_ctx - > module_attack_exec = module_attack_exec ;
module_ctx - > module_benchmark_esalt = MODULE_DEFAULT ;
module_ctx - > module_benchmark_hook_salt = MODULE_DEFAULT ;
module_ctx - > module_benchmark_mask = MODULE_DEFAULT ;
module_ctx - > module_benchmark_charset = MODULE_DEFAULT ;
module_ctx - > module_benchmark_salt = MODULE_DEFAULT ;
module_ctx - > module_build_plain_postprocess = MODULE_DEFAULT ;
module_ctx - > module_deep_comp_kernel = MODULE_DEFAULT ;
module_ctx - > module_deprecated_notice = MODULE_DEFAULT ;
module_ctx - > module_dgst_pos0 = module_dgst_pos0 ;
module_ctx - > module_dgst_pos1 = module_dgst_pos1 ;
module_ctx - > module_dgst_pos2 = module_dgst_pos2 ;
module_ctx - > module_dgst_pos3 = module_dgst_pos3 ;
module_ctx - > module_dgst_size = module_dgst_size ;
module_ctx - > module_dictstat_disable = MODULE_DEFAULT ;
module_ctx - > module_esalt_size = MODULE_DEFAULT ;
module_ctx - > module_extra_buffer_size = MODULE_DEFAULT ;
module_ctx - > module_extra_tmp_size = MODULE_DEFAULT ;
module_ctx - > module_extra_tuningdb_block = MODULE_DEFAULT ;
module_ctx - > module_forced_outfile_format = MODULE_DEFAULT ;
module_ctx - > module_hash_binary_count = MODULE_DEFAULT ;
module_ctx - > module_hash_binary_parse = MODULE_DEFAULT ;
module_ctx - > module_hash_binary_save = MODULE_DEFAULT ;
module_ctx - > module_hash_decode_postprocess = MODULE_DEFAULT ;
module_ctx - > module_hash_decode_potfile = MODULE_DEFAULT ;
module_ctx - > module_hash_decode_zero_hash = MODULE_DEFAULT ;
module_ctx - > module_hash_decode = module_hash_decode ;
module_ctx - > module_hash_encode_status = MODULE_DEFAULT ;
module_ctx - > module_hash_encode_potfile = MODULE_DEFAULT ;
module_ctx - > module_hash_encode = module_hash_encode ;
module_ctx - > module_hash_init_selftest = MODULE_DEFAULT ;
module_ctx - > module_hash_mode = MODULE_DEFAULT ;
module_ctx - > module_hash_category = module_hash_category ;
module_ctx - > module_hash_name = module_hash_name ;
module_ctx - > module_hashes_count_min = MODULE_DEFAULT ;
module_ctx - > module_hashes_count_max = MODULE_DEFAULT ;
module_ctx - > module_hlfmt_disable = MODULE_DEFAULT ;
module_ctx - > module_hook_extra_param_size = MODULE_DEFAULT ;
module_ctx - > module_hook_extra_param_init = MODULE_DEFAULT ;
module_ctx - > module_hook_extra_param_term = MODULE_DEFAULT ;
module_ctx - > module_hook12 = MODULE_DEFAULT ;
module_ctx - > module_hook23 = MODULE_DEFAULT ;
module_ctx - > module_hook_salt_size = MODULE_DEFAULT ;
module_ctx - > module_hook_size = MODULE_DEFAULT ;
module_ctx - > module_jit_build_options = MODULE_DEFAULT ;
module_ctx - > module_jit_cache_disable = MODULE_DEFAULT ;
module_ctx - > module_kernel_accel_max = MODULE_DEFAULT ;
module_ctx - > module_kernel_accel_min = MODULE_DEFAULT ;
module_ctx - > module_kernel_loops_max = MODULE_DEFAULT ;
module_ctx - > module_kernel_loops_min = MODULE_DEFAULT ;
module_ctx - > module_kernel_threads_max = MODULE_DEFAULT ;
module_ctx - > module_kernel_threads_min = MODULE_DEFAULT ;
module_ctx - > module_kern_type = module_kern_type ;
module_ctx - > module_kern_type_dynamic = MODULE_DEFAULT ;
module_ctx - > module_opti_type = module_opti_type ;
module_ctx - > module_opts_type = module_opts_type ;
module_ctx - > module_outfile_check_disable = MODULE_DEFAULT ;
module_ctx - > module_outfile_check_nocomp = MODULE_DEFAULT ;
module_ctx - > module_potfile_custom_check = MODULE_DEFAULT ;
module_ctx - > module_potfile_disable = MODULE_DEFAULT ;
module_ctx - > module_potfile_keep_all_hashes = MODULE_DEFAULT ;
module_ctx - > module_pwdump_column = MODULE_DEFAULT ;
module_ctx - > module_pw_max = MODULE_DEFAULT ;
module_ctx - > module_pw_min = MODULE_DEFAULT ;
module_ctx - > module_salt_max = MODULE_DEFAULT ;
module_ctx - > module_salt_min = MODULE_DEFAULT ;
module_ctx - > module_salt_type = module_salt_type ;
module_ctx - > module_separator = MODULE_DEFAULT ;
module_ctx - > module_st_hash = module_st_hash ;
module_ctx - > module_st_pass = module_st_pass ;
module_ctx - > module_tmp_size = MODULE_DEFAULT ;
module_ctx - > module_unstable_warning = MODULE_DEFAULT ;
module_ctx - > module_warmup_disable = MODULE_DEFAULT ;
}