Initial commit
This commit is contained in:
+21
-2
@@ -136,7 +136,7 @@ double TARGET_MS_PROFILE[3] = { 8, 16, 96 };
|
||||
|
||||
#define MAX_DICTSTAT 10000
|
||||
|
||||
#define NUM_DEFAULT_BENCHMARK_ALGORITHMS 130
|
||||
#define NUM_DEFAULT_BENCHMARK_ALGORITHMS 131
|
||||
|
||||
#define global_free(attr) \
|
||||
{ \
|
||||
@@ -182,6 +182,7 @@ static uint default_benchmark_algorithms[NUM_DEFAULT_BENCHMARK_ALGORITHMS] =
|
||||
5600,
|
||||
7300,
|
||||
7500,
|
||||
13100,
|
||||
8300,
|
||||
11100,
|
||||
11200,
|
||||
@@ -577,6 +578,7 @@ const char *USAGE_BIG[] =
|
||||
" 11100 = PostgreSQL Challenge-Response Authentication (MD5)",
|
||||
" 11200 = MySQL Challenge-Response Authentication (SHA1)",
|
||||
" 11400 = SIP digest authentication (MD5)",
|
||||
" 13100 = Kerberos 5 TGS-REP etype 23",
|
||||
"",
|
||||
"[[ Forums, CMS, E-Commerce, Frameworks, Middleware, Wiki, Management ]]",
|
||||
"",
|
||||
@@ -6109,7 +6111,7 @@ int main (int argc, char **argv)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (hash_mode_chgd && hash_mode > 13000) // just added to remove compiler warnings for hash_mode_chgd
|
||||
if (hash_mode_chgd && hash_mode > 13100) // just added to remove compiler warnings for hash_mode_chgd
|
||||
{
|
||||
log_error ("ERROR: Invalid hash-type specified");
|
||||
|
||||
@@ -10357,6 +10359,22 @@ int main (int argc, char **argv)
|
||||
dgst_pos3 = 3;
|
||||
break;
|
||||
|
||||
case 13100: hash_type = HASH_TYPE_KRB5TGS;
|
||||
salt_type = SALT_TYPE_EMBEDDED;
|
||||
attack_exec = ATTACK_EXEC_INSIDE_KERNEL;
|
||||
opts_type = OPTS_TYPE_PT_GENERATE_LE;
|
||||
kern_type = KERN_TYPE_KRB5TGS;
|
||||
dgst_size = DGST_SIZE_4_4;
|
||||
parse_func = krb5tgs_parse_hash;
|
||||
sort_by_digest = sort_by_digest_4_4;
|
||||
opti_type = OPTI_TYPE_ZERO_BYTE
|
||||
| OPTI_TYPE_NOT_ITERATED;
|
||||
dgst_pos0 = 0;
|
||||
dgst_pos1 = 1;
|
||||
dgst_pos2 = 2;
|
||||
dgst_pos3 = 3;
|
||||
break;
|
||||
|
||||
default: usage_mini_print (PROGNAME); return (-1);
|
||||
}
|
||||
|
||||
@@ -10460,6 +10478,7 @@ int main (int argc, char **argv)
|
||||
case 12000: esalt_size = sizeof (pbkdf2_sha1_t); break;
|
||||
case 12100: esalt_size = sizeof (pbkdf2_sha512_t); break;
|
||||
case 13000: esalt_size = sizeof (rar5_t); break;
|
||||
case 13100: esalt_size = sizeof (krb5tgs_t); break;
|
||||
}
|
||||
|
||||
data.esalt_size = esalt_size;
|
||||
|
||||
+127
@@ -5834,6 +5834,7 @@ char *strhashtype (const uint hash_mode)
|
||||
case 12800: return ((char *) HT_12800); break;
|
||||
case 12900: return ((char *) HT_12900); break;
|
||||
case 13000: return ((char *) HT_13000); break;
|
||||
case 13100: return ((char *) HT_13100); break;
|
||||
}
|
||||
|
||||
return ((char *) "Unknown");
|
||||
@@ -8278,6 +8279,36 @@ void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
|
||||
byte_swap_32 (digest_buf[1])
|
||||
);
|
||||
}
|
||||
else if (hash_mode == 13100)
|
||||
{
|
||||
krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
|
||||
|
||||
krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
|
||||
|
||||
u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
|
||||
u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
|
||||
|
||||
char data[256] = { 0 };
|
||||
|
||||
char *ptr_data = data;
|
||||
|
||||
for (uint i = 0; i < 16; i++, ptr_data += 2)
|
||||
sprintf (ptr_data, "%02x", ptr_checksum[i]);
|
||||
|
||||
/* skip '$' */
|
||||
ptr_data++;
|
||||
|
||||
for (uint i = 0; i < 32; i++, ptr_data += 2)
|
||||
sprintf (ptr_data, "%02x", ptr_edata2[i]);
|
||||
|
||||
*ptr_data = 0;
|
||||
|
||||
snprintf (out_buf, len-1, "%s$%s$%s$%s",
|
||||
SIGNATURE_KRB5TGS,
|
||||
(char *) krb5tgs->account_info,
|
||||
data,
|
||||
data + 33);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (hash_type == HASH_TYPE_MD4)
|
||||
@@ -18671,6 +18702,102 @@ int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
|
||||
return (PARSER_OK);
|
||||
}
|
||||
|
||||
int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
|
||||
{
|
||||
if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
|
||||
|
||||
if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
|
||||
|
||||
u32 *digest = (u32 *) hash_buf->digest;
|
||||
|
||||
salt_t *salt = hash_buf->salt;
|
||||
|
||||
krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
|
||||
|
||||
/**
|
||||
* parse line
|
||||
*/
|
||||
|
||||
/* Skip '$' */
|
||||
char *account_pos = input_buf + 11 + 1;
|
||||
|
||||
char *data_pos;
|
||||
|
||||
uint data_len;
|
||||
|
||||
if (account_pos[0] == '*')
|
||||
{
|
||||
account_pos++;
|
||||
|
||||
data_pos = strchr (account_pos, '*');
|
||||
|
||||
/* Skip '*' */
|
||||
data_pos++;
|
||||
|
||||
if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
|
||||
|
||||
uint account_len = data_pos - account_pos + 1;
|
||||
|
||||
if (account_len >= 512) return (PARSER_SALT_LENGTH);
|
||||
|
||||
/* Skip '$' */
|
||||
data_pos++;
|
||||
|
||||
data_len = input_len - 11 - 1 - account_len - 2;
|
||||
|
||||
memcpy (krb5tgs->account_info, account_pos - 1, account_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* assume $krb5tgs$23$checksum$edata2 */
|
||||
data_pos = account_pos;
|
||||
|
||||
memcpy (krb5tgs->account_info, "**", 3);
|
||||
|
||||
data_len = input_len - 11 - 1 - 1;
|
||||
}
|
||||
|
||||
if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
|
||||
|
||||
char *checksum_ptr = (char *) krb5tgs->checksum;
|
||||
|
||||
for (uint i = 0; i < 16 * 2; i += 2)
|
||||
{
|
||||
const char p0 = data_pos[i + 0];
|
||||
const char p1 = data_pos[i + 1];
|
||||
|
||||
*checksum_ptr++ = hex_convert (p1) << 0
|
||||
| hex_convert (p0) << 4;
|
||||
}
|
||||
|
||||
char *edata_ptr = (char *) krb5tgs->edata2;
|
||||
|
||||
/* skip '$' */
|
||||
for (uint i = 16 * 2 + 1; i < input_len; i += 2)
|
||||
{
|
||||
const char p0 = data_pos[i + 0];
|
||||
const char p1 = data_pos[i + 1];
|
||||
*edata_ptr++ = hex_convert (p1) << 0
|
||||
| hex_convert (p0) << 4;
|
||||
}
|
||||
|
||||
krb5tgs->edata2_len = strlen(edata_ptr - input_len)/(2 * 4);
|
||||
|
||||
salt->salt_buf[0] = krb5tgs->checksum[0];
|
||||
salt->salt_buf[1] = krb5tgs->checksum[1];
|
||||
salt->salt_buf[2] = krb5tgs->checksum[2];
|
||||
salt->salt_buf[3] = krb5tgs->checksum[3];
|
||||
|
||||
salt->salt_len = 32;
|
||||
|
||||
digest[0] = krb5tgs->checksum[0];
|
||||
digest[1] = krb5tgs->checksum[1];
|
||||
digest[2] = krb5tgs->checksum[2];
|
||||
digest[3] = krb5tgs->checksum[3];
|
||||
|
||||
return (PARSER_OK);
|
||||
}
|
||||
|
||||
int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
|
||||
{
|
||||
if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
|
||||
|
||||
Reference in New Issue
Block a user