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 ;
2023-04-27 16:16:07 +00:00
static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE ; // OPTS_TYPE_PT_ADD80 and OPTS_TYPE_PT_ADDBITS15 added within kernel
2023-03-23 18:20:06 +00:00
static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED ;
2023-03-15 20:22:10 +00:00
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 ; }
2023-03-23 18:20:06 +00:00
typedef struct scrtv2
{
u32 ct_buf [ 64 ] ;
int ct_len ;
} scrtv2_t ;
2023-07-27 16:11:55 +00:00
static const char * CONFIGPASSPHRASEV2_SIGNATURE = " S: \" Config Passphrase \" =02: " ; //The whole line is part of the format to prevent confusion with other similar tokens also prefixed with 02: in the config files
2023-03-23 18:20:06 +00:00
u64 module_esalt_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 )
2023-03-15 20:22:10 +00:00
{
2023-03-23 18:20:06 +00:00
const u64 esalt_size = ( const u64 ) sizeof ( scrtv2_t ) ;
2023-03-15 20:22:10 +00:00
2023-03-23 18:20:06 +00:00
return esalt_size ;
}
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-15 20:22:10 +00:00
u32 * digest = ( u32 * ) digest_buf ;
2023-03-23 18:20:06 +00:00
scrtv2_t * scrtv2 = ( scrtv2_t * ) esalt_buf ;
2023-03-15 20:22:10 +00:00
hc_token_t token ;
2023-04-11 17:34:01 +00:00
memset ( & token , 0 , sizeof ( hc_token_t ) ) ;
2023-03-15 20:22:10 +00:00
token . token_cnt = 2 ;
2023-03-23 18:20:06 +00:00
token . signatures_cnt = 1 ;
2023-03-15 20:22:10 +00:00
token . signatures_buf [ 0 ] = CONFIGPASSPHRASEV2_SIGNATURE ;
token . len [ 0 ] = 25 ;
token . attr [ 0 ] = TOKEN_ATTR_FIXED_LENGTH
| TOKEN_ATTR_VERIFY_SIGNATURE ;
token . len_min [ 1 ] = 96 ;
2023-04-27 16:16:07 +00:00
token . len_max [ 1 ] = 224 ;
2023-03-15 20:22:10 +00:00
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 ) ;
2023-03-23 18:20:06 +00:00
// some fake salt so we can have an esalt
2023-03-15 20:22:10 +00:00
2023-03-23 18:20:06 +00:00
salt - > salt_buf [ 0 ] = 0 ;
salt - > salt_len = 4 ;
const int ct_len = token . len [ 1 ] ;
const u8 * ct_pos = token . buf [ 1 ] ;
scrtv2 - > ct_len = hex_decode ( ct_pos , ct_len , ( u8 * ) scrtv2 - > ct_buf ) ;
// hash
digest [ 0 ] = hex_to_u32 ( ct_pos + 0 ) ;
digest [ 1 ] = hex_to_u32 ( ct_pos + 8 ) ;
digest [ 2 ] = hex_to_u32 ( ct_pos + 16 ) ;
digest [ 3 ] = hex_to_u32 ( ct_pos + 24 ) ;
2023-03-15 20:22:10 +00:00
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 )
{
2023-03-23 18:20:06 +00:00
const scrtv2_t * scrtv2 = ( const scrtv2_t * ) esalt_buf ;
u8 * out_buf = ( u8 * ) line_buf ;
int out_len = snprintf ( line_buf , line_size , " %s " , CONFIGPASSPHRASEV2_SIGNATURE ) ;
out_len + = hex_encode ( ( u8 * ) scrtv2 - > ct_buf , scrtv2 - > ct_len , out_buf + out_len ) ;
return out_len ;
2023-03-15 20:22:10 +00:00
}
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 ;
2023-03-23 18:20:06 +00:00
module_ctx - > module_esalt_size = module_esalt_size ;
2023-03-15 20:22:10 +00:00
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 ;
}