|
Message-ID: <20150510234027.GA28403@openwall.com> Date: Mon, 11 May 2015 02:40:27 +0300 From: Aleksey Cherepanov <lyosha@...nwall.com> To: john-dev@...ts.openwall.com Subject: Re: displaying full meta information about hashes with --show=types On Sun, May 10, 2015 at 11:32:52PM +0300, Alexander Cherepanov wrote: > On 2015-05-10 21:43, Aleksey Cherepanov wrote: > >I implemented --show=types option that prints all meta information > >about hashes from file. It tries all formats against all hashes and > >prints result in machine parseable format. It applies even formats > >that are disabled. It tries generic crypt always. It respects > >--format= option. It does not bypass john's heuristics for generic > >crypt. > > Cool, it will be useful in scripts for sorting and converting hashes. It should be useful for Johnny too. While I intended to make code that prints something for each line of input file, the code skips bare lines of length < 13 when they consist of letters. Fro instance: abcdefghijkl These are loaded: 1234567890 abcdefghijklm - loaded and validated as crypt: abcdefghijklm abcdefghijklmo Loading of the line with : at the beginning works: :abcdefghijk :abcdefghijkl The code responsible for the skipping: fields[0] = *login = ldr_get_field(&line, db_opts->field_sep_char); fields[1] = *ciphertext = ldr_get_field(&line, db_opts->field_sep_char); /* Check for NIS stuff */ if ((!strcmp(*login, "+") || !strncmp(*login, "+@", 2)) && strlen(*ciphertext) < 10 && strncmp(*ciphertext, "$dummy$", 7) && strncmp(*ciphertext, "$0$", 3)) return 0; if (!**ciphertext && !line) { /* Possible hash on a line on its own (no colons) */ char *p = *login; /* Skip leading and trailing whitespace */ while (*p == ' ' || *p == '\t') p++; *ciphertext = p; p += strlen(p) - 1; while (p > *ciphertext && (*p == ' ' || *p == '\t')) p--; p++; /* Some valid dummy or plaintext hashes may be shorter than 10 characters, * so don't subject them to the length checks. */ if (strncmp(*ciphertext, "$dummy$", 7) && strncmp(*ciphertext, "$0$", 3) && p - *ciphertext != 10 /* not tripcode */) { /* Check for a special case: possibly a traditional crypt(3) hash with * whitespace in its invalid salt. Only support such hashes at the very start * of a line (no leading whitespace other than the invalid salt). */ if (p - *ciphertext == 11 && *ciphertext - *login == 2) (*ciphertext)--; if (p - *ciphertext == 12 && *ciphertext - *login == 1) (*ciphertext)--; if (p - *ciphertext < 13) return 0; } *p = 0; fields[0] = *login = no_username; fields[1] = *ciphertext; } I am not sure what to do. You see 2 return statements here. There are 3 more before my code, they do not need to be handled specially. if (ldr_check_list(db_opts->users, *login, *uid)) return 0; if (ldr_check_list(db_opts->groups, gid, gid)) return 0; if (ldr_check_shells(db_opts->shells, shell)) return 0; While the first 2 'return' statements may be extended to print the line to be skipped in --show=types mode before exit. Thanks! -- Regards, Aleksey Cherepanov
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.