mirror of
https://github.com/hashcat/hashcat.git
synced 2025-01-22 05:31:11 +00:00
Rename 23911 to 10901 and populate salt->salt_buf[]
This commit is contained in:
parent
a18ba9fde6
commit
ef47811c9d
@ -53,6 +53,7 @@
|
||||
- Added hash-mode: QNX /etc/shadow (MD5)
|
||||
- Added hash-mode: QNX /etc/shadow (SHA256)
|
||||
- Added hash-mode: QNX /etc/shadow (SHA512)
|
||||
- Added hash-mode: RedHat 389-DS LDAP (PBKDF2-HMAC-SHA256)
|
||||
- Added hash-mode: Ruby on Rails Restful-Authentication
|
||||
- Added hash-mode: sha1(md5(md5($pass)))
|
||||
- Added hash-mode: sha1(md5($pass.$salt))
|
||||
|
@ -220,6 +220,7 @@ NVIDIA GPUs require "NVIDIA Driver" (418.56 or later) and "CUDA Toolkit" (9.0 or
|
||||
- CRAM-MD5 Dovecot
|
||||
- SSHA-256(Base64), LDAP {SSHA256}
|
||||
- SSHA-512(Base64), LDAP {SSHA512}
|
||||
- RedHat 389-DS LDAP (PBKDF2-HMAC-SHA256)
|
||||
- FileZilla Server >= 0.9.55
|
||||
- ColdFusion 10+
|
||||
- Apache $apr1$ MD5, md5apr1, MD5 (APR)
|
||||
|
@ -25,11 +25,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE
|
||||
static const u64 OPTS_TYPE = OPTS_TYPE_PT_GENERATE_LE;
|
||||
static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED;
|
||||
static const char *ST_PASS = "hashcat";
|
||||
static const char *ST_HASH = "{PBKDF2_SHA256}AACkEGhlaiBqZW5z/jtuSox0CrtV9SHiVFjYeHpQ/ki2kwDrQeSqiiTn8LOmpPCw3r6TK/JDfl+ZAXRoc3VidGxldHllIXuxBDl6ItQOMupkRn+hzi/LEdr62a7B9sNOo8BPL9Z2nOi/m9AI+nAd/qwpLD1fbeDgs2DdpCZ4QfljuCLRBdURZV3HcXDUjD7PZ1CQcIOv9VbFlbu0IBmiU7ccMyb/qoxi+rPMqE4U8f6hL0TQjTjlOzU9MpPYS+WfztpYy7lEN6QghhOz0xe+0y2rDoK+yCS4PykkNS4FFc+xeiT6SNy3r7m+0teyaQKOExLrjogWkj+t+e4bMpHNx/FL3jkjCsuZnhq/t8eshG9DKmeD9b/QMkqT8dxe0jmr0s4+GnmHpMQMAxYW3pg70TluiDp3kJrDr1/d8OQerkQRevNx";
|
||||
|
||||
static const u32 HASH_LEN_RAW = 256;
|
||||
static const u32 SALT_LEN_RAW = 64;
|
||||
static const u32 ITER_LEN_RAW = 4;
|
||||
static const char *ST_HASH = "{PBKDF2_SHA256}AAAgADkxMjM2NTIzMzgzMjQ3MjI4MDAwNTk5OTAyOTk4NDI2MjkyMzAzNjg0NjQwOTMxNjI3OTMzNjg0MDI0OTY5NTe5ULagRTYpLaUoeqJMg8x9W/DXu+9VTFaVhaYvebYrY+sOqn1ZMRnws22C1uAkiE2tFM8qN+xw5xe7OmCPZ203NuruK4oB33QlsKIEz4ppm0TR94JB9PJx7lIQwFHD3FUNUNryj4jk6UYyJ4+V1Z9Ug/Iy/ylQBJgfs5ihzgxHYZrfp1wUCXFzlZG9mxmziPm8VFnAhaX4+FBAZvLAx33jpbKOwEg7TmwP2VJ8BNFLQRqwYdlqIjQlAhncXH+dqIF9VdM4MonAA0hx76bMvFTP7LF5VO1IqVmcuYz7YG9v4KKRjnvoUUqOj6okUBQTay3EzsdFVnUW1FemYOccJd5q";
|
||||
|
||||
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; }
|
||||
@ -64,6 +60,10 @@ typedef struct pbkdf2_sha256_tmp
|
||||
|
||||
static const char *SIGNATURE_REDHAT_PBKDF2_SHA256 = "{PBKDF2_SHA256}";
|
||||
|
||||
static const int HASH_LEN_RAW = 256;
|
||||
static const int SALT_LEN_RAW = 64;
|
||||
static const int ITER_LEN_RAW = 4;
|
||||
|
||||
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)
|
||||
{
|
||||
const u64 esalt_size = (const u64) sizeof (pbkdf2_sha256_t);
|
||||
@ -106,7 +106,6 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE
|
||||
//length of base64 encoded hash
|
||||
token.len_min[1] = 432;
|
||||
token.len_max[1] = 432;
|
||||
|
||||
token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH
|
||||
| TOKEN_ATTR_VERIFY_BASE64A;
|
||||
|
||||
@ -119,103 +118,43 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE
|
||||
const u8 *tmp_pos = token.buf[1];
|
||||
const int tmp_len = token.len[1];
|
||||
|
||||
u8 tmp_buf[324];
|
||||
u8 tmp_buf[512];
|
||||
|
||||
memset (tmp_buf, 0, sizeof (tmp_buf));
|
||||
|
||||
const int base64_decode_len = base64_decode (base64_to_int, tmp_pos, tmp_len, tmp_buf);
|
||||
|
||||
if (base64_decode_len != (4 + 64 + 256)) return (PARSER_HASH_LENGTH);
|
||||
if (base64_decode_len != (ITER_LEN_RAW + SALT_LEN_RAW + HASH_LEN_RAW)) return (PARSER_HASH_LENGTH);
|
||||
|
||||
// iter
|
||||
|
||||
u8 *iter_pos = tmp_buf;
|
||||
|
||||
uint32_t iters[4] = {0};
|
||||
u32 salt_iter;
|
||||
|
||||
memcpy (iters, iter_pos, ITER_LEN_RAW);
|
||||
memcpy (&salt_iter, iter_pos, ITER_LEN_RAW);
|
||||
|
||||
// implementation does a ntohl(*iters)
|
||||
salt->salt_iter = byte_swap_32(*iters) - 1;
|
||||
salt_iter = byte_swap_32 (salt_iter); // implementation does a ntohl()
|
||||
|
||||
salt->salt_iter = salt_iter - 1;
|
||||
|
||||
// salt
|
||||
|
||||
u8 *salt_pos = tmp_buf + ITER_LEN_RAW;
|
||||
|
||||
salt->salt_len = SALT_LEN_RAW;
|
||||
salt->salt_len = SALT_LEN_RAW;
|
||||
|
||||
u8 *salt_buf_ptr = (u8 *) pbkdf2_sha256->salt_buf;
|
||||
memcpy (salt_buf_ptr, salt_pos, SALT_LEN_RAW);
|
||||
memcpy (pbkdf2_sha256->salt_buf, salt_pos, SALT_LEN_RAW);
|
||||
|
||||
for (int i = 0; i < SALT_LEN_RAW / 4; i++) salt->salt_buf[i] = pbkdf2_sha256->salt_buf[i];
|
||||
|
||||
// hash
|
||||
|
||||
u8 *hash_pos = tmp_buf + ITER_LEN_RAW + SALT_LEN_RAW;
|
||||
memcpy(digest, hash_pos, HASH_LEN_RAW);
|
||||
|
||||
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]);
|
||||
digest[4] = byte_swap_32 (digest[4]);
|
||||
digest[5] = byte_swap_32 (digest[5]);
|
||||
digest[6] = byte_swap_32 (digest[6]);
|
||||
digest[7] = byte_swap_32 (digest[7]);
|
||||
digest[8] = byte_swap_32 (digest[8]);
|
||||
digest[9] = byte_swap_32 (digest[9]);
|
||||
digest[10] = byte_swap_32 (digest[10]);
|
||||
digest[11] = byte_swap_32 (digest[11]);
|
||||
digest[12] = byte_swap_32 (digest[12]);
|
||||
digest[13] = byte_swap_32 (digest[13]);
|
||||
digest[14] = byte_swap_32 (digest[14]);
|
||||
digest[15] = byte_swap_32 (digest[15]);
|
||||
digest[16] = byte_swap_32 (digest[16]);
|
||||
digest[17] = byte_swap_32 (digest[17]);
|
||||
digest[18] = byte_swap_32 (digest[18]);
|
||||
digest[19] = byte_swap_32 (digest[19]);
|
||||
digest[20] = byte_swap_32 (digest[20]);
|
||||
digest[21] = byte_swap_32 (digest[21]);
|
||||
digest[22] = byte_swap_32 (digest[22]);
|
||||
digest[23] = byte_swap_32 (digest[23]);
|
||||
digest[24] = byte_swap_32 (digest[24]);
|
||||
digest[25] = byte_swap_32 (digest[25]);
|
||||
digest[26] = byte_swap_32 (digest[26]);
|
||||
digest[27] = byte_swap_32 (digest[27]);
|
||||
digest[28] = byte_swap_32 (digest[28]);
|
||||
digest[29] = byte_swap_32 (digest[29]);
|
||||
digest[30] = byte_swap_32 (digest[30]);
|
||||
digest[31] = byte_swap_32 (digest[31]);
|
||||
digest[32] = byte_swap_32 (digest[32]);
|
||||
digest[33] = byte_swap_32 (digest[33]);
|
||||
digest[34] = byte_swap_32 (digest[34]);
|
||||
digest[35] = byte_swap_32 (digest[35]);
|
||||
digest[36] = byte_swap_32 (digest[36]);
|
||||
digest[37] = byte_swap_32 (digest[37]);
|
||||
digest[38] = byte_swap_32 (digest[38]);
|
||||
digest[39] = byte_swap_32 (digest[39]);
|
||||
digest[40] = byte_swap_32 (digest[40]);
|
||||
digest[41] = byte_swap_32 (digest[41]);
|
||||
digest[42] = byte_swap_32 (digest[42]);
|
||||
digest[43] = byte_swap_32 (digest[43]);
|
||||
digest[44] = byte_swap_32 (digest[44]);
|
||||
digest[45] = byte_swap_32 (digest[45]);
|
||||
digest[46] = byte_swap_32 (digest[46]);
|
||||
digest[47] = byte_swap_32 (digest[47]);
|
||||
digest[48] = byte_swap_32 (digest[48]);
|
||||
digest[49] = byte_swap_32 (digest[49]);
|
||||
digest[50] = byte_swap_32 (digest[50]);
|
||||
digest[51] = byte_swap_32 (digest[51]);
|
||||
digest[52] = byte_swap_32 (digest[52]);
|
||||
digest[53] = byte_swap_32 (digest[53]);
|
||||
digest[54] = byte_swap_32 (digest[54]);
|
||||
digest[55] = byte_swap_32 (digest[55]);
|
||||
digest[56] = byte_swap_32 (digest[56]);
|
||||
digest[57] = byte_swap_32 (digest[57]);
|
||||
digest[58] = byte_swap_32 (digest[58]);
|
||||
digest[59] = byte_swap_32 (digest[59]);
|
||||
digest[60] = byte_swap_32 (digest[60]);
|
||||
digest[61] = byte_swap_32 (digest[61]);
|
||||
digest[62] = byte_swap_32 (digest[62]);
|
||||
digest[63] = byte_swap_32 (digest[63]);
|
||||
memcpy (digest, hash_pos, HASH_LEN_RAW);
|
||||
|
||||
for (int i = 0; i < HASH_LEN_RAW / 4; i++) digest[i] = byte_swap_32 (digest[i]);
|
||||
|
||||
return (PARSER_OK);
|
||||
}
|
||||
@ -227,90 +166,28 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE
|
||||
const pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) esalt_buf;
|
||||
|
||||
u32 tmp_digest[64];
|
||||
tmp_digest[0] = byte_swap_32 (digest[0]);
|
||||
tmp_digest[1] = byte_swap_32 (digest[1]);
|
||||
tmp_digest[2] = byte_swap_32 (digest[2]);
|
||||
tmp_digest[3] = byte_swap_32 (digest[3]);
|
||||
tmp_digest[4] = byte_swap_32 (digest[4]);
|
||||
tmp_digest[5] = byte_swap_32 (digest[5]);
|
||||
tmp_digest[6] = byte_swap_32 (digest[6]);
|
||||
tmp_digest[7] = byte_swap_32 (digest[7]);
|
||||
tmp_digest[8] = byte_swap_32 (digest[8]);
|
||||
tmp_digest[9] = byte_swap_32 (digest[9]);
|
||||
tmp_digest[10] = byte_swap_32 (digest[10]);
|
||||
tmp_digest[11] = byte_swap_32 (digest[11]);
|
||||
tmp_digest[12] = byte_swap_32 (digest[12]);
|
||||
tmp_digest[13] = byte_swap_32 (digest[13]);
|
||||
tmp_digest[14] = byte_swap_32 (digest[14]);
|
||||
tmp_digest[15] = byte_swap_32 (digest[15]);
|
||||
tmp_digest[16] = byte_swap_32 (digest[16]);
|
||||
tmp_digest[17] = byte_swap_32 (digest[17]);
|
||||
tmp_digest[18] = byte_swap_32 (digest[18]);
|
||||
tmp_digest[19] = byte_swap_32 (digest[19]);
|
||||
tmp_digest[20] = byte_swap_32 (digest[20]);
|
||||
tmp_digest[21] = byte_swap_32 (digest[21]);
|
||||
tmp_digest[22] = byte_swap_32 (digest[22]);
|
||||
tmp_digest[23] = byte_swap_32 (digest[23]);
|
||||
tmp_digest[24] = byte_swap_32 (digest[24]);
|
||||
tmp_digest[25] = byte_swap_32 (digest[25]);
|
||||
tmp_digest[26] = byte_swap_32 (digest[26]);
|
||||
tmp_digest[27] = byte_swap_32 (digest[27]);
|
||||
tmp_digest[28] = byte_swap_32 (digest[28]);
|
||||
tmp_digest[29] = byte_swap_32 (digest[29]);
|
||||
tmp_digest[30] = byte_swap_32 (digest[30]);
|
||||
tmp_digest[31] = byte_swap_32 (digest[31]);
|
||||
tmp_digest[32] = byte_swap_32 (digest[32]);
|
||||
tmp_digest[33] = byte_swap_32 (digest[33]);
|
||||
tmp_digest[34] = byte_swap_32 (digest[34]);
|
||||
tmp_digest[35] = byte_swap_32 (digest[35]);
|
||||
tmp_digest[36] = byte_swap_32 (digest[36]);
|
||||
tmp_digest[37] = byte_swap_32 (digest[37]);
|
||||
tmp_digest[38] = byte_swap_32 (digest[38]);
|
||||
tmp_digest[39] = byte_swap_32 (digest[39]);
|
||||
tmp_digest[40] = byte_swap_32 (digest[40]);
|
||||
tmp_digest[41] = byte_swap_32 (digest[41]);
|
||||
tmp_digest[42] = byte_swap_32 (digest[42]);
|
||||
tmp_digest[43] = byte_swap_32 (digest[43]);
|
||||
tmp_digest[44] = byte_swap_32 (digest[44]);
|
||||
tmp_digest[45] = byte_swap_32 (digest[45]);
|
||||
tmp_digest[46] = byte_swap_32 (digest[46]);
|
||||
tmp_digest[47] = byte_swap_32 (digest[47]);
|
||||
tmp_digest[48] = byte_swap_32 (digest[48]);
|
||||
tmp_digest[49] = byte_swap_32 (digest[49]);
|
||||
tmp_digest[50] = byte_swap_32 (digest[50]);
|
||||
tmp_digest[51] = byte_swap_32 (digest[51]);
|
||||
tmp_digest[52] = byte_swap_32 (digest[52]);
|
||||
tmp_digest[53] = byte_swap_32 (digest[53]);
|
||||
tmp_digest[54] = byte_swap_32 (digest[54]);
|
||||
tmp_digest[55] = byte_swap_32 (digest[55]);
|
||||
tmp_digest[56] = byte_swap_32 (digest[56]);
|
||||
tmp_digest[57] = byte_swap_32 (digest[57]);
|
||||
tmp_digest[58] = byte_swap_32 (digest[58]);
|
||||
tmp_digest[59] = byte_swap_32 (digest[59]);
|
||||
tmp_digest[60] = byte_swap_32 (digest[60]);
|
||||
tmp_digest[61] = byte_swap_32 (digest[61]);
|
||||
tmp_digest[62] = byte_swap_32 (digest[62]);
|
||||
tmp_digest[63] = byte_swap_32 (digest[63]);
|
||||
|
||||
char tmp_buf[324] = { 0 };
|
||||
for (int i = 0; i < HASH_LEN_RAW / 4; i++) tmp_digest[i] = byte_swap_32 (digest[i]);
|
||||
|
||||
char tmp_buf[512];
|
||||
|
||||
memset (tmp_buf, 0, sizeof (tmp_buf));
|
||||
|
||||
uint32_t salt_iters[4] = { 0 };
|
||||
const u32 salt_iters = byte_swap_32 (salt->salt_iter + 1); //htonl (salt->salt_iter);
|
||||
|
||||
salt_iters[0] = byte_swap_32 (salt->salt_iter + 1); //htonl(salt->salt_iter);
|
||||
memcpy (tmp_buf, &salt_iters, ITER_LEN_RAW);
|
||||
memcpy (tmp_buf + ITER_LEN_RAW, pbkdf2_sha256->salt_buf, salt->salt_len);
|
||||
memcpy (tmp_buf + ITER_LEN_RAW + SALT_LEN_RAW, tmp_digest, HASH_LEN_RAW);
|
||||
|
||||
memcpy (tmp_buf, salt_iters, 4);
|
||||
memcpy (tmp_buf + 4, pbkdf2_sha256->salt_buf, salt->salt_len);
|
||||
memcpy (tmp_buf + 4 + 64, tmp_digest, 256);
|
||||
char ptr_plain[512];
|
||||
|
||||
char ptr_plain[433] = { 0 };
|
||||
memset (ptr_plain, 0, sizeof (ptr_plain));
|
||||
|
||||
base64_encode (int_to_base64, (const u8 *) tmp_buf, 324, (u8 *) ptr_plain);
|
||||
base64_encode (int_to_base64, (const u8 *) tmp_buf, (ITER_LEN_RAW + SALT_LEN_RAW + HASH_LEN_RAW), (u8 *) ptr_plain);
|
||||
|
||||
const int line_len = snprintf (line_buf, line_size, "%s%s", SIGNATURE_REDHAT_PBKDF2_SHA256, ptr_plain);
|
||||
|
||||
return line_len;
|
||||
|
||||
}
|
||||
|
||||
void module_init (module_ctx_t *module_ctx)
|
@ -16,7 +16,7 @@ sub module_generate_hash
|
||||
{
|
||||
my $word = shift;
|
||||
my $salt = shift;
|
||||
my $iter = shift // 10000;
|
||||
my $iter = shift // 8192; ## https://pagure.io/389-ds-base/blob/master/f/ldap/servers/plugins/pwdstorage/pbkdf2_pwd.c
|
||||
|
||||
if (length $salt == 0)
|
||||
{
|
||||
@ -29,6 +29,7 @@ sub module_generate_hash
|
||||
output_len => 256,
|
||||
salt_len => 64,
|
||||
);
|
||||
|
||||
my $p = $pbkdf2->generate($word, $salt);
|
||||
|
||||
my $decoded_hash = $pbkdf2->decode_string($p);
|
Loading…
Reference in New Issue
Block a user