openwall / john-tests Goto Github PK
View Code? Open in Web Editor NEWTest Suite for John the Ripper
Test Suite for John the Ripper
RAKP formats is somewhat popular it seems.
We need to make sure that it does what it is supposed to do all the time.
I have created a c++ file that generates a new input dictionary. I am hopeful that this dictionary will help put a bit more stress on JtR, especially on length boundary issues.
There are no passwords with a ':' char (colon)
there are no passwords that have a space and ( char together, i.e " (" (this is a problem for some new logic in the TS)
I tried to get the start of each password to be unique. This is so that JtR chopping off the word to a shorter length will not match anything.
All passwords are 4 bytes or more (except for a null pw, and a single letter password).
I tried to make some sections vary greatly between lengths of adjacent passwords.
I have areas where passwords grow or shrink in size each time.
I have areas where passwords grow or shrink every 5 passwords.
I have values that have high bits set (but it was much more controlled that before).
Please comment on this strategy NOTE, if we put the passwords in the input files, they will be larger, since we are using longer passwords for input.
We currently only test wordlist mode, without rules.
We should test variants of the wordlist mode (rules, loopback, --min/max-length, dupe suppression, --mem=1, pipe and stdin) as well as other modes (incremental, markov, mask, perhaps some external mode). These tests can be performed using just a few, or even one single format (descrypt and NT would be a good choice because they include 7-bit, Unicode and short length).
Example:
--incremental --stdout
. Pick all the first 500 words and then 1000 more out of eg. 150000 (randomly distributed but using a fixed random seed - so reproducible!).If the above is cleverly implemented, the same function can be used with markov or other modes instead of incremental.
To reproduce, first checkout commit 250c03d.
Then run
$ ./jtrts.pl -v -stoponerror -passthru="--mkpc=4"
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.4-jumbo-1-bleeding [linux-gnu 32-bit AVX2-autoconf]
--------------------------------------------------------------------------------
John Jumbo build detected.
Can't set mkpc larger than 2 for bcrypt format
--pot=NAME option is valid
--encoding=NAME option is valid
all.chr (../run/all.chr) not found
alnum.chr found, inc_alnum_ee8763c850dee8e4b88ef547a8ed39b8 added as a capability
Setting default for john-jumbo to be: base+koi8r+utf8
Capabilities in this build of john:
jumbo core inc local_pot_valid encode_valid utf8 cp1252 cp1251 koi8r cp437 cp737 cp850 cp858 cp866 iso8859-1 iso8859-15 inc_alnum_ee8763c850dee8e4b88ef547a8ed39b8
form=dynamic_0 guesses: 1500 -show= 0 0:00:00:00 DONE : Expected count(s) (1500)(-show1502) [!!!FAILED3!!!]
Exiting on error. The .pot file ./tst.pot contains the found data
The command used to run this test was:
../run/john -ses=./tst --mkpc=4 -pot=./tst.pot dynamic_0_tst.in --wordlist=pw.dic
Since the error was that --show
doesn't allow --mkpc
, the last line of output should have been the failing ../run/john --show
command.
Over the last few months we've seen at least two formats that were not in TS and that could not crack their own test vectors when put in an external file and ran like IRL.
We should automate this. Just use --list=formats
and iterate over them.
Then, for each format:
john -format=$fmt -list=format-tests | cut -f3 > tempfile
john -format=$fmt -list=format-tests | cut -f4 > tempdict
cat pw.dic tempdict | shuf > tempdict2
or something like thatjohn -format=$fmt tempfile -w:tempdict2
See also the last comments in openwall/john#1074.
It is a real TS bug (parsing error, not related to mangled stdout output due to fork.)
Here is how to reproduce it without fork:
First make sure that all the passwords in pw-new.dic that end with a )
character are at the end of that file:
(master)test $ grep "[)]$" pw-new.dic > pw-new.dic2
(master)test $ grep -v "[)]$" pw-new.dic > pw-new.dic1
cat pw-new.dic1 pw-new.dic2 > pw-new.dic
Then
(master)test $ ./jtrts.pl -type=dynamic -stoponerror
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-jumbo-1-bleeding_omp [linux-gnu 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
John Jumbo build detected.
form=dynamic_0 guesses: 1502 0:00:00:00 DONE [PASSED]
.pot CHK:dynamic_0 guesses: 1500 0:00:00:00 DONE [PASSED] (1500 val-pwd)
form=dynamic_0 guesses: 920 0:00:00:00 DONE [PASSED]
.pot CHK:dynamic_0 guesses: 920 -show= 920 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED4!!!] (920 val-pwd 1 inval-pwd)
Exiting on error. The .pot file ./tst.pot contains the found data
The command used to run this test was:
../run/john -ses=./tst -pot=./tst.pot dynamic_0_new_tst.in --wordlist=pw-new.dic
(master)test $ ./jtrts.pl -type=dynamic -stoponerror -v -v
...
t6)FppppV'j) (t6)FppppV'j))
?ziypppppG"Z) (?ziypppppG"Z))
Warning: detected hash type "dynamic_0", but the string is also recognized as "Raw-MD5"
Use the "--format=Raw-MD5" option to force loading these as that type instead
Warning: poor OpenMP scalability for this hash type, consider --fork=8
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
920g 0:00:00:00 DONE (2015-03-04 16:52) 30666g/s 30666p/s 30666c/s 28213KC/s aab2b..?ziypppppG"Z)
Use the "--show" option to display all of the cracked passwords reliably
Session completed
FAILED line = guesses: 920 0:00:00:00 DONE (2015-03-04 16:52) 30666g/s 30666p/s 30666c/s 28213KC/s aab2b..?ziypppppG"Z)
Execute john: ../run/john -show -pot=./tst.pot dynamic_0_new_tst.in -form=dynamic_0 2>&1
d_show_line2 =
920 password hashes cracked, 580 left
1 invalid passwords
920 valid passwords
.pot CHK:dynamic_0 guesses: 920 -show= 920 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED4!!!] (920 val-pwd 1 inval-pwd)
Exiting on error. The .pot file ./tst.pot contains the found data
The command used to run this test was:
../run/john -ses=./tst -pot=./tst.pot dynamic_0_new_tst.in --wordlist=pw-new.dic
Out of 920 passwords, there are 920 valid passwords + 1 invalid (due to the parsing error)
Certain john options can only be used for real cracking, not for --test or --show etc.
That's why, -passthru should either be changed to just pass additional options to the real cracking run, or another ./jtrts option is needed to allow passing options like --fork=2 to real cracking.
(master)test $ ./jtrts.pl -passthru "--fork=2"
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.12.14, June 30, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-bleeding-jumbo [linux-gnu 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
John Jumbo build detected.
testing: john -test=0
Invalid options combination or duplicate option: "-test=0"
testing: john -test=0 --encoding=utf8
Invalid options combination or duplicate option: "-test=0"
testing: john -test=0 --encoding=koi8r
Invalid options combination or duplicate option: "-test=0"
form=dynamic_0 guesses: 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!]
.pot CHK:dynamic_0 guesses: 0 unk unk [PASSED]
[...]
form=dynamic_20 guesses: 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!]
.pot CHK:dynamic_20 guesses: 0 unk unk [PASSED]
sh: line 1: 23469 Segmentation fault (core dumped) ../run/john -ses=./tst --fork=2 -pot=./tst.pot dynamic_21_tst.in --wordlist=pw.dic 2>&1 > /dev/null
form=dynamic_21 guesses: 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!]
.pot CHK:dynamic_21 guesses: 0 unk unk [PASSED]
[...]
form=rar guesses: 0 unk unk : Expected count(s) (130) [!!!FAILED!!!]
.pot CHK:rar guesses: 0 unk unk [PASSED]
Some tests had Errors. Performed 289 tests.289 errors
Time used was 1052 seconds
The tests pass if I don't try to use --fork=2
(master)test $ ./jtrts.pl -type full -v -stoponerror
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0
--------------------------------------------------------------------------------
John CORE build detected. Only core formats can be tested.
all.chr (../run/all.chr) not found
alnum.chr (../run/alnum.chr) not found
Types to filter on:
full
Capabilities in this build of john:
core inc
form=md5crypt guesses: 1500 0:00:00:12 DONE [PASSED]
.pot CHK:md5crypt guesses: 1500 0:00:00:09 100% [PASSED] (1500 val-pwd)
form=md5_apr1 guesses: 1500 0:00:00:12 DONE [PASSED]
.pot CHK:md5_apr1 guesses: 1500 0:00:00:10 100% [PASSED] (1500 val-pwd)
form=md5_smd5 guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!]
Exiting on error. The .pot file ../run/john.pot contains the found data
The command used to run this test was:
../run/john -ses=./tst md5crypt-smd5_tst.in --wordlist=pw-80.dic -form=md5crypt
(master)test $ ../run/john -ses=./tst md5crypt-smd5_tst.in --wordlist=pw-80.dic -form=md5crypt
No password hashes loaded (see FAQ)
(master)test $ ../run/john -ses=./tst md5crypt-smd5_tst.in --wordlist=pw-80.dic
No password hashes loaded (see FAQ)
(master)test $ ./jtrts.pl -prelims -q
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-jumbo-1-bleeding_omp [linux-gnu 64-bit AVX2-autoconf]
--------------------------------------------------------------------------------
Will run 4 OpenMP threadst=0
Will run 4 OpenMP threadst=0 --encoding=utf8
Will run 4 OpenMP threadst=0 --encoding=koi8r
All tests passed without error. Performed 195 tests. Time used was 318 seconds
The Will run 4 OpenMP threads
is john's stderr output.
See openwall/john#841 for lots of very small tests that TS should verify (if there is a mask mode present at all). They will ensure ranges and placeholders are parsed (or not) correctly, when things are escaped.
Testing: descrypt, traditional crypt(3) [DES 128/128 AVX-16]... PASS
Testing: bsdicrypt, BSDI crypt(3) ("_J9..", 725 iterations) [DES 128/128 AVX-16]... PASS
Testing: md5crypt, crypt(3) $1$ [MD5 128/128 AVX 12x]... PASS
Testing: bcrypt ("$2a$05", 32 iterations) [Blowfish 32/64 X2]... PASS
Testing: scrypt (16384, 8, 1) [Salsa20/8 128/128 AVX]... PASS
...
Testing: PFX, PKCS12 (.pfx, .p12) [32/64]... PASS
Testing: rar, RAR3 (4 characters) [SHA1 AES 32/64]... PASS
Testing: SSH (one 2048-bit RSA and one 1024-bit DSA key) [RSA/DSA 32/64]... PASS
Testing: wpapsk, WPA/WPA2 PSK [PBKDF2-SHA1 128/128 AVX 8x]... PASS
Testing: crypt, generic crypt(3) DES [?/64]... PASS
All 361 formats passed self-tests!
Old style output still needs to be supported:
Warning: doing quick benchmarking - the performance numbers will be inaccurate
Benchmarking: descrypt, traditional crypt(3) [DES 128/128 AVX-16]... DONE
Many salts: 5568K c/s real, 5568K c/s virtual
Only one salt: 1740K c/s real, 3481K c/s virtual
...
Benchmarking: crypt, generic crypt(3) DES [?/64]... DONE
Many salts: 307200 c/s real, 307200 c/s virtual
Only one salt: 201600 c/s real, 201600 c/s virtual
All 361 formats passed self-tests!
Start working on these. Some we will fix jtrts.pl (list when we do), and some we will fix the format. Some we may just accept the problem,, but at least list why.
NOTE, this list updated with cpu AFTER 9a46ca2 was applied.
$ ./jtrts.pl -internal -q -case_mangle cpu ***** ALL FIXED *****
here is the GPU failures from my laptop (NOTE some are driver fails)
$ ./jtrts.pl -internal -case_mangle gpu
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-jumbo-1-bleeding_omp [cygwin 64-bit XOP-autoconf]
--------------------------------------------------------------------------------
ALL of these fail ST on my laptop card.
descrypt-opencl guesses: 0 -show= 0 0:00:00:00 DONE : Expected (6)(-show6)
pbkdf2-hmac-sha512-opencl guesses: 0 -show= 0 0:00:00:38 DONE : Expected (9)(-show27)
sha256crypt-opencl guesses: 0 -show= 0 0:00:00:01 DONE : Expected (4)(-show4)
sha512crypt-opencl guesses: 0 -show= 0 0:00:00:01 DONE : Expected (5)(-show5)
krb5pg-md5 fails ST on get_hash[0](3) The only reason it finds 6 (vs 9), is because we are using -skip
krb5pa-md5-opencl guesses: 6 -show= 21 0:00:00:00 DONE : Expected (9)(-show27)
oldoffice-opencl fails ST on cmp_all(1) The only reason it finds 6 (vs 9), is because we are using -skip
oldoffice-opencl guesses: 1 -show= 3 0:00:00:00 DONE : Expected (5)(-show15)
gpg crashed my driver
gpg-opencl guesses: 0 -show= 0 unk unk : Expected (6)(-show6)
Fixed split() function (for tagged hashes)
raw-sha512-opencl guesses: 13 -show= 33 0:00:00:00 DONE : Expected (12)(-show36)
These were fixed by making them FMT_SPLIT_UNI formats
form=skein-256 guesses: 1 0:00:00:00 DONE [PASSED]
form=skein-512 guesses: 2 0:00:00:00 DONE [PASSED]
form=tiger guesses: 2 0:00:00:00 DONE [PASSED]
form=whirlpool guesses: 1 0:00:00:00 DONE [PASSED]
form=whirlpool0 guesses: 1 0:00:00:00 DONE [PASSED]
form=whirlpool1 guesses: 1 0:00:00:00 DONE [PASSED]
These were fixed by making non proper cased hashes fail valid()
This is especially important if -random -seed=n
is used, because otherwise it might be hard to get hold of the rendomized dictionary file to reproduce the error.
The following change is required:
(master)test $ git diff
diff --git a/jtrts.pl b/jtrts.pl
index 15097bc..d428b83 100755
--- a/jtrts.pl
+++ b/jtrts.pl
@@ -793,6 +793,12 @@ sub process {
my $str = sprintf("form=%-28.28s guesses: %4.4s $crack_xx[3] $crack_xx[4] [pass, but return code $ret_val]\n", $ar[4], $orig_crack_cnt);
ScreenOutAlways($str);
$ret_val_non_zero_cnt += 1;
+ if ($stop_on_error) {
+ ScreenOut("Exiting on error. The pot file $pot contains the found data\n");
+ $cmd =~ s# 2>&1 >/dev/null##;
+ ScreenOut("The command used to run this test was:\n\n$cmd\n");
+ exit(1);
+ }
}
if ($dict_name_ex ne "") {
unlink ($dict_name_ex);
@@ -875,6 +881,12 @@ sub process {
my $str = sprintf(".pot CHK:%-24.24s guesses: %4.4s $crack_xx[3] $crack_xx[4] [pass, but return code $ret_val]\n", $ar[4], $orig_pot_cnt);
ScreenOutAlways($str);
$ret_val_non_zero_cnt += 1;
+ if ($stop_on_error) {
+ ScreenOut("Exiting on error. The pot file $pot contains the found data\n");
+ $cmd =~ s# 2>&1 >/dev/null##;
+ ScreenOut("The command used to run this test was:\n\n$cmd\n");
+ exit(1);
+ }
}
unlink("$pot");
unlink("pw3");
BTW, meanwhile there are several instances of if ($stop_on_error) {
... }
. I hesitated to add even more copies, that's why no commit.
May be the stoponerror handling should be moved into a separate subroutine.
Not sure yet whether this is due to the recent memdbg, utf-8 default, or other changes, or a mix of those.
$ ./jtrts.pl -q
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.4-jumbo-1-bleeding_omp_memdbg [linux-gnu 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
Warning: SAP-B format should never be UTF-8.
Use --target-encoding=iso-8859-1 or whatever is applicable.
form=dynamic_29-raw guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=dynamic_29 guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=dynamic_33 guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=dynamic_33 guesses: 1327 -show=1327 0:00:00:00 DONE : Expected count(s) (1500)(1365) [!!!FAILED1!!!]
form=dynamic_33-NT guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=dynamic_1032 guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED2!!! exited, return code 1]
.pot CHK:dynamic_1032 guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED4!!!] (0 val-pwd 1 inval-pwd)
form=dynamic_1400 guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED2!!! exited, return code 1]
.pot CHK:dynamic_1400 guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED4!!!] (0 val-pwd 1 inval-pwd)
form=dynamic_1400 guesses: 0 -show= 0 unk unk : Expected count(s) (1500)(920) [!!!FAILED2!!! exited, return code 1]
.pot CHK:dynamic_1400 guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED4!!!] (0 val-pwd 1 inval-pwd)
form=raw-md5u-raw guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=raw-md5u guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=raw-md5u guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=raw-md5u-raw guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=NT guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=NT-raw guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=mscash guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=mscash_crash guesses: 1169 -show=1169 0:00:00:00 DONE : Expected count(s) (1440) [!!!FAILED1!!!]
form=pwdump_lm guesses: 646 -show=2385 0:00:00:00 DONE : Expected count(s) (986)(-show2760) [!!!FAILED1!!!]
form=pwdump_nt guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=krb5pa-md5 guesses: 1229 -show=1229 0:00:00:02 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=krb5pa-md5 guesses: 1442 -show=1442 0:00:00:01 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=MSSql12 guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=MSSql05 guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=MSSql guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
.pot CHK:MSSql-8859-1 guesses: 1195 -show=1195 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED4!!!] (1195 val-pwd 0 inval-pwd)
.pot CHK:MSSql-8859-1-gen guesses: 390 -show= 390 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED4!!!] (390 val-pwd 0 inval-pwd)
form=oracle guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=netntlm-naive guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=netntlm-naive-l0phtcrack guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=netlm-l0phtcrack guesses: 1069 -show=1069 0:00:00:00 DONE : Expected count(s) (1351) [!!!FAILED1!!!]
form=netlmv2 guesses: 1229 -show=1229 0:00:00:02 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=netntlmv2 guesses: 1229 -show=1229 0:00:00:02 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=mschapv2-naive guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=episerver_sha1 guesses: 1229 -show=1229 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
form=episerver_sha256 guesses: 1229 -show=1229 0:00:00:01 DONE : Expected count(s) (1500) [!!!FAILED1!!!]
sh: line 1: 3639 Segmentation fault (core dumped) ../run/john -ses=tst -pot=tst.pot sybasease_tst.in --wordlist=pw.dic -form=sybasease 2>&1 > /dev/null
form=sybasease guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED2!!! exited, return code 139]
.pot CHK:sybasease guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED4!!!] (0 val-pwd 1 inval-pwd)
[...]
A command like this, that used to work, is failing now:
I expect 5 tests performed (not two).
./jtrts.pl -noprelims -stoponerror -type raw-sha256-opencl raw-sha512-ng-opencl sha256crypt-opencl sha512crypt-opencl xsha512-ng-opencl -passthru "-pla:0 -de:1"
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.12.11, July 20, 2012. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.1-bleeding-jumbo [linux-x86-64-opencl]
--------------------------------------------------------------------------------
John Jumbo build detected.
form=sha256crypt-opencl guesses: 1500 0:00:00:01 DONE [PASSED]
.pot CHK:sha256crypt-opencl guesses: 1500 0:00:00:01 DONE [PASSED]
form=sha512crypt-opencl guesses: 1500 0:00:00:01 DONE [PASSED]
.pot CHK:sha512crypt-opencl guesses: 1500 0:00:00:01 DONE [PASSED]
All tests passed without error. Performed 2 tests. Time used was 18 seconds
"caused" by openwall/john@546a203 which repeated the test hash in the canonical format used for john.pot.
(master)test $ ./jtrts.pl -internal -q
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-jumbo-1-bleeding_omp [linux-gnu 64-bit AVX2-autoconf]
--------------------------------------------------------------------------------
form=osc guesses: 1 -show= 1 0:00:00:00 DONE : Expected count(s) (2)(-show2) [!!!FAILED!!!]
Some tests had Errors. Performed 295 tests. 1 errors00:00 DONE [PASSED]
Time used was 75 seconds
I didn't revert this JtR addition:
+ // repeat hash in the same form that is used in john.pot
+ {"$dynamic_4$05de5c963ee6234dc7d52f7589a1922b$ ", "welcome"},
Because I think it is a TS problem. (./john --test
doesn't fail)
From 1fc9bcd1857ad9035fe64f2e83dcc1caab38794a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Claudio=20Andr=C3=A9?= <[email protected]>
Date: Sun, 14 Sep 2014 20:33:05 -0300
Subject: [PATCH 2/2] Add lotus5-opencl to JtrTestSuite.
---
jtrts.dat | 1 +
1 file changed, 1 insertion(+)
diff --git a/jtrts.dat b/jtrts.dat
index a99ccb0..c5655f1 100644
--- a/jtrts.dat
+++ b/jtrts.dat
@@ -535,6 +535,7 @@
(opencl)(gpu),(X),(jumbo)&(opencl),30,rar-opencl,pw,rar_tst.in,rar-opencl,Y,X,(130),(130)
(opencl)(gpu),(X),(jumbo)&(opencl),10000,rakp-opencl,pw,rakp_tst.in,rakp-opencl,Y,X,(1500)(1451),(1500)(1451)
(opencl)(gpu),(X),(jumbo),10000,krb5pa-md5-opencl,pw,mskrb5_tst.in,krb5pa-md5-opencl,Y,X,(1500),(1500)
+(opencl)(gpu),(X),(jumbo),10000,lotus5-opencl,pw,lotus5_tst.in,lotus5-opencl,Y,X,(1500),(1500)
# This is a very slow, and VERY large input file hash.
(ssh),(full),(jumbo),1600,ssh,pass,ssh_1500_tst.in,ssh,N,X,(1500),(1500)
--
1.9.1
see openwall/john#988.
...because it tries to use -pot=../run/john.pot
which is not supported any anyway it's a no-op.
I got really weird results and could not find the problem until long after: Turned out I had custom encoding and UTF-8 settings in john.local.conf.
If possible we should warn about that situation, but I'm not sure how to detect it from TS.
In repeated runs of the testsuite on my 32bit linux laptop, I noticed that one run just reported 135 seconds of total run time (for 152 dynamic format tests with OMP_NUM_THREADS=5), while the other tests took between 3700 and 3800 seconds.
$ ./jtrts.pl -v -stoponerror -passthru="--dupe-suppression"
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.4-jumbo-1-bleeding [linux-gnu 32-bit AVX2-autoconf]
--------------------------------------------------------------------------------
John Jumbo build detected.
Invalid options combination or duplicate option: "--dupe-suppression"
--pot=NAME option is valid
--encoding=NAME option is valid
all.chr (../run/all.chr) not found
alnum.chr found, inc_alnum_ee8763c850dee8e4b88ef547a8ed39b8 added as a capability
Setting default for john-jumbo to be: base+koi8r+utf8
Capabilities in this build of john:
jumbo core inc local_pot_valid encode_valid utf8 cp1252 cp1251 koi8r cp437 cp737 cp850 cp858 cp866 iso8859-1 iso8859-15 inc_alnum_ee8763c850dee8e4b88ef547a8ed39b8
form=asa-md5 guesses: 1500 0:00:00:00 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 652.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 653.
.pot CHK:asa-md5 guesses: 1500 0:00:00:00 DONE [PASSED] (1500 val-pwd)
form=asa-md5 guesses: 1293 0:00:00:00 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 652.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 653.
.pot CHK:asa-md5 guesses: 1293 0:00:00:00 DONE [PASSED] (1293 val-pwd)
form=formspring guesses: 1500 0:00:00:00 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 652.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 653.
.pot CHK:formspring guesses: 1500 0:00:00:00 DONE [PASSED] (1500 val-pwd)
form=formspring guesses: 1500 0:00:00:00 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 652.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 653.
.pot CHK:formspring guesses: 1500 0:00:00:00 DONE [PASSED] (1500 val-pwd)
form=raw-md5u-raw guesses: 1500 0:00:00:00 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 652.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 653.
.pot CHK:raw-md5u-raw guesses: 1500 0:00:00:00 DONE [PASSED] (1500 val-pwd)
form=raw-md5u guesses: 1500 0:00:00:00 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 652.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 653.
.pot CHK:raw-md5u guesses: 1500 0:00:00:00 DONE [PASSED] (1500 val-pwd)
form=raw-md5u-raw-utf8 guesses: 1229 0:00:00:00 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 652.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 653.
.pot CHK:raw-md5u-raw-utf8 guesses: 1229 0:00:00:00 DONE [PASSED] (1229 val-pwd)
form=raw-md5u-raw-utf8 guesses: 1500 0:00:00:00 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 652.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 653.
Invalid negative number (-1) in chr at ./jtrts.pl line 660.
Invalid negative number (-1) in chr at ./jtrts.pl line 660.
FAILED line = à(àç&ç-à (à(àç&ç-à)
FAILED line = é-àçéàà( (é-àçéàà()
.pot CHK:raw-md5u-raw-utf8 guesses: 1500 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED4!!!] (1498 val-pwd 2 inval-pwd)
Exiting on error. The .pot file ./tst.pot contains the found data
The command used to run this test was:
../run/john -ses=./tst --dupe-suppression -pot=./tst.pot rawmd5u_raw_tst_utf8.in --wordlist=pw-utf8.dic -form=raw-md5u --encoding=utf-8
[fd@f20x32 test]$ ./jtrts.pl -v -stoponerror -passthru="--save-memory=1" -type rar
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.4-jumbo-1-bleeding [linux-gnu 32-bit AVX2-autoconf]
--------------------------------------------------------------------------------
John Jumbo build detected.
--pot=NAME option is valid
--encoding=NAME option is valid
all.chr (../run/all.chr) not found
alnum.chr found, inc_alnum_ee8763c850dee8e4b88ef547a8ed39b8 added as a capability
Types to filter on:
rar
Capabilities in this build of john:
jumbo core inc local_pot_valid encode_valid utf8 cp1252 cp1251 koi8r cp437 cp737 cp850 cp858 cp866 iso8859-1 iso8859-15 inc_alnum_ee8763c850dee8e4b88ef547a8ed39b8
form=rar guesses: 130 0:00:01:05 DONE [PASSED]
FAILED line = Bert$ErnIE (?)
FAILED line = Bert$ErnIE (?)
FAILED line = Bert$ErnIE (?)
[...]
FAILED line = alsfdkja; (?)
FAILED line = alsfdkja; (?)
FAILED line = alsfdkja; (?)
.pot CHK:rar guesses: 130 -show= 130 0:00:00:11 DONE : Expected count(s) (130) [!!!FAILED4!!!] (0 val-pwd 130 inval-pwd)
Exiting on error. The .pot file ./tst.pot contains the found data
The command used to run this test was:
../run/john -ses=./tst --save-memory=1 -pot=./tst.pot rar_tst.in --wordlist=pw-40.dic -form=rar
(master)test $ ./jtrts.pl -type full "-passthru=--fork=2" -q
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-jumbo-1-bleeding_omp_asAN [linux-gnu 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
.pot CHK:dynamic_0 guesses: 1500 -show=1502 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1495 val-pwd)
.pot CHK:dynamic_0-raw guesses: 1500 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1491 val-pwd)
.pot CHK:dynamic_1 guesses: 1500 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1491 val-pwd)
.pot CHK:dynamic_2 guesses: 1500 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1493 val-pwd)
.pot CHK:dynamic_2-raw guesses: 1500 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1497 val-pwd)
.pot CHK:dynamic_3 guesses: 1500 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1497 val-pwd)
.pot CHK:dynamic_3-raw guesses: 1500 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1491 val-pwd)
.pot CHK:dynamic_4 guesses: 1500 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1489 val-pwd)
.pot CHK:dynamic_5 guesses: 1500 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1490 val-pwd)
.pot CHK:dynamic_6 guesses: 1500 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1489 val-pwd)
.pot CHK:dynamic_6-1salt guesses: 1500 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1495 val-pwd)
.pot CHK:dynamic_8 guesses: 1500 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1491 val-pwd)
^C
etc
See openwall/john#825 as an example.
I have not checked this for sure, BUT looking at this, it allocates an array that holds each of the fields, then allocated into those fields, and that is part of the salt. No way would this detect dupe salts.
This should either be a dyna salt, or better yet, the 12 fields (if needed), should be inline fixed sized char buffers, so the salt logic works properly.
With randomly shuffled dictionary files:
mkdir dic
mv *.dic dic
cd dic
for for f in *.dic; do shuf< $f > ../$f; done
cd ..
I sometimes get errors at ./jtrts.pl line 732 (somehow parsing john --show
output didn't work, and $orig_show_cnt
contains strings ("eft"
or "ssword"
):
./jtrts.pl -q
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-jumbo-1-bleeding_omp [linux-gnu 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
Argument "eft" isn't numeric in numeric ne (!=) at ./jtrts.pl line 732.
form=dynamic_29-utf8 guesses: 1229 -show= eft 0:00:00:00 DONE : Expected count(s) (1229) [!!!FAILED!!!]
form=dynamic_2004 guesses: 1501 -show=1500 0:00:00:01 DONE : Expected count(s) (1500) [!!!FAILED!!!]
form=sha256crypt guesses: 0 -show= 0 0:00:00:02 DONE : Expected count(s) (1500) [!!!FAILED!!!]
.pot CHK:sha256crypt guesses: 0 unk unk [pass, but return code 256]
form=drupal7 guesses: 0 -show= 0 0:00:00:09 DONE : Expected count(s) (1485) [!!!FAILED!!!]
.pot CHK:drupal7 guesses: 0 unk unk [pass, but return code 256]
form=krb5-18 guesses: 0 -show= 0 0:00:00:01 DONE : Expected count(s) (1500) [!!!FAILED!!!]
.pot CHK:krb5-18 guesses: 0 unk unk [pass, but return code 256]
Argument "ssword" isn't numeric in numeric ne (!=) at ./jtrts.pl line 732.
form=mssql-utf8 guesses: 1229 -show=sswo 0:00:00:00 DONE : Expected count(s) (1229) [!!!FAILED!!!]
Some tests had Errors. Performed 244 tests. 6 errors 3 runs had non-zero return code (cores?)
Time used was 646 seconds
When I repeatedly run
./jtrts.pl -q -passthru="--fork=16" -type dynamic"
(on my quad code system with HT) for a john build with memdbg enabled, I regularly but not always get errors like these:
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-jumbo-1-bleeding_omp [linux-gnu 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
form=dynamic_80 guesses: 1397 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!]
Some tests had Errors. Performed 113 tests. 1 errors
Time used was 200 seconds
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-jumbo-1-bleeding_omp [linux-gnu 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
form=dynamic_23 guesses: 1415 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!]
Some tests had Errors. Performed 113 tests. 1 errors
Time used was 203 seconds
So, -show has the expected number of cracked hashes, but guesses reports a number which is too small.
My guess is that jtrts.pl has trouble parsinf the memdbg output if that memdbg output of tifferent forked processes gets mixed likes this:
outleft__5 (u521-dynamic_70)
11 96g 0:00:00:00 DONE (2015-01-03 19:31) 3200g/s 12233p/s 12233c/s 18350KC/s ReplyNow__10..12346295
10 95g 0:00:00:00 DONE (2015-01-03 19:31) 3166g/s 12233p/s 12233c/s 18350KC/s limiey__18..B413
At Program Exit
At Program Exit
MemDbg_Validate level 0 checkingMemDbg_Validate level 0 checking Passed
Passed
At Program Exit
MemDbg_Validate level 0 checking Passed
1 87g 0:00:00:00 DONE (2015-01-03 19:31) 2175g/s 9175p/s 9175c/s 13762KC/s AB1168..3_�5
Waiting for 15 children to terminate
9 94g 0:00:00:00 DONE (2015-01-03 19:31) 2350g/s 9175p/s 9175c/s 13762KC/s SH�_�..P__9
At Program Exit
At Program Exit
MemDbg_Validate level 0 checking Passed
MemDbg_Validate level 0 checking Passed
At Program Exit
At Program Exit
MemDbg_Validate level 0 checking Passed
At Program Exit
MemDbg_Validate level 0 checking Passed
At Program Exit
MemDbg_Validate level 0 checking Passed
At Program Exit
MemDbg_Validate level 0 checking Passed
At Program Exit
MemDbg_Validate level 0 checking Passed
At Program Exit
MemDbg_Validate level 0 checking Passed
MemDbg_Validate level 0 checking Passed
Use the "--show" option to display all of the cracked passwords reliably
Session completed
At Program Exit
MemDbg_Validate level 0 checking Passed
Since this simple shuffling
mkdir dic
mv *.dic dic
cd dic
for f in *.dic; do shuf < $f > ../$f; done
cd ..
helped to uncover bugs in certain formats:
Argument "eft" isn't numeric in numeric ne (!=) at ./jtrts.pl line 732.
form=dynamic_29-utf8 guesses: 1229 -show= eft 0:00:00:00 DONE : Expected count(s) (1229) [!!!FAILED!!!]
form=sha256crypt guesses: 0 -show= 0 0:00:00:02 DONE : Expected count(s) (1500) [!!!FAILED!!!]
.pot CHK:sha256crypt guesses: 0 unk unk [pass, but return code 256]
form=drupal7 guesses: 0 -show= 0 0:00:00:08 DONE : Expected count(s) (1485) [!!!FAILED!!!]
.pot CHK:drupal7 guesses: 0 unk unk [pass, but return code 256]
form=krb5-18 guesses: 0 -show= 0 0:00:00:01 DONE : Expected count(s) (1500) [!!!FAILED!!!]
.pot CHK:krb5-18 guesses: 0 unk unk [pass, but return code 256]
Argument "ssword" isn't numeric in numeric ne (!=) at ./jtrts.pl line 732.
form=mssql-utf8 guesses: 1229 -show=sswo 0:00:00:00 DONE : Expected count(s) (1229) [!!!FAILED!!!]
Some tests had Errors. Performed 244 tests. 5 errors 3 runs had non-zero return code (cores?)
Time used was 640 seconds
I'd like to have a -random mode.
A first version could just support that random shuffling using shuf
, and run in an endless loop unless an error occurs and -stoponerror
has been specified.
A more sophisticated way shouldn't randomly shuffle the dictionary files.
Istead, you should be able to specify a seed, so that with the same seed the dictionary files will be shuffled in exactly the same way. This would make error reporting much easier, because you could just report the seed instead of copying the random dictionaty files.
Have you guys ever seen this?
$ ../run/john -ses=./tst -pot=./tst.pot SHA512crypt_tst.in --wordlist=pw.dic -form=sha512crypt-opencl 2>&1 >/dev/null
Device 0: GeForce GTX 570
Local worksize (LWS) 512, global worksize (GWS) 46080
Press 'q' or Ctrl-C to abort, almost any other key for status
OpenCL error (CL_INVALID_COMMAND_QUEUE) in file (opencl_cryptsha512_fmt_plug.c) at line (497) - (Error running loop kernel)
$ ./jtrts.pl -noprelims -stoponerror -type sha512crypt-opencl
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.12.16, Sept 24, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-bleeding-jumbo_omp [linux-gnu 64-bit XOP-autoconf]
--------------------------------------------------------------------------------
John Jumbo build detected.
form=sha512crypt-opencl guesses: 1500 0:00:00:43 DONE [PASSED]
.pot CHK:sha512crypt-opencl guesses: 1500 0:00:00:43 DONE [PASSED]
All tests passed without error. Performed 1 tests. Time used was 145 seconds
Or JtR running under Test Suite doesn't trigger the bug? Any ideas?
$ ./jtrts.pl -q -noprel
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.12.12, July 21, 2013. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-bleeding-jumbo_omp [macosx-x86-64-native-gpu]
--------------------------------------------------------------------------------
Use of uninitialized value $crack_xx[4] in substitution (s///) at ./jtrts.pl line 612.
^C
The above typically means john crashed. This should be detected and errors should be shown. Currently it seems to hang forever after the Use of uninitialized...
output.
(master)test $ ./jtrts.pl -type mssql12 -passthru="--fork=2" -q
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-jumbo-1-bleeding_omp [linux-gnu 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
sh: line 1: 3495 Segmentation fault (core dumped) ../run/john -ses=./tst --fork=2 -pot=./tst.pot MsSql12_tst.in --wordlist=pw.dic 2>&1 > /dev/null
Use of uninitialized value $crack_xx[3] in concatenation (.) or string at ./jtrts.pl line 860.
Use of uninitialized value in concatenation (.) or string at ./jtrts.pl line 860.
form=MSSql12 guesses: 0 [pass, but return code 35584]
Some tests had Errors. Performed 1 tests. 1 runs had non-zero return code (cores?)
Time used was 3 seconds
There's openwall/john#1076 for the segfault.
This is about the Use of uninitialized value
which should be avoided if john crashes.
Even with the recent changes to make -passthru --fork work, there are many "FAILED" tests, because the same password might get cracked more than once.
This occurs if the word list contains words that are to long for the format, but after truncation produce a valid password.
The result is something like this:
$ ./jtrts.pl -noprelim -passthru "--fork=2 --dupe" -q
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.12.14, June 30, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-bleeding-jumbo [linux-gnu 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
form=dynamic_19 guesses: 1501 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!]
form=dynamic_20 guesses: 1890 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!]
So, instead of reading the guesses from the status lines (one per process), jtrts should call
./john --show --format=... --prot= | tail -n 1
and get the number of cracked paswords from the --show status line.
$ ./jtrts.pl -v -stoponerror -passthru="--save-memory=1" -type rar
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.4-jumbo-1-bleeding_omp_dbg [linux-gnu 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
John Jumbo build detected.
--pot=NAME option is valid
--encoding=NAME option is valid
all.chr (../run/all.chr) not found
alnum.chr found, inc_alnum_ee8763c850dee8e4b88ef547a8ed39b8 added as a capability
Types to filter on:
rar
Capabilities in this build of john:
jumbo core inc local_pot_valid encode_valid utf8 cp1252 cp1251 koi8r cp437 cp737 cp850 cp858 cp866 iso8859-1 iso8859-15 inc_alnum_ee8763c850dee8e4b88ef547a8ed39b8
form=rar guesses: 130 0:00:01:17 DONE [PASSED]
FAILED line = dffffffffffff (?)
FAILED line = alsfdkja; (?)
[...]
FAILED line = 1 (?)
FAILED line = password (?)
.pot CHK:rar guesses: 130 -show= 130 0:00:00:17 DONE : Expected count(s) (130) [!!!FAILED4!!!] (0 val-pwd 130 inval-pwd)
Exiting on error. The .pot file tst.pot contains the found data
The command used to run this test was:
../run/john -ses=tst --save-memory=1 -pot=tst.pot rar_tst.in --wordlist=pw-40.dic -form=rar
$ ../run/john -ses=tst --save-memory=1 -pot=tst.pot rar_tst.in --wordlist=pw-40.dic -form=rar
Loaded 130 password hashes with 130 different salts (rar, RAR3 [SHA1 AES 32/64])
No password hashes left to crack (see FAQ)
$ rm tst.pot
$ ../run/john -ses=tst --save-memory=1 -pot=tst.pot rar_tst.in --wordlist=pw-40.dic -form=rar
Loaded 130 password hashes with 130 different salts (rar, RAR3 [SHA1 AES 32/64])
Will run 8 OpenMP threads
fopen: pw-40.dic: No such file or directory
Apparently, jtrts.pl removed pw-40.dic, because the first command actually worked, i.e., there were 130 guesses.
The error was that jtrts.pl couldn't parse the output, because ?
instead of user names were printed.
Nevertheless, I would have liked to run this command with and without -save-memory=1, and compare the output.
TS says all is clear, since jtr says it cracked all items. However, not all were cracked, and there is issues where jtr was thinking there were dupe salts when there should not be.
To work around this (or possibly show OTHER issues), I will re-run JtR after each test, simply to make sure it says no passwords are left.
NOTE This MAY be a problem for formats that are not precise (CRC32, etc). But I can think of no other way to detect this type bug, and it is POSSIBLE that other formats also list that they cracked X number of hashes when in actually they did not.
Frank has provided good tests for 1-4 byte UTF-8 up to maximum length. Wrap them up and use them.
I ran tests with -dev=cpu but it did not work, the default device was used. Took me a while to realize I forgot to say -pass=-dev=cpu... so that was a PEBCAK but TS should really not silently allow an invalid option!
Build a very large file (say 200mb), of arbitrary data lines (none matching). Scatter into that file while it is created, the lines of pw.dic. Then for some fast formats, use this larger dic to run. Things like LM, raw-*, etc. But also sapB/sapG, since they are read past the end of buffer formats also. This is to make sure we are now reading past end of buffer in ways that could crash john on certain systems. This would be good to also run an ASan build of john when doing this, not just expecting the OS to crash the app for us.
This issue in reference to openwall/john@72b22f1#commitcomment-9026535
This is on a 64bit Linux system (Fedora 20):
(master)test $ ./jtrts.pl -type full
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0
--------------------------------------------------------------------------------
John CORE build detected. Only core formats can be tested.
form=md5crypt guesses: 1500 0:00:00:11 DONE [PASSED]
readline() on closed filehandle POTFILE at ./jtrts.pl line 828.
.pot CHK:md5crypt guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!] (0 val-pwd)
form=md5_apr1 guesses: 1500 0:00:00:11 DONE [PASSED]
readline() on closed filehandle POTFILE at ./jtrts.pl line 828.
.pot CHK:md5_apr1 guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!] (0 val-pwd)
form=md5_smd5 guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!]
form=BSDIcrypt guesses: 1500 0:00:00:01 DONE [PASSED]
readline() on closed filehandle POTFILE at ./jtrts.pl line 828.
.pot CHK:BSDIcrypt guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!] (0 val-pwd)
form=Bcrypt guesses: 1500 0:00:00:02 DONE [PASSED]
readline() on closed filehandle POTFILE at ./jtrts.pl line 828.
.pot CHK:Bcrypt guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!] (0 val-pwd)
form=Bcrypt_broken guesses: 1500 0:00:00:02 DONE [PASSED]
readline() on closed filehandle POTFILE at ./jtrts.pl line 828.
.pot CHK:Bcrypt_broken guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!] (0 val-pwd)
form=descrypt guesses: 1500 0:00:00:00 DONE [PASSED]
readline() on closed filehandle POTFILE at ./jtrts.pl line 828.
.pot CHK:descrypt guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!] (0 val-pwd)
form=descrypt guesses: 1500 0:00:00:01 DONE [PASSED]
readline() on closed filehandle POTFILE at ./jtrts.pl line 828.
.pot CHK:descrypt guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!] (0 val-pwd)
form=lm guesses: 3000 0:00:00:00 DONE [PASSED]
readline() on closed filehandle POTFILE at ./jtrts.pl line 828.
.pot CHK:lm guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED!!!] (0 val-pwd)
form=pwdump_lm guesses: 2760 0:00:00:00 DONE [PASSED]
readline() on closed filehandle POTFILE at ./jtrts.pl line 828.
.pot CHK:pwdump_lm guesses: 0 -show= 0 unk unk : Expected count(s) (986) [!!!FAILED!!!] (0 val-pwd)
Some tests had Errors. Performed 10 tests. 1 errors 9 errors reprocessing the .POT files
Time used was 33 seconds
I see this for dynamic_12 and dynamic_1503
$ ./jtrts.pl -type dynamic_12 -q
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper 1.8.0.6-jumbo-1-199-geacddf1 OMP [linux-gnu 64-bit AVX2-autoconf]
--------------------------------------------------------------------------------
Warning: SAP-B format should never be UTF-8.
Use --target-encoding=iso-8859-1 or whatever is applicable.
.pot CHK:dynamic_12 guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED6!!! exited, return code 1]
.pot CHK:dynamic_12 guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED6!!! exited, return code 1]
Some tests had Errors. Performed 2 tests. 2 errors reprocessing the .POT files 2 runs had non-clean exit
Time used was 2 seconds
$ ./jtrts.pl -type dynamic_12 -v -stoponerror
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper 1.8.0.6-jumbo-1-199-geacddf1 OMP [linux-gnu 64-bit AVX2-autoconf]
--------------------------------------------------------------------------------
John Jumbo build detected.
Warning: SAP-B format should never be UTF-8.
Use --target-encoding=iso-8859-1 or whatever is applicable.
--pot=NAME option is valid
--encoding=NAME option is valid
all.chr (../run/all.chr) not found
alnum.chr found, inc_alnum_ee8763c850dee8e4b88ef547a8ed39b8 added as a capability
Types to filter on:
dynamic_12
Capabilities in this build of john:
jumbo core inc local_pot_valid encode_valid utf8 cp1252 cp1251 koi8r cp437 cp737 cp850 cp858 cp866 iso8859-1 iso8859-15 inc_alnum_ee8763c850dee8e4b88ef547a8ed39b8
form=dynamic_12 guesses: 1500 0:00:00:00 DONE [PASSED]
.pot CHK:dynamic_12 guesses: 0 -show= 0 unk unk : Expected count(s) (1500) [!!!FAILED6!!! exited, return code 1]
Exiting on error. The .pot file tst.pot contains the found data
The command used to run this test was:
../run/john -ses=tst -pot=tst.pot dynamic_12_tst.in --wordlist=pw.dic
But executing
../run/john -ses=tst -pot=tst.pot dynamic_12_tst.in --wordlist=pw.dic
cracks the expected 1500 passwords, and exit code is 0:
$ ../run/john -ses=tst -pot=tst.pot dynamic_12_tst.in --wordlist=pw.dic
Warning: invalid UTF-8 seen reading dynamic_12_tst.in
Using default input encoding: UTF-8
Loaded 1500 password hashes with 1500 different salts (dynamic_12 [md5(md5($s).md5($p)) (IPB) 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=4
Press 'q' or Ctrl-C to abort, almost any other key for status
aksarban__5 (u471-dynamic_12)
[...]
Skipping and& Dipping__4 (u362-dynamic_12)
1500g 0:00:00:00 DONE (2015-07-03 19:03) 3571g/s 4000p/s 6000Kc/s 6000KC/s Skippin� an�*..IwasJu$there__19
Use the "--show" option to display all of the cracked passwords reliably
Session completed
$ echo $?
0
$ ../run/john -show -pot=tst.pot dynamic_12_tst.in
Warning: invalid UTF-8 seen reading dynamic_12_tst.in
u0-dynamic_12:Skippin� an�_:0:0:Skippin� an�_::
[...]
u1499-dynamic_12:1__18:1499:0:1__18::
1500 password hashes cracked, 0 left
$ echo $?
0
So, what command did jtrts.pl really run which didn't crack any passwords and ended with exit code 1?
Obviously not the command listed with `-v`.
$ ./jtrts.pl -noprelims lm --stoponerror -pass=-fork=666
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.12.16, Sept 24, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-bleeding-jumbo_omp [darwin13.4.0 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
John Jumbo build detected.
form=lm guesses: 1409 -show=2888 0:00:00:00 DONE : Expected count(s) (1500)(-show3000) [!!!FAILED!!!]
Exiting on error. The pot file ./tst.pot contains the found data
The command used to run this test was:
../run/john -ses=./tst -fork=666 -pot=./tst.pot LM_tst.in --wordlist=pw.dic -form=lm
Actual problem:
$ grep Terminating tst.log
1 0:00:00:00 Terminating on error, john.c:496
Looking at the referenced source line, it's obvious I just hit my ulimits.
I guess we could always grep for that and show it, as a hint.
After a system() or backtick call, $? is the real exit code left shifted by 8, plus: bit 7 tells if we got a core dump and bits 0-6 tells we had a segfault and with what signal.
if ($? & 127) {
printf "child died with signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
printf "child exited with value %d\n", $? >> 8;
}
8a91223 just fixed the reporting of exit value (right shifts by 8) but with something like the above we could also add whether it died and with what signal.
Since descrypt accepts 8bit characters, but ignores the highest bit, TS has to treat several possible password candidates as valid, as long as they match after stripping the highest bit.
form=descrypt guesses: 1500 0:00:00:00 DONE [PASSED]
FAILED line = P�II (PIII)
FAILED line = hello__1 (hello__�)
FAILED line = �23�5�_2 (12345__2)
FAILED line = 1__3 (1�_3)
FAILED line = P�II (PIII)
FAILED line = 1__3 (1�_3)
FAILED line = BBSPw__5 (B�S�w_�5)
FAILED line = �23�5�_2 (12345__2)
FAILED line = 1__� (1__1)
FAILED line = ad�in__1 (admin__1)
FAILED line = hello__1 (hello__�)
FAILED line = qerwt__2 (qe�wt_߲)
FAILED line = BBSPw__1 (B�SP�__�)
FAILED line = qerwt__2 (qe�wt_߲)
FAILED line = qerwt__5 (q�rwt_ߵ)
FAILED line = letM�in (letMein)
FAILED line = qe��t__� (qerwt__3)
FAILED line = admin__5 (�d�in__5)
FAILED line = ad�in__1 (admin__1)
FAILED line = test__� (test__5)
FAILED line = 1234�__� (12345__4)
FAILED line = test (��st)
FAILED line = test__� (test__5)
FAILED line = BBSPw__1 (B�SP�__�)
FAILED line = test (��st)
FAILED line = admin__5 (�d�in__5)
FAILED line = qe��t__� (qerwt__3)
FAILED line = BBSPw__5 (B�S�w_�5)
FAILED line = qerwt__5 (q�rwt_ߵ)
FAILED line = 1__� (1__1)
FAILED line = letM�in (letMein)
FAILED line = 1234�__� (12345__4)
.pot CHK:descrypt guesses: 1532 -show=1500 0:00:00:00 DONE : Expected count(s) (1500) [!!!FAILED!!!] (1500 val-pwd)
Exiting on error. The .pot file ./tst.pot contains the found data
The command used to run this test was:
../run/john -ses=./tst --fork=3 -pot=./tst.pot DES_tst.in --wordlist=pw.dic
In the FAILED
lines above, the test suite either expects ascii-only passwords where john found non-ascii passwords, or it expects non-ascii paswords where john found ascii passwords.
After the -show tests were added, we get these complaints from sapF
$ ./jtrts.pl sapf
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.12.14, June 30, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-bleeding-jumbo [darwin13.4.0 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
John Jumbo build detected.
Warning: SAP-F/G format should always be UTF-8.
Convert your input files to UTF-8 and use --input-encoding=utf8
form=SAP F/G guesses: 6794 0:00:00:00 DONE [PASSED]
Warning: SAP-F/G format should always be UTF-8.
Convert your input files to UTF-8 and use --input-encoding=utf8
.pot CHK:SAP F/G guesses: 6794 0:00:00:00 DONE [PASSED]
All tests passed without error. Performed 1 tests. Time used was 1 seconds
jtrts.dat says that -enc=utf8
should be used, and the normal tests does so. The -show tests doesn't.
$ ./jtrts.pl -h
Use of uninitialized value in concatenation (.) or string at jtrts_inc.pm line 27.
JtR TestSuite, command usage:
usage: ./jtrts.pl [-h|-?] [-option[s]]
Options can be abbreviated!
Options are:
-basepath <s> set the basepath where john exe is located. By default
this is set to
[...]
To fix this, the following change is required:
$ git diff
diff --git a/jtrts.pl b/jtrts.pl
index a904e1b..ab08610 100755
--- a/jtrts.pl
+++ b/jtrts.pl
@@ -95,7 +95,7 @@ sub parseArgs {
'stoponerror!' => \$stop_on_error,
'showstderr!' => \$show_stderr,
);
- if ($help) { usage(); }
+ if ($help) { usage($JOHN_PATH); }
if ($basepath ne "") {
$JOHN_PATH = $basepath;
$JOHN_EXE = "$JOHN_PATH/john";
Result:
$ ./jtrts.pl -h
JtR TestSuite, command usage:
usage: ./jtrts.pl [-h|-?] [-option[s]]
Options can be abbreviated!
Options are:
-basepath <s> set the basepath where john exe is located. By default
this is set to ../run
$ ./jtrts.pl -internal
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.2-jumbo-1-bleeding_omp_asan [darwin14.1.0 64-bit AVX-autoconf]
--------------------------------------------------------------------------------
John Jumbo build detected.
John CORE build detected.
The -internal mode ONLY works for jumbo build of john.
I suppose this is due to the format list being suppressed from normal usage blob.
As I start to either add these, or figure out why they are not included, I will update this list.
dynamic_17 (there but only run on a 'full' mode)
dynamic_39 (added this, and also a net-md5 file I converted from the dyna_39)
dynamic_40 (added this, and also a net-sha1 file I converted from the dyna_40)
dynamic_53 53 to 158 have all been added.
Updated all above: 724ccf9 and e4c8357
dynamic_1010 (not in pass_gen.pl)
dynamic_1013 (not in pass_gen.pl)
dynamic_1400
dynamic_1401
dynamic_1501
dynamic_1502
dynamic_1503
Also, when new formats are added to JtR, but are not in the TS, we should also add them, and then move them to the 'in pass_gen' table when we code it there, then remove it when it gets added to the TS.
I added code to the -showtypes function in the jtrts.pl file, and now I think we have a pretty comprehensive list of data that we have in pass_gen.pl but not in the TS yet, AND a list of items not even added to pass_gen.pl yet. This is some decent 'todo' work, lol.
These are not in pass_gen.pl or in the TS yet.
---These have been added to pass_gen.pl and also placed into TS ---
This is insane
form=office_2007 guesses: 1500 0:00:20:21 DONE [PASSED]
.pot CHK:office_2007 guesses: 1500 0:00:17:17 DONE [PASSED]
We should run like 50 of them instead, for a 300x faster run.
$ ./jtrts.pl
-------------------------------------------------------------------------------
- JtR-TestSuite (jtrts). Version 1.13, Dec 21, 2014. By, Jim Fougeron & others
- Testing: John the Ripper password cracker, version 1.8.0.4
--------------------------------------------------------------------------------
John CORE build detected. Only core formats can be tested.
form=md5crypt guesses: 1500 0:00:00:08 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 650.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 651.
.pot CHK:md5crypt guesses: 1500 0:00:00:06 100% [PASSED] (1500 val-pwd)
form=md5crypt guesses: 1500 0:00:00:01 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 650.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 651.
.pot CHK:md5crypt guesses: 1500 0:00:00:00 100% [PASSED] (1500 val-pwd)
form=md5_apr1 guesses: 1500 0:00:00:08 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 650.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 651.
.pot CHK:md5_apr1 guesses: 1500 0:00:00:06 100% [PASSED] (1500 val-pwd)
form=md5_apr1 guesses: 1500 0:00:00:01 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 650.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 651.
.pot CHK:md5_apr1 guesses: 1500 0:00:00:00 100% [PASSED] (1500 val-pwd)
form=BSDIcrypt guesses: 1500 0:00:00:01 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 650.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 651.
.pot CHK:BSDIcrypt guesses: 1500 0:00:00:01 100% [PASSED] (1500 val-pwd)
form=Bcrypt guesses: 1500 0:00:00:01 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 650.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 651.
.pot CHK:Bcrypt guesses: 1500 0:00:00:01 100% [PASSED] (1500 val-pwd)
form=Bcrypt_broken guesses: 1500 0:00:00:01 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 650.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 651.
.pot CHK:Bcrypt_broken guesses: 1500 0:00:00:01 100% [PASSED] (1500 val-pwd)
form=descrypt guesses: 1500 0:00:00:00 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 650.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 651.
.pot CHK:descrypt guesses: 1500 0:00:00:00 100% [PASSED] (1500 val-pwd)
form=descrypt guesses: 1500 0:00:00:01 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 650.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 651.
.pot CHK:descrypt guesses: 1500 0:00:00:00 100% [PASSED] (1500 val-pwd)
form=lm guesses: 3000 0:00:00:00 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 650.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 651.
.pot CHK:lm guesses: 1500 0:00:00:00 100% [PASSED] (1500 val-pwd)
form=pwdump_lm guesses: 2760 0:00:00:00 DONE [PASSED]
Use of uninitialized value in split at ./jtrts.pl line 650.
Use of uninitialized value $details[4] in hex at ./jtrts.pl line 651.
.pot CHK:pwdump_lm guesses: 986 0:00:00:00 100% [PASSED] (986 val-pwd)
All tests passed without error. Performed 11 tests. Time used was 48 seconds
Since core doesn't have --list=
, the only way here would be a hard coded list (or we just ignore $is_8bit
for core builds.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.