From 85aab39dbdd15cd27546492ec8e518fb72886b82 Mon Sep 17 00:00:00 2001 From: namaenonaimumei <50381836+namaenonaimumei@users.noreply.github.com> Date: Fri, 14 Jan 2022 07:14:47 +0900 Subject: [PATCH 1/4] Fix syntax error for --nolog --- lib/metasploit/framework/password_crackers/cracker.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/metasploit/framework/password_crackers/cracker.rb b/lib/metasploit/framework/password_crackers/cracker.rb index fc5fe0c709..a3c9864850 100644 --- a/lib/metasploit/framework/password_crackers/cracker.rb +++ b/lib/metasploit/framework/password_crackers/cracker.rb @@ -369,7 +369,7 @@ module Metasploit # @return [Array] An array set up for {::IO.popen} to use def john_crack_command cmd_string = binary_path - cmd = [cmd_string, '--session=' + cracker_session_id, '--nolog'] + cmd = [cmd_string, '--session=' + cracker_session_id, '--no-log'] if config.present? cmd << ("--config=" + config) From 7a7b009161d6b0839653f21296864da3365402a0 Mon Sep 17 00:00:00 2001 From: h00die Date: Mon, 17 Jan 2022 15:33:41 -0500 Subject: [PATCH 2/4] add more smarts to nolog for jtr --- data/jtr/dumb16.conf | 74 +++-- data/jtr/dumb32.conf | 284 ++++++++++++------ data/jtr/dynamic_disabled.conf | 6 +- data/jtr/john.conf | 259 +++++++++++++--- data/jtr/korelogic.conf | 2 +- data/jtr/repeats16.conf | 74 +++-- data/jtr/repeats32.conf | 284 ++++++++++++------ .../framework/password_crackers/cracker.rb | 163 +++++----- .../password_crackers/cracker_spec.rb | 34 +-- 9 files changed, 783 insertions(+), 397 deletions(-) diff --git a/data/jtr/dumb16.conf b/data/jtr/dumb16.conf index d45a8c1f3d..7699a22b48 100644 --- a/data/jtr/dumb16.conf +++ b/data/jtr/dumb16.conf @@ -1,17 +1,22 @@ -# This software is Copyright (c) 2012-2018 magnum, and it is hereby +# This software is Copyright (c) 2012-2020 magnum, and it is hereby # released to the general public under the following terms: # Redistribution and use in source and binary forms, with or without # modification, are permitted. # # Generic implementation of "dumb" exhaustive search of Unicode BMP. -# Default is to try *all* allocated characters in the BMP of Unicode v11 -# (there's 55,292 of them). Even if a fast format can exhaust two characters +# Default is to try *all* allocated characters in the BMP of Unicode v13 +# (there's 55,387 of them). Even if a fast format can exhaust two characters # in 15 minutes, three characters would take 1.5 years... # # Note that these modes will handle --max-len differently than normal: They # will consider number of characters as opposed to number of bytes. This # means you can naturally just use e.g. --max-len=3 for generating all # three-character candidates (which may be up to 9 bytes each). +# +# Note that the (newer) cracking mode --subsets=full-unicode is way faster than +# this external mode, although not as easy to adapt to smaller portions of the +# Unicode space. See doc/SUBSETS + [List.External:Dumb16] int maxlength; // Maximum password length to try int last; // Last character position, zero-based @@ -163,7 +168,7 @@ void init() while (c <= 0x8b4) // ..to ARABIC LETTER KAF WITH DOT BELOW charset[i++] = c++; c = 0x8b6; // from ARABIC LETTER BEH WITH SMALL MEEM ABOVE - while (c <= 0x8bd) // ..to ARABIC LETTER AFRICAN NOON + while (c <= 0x8c7) // ..to ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE charset[i++] = c++; c = 0x8d3; // from ARABIC SMALL LOW WAW while (c <= 0x8ff) // ..to ARABIC MARK SIDEWAYS NOON GHUNNA @@ -300,7 +305,7 @@ void init() charset[i++] = 0xb48; // ORIYA VOWEL SIGN AI charset[i++] = 0xb4b; // ORIYA VOWEL SIGN O charset[i++] = 0xb4d; // ORIYA SIGN VIRAMA - charset[i++] = 0xb56; // ORIYA AI LENGTH MARK + charset[i++] = 0xb55; // ORIYA SIGN OVERLINE charset[i++] = 0xb57; // ORIYA AU LENGTH MARK charset[i++] = 0xb5c; // ORIYA LETTER RRA charset[i++] = 0xb5d; // ORIYA LETTER RHA @@ -373,7 +378,7 @@ void init() c = 0xc66; // from TELUGU DIGIT ZERO while (c <= 0xc6f) // ..to TELUGU DIGIT NINE charset[i++] = c++; - c = 0xc78; // from TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR + c = 0xc77; // from TELUGU SIGN SIDDHAM while (c <= 0xc7f) // ..to TELUGU SIGN TUUMU charset[i++] = c++; // 0C80..0CFF; Kannada @@ -411,9 +416,6 @@ void init() charset[i++] = 0xcf2; // KANNADA SIGN UPADHMANIYA // 0D00..0D7F; Malayalam c = 0xd00; // from MALAYALAM SIGN COMBINING ANUSVARA ABOVE - while (c <= 0xd03) // ..to MALAYALAM SIGN VISARGA - charset[i++] = c++; - c = 0xd05; // from MALAYALAM LETTER A while (c <= 0xd0c) // ..to MALAYALAM LETTER VOCALIC L charset[i++] = c++; charset[i++] = 0xd0e; // MALAYALAM LETTER E @@ -433,7 +435,7 @@ void init() while (c <= 0xd7f) // ..to MALAYALAM LETTER CHILLU K charset[i++] = c++; // 0D80..0DFF; Sinhala - charset[i++] = 0xd82; // SINHALA SIGN ANUSVARAYA + charset[i++] = 0xd81; // SINHALA SIGN CANDRABINDU charset[i++] = 0xd83; // SINHALA SIGN VISARGAYA c = 0xd85; // from SINHALA LETTER AYANNA while (c <= 0xd96) // ..to SINHALA LETTER AUYANNA @@ -468,23 +470,15 @@ void init() // 0E80..0EFF; Lao charset[i++] = 0xe81; // LAO LETTER KO charset[i++] = 0xe82; // LAO LETTER KHO SUNG - charset[i++] = 0xe87; // LAO LETTER NGO - charset[i++] = 0xe88; // LAO LETTER CO - c = 0xe94; // from LAO LETTER DO - while (c <= 0xe97) // ..to LAO LETTER THO TAM + c = 0xe86; // from LAO LETTER PALI GHA + while (c <= 0xe8a) // ..to LAO LETTER SO TAM charset[i++] = c++; - c = 0xe99; // from LAO LETTER NO - while (c <= 0xe9f) // ..to LAO LETTER FO SUNG + c = 0xe8c; // from LAO LETTER PALI JHA + while (c <= 0xea3) // ..to LAO LETTER LO LING charset[i++] = c++; - charset[i++] = 0xea1; // LAO LETTER MO - charset[i++] = 0xea3; // LAO LETTER LO LING - charset[i++] = 0xeaa; // LAO LETTER SO SUNG - charset[i++] = 0xeab; // LAO LETTER HO SUNG - c = 0xead; // from LAO LETTER O - while (c <= 0xeb9) // ..to LAO VOWEL SIGN UU + c = 0xea7; // from LAO LETTER WO + while (c <= 0xebd) // ..to LAO SEMIVOWEL SIGN NYO charset[i++] = c++; - charset[i++] = 0xebb; // LAO VOWEL SIGN MAI KON - charset[i++] = 0xebd; // LAO SEMIVOWEL SIGN NYO c = 0xec0; // from LAO VOWEL SIGN E while (c <= 0xec4) // ..to LAO VOWEL SIGN AI charset[i++] = c++; @@ -710,7 +704,7 @@ void init() charset[i++] = c++; // 1AB0..1AFF; Combining Diacritical Marks Extended c = 0x1ab0; // from COMBINING DOUBLED CIRCUMFLEX ACCENT - while (c <= 0x1abe) // ..to COMBINING PARENTHESES OVERLAY + while (c <= 0x1ac0) // ..to COMBINING LATIN SMALL LETTER TURNED W BELOW charset[i++] = c++; // 1B00..1B7F; Balinese c = 0x1b00; // from BALINESE SIGN ULU RICEM @@ -759,7 +753,7 @@ void init() charset[i++] = c++; // 1CD0..1CFF; Vedic Extensions c = 0x1cd0; // from VEDIC TONE KARSHANA - while (c <= 0x1cf9) // ..to VEDIC TONE DOUBLE RING ABOVE + while (c <= 0x1cfa) // ..to VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA charset[i++] = c++; // 1D00..1D7F; Phonetic Extensions c = 0x1d00; // from LATIN LETTER SMALL CAPITAL A @@ -926,11 +920,8 @@ void init() c = 0x2b76; // from NORTH WEST TRIANGLE-HEADED ARROW TO BAR while (c <= 0x2b95) // ..to RIGHTWARDS BLACK ARROW charset[i++] = c++; - c = 0x2b98; // from THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD - while (c <= 0x2bc8) // ..to BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED - charset[i++] = c++; - c = 0x2bca; // from TOP HALF BLACK CIRCLE - while (c <= 0x2bfe) // ..to REVERSED RIGHT ANGLE + c = 0x2b97; // from SYMBOL FOR TYPE A ELECTRONICS + while (c <= 0x2bff) // ..to HELLSCHREIBER PAUSE SYMBOL charset[i++] = c++; // 2C00..2C5F; Glagolitic c = 0x2c00; // from GLAGOLITIC CAPITAL LETTER AZU @@ -998,7 +989,7 @@ void init() charset[i++] = c++; // 2E00..2E7F; Supplemental Punctuation c = 0x2e00; // from RIGHT ANGLE SUBSTITUTION MARKER - while (c <= 0x2e4e) // ..to PUNCTUS ELEVATUS MARK + while (c <= 0x2e52) // ..to TIRONIAN SIGN CAPITAL ET charset[i++] = c++; // 2E80..2EFF; CJK Radicals Supplement c = 0x2e80; // from CJK RADICAL REPEAT @@ -1044,7 +1035,7 @@ void init() charset[i++] = c++; // 31A0..31BF; Bopomofo Extended c = 0x31a0; // from BOPOMOFO LETTER BU - while (c <= 0x31ba) // ..to BOPOMOFO LETTER ZY + while (c <= 0x31bf) // ..to BOPOMOFO LETTER AH charset[i++] = c++; // 31C0..31EF; CJK Strokes c = 0x31c0; // from CJK STROKE T @@ -1059,7 +1050,7 @@ void init() while (c <= 0x321e) // ..to PARENTHESIZED KOREAN CHARACTER O HU charset[i++] = c++; c = 0x3220; // from PARENTHESIZED IDEOGRAPH ONE - while (c <= 0x32fe) // ..to CIRCLED KATAKANA WO + while (c <= 0x32ff) // ..to SQUARE ERA NAME REIWA charset[i++] = c++; // 3300..33FF; CJK Compatibility c = 0x3300; // from SQUARE APAATO @@ -1067,7 +1058,7 @@ void init() charset[i++] = c++; // 3400..4DBF; CJK Unified Ideographs Extension A c = 0x3400; // from - while (c <= 0x4db5) // ..to + while (c <= 0x4dbf) // ..to charset[i++] = c++; // 4DC0..4DFF; Yijing Hexagram Symbols c = 0x4dc0; // from HEXAGRAM FOR THE CREATIVE HEAVEN @@ -1075,7 +1066,7 @@ void init() charset[i++] = c++; // 4E00..9FFF; CJK Unified Ideographs c = 0x4e00; // from - while (c <= 0x9fef) // ..to + while (c <= 0x9ffc) // ..to charset[i++] = c++; // A000..A48F; Yi Syllables c = 0xa000; // from YI SYLLABLE IT @@ -1107,14 +1098,17 @@ void init() charset[i++] = c++; // A720..A7FF; Latin Extended-D c = 0xa720; // from MODIFIER LETTER STRESS AND HIGH TONE - while (c <= 0xa7b9) // ..to LATIN SMALL LETTER U WITH STROKE + while (c <= 0xa7bf) // ..to LATIN SMALL LETTER GLOTTAL U charset[i++] = c++; - c = 0xa7f7; // from LATIN EPIGRAPHIC LETTER SIDEWAYS I + c = 0xa7c2; // from LATIN CAPITAL LETTER ANGLICANA W + while (c <= 0xa7ca) // ..to LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY + charset[i++] = c++; + c = 0xa7f5; // from LATIN CAPITAL LETTER REVERSED HALF H while (c <= 0xa7ff) // ..to LATIN EPIGRAPHIC LETTER ARCHAIC M charset[i++] = c++; // A800..A82F; Syloti Nagri c = 0xa800; // from SYLOTI NAGRI LETTER A - while (c <= 0xa82b) // ..to SYLOTI NAGRI POETRY MARK-4 + while (c <= 0xa82c) // ..to SYLOTI NAGRI SIGN ALTERNATE HASANTA charset[i++] = c++; // A830..A83F; Common Indic Number Forms c = 0xa830; // from NORTH INDIC FRACTION ONE QUARTER @@ -1207,7 +1201,7 @@ void init() charset[i++] = c++; // AB30..AB6F; Latin Extended-E c = 0xab30; // from LATIN SMALL LETTER BARRED ALPHA - while (c <= 0xab65) // ..to GREEK LETTER SMALL CAPITAL OMEGA + while (c <= 0xab6b) // ..to MODIFIER LETTER RIGHT TACK charset[i++] = c++; // AB70..ABBF; Cherokee Supplement c = 0xab70; // from CHEROKEE SMALL LETTER A diff --git a/data/jtr/dumb32.conf b/data/jtr/dumb32.conf index a28e3d46d6..02d75bf108 100644 --- a/data/jtr/dumb32.conf +++ b/data/jtr/dumb32.conf @@ -1,11 +1,11 @@ -# This software is Copyright (c) 2012-2018 magnum, and it is hereby +# This software is Copyright (c) 2012-2020 magnum, and it is hereby # released to the general public under the following terms: # Redistribution and use in source and binary forms, with or without # modification, are permitted. # # Generic implementation of "dumb" exhaustive search of FULL Unicode. -# Default is to try *all* allocated characters in Unicode v11 (there's -# 137,046 of them). Even if a fast format can exhaust two characters in one +# Default is to try *all* allocated characters in Unicode v13 (there's +# 143,532 of them). Even if a fast format can exhaust two characters in one # hour, three characters would take 12 years... # # Note that these modes will handle --max-len differently than normal: They @@ -17,12 +17,17 @@ # format will be up to four bytes (two 16-bit words) due to use of surrogates # for characters above U+FFFF. This means a format which normally handles up # to 27 characters may be limited to only 13 characters, worst case. +# +# Note that the (newer) cracking mode --subsets=full-unicode is way faster than +# this external mode, although not as easy to adapt to smaller portions of the +# Unicode space. See doc/SUBSETS + [List.External:Dumb32] int maxlength; // Maximum password length to try int last; // Last character position, zero-based int lastid; // Character index in the last position int id[0x7f]; // Current character indices for other positions -int charset[0x22000], c0; // Characters +int charset[0x24000], c0; // Characters void init() { @@ -168,7 +173,7 @@ void init() while (c <= 0x8b4) // ..to ARABIC LETTER KAF WITH DOT BELOW charset[i++] = c++; c = 0x8b6; // from ARABIC LETTER BEH WITH SMALL MEEM ABOVE - while (c <= 0x8bd) // ..to ARABIC LETTER AFRICAN NOON + while (c <= 0x8c7) // ..to ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE charset[i++] = c++; c = 0x8d3; // from ARABIC SMALL LOW WAW while (c <= 0x8ff) // ..to ARABIC MARK SIDEWAYS NOON GHUNNA @@ -305,7 +310,7 @@ void init() charset[i++] = 0xb48; // ORIYA VOWEL SIGN AI charset[i++] = 0xb4b; // ORIYA VOWEL SIGN O charset[i++] = 0xb4d; // ORIYA SIGN VIRAMA - charset[i++] = 0xb56; // ORIYA AI LENGTH MARK + charset[i++] = 0xb55; // ORIYA SIGN OVERLINE charset[i++] = 0xb57; // ORIYA AU LENGTH MARK charset[i++] = 0xb5c; // ORIYA LETTER RRA charset[i++] = 0xb5d; // ORIYA LETTER RHA @@ -378,7 +383,7 @@ void init() c = 0xc66; // from TELUGU DIGIT ZERO while (c <= 0xc6f) // ..to TELUGU DIGIT NINE charset[i++] = c++; - c = 0xc78; // from TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR + c = 0xc77; // from TELUGU SIGN SIDDHAM while (c <= 0xc7f) // ..to TELUGU SIGN TUUMU charset[i++] = c++; // 0C80..0CFF; Kannada @@ -416,9 +421,6 @@ void init() charset[i++] = 0xcf2; // KANNADA SIGN UPADHMANIYA // 0D00..0D7F; Malayalam c = 0xd00; // from MALAYALAM SIGN COMBINING ANUSVARA ABOVE - while (c <= 0xd03) // ..to MALAYALAM SIGN VISARGA - charset[i++] = c++; - c = 0xd05; // from MALAYALAM LETTER A while (c <= 0xd0c) // ..to MALAYALAM LETTER VOCALIC L charset[i++] = c++; charset[i++] = 0xd0e; // MALAYALAM LETTER E @@ -438,7 +440,7 @@ void init() while (c <= 0xd7f) // ..to MALAYALAM LETTER CHILLU K charset[i++] = c++; // 0D80..0DFF; Sinhala - charset[i++] = 0xd82; // SINHALA SIGN ANUSVARAYA + charset[i++] = 0xd81; // SINHALA SIGN CANDRABINDU charset[i++] = 0xd83; // SINHALA SIGN VISARGAYA c = 0xd85; // from SINHALA LETTER AYANNA while (c <= 0xd96) // ..to SINHALA LETTER AUYANNA @@ -473,23 +475,15 @@ void init() // 0E80..0EFF; Lao charset[i++] = 0xe81; // LAO LETTER KO charset[i++] = 0xe82; // LAO LETTER KHO SUNG - charset[i++] = 0xe87; // LAO LETTER NGO - charset[i++] = 0xe88; // LAO LETTER CO - c = 0xe94; // from LAO LETTER DO - while (c <= 0xe97) // ..to LAO LETTER THO TAM + c = 0xe86; // from LAO LETTER PALI GHA + while (c <= 0xe8a) // ..to LAO LETTER SO TAM charset[i++] = c++; - c = 0xe99; // from LAO LETTER NO - while (c <= 0xe9f) // ..to LAO LETTER FO SUNG + c = 0xe8c; // from LAO LETTER PALI JHA + while (c <= 0xea3) // ..to LAO LETTER LO LING charset[i++] = c++; - charset[i++] = 0xea1; // LAO LETTER MO - charset[i++] = 0xea3; // LAO LETTER LO LING - charset[i++] = 0xeaa; // LAO LETTER SO SUNG - charset[i++] = 0xeab; // LAO LETTER HO SUNG - c = 0xead; // from LAO LETTER O - while (c <= 0xeb9) // ..to LAO VOWEL SIGN UU + c = 0xea7; // from LAO LETTER WO + while (c <= 0xebd) // ..to LAO SEMIVOWEL SIGN NYO charset[i++] = c++; - charset[i++] = 0xebb; // LAO VOWEL SIGN MAI KON - charset[i++] = 0xebd; // LAO SEMIVOWEL SIGN NYO c = 0xec0; // from LAO VOWEL SIGN E while (c <= 0xec4) // ..to LAO VOWEL SIGN AI charset[i++] = c++; @@ -715,7 +709,7 @@ void init() charset[i++] = c++; // 1AB0..1AFF; Combining Diacritical Marks Extended c = 0x1ab0; // from COMBINING DOUBLED CIRCUMFLEX ACCENT - while (c <= 0x1abe) // ..to COMBINING PARENTHESES OVERLAY + while (c <= 0x1ac0) // ..to COMBINING LATIN SMALL LETTER TURNED W BELOW charset[i++] = c++; // 1B00..1B7F; Balinese c = 0x1b00; // from BALINESE SIGN ULU RICEM @@ -764,7 +758,7 @@ void init() charset[i++] = c++; // 1CD0..1CFF; Vedic Extensions c = 0x1cd0; // from VEDIC TONE KARSHANA - while (c <= 0x1cf9) // ..to VEDIC TONE DOUBLE RING ABOVE + while (c <= 0x1cfa) // ..to VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA charset[i++] = c++; // 1D00..1D7F; Phonetic Extensions c = 0x1d00; // from LATIN LETTER SMALL CAPITAL A @@ -931,11 +925,8 @@ void init() c = 0x2b76; // from NORTH WEST TRIANGLE-HEADED ARROW TO BAR while (c <= 0x2b95) // ..to RIGHTWARDS BLACK ARROW charset[i++] = c++; - c = 0x2b98; // from THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD - while (c <= 0x2bc8) // ..to BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED - charset[i++] = c++; - c = 0x2bca; // from TOP HALF BLACK CIRCLE - while (c <= 0x2bfe) // ..to REVERSED RIGHT ANGLE + c = 0x2b97; // from SYMBOL FOR TYPE A ELECTRONICS + while (c <= 0x2bff) // ..to HELLSCHREIBER PAUSE SYMBOL charset[i++] = c++; // 2C00..2C5F; Glagolitic c = 0x2c00; // from GLAGOLITIC CAPITAL LETTER AZU @@ -1003,7 +994,7 @@ void init() charset[i++] = c++; // 2E00..2E7F; Supplemental Punctuation c = 0x2e00; // from RIGHT ANGLE SUBSTITUTION MARKER - while (c <= 0x2e4e) // ..to PUNCTUS ELEVATUS MARK + while (c <= 0x2e52) // ..to TIRONIAN SIGN CAPITAL ET charset[i++] = c++; // 2E80..2EFF; CJK Radicals Supplement c = 0x2e80; // from CJK RADICAL REPEAT @@ -1049,7 +1040,7 @@ void init() charset[i++] = c++; // 31A0..31BF; Bopomofo Extended c = 0x31a0; // from BOPOMOFO LETTER BU - while (c <= 0x31ba) // ..to BOPOMOFO LETTER ZY + while (c <= 0x31bf) // ..to BOPOMOFO LETTER AH charset[i++] = c++; // 31C0..31EF; CJK Strokes c = 0x31c0; // from CJK STROKE T @@ -1064,7 +1055,7 @@ void init() while (c <= 0x321e) // ..to PARENTHESIZED KOREAN CHARACTER O HU charset[i++] = c++; c = 0x3220; // from PARENTHESIZED IDEOGRAPH ONE - while (c <= 0x32fe) // ..to CIRCLED KATAKANA WO + while (c <= 0x32ff) // ..to SQUARE ERA NAME REIWA charset[i++] = c++; // 3300..33FF; CJK Compatibility c = 0x3300; // from SQUARE APAATO @@ -1072,7 +1063,7 @@ void init() charset[i++] = c++; // 3400..4DBF; CJK Unified Ideographs Extension A c = 0x3400; // from - while (c <= 0x4db5) // ..to + while (c <= 0x4dbf) // ..to charset[i++] = c++; // 4DC0..4DFF; Yijing Hexagram Symbols c = 0x4dc0; // from HEXAGRAM FOR THE CREATIVE HEAVEN @@ -1080,7 +1071,7 @@ void init() charset[i++] = c++; // 4E00..9FFF; CJK Unified Ideographs c = 0x4e00; // from - while (c <= 0x9fef) // ..to + while (c <= 0x9ffc) // ..to charset[i++] = c++; // A000..A48F; Yi Syllables c = 0xa000; // from YI SYLLABLE IT @@ -1112,14 +1103,17 @@ void init() charset[i++] = c++; // A720..A7FF; Latin Extended-D c = 0xa720; // from MODIFIER LETTER STRESS AND HIGH TONE - while (c <= 0xa7b9) // ..to LATIN SMALL LETTER U WITH STROKE + while (c <= 0xa7bf) // ..to LATIN SMALL LETTER GLOTTAL U charset[i++] = c++; - c = 0xa7f7; // from LATIN EPIGRAPHIC LETTER SIDEWAYS I + c = 0xa7c2; // from LATIN CAPITAL LETTER ANGLICANA W + while (c <= 0xa7ca) // ..to LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY + charset[i++] = c++; + c = 0xa7f5; // from LATIN CAPITAL LETTER REVERSED HALF H while (c <= 0xa7ff) // ..to LATIN EPIGRAPHIC LETTER ARCHAIC M charset[i++] = c++; // A800..A82F; Syloti Nagri c = 0xa800; // from SYLOTI NAGRI LETTER A - while (c <= 0xa82b) // ..to SYLOTI NAGRI POETRY MARK-4 + while (c <= 0xa82c) // ..to SYLOTI NAGRI SIGN ALTERNATE HASANTA charset[i++] = c++; // A830..A83F; Common Indic Number Forms c = 0xa830; // from NORTH INDIC FRACTION ONE QUARTER @@ -1212,7 +1206,7 @@ void init() charset[i++] = c++; // AB30..AB6F; Latin Extended-E c = 0xab30; // from LATIN SMALL LETTER BARRED ALPHA - while (c <= 0xab65) // ..to GREEK LETTER SMALL CAPITAL OMEGA + while (c <= 0xab6b) // ..to MODIFIER LETTER RIGHT TACK charset[i++] = c++; // AB70..ABBF; Cherokee Supplement c = 0xab70; // from CHEROKEE SMALL LETTER A @@ -1378,7 +1372,7 @@ void init() charset[i++] = c++; // 10190..101CF; Ancient Symbols c = 0x10190; // from ROMAN SEXTANS SIGN - while (c <= 0x1019b) // ..to ROMAN CENTURIAL SIGN + while (c <= 0x1019c) // ..to ASCIA SYMBOL charset[i++] = c++; charset[i++] = 0x101a0; // GREEK SYMBOL TAU RHO // 101D0..101FF; Phaistos Disc @@ -1620,6 +1614,14 @@ void init() c = 0x10e60; // from RUMI DIGIT ONE while (c <= 0x10e7e) // ..to RUMI FRACTION TWO THIRDS charset[i++] = c++; +// 10E80..10EBF; Yezidi + c = 0x10e80; // from YEZIDI LETTER ELIF + while (c <= 0x10ea9) // ..to YEZIDI LETTER ET + charset[i++] = c++; + charset[i++] = 0x10eab; // YEZIDI COMBINING HAMZA MARK + charset[i++] = 0x10ead; // YEZIDI HYPHENATION MARK + charset[i++] = 0x10eb0; // YEZIDI LETTER LAM WITH DOT ABOVE + charset[i++] = 0x10eb1; // YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE // 10F00..10F2F; Old Sogdian c = 0x10f00; // from OLD SOGDIAN LETTER ALEPH while (c <= 0x10f27) // ..to OLD SOGDIAN LIGATURE AYIN-DALETH @@ -1628,6 +1630,14 @@ void init() c = 0x10f30; // from SOGDIAN LETTER ALEPH while (c <= 0x10f59) // ..to SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT charset[i++] = c++; +// 10FB0..10FDF; Chorasmian + c = 0x10fb0; // from CHORASMIAN LETTER ALEPH + while (c <= 0x10fcb) // ..to CHORASMIAN NUMBER ONE HUNDRED + charset[i++] = c++; +// 10FE0..10FFF; Elymaic + c = 0x10fe0; // from ELYMAIC LETTER ALEPH + while (c <= 0x10ff6) // ..to ELYMAIC LIGATURE ZAYIN-YODH + charset[i++] = c++; // 11000..1107F; Brahmi c = 0x11000; // from BRAHMI SIGN CANDRABINDU while (c <= 0x1104d) // ..to BRAHMI PUNCTUATION LOTUS @@ -1653,7 +1663,7 @@ void init() while (c <= 0x11134) // ..to CHAKMA MAAYYAA charset[i++] = c++; c = 0x11136; // from CHAKMA DIGIT ZERO - while (c <= 0x11146) // ..to CHAKMA VOWEL SIGN EI + while (c <= 0x11147) // ..to CHAKMA LETTER VAA charset[i++] = c++; // 11150..1117F; Mahajani c = 0x11150; // from MAHAJANI LETTER A @@ -1661,9 +1671,6 @@ void init() charset[i++] = c++; // 11180..111DF; Sharada c = 0x11180; // from SHARADA SIGN CANDRABINDU - while (c <= 0x111cd) // ..to SHARADA SUTRA MARK - charset[i++] = c++; - c = 0x111d0; // from SHARADA DIGIT ZERO while (c <= 0x111df) // ..to SHARADA SECTION MARK-2 charset[i++] = c++; // 111E0..111FF; Sinhala Archaic Numbers @@ -1735,10 +1742,11 @@ void init() charset[i++] = c++; // 11400..1147F; Newa c = 0x11400; // from NEWA LETTER A - while (c <= 0x11459) // ..to NEWA DIGIT NINE + while (c <= 0x1145b) // ..to NEWA PLACEHOLDER MARK + charset[i++] = c++; + c = 0x1145d; // from NEWA INSERTION SIGN + while (c <= 0x11461) // ..to NEWA SIGN UPADHMANIYA charset[i++] = c++; - charset[i++] = 0x1145d; // NEWA INSERTION SIGN - charset[i++] = 0x1145e; // NEWA SANDHI MARK // 11480..114DF; Tirhuta c = 0x11480; // from TIRHUTA ANJI while (c <= 0x114c7) // ..to TIRHUTA OM @@ -1766,7 +1774,7 @@ void init() charset[i++] = c++; // 11680..116CF; Takri c = 0x11680; // from TAKRI LETTER A - while (c <= 0x116b7) // ..to TAKRI SIGN NUKTA + while (c <= 0x116b8) // ..to TAKRI LETTER ARCHAIC KHA charset[i++] = c++; c = 0x116c0; // from TAKRI DIGIT ZERO while (c <= 0x116c9) // ..to TAKRI DIGIT NINE @@ -1790,15 +1798,42 @@ void init() while (c <= 0x118f2) // ..to WARANG CITI NUMBER NINETY charset[i++] = c++; charset[i++] = 0x118ff; // WARANG CITI OM +// 11900..1195F; Dives Akuru + c = 0x11900; // from DIVES AKURU LETTER A + while (c <= 0x11906) // ..to DIVES AKURU LETTER E + charset[i++] = c++; + c = 0x1190c; // from DIVES AKURU LETTER KA + while (c <= 0x11913) // ..to DIVES AKURU LETTER JA + charset[i++] = c++; + charset[i++] = 0x11915; // DIVES AKURU LETTER NYA + charset[i++] = 0x11916; // DIVES AKURU LETTER TTA + c = 0x11918; // from DIVES AKURU LETTER DDA + while (c <= 0x11935) // ..to DIVES AKURU VOWEL SIGN E + charset[i++] = c++; + charset[i++] = 0x11937; // DIVES AKURU VOWEL SIGN AI + charset[i++] = 0x11938; // DIVES AKURU VOWEL SIGN O + c = 0x1193b; // from DIVES AKURU SIGN ANUSVARA + while (c <= 0x11946) // ..to DIVES AKURU END OF TEXT MARK + charset[i++] = c++; + c = 0x11950; // from DIVES AKURU DIGIT ZERO + while (c <= 0x11959) // ..to DIVES AKURU DIGIT NINE + charset[i++] = c++; +// 119A0..119FF; Nandinagari + c = 0x119a0; // from NANDINAGARI LETTER A + while (c <= 0x119a7) // ..to NANDINAGARI LETTER VOCALIC RR + charset[i++] = c++; + c = 0x119aa; // from NANDINAGARI LETTER E + while (c <= 0x119d7) // ..to NANDINAGARI VOWEL SIGN VOCALIC RR + charset[i++] = c++; + c = 0x119da; // from NANDINAGARI VOWEL SIGN E + while (c <= 0x119e4) // ..to NANDINAGARI VOWEL SIGN PRISHTHAMATRA E + charset[i++] = c++; // 11A00..11A4F; Zanabazar Square c = 0x11a00; // from ZANABAZAR SQUARE LETTER A while (c <= 0x11a47) // ..to ZANABAZAR SQUARE SUBJOINER charset[i++] = c++; // 11A50..11AAF; Soyombo c = 0x11a50; // from SOYOMBO LETTER A - while (c <= 0x11a83) // ..to SOYOMBO LETTER KSSA - charset[i++] = c++; - c = 0x11a86; // from SOYOMBO CLUSTER-INITIAL LETTER RA while (c <= 0x11aa2) // ..to SOYOMBO TERMINAL MARK-2 charset[i++] = c++; // 11AC0..11AFF; Pau Cin Hau @@ -1866,6 +1901,13 @@ void init() c = 0x11ee0; // from MAKASAR LETTER KA while (c <= 0x11ef8) // ..to MAKASAR END OF SECTION charset[i++] = c++; +// 11FB0..11FBF; Lisu Supplement + charset[i++] = 0x11fb0; // LISU LETTER YHA +// 11FC0..11FFF; Tamil Supplement + c = 0x11fc0; // from TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH + while (c <= 0x11ff1) // ..to TAMIL SIGN VAKAIYARAA + charset[i++] = c++; + charset[i++] = 0x11fff; // TAMIL PUNCTUATION END OF TEXT // 12000..123FF; Cuneiform c = 0x12000; // from CUNEIFORM SIGN A while (c <= 0x12399) // ..to CUNEIFORM SIGN U U @@ -1885,6 +1927,10 @@ void init() c = 0x13000; // from EGYPTIAN HIEROGLYPH A001 while (c <= 0x1342e) // ..to EGYPTIAN HIEROGLYPH AA032 charset[i++] = c++; +// 13430..1343F; Egyptian Hieroglyph Format Controls + c = 0x13430; // from EGYPTIAN HIEROGLYPH VERTICAL JOINER + while (c <= 0x13438) // ..to EGYPTIAN HIEROGLYPH END SEGMENT + charset[i++] = c++; // 14400..1467F; Anatolian Hieroglyphs c = 0x14400; // from ANATOLIAN HIEROGLYPH A001 while (c <= 0x14646) // ..to ANATOLIAN HIEROGLYPH A530 @@ -1931,24 +1977,35 @@ void init() charset[i++] = c++; // 16F00..16F9F; Miao c = 0x16f00; // from MIAO LETTER PA - while (c <= 0x16f44) // ..to MIAO LETTER HHA + while (c <= 0x16f4a) // ..to MIAO LETTER RTE charset[i++] = c++; - c = 0x16f50; // from MIAO LETTER NASALIZATION - while (c <= 0x16f7e) // ..to MIAO VOWEL SIGN NG + c = 0x16f4f; // from MIAO SIGN CONSONANT MODIFIER BAR + while (c <= 0x16f87) // ..to MIAO VOWEL SIGN UI charset[i++] = c++; c = 0x16f8f; // from MIAO TONE RIGHT while (c <= 0x16f9f) // ..to MIAO LETTER REFORMED TONE-8 charset[i++] = c++; // 16FE0..16FFF; Ideographic Symbols and Punctuation - charset[i++] = 0x16fe0; // TANGUT ITERATION MARK - charset[i++] = 0x16fe1; // NUSHU ITERATION MARK + c = 0x16fe0; // from TANGUT ITERATION MARK + while (c <= 0x16fe4) // ..to KHITAN SMALL SCRIPT FILLER + charset[i++] = c++; + charset[i++] = 0x16ff0; // VIETNAMESE ALTERNATE READING MARK CA + charset[i++] = 0x16ff1; // VIETNAMESE ALTERNATE READING MARK NHAY // 17000..187FF; Tangut c = 0x17000; // from - while (c <= 0x187f1) // ..to + while (c <= 0x187f7) // ..to charset[i++] = c++; // 18800..18AFF; Tangut Components c = 0x18800; // from TANGUT COMPONENT-001 - while (c <= 0x18af2) // ..to TANGUT COMPONENT-755 + while (c <= 0x18aff) // ..to TANGUT COMPONENT-768 + charset[i++] = c++; +// 18B00..18CFF; Khitan Small Script + c = 0x18b00; // from KHITAN SMALL SCRIPT CHARACTER-18B00 + while (c <= 0x18cd5) // ..to KHITAN SMALL SCRIPT CHARACTER-18CD5 + charset[i++] = c++; +// 18D00..18D8F; Tangut Supplement + c = 0x18d00; // from + while (c <= 0x18d08) // ..to charset[i++] = c++; // 1B000..1B0FF; Kana Supplement c = 0x1b000; // from KATAKANA LETTER ARCHAIC E @@ -1958,6 +2015,12 @@ void init() c = 0x1b100; // from HENTAIGANA LETTER RE-3 while (c <= 0x1b11e) // ..to HENTAIGANA LETTER N-MU-MO-2 charset[i++] = c++; +// 1B130..1B16F; Small Kana Extension + charset[i++] = 0x1b150; // HIRAGANA LETTER SMALL WI + charset[i++] = 0x1b152; // HIRAGANA LETTER SMALL WO + c = 0x1b164; // from KATAKANA LETTER SMALL WI + while (c <= 0x1b167) // ..to KATAKANA LETTER SMALL N + charset[i++] = c++; // 1B170..1B2FF; Nushu c = 0x1b170; // from NUSHU CHARACTER-1B170 while (c <= 0x1b2fb) // ..to NUSHU CHARACTER-1B2FB @@ -2087,6 +2150,23 @@ void init() c = 0x1e026; // from COMBINING GLAGOLITIC LETTER YO while (c <= 0x1e02a) // ..to COMBINING GLAGOLITIC LETTER FITA charset[i++] = c++; +// 1E100..1E14F; Nyiakeng Puachue Hmong + c = 0x1e100; // from NYIAKENG PUACHUE HMONG LETTER MA + while (c <= 0x1e12c) // ..to NYIAKENG PUACHUE HMONG LETTER W + charset[i++] = c++; + c = 0x1e130; // from NYIAKENG PUACHUE HMONG TONE-B + while (c <= 0x1e13d) // ..to NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER + charset[i++] = c++; + c = 0x1e140; // from NYIAKENG PUACHUE HMONG DIGIT ZERO + while (c <= 0x1e149) // ..to NYIAKENG PUACHUE HMONG DIGIT NINE + charset[i++] = c++; + charset[i++] = 0x1e14e; // NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ + charset[i++] = 0x1e14f; // NYIAKENG PUACHUE HMONG CIRCLED CA +// 1E2C0..1E2FF; Wancho + c = 0x1e2c0; // from WANCHO LETTER AA + while (c <= 0x1e2f9) // ..to WANCHO DIGIT NINE + charset[i++] = c++; + charset[i++] = 0x1e2ff; // WANCHO NGUN SIGN // 1E800..1E8DF; Mende Kikakui c = 0x1e800; // from MENDE KIKAKUI SYLLABLE M001 KI while (c <= 0x1e8c4) // ..to MENDE KIKAKUI SYLLABLE M060 NYON @@ -2096,7 +2176,7 @@ void init() charset[i++] = c++; // 1E900..1E95F; Adlam c = 0x1e900; // from ADLAM CAPITAL LETTER ALIF - while (c <= 0x1e94a) // ..to ADLAM NUKTA + while (c <= 0x1e94b) // ..to ADLAM NASALIZATION MARK charset[i++] = c++; c = 0x1e950; // from ADLAM DIGIT ZERO while (c <= 0x1e959) // ..to ADLAM DIGIT NINE @@ -2107,6 +2187,10 @@ void init() c = 0x1ec71; // from INDIC SIYAQ NUMBER ONE while (c <= 0x1ecb4) // ..to INDIC SIYAQ ALTERNATE LAKH MARK charset[i++] = c++; +// 1ED00..1ED4F; Ottoman Siyaq Numbers + c = 0x1ed01; // from OTTOMAN SIYAQ NUMBER ONE + while (c <= 0x1ed3d) // ..to OTTOMAN SIYAQ FRACTION ONE SIXTH + charset[i++] = c++; // 1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols c = 0x1ee00; // from ARABIC MATHEMATICAL ALEF while (c <= 0x1ee03) // ..to ARABIC MATHEMATICAL DAL @@ -2179,13 +2263,7 @@ void init() charset[i++] = c++; // 1F100..1F1FF; Enclosed Alphanumeric Supplement c = 0x1f100; // from DIGIT ZERO FULL STOP - while (c <= 0x1f10c) // ..to DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO - charset[i++] = c++; - c = 0x1f110; // from PARENTHESIZED LATIN CAPITAL LETTER A - while (c <= 0x1f16b) // ..to RAISED MD SIGN - charset[i++] = c++; - c = 0x1f170; // from NEGATIVE SQUARED LATIN CAPITAL LETTER A - while (c <= 0x1f1ac) // ..to SQUARED VOD + while (c <= 0x1f1ad) // ..to MASK WORK SYMBOL charset[i++] = c++; c = 0x1f1e6; // from REGIONAL INDICATOR SYMBOL LETTER A while (c <= 0x1f1ff) // ..to REGIONAL INDICATOR SYMBOL LETTER Z @@ -2218,13 +2296,13 @@ void init() charset[i++] = c++; // 1F680..1F6FF; Transport and Map Symbols c = 0x1f680; // from ROCKET - while (c <= 0x1f6d4) // ..to PAGODA + while (c <= 0x1f6d7) // ..to ELEVATOR charset[i++] = c++; c = 0x1f6e0; // from HAMMER AND WRENCH while (c <= 0x1f6ec) // ..to AIRPLANE ARRIVING charset[i++] = c++; c = 0x1f6f0; // from SATELLITE - while (c <= 0x1f6f9) // ..to SKATEBOARD + while (c <= 0x1f6fc) // ..to ROLLER SKATE charset[i++] = c++; // 1F700..1F77F; Alchemical Symbols c = 0x1f700; // from ALCHEMICAL SYMBOL FOR QUINTESSENCE @@ -2234,6 +2312,9 @@ void init() c = 0x1f780; // from BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE while (c <= 0x1f7d8) // ..to NEGATIVE CIRCLED SQUARE charset[i++] = c++; + c = 0x1f7e0; // from LARGE ORANGE CIRCLE + while (c <= 0x1f7eb) // ..to LARGE BROWN SQUARE + charset[i++] = c++; // 1F800..1F8FF; Supplemental Arrows-C c = 0x1f800; // from LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD while (c <= 0x1f80b) // ..to DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD @@ -2250,37 +2331,58 @@ void init() c = 0x1f890; // from LEFTWARDS TRIANGLE ARROWHEAD while (c <= 0x1f8ad) // ..to WHITE ARROW SHAFT WIDTH TWO THIRDS charset[i++] = c++; + charset[i++] = 0x1f8b0; // ARROW POINTING UPWARDS THEN NORTH WEST + charset[i++] = 0x1f8b1; // ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST // 1F900..1F9FF; Supplemental Symbols and Pictographs c = 0x1f900; // from CIRCLED CROSS FORMEE WITH FOUR DOTS - while (c <= 0x1f90b) // ..to DOWNWARD FACING NOTCHED HOOK WITH DOT + while (c <= 0x1f978) // ..to DISGUISED FACE charset[i++] = c++; - c = 0x1f910; // from ZIPPER-MOUTH FACE - while (c <= 0x1f93e) // ..to HANDBALL + c = 0x1f97a; // from FACE WITH PLEADING EYES + while (c <= 0x1f9cb) // ..to BUBBLE TEA charset[i++] = c++; - c = 0x1f940; // from WILTED FLOWER - while (c <= 0x1f970) // ..to SMILING FACE WITH SMILING EYES AND THREE HEARTS - charset[i++] = c++; - c = 0x1f973; // from FACE WITH PARTY HORN AND PARTY HAT - while (c <= 0x1f976) // ..to FREEZING FACE - charset[i++] = c++; - c = 0x1f97c; // from LAB COAT - while (c <= 0x1f9a2) // ..to SWAN - charset[i++] = c++; - c = 0x1f9b0; // from EMOJI COMPONENT RED HAIR - while (c <= 0x1f9b9) // ..to SUPERVILLAIN - charset[i++] = c++; - charset[i++] = 0x1f9c0; // CHEESE WEDGE - charset[i++] = 0x1f9c2; // SALT SHAKER - c = 0x1f9d0; // from FACE WITH MONOCLE + c = 0x1f9cd; // from STANDING PERSON while (c <= 0x1f9ff) // ..to NAZAR AMULET charset[i++] = c++; // 1FA00..1FA6F; Chess Symbols + c = 0x1fa00; // from NEUTRAL CHESS KING + while (c <= 0x1fa53) // ..to BLACK CHESS KNIGHT-BISHOP + charset[i++] = c++; c = 0x1fa60; // from XIANGQI RED GENERAL while (c <= 0x1fa6d) // ..to XIANGQI BLACK SOLDIER charset[i++] = c++; +// 1FA70..1FAFF; Symbols and Pictographs Extended-A + c = 0x1fa70; // from BALLET SHOES + while (c <= 0x1fa74) // ..to THONG SANDAL + charset[i++] = c++; + charset[i++] = 0x1fa78; // DROP OF BLOOD + charset[i++] = 0x1fa7a; // STETHOSCOPE + c = 0x1fa80; // from YO-YO + while (c <= 0x1fa86) // ..to NESTING DOLLS + charset[i++] = c++; + c = 0x1fa90; // from RINGED PLANET + while (c <= 0x1faa8) // ..to ROCK + charset[i++] = c++; + c = 0x1fab0; // from FLY + while (c <= 0x1fab6) // ..to FEATHER + charset[i++] = c++; + charset[i++] = 0x1fac0; // ANATOMICAL HEART + charset[i++] = 0x1fac2; // PEOPLE HUGGING + c = 0x1fad0; // from BLUEBERRIES + while (c <= 0x1fad6) // ..to TEAPOT + charset[i++] = c++; +// 1FB00..1FBFF; Symbols for Legacy Computing + c = 0x1fb00; // from BLOCK SEXTANT-1 + while (c <= 0x1fb92) // ..to UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK + charset[i++] = c++; + c = 0x1fb94; // from LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK + while (c <= 0x1fbca) // ..to WHITE UP-POINTING CHEVRON + charset[i++] = c++; + c = 0x1fbf0; // from SEGMENTED DIGIT ZERO + while (c <= 0x1fbf9) // ..to SEGMENTED DIGIT NINE + charset[i++] = c++; // 20000..2A6DF; CJK Unified Ideographs Extension B c = 0x20000; // from - while (c <= 0x2a6d6) // ..to + while (c <= 0x2a6dd) // ..to charset[i++] = c++; // 2A700..2B73F; CJK Unified Ideographs Extension C c = 0x2a700; // from @@ -2302,6 +2404,10 @@ void init() c = 0x2f800; // from CJK COMPATIBILITY IDEOGRAPH-2F800 while (c <= 0x2fa1d) // ..to CJK COMPATIBILITY IDEOGRAPH-2FA1D charset[i++] = c++; +// 30000..3134F; CJK Unified Ideographs Extension G + c = 0x30000; // from + while (c <= 0x3134a) // ..to + charset[i++] = c++; // E0000..E007F; Tags c = 0xe0020; // from TAG SPACE while (c <= 0xe007f) // ..to CANCEL TAG diff --git a/data/jtr/dynamic_disabled.conf b/data/jtr/dynamic_disabled.conf index a25cbf66cf..593e2570c1 100644 --- a/data/jtr/dynamic_disabled.conf +++ b/data/jtr/dynamic_disabled.conf @@ -10,7 +10,8 @@ dynamic_57 = Y dynamic_58 = Y # dyna-61 used by formspring and should not be disabled. dynamic_61 = N -dynamic_62 = Y +# dyna-62 is ITW +dynamic_62 = N dynamic_63 = Y dynamic_64 = Y dynamic_65 = Y @@ -26,7 +27,8 @@ dynamic_76 = Y dynamic_77 = Y dynamic_78 = Y dynamic_81 = Y -dynamic_82 = Y +# dyna-82 it ITW Filezilla +dynamic_82 = N dynamic_83 = Y dynamic_84 = Y dynamic_85 = Y diff --git a/data/jtr/john.conf b/data/jtr/john.conf index 5dee1d9568..99012f4758 100755 --- a/data/jtr/john.conf +++ b/data/jtr/john.conf @@ -141,10 +141,10 @@ PotFilePermissions = 0600 # Default is N IgnoreChmodErrors = N -# This figure is in MB. The default is to memory map wordlists not larger -# than one terabyte. +# This figure is in MiB. The default is to memory map wordlists not larger +# than one GiB. # Set this to 0 to disable any use of memory-mapping in wordlist mode. -WordlistMemoryMapMaxSize = 1048576 +WordlistMemoryMapMaxSize = 1024 # For single mode, load the full GECOS field (before splitting) as one # additional candidate. Normal behavior is to only load individual words @@ -172,7 +172,8 @@ SingleSkipLogin = N SingleWordsPairMax = 6 # Setting this to false stops Single mode from re-testing guessed plaintexts -# with all other salts. +# with all other salts. This is deprecated: Use command-line per-session +# option --single-retest-guess=no instead. SingleRetestGuessed = Y # Max recursion depth for SingleRetestGuessed, so we don't blow the stack @@ -215,7 +216,7 @@ SessionFileProtect = Disabled # reused by a new session. # (Of course, a restored session will always be allowed to append to an # existing log file.) -# Unless you use the --nolog option, setting LogFileProtect will also +# Unless you use the --no-log option, setting LogFileProtect will also # prevent overwriting existing session files. LogFileProtect = Disabled @@ -239,6 +240,7 @@ ShowRemainOnStatus = N LogCrackedPasswords = N # Disable the dupe checking when loading hashes. For testing purposes only! +# This is deprecated: Use per-session option --loader-dupecheck=no instead. NoLoaderDupeCheck = N # Default encoding for input files (ie. login/GECOS fields) and wordlists @@ -321,11 +323,11 @@ ReloadAtDone = Y # but it may be delayed by the "Save" timer setting near top of this file. ReloadAtSave = Y -# If this file exists, john will abort cleanly -AbortFile = /var/run/john/abort +# If this file exists, john will abort cleanly (uncomment to enable) +#AbortFile = /var/run/john/abort -# While this file exists, john will pause -PauseFile = /var/run/john/pause +# While this file exists, john will pause (uncomment to enable) +#PauseFile = /var/run/john/pause # If set to true, the uid will be appended to user name on cracks # With: password123 (Administrator:500) @@ -525,12 +527,12 @@ Frequency = 160 #Frequency = 160 # Some bitstreams accept runtime configuration. # In sha512crypt/Drupal7, configuration is 2 bytes. That's interpreted -# as a bitmask. By setting any of the lowest 10 bits to 1 it turns off -# corresponding unit (there are 10 units in the bitstream). +# as a bitmask. By setting any of the lowest 12 bits to 1 it turns off +# the corresponding unit (there are 12 units in the bitstream). # This turns off units 0 and 1. #Config1 = \x03\x00 -# This turns off all 10 units (resulting in a timeout). -#Config1_04A36E0FD6_0 = \xff\x03 +# This turns off all 12 units (resulting in a timeout). +#Config1_04A36E0FD6_0 = \xff\x0f [ZTEX:sha256crypt] # Design tools reported possible frequency is 241 MHz but tested boards @@ -548,10 +550,10 @@ Frequency = 180 Frequency = 180 #TargetRounds = 2048 -# These formats are disabled from all-formats --test runs, or auto-selection -# of format from an input file. Even when disabled, you can use them as long -# as you spell them out with the --format option. Or you can delete a line, -# comment it out, or change to 'N' +# These formats are disabled from listing or self-test/benchmark unless +# specifically requested. You can use them as long as you add them out with +# the --format option. Or you can delete a line, comment it out, or change +# to 'N' and the format will be enabled again. [Disabled:Formats] #formatname = Y .include '$JOHN/dynamic_disabled.conf' @@ -723,7 +725,6 @@ DefaultCharset = (?a )?d /?d a0 'p Xpz0 )?a (?d /?a a0 'p Xpz0 - # "Single crack" mode rules [List.Rules:Single] # Simple rules come first... @@ -1015,6 +1016,8 @@ W0Q ->F a0 WEQW[z0]W[z1]W[z2]W[z3]W[z4]W[z5]W[z6]W[z7]W[z8]W[z9]W[zA]W[zB]W[zC]W[zD] ->G a0 WFQW[z0]W[z1]W[z2]W[z3]W[z4]W[z5]W[z6]W[z7]W[z8]W[z9]W[zA]W[zB]W[zC]W[zD]W[zE] +# This ruleset partially overlaps with some Phrase* rulesets below, but it was +# historically introduced and made part of the jumbo ruleset first, so it stays [List.Rules:Multiword] -c / Dp l -c / Dp c Tp @@ -1037,6 +1040,49 @@ W0Q -c %4[ ] T[0z] \p0[Q:] \p0[M:] va01 vbpa Tb Q M %2[ ] vbpa Tb Q M /[ ] vbpa Tb Q @?[Zw] -c %4[ ] T[0z] \p0[Q:] \p0[M:] va01 vbpa Tb Q M %3[ ] vbpa Tb Q M /[ ] vbpa Tb Q @?[Zw] +# A special ruleset intended for stacking before other Phrase* rules below, +# such that you have the option to run its output through "unique" first +[List.Rules:PhrasePreprocess] +/[ ] : +-c /[ ] l Q +/[ ] @' Q +-c /[ ] @' Q M l Q + +# The main optimized Phrase ruleset, almost no duplicates with proper input +[List.Rules:Phrase] +# This one rule cracks ~1050 HIBP v7 passwords per million with sequences of +# 2 to 6 words occurring 2+ times across Project Gutenberg Australia books +# when our sequence list includes them in both their original case and +# all-lowercase, as well as both with apostrophes intact and removed (these +# variations are not implemented in this ruleset not to produce duplicates) +@?w Q +# Sorted separator characters: 1_24 -.3785690@,&+*!'$/?:=#~^%;`>"[)<]|({}\ +# (the apostrophe is probably overrated since it also occurs inside words) +# Each character in 1_24 cracks ~82 to ~61 passwords per million +s[ ][1_24] Q +# Leaving the space separators intact cracks ~59 passwords per million +/[ ] +# Each character in -.3785690@ cracks ~53 to ~12 passwords per million +s[ ][\-.3785690@] Q +# Each character in ,&+*!'$/?:=#~ cracks ~10 to ~1 passwords per million +s[ ][,&+*!'$/?:=#~] Q + +# Toggle capitalization of words 1 to 6 individually +[List.Rules:PhraseCaseOne] +-c /[ ] T0 Q +-c /[ ] va01 vapa Ta Q +-c %2[ ] va01 vapa Ta Q +-c %3[ ] va01 vapa Ta Q +-c %4[ ] va01 vapa Ta Q +-c %5[ ] va01 vapa Ta Q + +# Move first word to be after last word +[List.Rules:PhraseWrap] +/[ ] ^[ ] Xpz0 \[ 'l +# Other ways to write this rule +#/[ ] xpz \[ $[ ] X0pz 'l +#/[ ] 'p ^[ ] va01 vapa Xaz0 + # Used for loopback. This rule will produce candidates "PASSWOR" and "D" for # an input of "PASSWORD" (assuming LM, which has halves of length 7). [List.Rules:Split] @@ -1167,6 +1213,9 @@ b1 ] .include [List.Rules:Extra] .include [List.Rules:OldOffice] +# Unicode substitution rules +.include + # For Wordlist mode and very fast hashes [List.Rules:Jumbo] .include [List.Rules:Single-Extra] @@ -1174,6 +1223,7 @@ b1 ] .include [List.Rules:ShiftToggle] .include [List.Rules:Multiword] .include [List.Rules:best64] +.include [List.Rules:UnicodeSubstitution] # KoreLogic rules .include @@ -1189,7 +1239,9 @@ b1 ] # Incremental modes -# This is for one-off uses (make your own custom.chr) +# This is for one-off uses (make your own custom.chr). +# A charset can now also be named directly from command-line, so no config +# entry needed: --incremental=whatever.chr [Incremental:Custom] File = $JOHN/custom.chr MinLen = 0 @@ -1548,6 +1600,65 @@ void filter() word = 0; } +# Skip candidate passwords that contain the same character more than once +[List.External:Filter_NoRepeats] +int seen[0x100], now; + +void init() +{ + now = 1; +} + +void filter() +{ + int i, c; + + if (!--now) { + i = 0; + while (i < 0x100) + seen[i++] = 0; + now = 1000000000; + } + + i = 0; + while (c = word[i++]) { + if (seen[c] == now) { + word = 0; return; + } + seen[c] = now; + } +} + +# Keep only candidate passwords that contain the same character more than once +[List.External:Filter_Repeats] +int seen[0x100], now; + +void init() +{ + now = 1; +} + +void filter() +{ + int i, c; + + if (!--now) { + i = 0; + while (i < 0x100) + seen[i++] = 0; + now = 1000000000; + } + + i = 0; + while (c = word[i++]) { + if (seen[c] == now) + return; + seen[c] = now; + } + + word = 0; +} + # A simple cracker for LM hashes [List.External:LanMan] int length; // Current length @@ -2167,6 +2278,9 @@ void init() # than the maximum length (the maxlength setting). Nevertheless, you may want # to pass the resulting candidate passwords through "unique" if you intend to # test them against hashes that are salted and/or of a slow to compute type. +# +# Note that we now have a full blown cracking mode --subsets that is way faster +# than this code and never produce a duplicate. See doc/SUBSETS [List.External:Subsets] int minlength; // Minimum password length to try int maxlength; // Maximum password length to try @@ -3383,6 +3497,40 @@ void restore() } } +# generate all possible wps pins +[List.External:wpspin] +int pin; +void init() { + pin = 0; +} +void generate() { + if (pin > 9999999) { + word = 0; + return; + } + int i, p; + i = 0; + while (i < 8) word[i++] = '0'; + word[8] = 0; + p = pin; + i = 6; + while (p) { + word[i] = '0' + p % 10; + p /= 10; + --i; + } + p = pin; + i = 0; + while (p) { + i += 3 * (p % 10); + p /= 10; + i += p % 10; + p /= 10; + } + word[7] = '0' + ((10 - i % 10) % 10); + ++pin; +} + # Append the Luhn algorithm digit to arbitrary all-digit strings. Optimized # for speed, not for size nor simplicity. The primary optimization trick is to # compute the length and four sums in parallel (in two SIMD'ish variables). @@ -3860,8 +4008,8 @@ void next() } /* restore() not needed. john properly restores fast enough without it */ -# External hybrid CaSE mutation code -[List.External:Case] +# Shared base code for External hybrid CaSE and Wordcase mutation code +[List.External_base:Case] int rotor[251]; /* max length input is 125 bytes [125*5+1]; */ int rotors[125]; @@ -3871,17 +4019,12 @@ int rotor_cnt[125]; int current_word_count; int max_mangle; /* controls how many bytes we run through our 'leet' code */ int original_word; /* if set to 1 then we start with original word. If 0, then start with first mangled word */ - -void init() -{ - max_mangle = 20; /* only mangle 20 characters max (2^20 is 1 million) */ - original_word = 1; /* for case mangle, unless the data is 100% lower case, we really can not skip the original word */ -} +int word_mode; /* if set to 1, only first character of each space-separated word is case-toggled, else every character */ /* new word */ void new() { - int rotor_off, idx, wlen, ch; + int rotor_off, idx, wlen, ch, prevch; idx = rotor_off = wlen = 0; hybrid_total = 1; while (word[wlen++]) ; --wlen; @@ -3890,24 +4033,32 @@ void new() return; } wlen = 0; + prevch = ' '; /* at word start, behave as if previous char was space for wordcase mode */ while (word[wlen] && idx < max_mangle) { rotor_cnt[wlen] = rotor_idx[wlen] = 0; rotor_ptr[wlen] = rotor_off; ch = word[wlen]; - if (ch >= 'A' && ch <= 'Z') { - ch += 0x20; - word[wlen] = ch; - rotor[rotor_off++] = ch; - rotor[rotor_off++] = ch-0x20; - } - if (ch >= 'a' && ch <= 'z') { - rotor[rotor_off++] = ch; - rotor[rotor_off++] = ch-0x20; - rotor_cnt[wlen] = 2; - hybrid_total *= 2; - rotors[idx++] = wlen; + /* traditionally, this block was always executed, with Wordcase + mode added we execute it either always when word_mode isn't + used or at the beginning of a word or when the previous char + was space */ + if (!word_mode || prevch == ' ') { + if (ch >= 'A' && ch <= 'Z') { + ch += 0x20; + word[wlen] = ch; + rotor[rotor_off++] = ch; + rotor[rotor_off++] = ch-0x20; + } + if (ch >= 'a' && ch <= 'z') { + rotor[rotor_off++] = ch; + rotor[rotor_off++] = ch-0x20; + rotor_cnt[wlen] = 2; + hybrid_total *= 2; + rotors[idx++] = wlen; + } } ++wlen; + prevch = ch; } /* hybrid_total+666 is our indicator that this is the original word */ if (original_word) @@ -3942,9 +4093,37 @@ void next() } /* restore() not needed. john properly restores fast enough without it */ +# External hybrid CaSE mutation code +[List.External:Case] +.include [List.External_base:Case] + +void init() +{ + max_mangle = 20; /* only mangle 20 characters max (2^20 is 1 million) */ + original_word = 1; /* for case mangle, unless the data is 100% lower case, we really can not skip the original word */ + word_mode = 0; +} + + +# external mode toggling case in all word combinations, e.g: +# foo bar -> foo bar, foo Bar, Foo bar, Foo Bar +[List.External:Wordcase] +.include [List.External_base:Case] + +void init() +{ + max_mangle = 20; /* only mangle 20 characters max (2^20 is 1 million) */ + original_word = 1; /* for case mangle, unless the data is 100% lower case, we really can not skip the original word */ + word_mode = 1; +} + # Alternate hybrid external 'leet' mode (HybridLeet) .include +# Note that the (newer) cracking mode --subsets=full-unicode is way faster than +# the external dumb/repeats modes below, although not as easy to adapt to smaller +# portions of the Unicode space. See doc/SUBSETS + # dumb-force UTF-16, in an external file .include diff --git a/data/jtr/korelogic.conf b/data/jtr/korelogic.conf index 3d7cc072d0..c77e978929 100644 --- a/data/jtr/korelogic.conf +++ b/data/jtr/korelogic.conf @@ -14,7 +14,7 @@ a6 A0"[Aa][uU][tT][uU][mM][nN]" [List.Rules:AppendSeason] a6 Az"[Ss$][uU][mM][mM][eE3][rR]" a6 Az"[Ww][iI|][nN][tT+][eE3][rR]" -a6 Az"[Ff][aA][lL][lL]" +a4 Az"[Ff][aA][lL][lL]" a6 Az"[Ss][pP][rR][iI][nN][gG]" a6 Az"[Aa][uU][tT][uU][mM][nN]" diff --git a/data/jtr/repeats16.conf b/data/jtr/repeats16.conf index a5c9f0d14f..05158ff893 100644 --- a/data/jtr/repeats16.conf +++ b/data/jtr/repeats16.conf @@ -1,16 +1,21 @@ -# This software is Copyright (c) 2012-2018 magnum, and it is hereby +# This software is Copyright (c) 2012-2020 magnum, and it is hereby # released to the general public under the following terms: # Redistribution and use in source and binary forms, with or without # modification, are permitted. # -# Try strings of repeated characters, Unicode (version 11) BMP version +# Try strings of repeated characters, Unicode (version 13) BMP version # -# Number of candidates = 55,292 x max-length +# Number of candidates = 55,387 x max-length # # Note that these modes will handle --max-len differently than normal: They # will consider number of characters as opposed to number of bytes. This # means you can naturally just use e.g. --max-len=3 for generating all # three-character candidates (which may be up to 9 bytes each). +# +# Note that the (newer) cracking mode --subsets=full-unicode is way faster than +# this external mode, although not as easy to adapt to smaller portions of the +# Unicode space. See doc/SUBSETS + [List.External:Repeats16] int minlength, maxlength, maxc, length, c; int charset[0x10000]; @@ -159,7 +164,7 @@ void init() while (c <= 0x8b4) // ..to ARABIC LETTER KAF WITH DOT BELOW charset[i++] = c++; c = 0x8b6; // from ARABIC LETTER BEH WITH SMALL MEEM ABOVE - while (c <= 0x8bd) // ..to ARABIC LETTER AFRICAN NOON + while (c <= 0x8c7) // ..to ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE charset[i++] = c++; c = 0x8d3; // from ARABIC SMALL LOW WAW while (c <= 0x8ff) // ..to ARABIC MARK SIDEWAYS NOON GHUNNA @@ -296,7 +301,7 @@ void init() charset[i++] = 0xb48; // ORIYA VOWEL SIGN AI charset[i++] = 0xb4b; // ORIYA VOWEL SIGN O charset[i++] = 0xb4d; // ORIYA SIGN VIRAMA - charset[i++] = 0xb56; // ORIYA AI LENGTH MARK + charset[i++] = 0xb55; // ORIYA SIGN OVERLINE charset[i++] = 0xb57; // ORIYA AU LENGTH MARK charset[i++] = 0xb5c; // ORIYA LETTER RRA charset[i++] = 0xb5d; // ORIYA LETTER RHA @@ -369,7 +374,7 @@ void init() c = 0xc66; // from TELUGU DIGIT ZERO while (c <= 0xc6f) // ..to TELUGU DIGIT NINE charset[i++] = c++; - c = 0xc78; // from TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR + c = 0xc77; // from TELUGU SIGN SIDDHAM while (c <= 0xc7f) // ..to TELUGU SIGN TUUMU charset[i++] = c++; // 0C80..0CFF; Kannada @@ -407,9 +412,6 @@ void init() charset[i++] = 0xcf2; // KANNADA SIGN UPADHMANIYA // 0D00..0D7F; Malayalam c = 0xd00; // from MALAYALAM SIGN COMBINING ANUSVARA ABOVE - while (c <= 0xd03) // ..to MALAYALAM SIGN VISARGA - charset[i++] = c++; - c = 0xd05; // from MALAYALAM LETTER A while (c <= 0xd0c) // ..to MALAYALAM LETTER VOCALIC L charset[i++] = c++; charset[i++] = 0xd0e; // MALAYALAM LETTER E @@ -429,7 +431,7 @@ void init() while (c <= 0xd7f) // ..to MALAYALAM LETTER CHILLU K charset[i++] = c++; // 0D80..0DFF; Sinhala - charset[i++] = 0xd82; // SINHALA SIGN ANUSVARAYA + charset[i++] = 0xd81; // SINHALA SIGN CANDRABINDU charset[i++] = 0xd83; // SINHALA SIGN VISARGAYA c = 0xd85; // from SINHALA LETTER AYANNA while (c <= 0xd96) // ..to SINHALA LETTER AUYANNA @@ -464,23 +466,15 @@ void init() // 0E80..0EFF; Lao charset[i++] = 0xe81; // LAO LETTER KO charset[i++] = 0xe82; // LAO LETTER KHO SUNG - charset[i++] = 0xe87; // LAO LETTER NGO - charset[i++] = 0xe88; // LAO LETTER CO - c = 0xe94; // from LAO LETTER DO - while (c <= 0xe97) // ..to LAO LETTER THO TAM + c = 0xe86; // from LAO LETTER PALI GHA + while (c <= 0xe8a) // ..to LAO LETTER SO TAM charset[i++] = c++; - c = 0xe99; // from LAO LETTER NO - while (c <= 0xe9f) // ..to LAO LETTER FO SUNG + c = 0xe8c; // from LAO LETTER PALI JHA + while (c <= 0xea3) // ..to LAO LETTER LO LING charset[i++] = c++; - charset[i++] = 0xea1; // LAO LETTER MO - charset[i++] = 0xea3; // LAO LETTER LO LING - charset[i++] = 0xeaa; // LAO LETTER SO SUNG - charset[i++] = 0xeab; // LAO LETTER HO SUNG - c = 0xead; // from LAO LETTER O - while (c <= 0xeb9) // ..to LAO VOWEL SIGN UU + c = 0xea7; // from LAO LETTER WO + while (c <= 0xebd) // ..to LAO SEMIVOWEL SIGN NYO charset[i++] = c++; - charset[i++] = 0xebb; // LAO VOWEL SIGN MAI KON - charset[i++] = 0xebd; // LAO SEMIVOWEL SIGN NYO c = 0xec0; // from LAO VOWEL SIGN E while (c <= 0xec4) // ..to LAO VOWEL SIGN AI charset[i++] = c++; @@ -706,7 +700,7 @@ void init() charset[i++] = c++; // 1AB0..1AFF; Combining Diacritical Marks Extended c = 0x1ab0; // from COMBINING DOUBLED CIRCUMFLEX ACCENT - while (c <= 0x1abe) // ..to COMBINING PARENTHESES OVERLAY + while (c <= 0x1ac0) // ..to COMBINING LATIN SMALL LETTER TURNED W BELOW charset[i++] = c++; // 1B00..1B7F; Balinese c = 0x1b00; // from BALINESE SIGN ULU RICEM @@ -755,7 +749,7 @@ void init() charset[i++] = c++; // 1CD0..1CFF; Vedic Extensions c = 0x1cd0; // from VEDIC TONE KARSHANA - while (c <= 0x1cf9) // ..to VEDIC TONE DOUBLE RING ABOVE + while (c <= 0x1cfa) // ..to VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA charset[i++] = c++; // 1D00..1D7F; Phonetic Extensions c = 0x1d00; // from LATIN LETTER SMALL CAPITAL A @@ -922,11 +916,8 @@ void init() c = 0x2b76; // from NORTH WEST TRIANGLE-HEADED ARROW TO BAR while (c <= 0x2b95) // ..to RIGHTWARDS BLACK ARROW charset[i++] = c++; - c = 0x2b98; // from THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD - while (c <= 0x2bc8) // ..to BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED - charset[i++] = c++; - c = 0x2bca; // from TOP HALF BLACK CIRCLE - while (c <= 0x2bfe) // ..to REVERSED RIGHT ANGLE + c = 0x2b97; // from SYMBOL FOR TYPE A ELECTRONICS + while (c <= 0x2bff) // ..to HELLSCHREIBER PAUSE SYMBOL charset[i++] = c++; // 2C00..2C5F; Glagolitic c = 0x2c00; // from GLAGOLITIC CAPITAL LETTER AZU @@ -994,7 +985,7 @@ void init() charset[i++] = c++; // 2E00..2E7F; Supplemental Punctuation c = 0x2e00; // from RIGHT ANGLE SUBSTITUTION MARKER - while (c <= 0x2e4e) // ..to PUNCTUS ELEVATUS MARK + while (c <= 0x2e52) // ..to TIRONIAN SIGN CAPITAL ET charset[i++] = c++; // 2E80..2EFF; CJK Radicals Supplement c = 0x2e80; // from CJK RADICAL REPEAT @@ -1040,7 +1031,7 @@ void init() charset[i++] = c++; // 31A0..31BF; Bopomofo Extended c = 0x31a0; // from BOPOMOFO LETTER BU - while (c <= 0x31ba) // ..to BOPOMOFO LETTER ZY + while (c <= 0x31bf) // ..to BOPOMOFO LETTER AH charset[i++] = c++; // 31C0..31EF; CJK Strokes c = 0x31c0; // from CJK STROKE T @@ -1055,7 +1046,7 @@ void init() while (c <= 0x321e) // ..to PARENTHESIZED KOREAN CHARACTER O HU charset[i++] = c++; c = 0x3220; // from PARENTHESIZED IDEOGRAPH ONE - while (c <= 0x32fe) // ..to CIRCLED KATAKANA WO + while (c <= 0x32ff) // ..to SQUARE ERA NAME REIWA charset[i++] = c++; // 3300..33FF; CJK Compatibility c = 0x3300; // from SQUARE APAATO @@ -1063,7 +1054,7 @@ void init() charset[i++] = c++; // 3400..4DBF; CJK Unified Ideographs Extension A c = 0x3400; // from - while (c <= 0x4db5) // ..to + while (c <= 0x4dbf) // ..to charset[i++] = c++; // 4DC0..4DFF; Yijing Hexagram Symbols c = 0x4dc0; // from HEXAGRAM FOR THE CREATIVE HEAVEN @@ -1071,7 +1062,7 @@ void init() charset[i++] = c++; // 4E00..9FFF; CJK Unified Ideographs c = 0x4e00; // from - while (c <= 0x9fef) // ..to + while (c <= 0x9ffc) // ..to charset[i++] = c++; // A000..A48F; Yi Syllables c = 0xa000; // from YI SYLLABLE IT @@ -1103,14 +1094,17 @@ void init() charset[i++] = c++; // A720..A7FF; Latin Extended-D c = 0xa720; // from MODIFIER LETTER STRESS AND HIGH TONE - while (c <= 0xa7b9) // ..to LATIN SMALL LETTER U WITH STROKE + while (c <= 0xa7bf) // ..to LATIN SMALL LETTER GLOTTAL U charset[i++] = c++; - c = 0xa7f7; // from LATIN EPIGRAPHIC LETTER SIDEWAYS I + c = 0xa7c2; // from LATIN CAPITAL LETTER ANGLICANA W + while (c <= 0xa7ca) // ..to LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY + charset[i++] = c++; + c = 0xa7f5; // from LATIN CAPITAL LETTER REVERSED HALF H while (c <= 0xa7ff) // ..to LATIN EPIGRAPHIC LETTER ARCHAIC M charset[i++] = c++; // A800..A82F; Syloti Nagri c = 0xa800; // from SYLOTI NAGRI LETTER A - while (c <= 0xa82b) // ..to SYLOTI NAGRI POETRY MARK-4 + while (c <= 0xa82c) // ..to SYLOTI NAGRI SIGN ALTERNATE HASANTA charset[i++] = c++; // A830..A83F; Common Indic Number Forms c = 0xa830; // from NORTH INDIC FRACTION ONE QUARTER @@ -1203,7 +1197,7 @@ void init() charset[i++] = c++; // AB30..AB6F; Latin Extended-E c = 0xab30; // from LATIN SMALL LETTER BARRED ALPHA - while (c <= 0xab65) // ..to GREEK LETTER SMALL CAPITAL OMEGA + while (c <= 0xab6b) // ..to MODIFIER LETTER RIGHT TACK charset[i++] = c++; // AB70..ABBF; Cherokee Supplement c = 0xab70; // from CHEROKEE SMALL LETTER A diff --git a/data/jtr/repeats32.conf b/data/jtr/repeats32.conf index 2c66aca5ca..3dc2457cc8 100644 --- a/data/jtr/repeats32.conf +++ b/data/jtr/repeats32.conf @@ -1,11 +1,11 @@ -# This software is Copyright (c) 2012-2018 magnum, and it is hereby +# This software is Copyright (c) 2012-2020 magnum, and it is hereby # released to the general public under the following terms: # Redistribution and use in source and binary forms, with or without # modification, are permitted. # -# Try strings of repeated characters, Full Unicode (version 11) version +# Try strings of repeated characters, Full Unicode (version 13) version # -# Number of candidates = 137,046 x length +# Number of candidates = 143,532 x length # # Note that these modes will handle --max-len differently than normal: They # will consider number of characters as opposed to number of bytes. This @@ -16,9 +16,14 @@ # format will be up to four bytes (two 16-bit words) due to use of surrogates # for characters above U+FFFF. This means a format which normally handles up # to 27 characters may be limited to only 13 characters, worst case. +# +# Note that the (newer) cracking mode --subsets=full-unicode is way faster than +# this external mode, although not as easy to adapt to smaller portions of the +# Unicode space. See doc/SUBSETS + [List.External:Repeats32] int minlength, maxlength, maxc, length, c; -int charset[0x22000]; +int charset[0x24000]; void init() { @@ -164,7 +169,7 @@ void init() while (c <= 0x8b4) // ..to ARABIC LETTER KAF WITH DOT BELOW charset[i++] = c++; c = 0x8b6; // from ARABIC LETTER BEH WITH SMALL MEEM ABOVE - while (c <= 0x8bd) // ..to ARABIC LETTER AFRICAN NOON + while (c <= 0x8c7) // ..to ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE charset[i++] = c++; c = 0x8d3; // from ARABIC SMALL LOW WAW while (c <= 0x8ff) // ..to ARABIC MARK SIDEWAYS NOON GHUNNA @@ -301,7 +306,7 @@ void init() charset[i++] = 0xb48; // ORIYA VOWEL SIGN AI charset[i++] = 0xb4b; // ORIYA VOWEL SIGN O charset[i++] = 0xb4d; // ORIYA SIGN VIRAMA - charset[i++] = 0xb56; // ORIYA AI LENGTH MARK + charset[i++] = 0xb55; // ORIYA SIGN OVERLINE charset[i++] = 0xb57; // ORIYA AU LENGTH MARK charset[i++] = 0xb5c; // ORIYA LETTER RRA charset[i++] = 0xb5d; // ORIYA LETTER RHA @@ -374,7 +379,7 @@ void init() c = 0xc66; // from TELUGU DIGIT ZERO while (c <= 0xc6f) // ..to TELUGU DIGIT NINE charset[i++] = c++; - c = 0xc78; // from TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR + c = 0xc77; // from TELUGU SIGN SIDDHAM while (c <= 0xc7f) // ..to TELUGU SIGN TUUMU charset[i++] = c++; // 0C80..0CFF; Kannada @@ -412,9 +417,6 @@ void init() charset[i++] = 0xcf2; // KANNADA SIGN UPADHMANIYA // 0D00..0D7F; Malayalam c = 0xd00; // from MALAYALAM SIGN COMBINING ANUSVARA ABOVE - while (c <= 0xd03) // ..to MALAYALAM SIGN VISARGA - charset[i++] = c++; - c = 0xd05; // from MALAYALAM LETTER A while (c <= 0xd0c) // ..to MALAYALAM LETTER VOCALIC L charset[i++] = c++; charset[i++] = 0xd0e; // MALAYALAM LETTER E @@ -434,7 +436,7 @@ void init() while (c <= 0xd7f) // ..to MALAYALAM LETTER CHILLU K charset[i++] = c++; // 0D80..0DFF; Sinhala - charset[i++] = 0xd82; // SINHALA SIGN ANUSVARAYA + charset[i++] = 0xd81; // SINHALA SIGN CANDRABINDU charset[i++] = 0xd83; // SINHALA SIGN VISARGAYA c = 0xd85; // from SINHALA LETTER AYANNA while (c <= 0xd96) // ..to SINHALA LETTER AUYANNA @@ -469,23 +471,15 @@ void init() // 0E80..0EFF; Lao charset[i++] = 0xe81; // LAO LETTER KO charset[i++] = 0xe82; // LAO LETTER KHO SUNG - charset[i++] = 0xe87; // LAO LETTER NGO - charset[i++] = 0xe88; // LAO LETTER CO - c = 0xe94; // from LAO LETTER DO - while (c <= 0xe97) // ..to LAO LETTER THO TAM + c = 0xe86; // from LAO LETTER PALI GHA + while (c <= 0xe8a) // ..to LAO LETTER SO TAM charset[i++] = c++; - c = 0xe99; // from LAO LETTER NO - while (c <= 0xe9f) // ..to LAO LETTER FO SUNG + c = 0xe8c; // from LAO LETTER PALI JHA + while (c <= 0xea3) // ..to LAO LETTER LO LING charset[i++] = c++; - charset[i++] = 0xea1; // LAO LETTER MO - charset[i++] = 0xea3; // LAO LETTER LO LING - charset[i++] = 0xeaa; // LAO LETTER SO SUNG - charset[i++] = 0xeab; // LAO LETTER HO SUNG - c = 0xead; // from LAO LETTER O - while (c <= 0xeb9) // ..to LAO VOWEL SIGN UU + c = 0xea7; // from LAO LETTER WO + while (c <= 0xebd) // ..to LAO SEMIVOWEL SIGN NYO charset[i++] = c++; - charset[i++] = 0xebb; // LAO VOWEL SIGN MAI KON - charset[i++] = 0xebd; // LAO SEMIVOWEL SIGN NYO c = 0xec0; // from LAO VOWEL SIGN E while (c <= 0xec4) // ..to LAO VOWEL SIGN AI charset[i++] = c++; @@ -711,7 +705,7 @@ void init() charset[i++] = c++; // 1AB0..1AFF; Combining Diacritical Marks Extended c = 0x1ab0; // from COMBINING DOUBLED CIRCUMFLEX ACCENT - while (c <= 0x1abe) // ..to COMBINING PARENTHESES OVERLAY + while (c <= 0x1ac0) // ..to COMBINING LATIN SMALL LETTER TURNED W BELOW charset[i++] = c++; // 1B00..1B7F; Balinese c = 0x1b00; // from BALINESE SIGN ULU RICEM @@ -760,7 +754,7 @@ void init() charset[i++] = c++; // 1CD0..1CFF; Vedic Extensions c = 0x1cd0; // from VEDIC TONE KARSHANA - while (c <= 0x1cf9) // ..to VEDIC TONE DOUBLE RING ABOVE + while (c <= 0x1cfa) // ..to VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA charset[i++] = c++; // 1D00..1D7F; Phonetic Extensions c = 0x1d00; // from LATIN LETTER SMALL CAPITAL A @@ -927,11 +921,8 @@ void init() c = 0x2b76; // from NORTH WEST TRIANGLE-HEADED ARROW TO BAR while (c <= 0x2b95) // ..to RIGHTWARDS BLACK ARROW charset[i++] = c++; - c = 0x2b98; // from THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD - while (c <= 0x2bc8) // ..to BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED - charset[i++] = c++; - c = 0x2bca; // from TOP HALF BLACK CIRCLE - while (c <= 0x2bfe) // ..to REVERSED RIGHT ANGLE + c = 0x2b97; // from SYMBOL FOR TYPE A ELECTRONICS + while (c <= 0x2bff) // ..to HELLSCHREIBER PAUSE SYMBOL charset[i++] = c++; // 2C00..2C5F; Glagolitic c = 0x2c00; // from GLAGOLITIC CAPITAL LETTER AZU @@ -999,7 +990,7 @@ void init() charset[i++] = c++; // 2E00..2E7F; Supplemental Punctuation c = 0x2e00; // from RIGHT ANGLE SUBSTITUTION MARKER - while (c <= 0x2e4e) // ..to PUNCTUS ELEVATUS MARK + while (c <= 0x2e52) // ..to TIRONIAN SIGN CAPITAL ET charset[i++] = c++; // 2E80..2EFF; CJK Radicals Supplement c = 0x2e80; // from CJK RADICAL REPEAT @@ -1045,7 +1036,7 @@ void init() charset[i++] = c++; // 31A0..31BF; Bopomofo Extended c = 0x31a0; // from BOPOMOFO LETTER BU - while (c <= 0x31ba) // ..to BOPOMOFO LETTER ZY + while (c <= 0x31bf) // ..to BOPOMOFO LETTER AH charset[i++] = c++; // 31C0..31EF; CJK Strokes c = 0x31c0; // from CJK STROKE T @@ -1060,7 +1051,7 @@ void init() while (c <= 0x321e) // ..to PARENTHESIZED KOREAN CHARACTER O HU charset[i++] = c++; c = 0x3220; // from PARENTHESIZED IDEOGRAPH ONE - while (c <= 0x32fe) // ..to CIRCLED KATAKANA WO + while (c <= 0x32ff) // ..to SQUARE ERA NAME REIWA charset[i++] = c++; // 3300..33FF; CJK Compatibility c = 0x3300; // from SQUARE APAATO @@ -1068,7 +1059,7 @@ void init() charset[i++] = c++; // 3400..4DBF; CJK Unified Ideographs Extension A c = 0x3400; // from - while (c <= 0x4db5) // ..to + while (c <= 0x4dbf) // ..to charset[i++] = c++; // 4DC0..4DFF; Yijing Hexagram Symbols c = 0x4dc0; // from HEXAGRAM FOR THE CREATIVE HEAVEN @@ -1076,7 +1067,7 @@ void init() charset[i++] = c++; // 4E00..9FFF; CJK Unified Ideographs c = 0x4e00; // from - while (c <= 0x9fef) // ..to + while (c <= 0x9ffc) // ..to charset[i++] = c++; // A000..A48F; Yi Syllables c = 0xa000; // from YI SYLLABLE IT @@ -1108,14 +1099,17 @@ void init() charset[i++] = c++; // A720..A7FF; Latin Extended-D c = 0xa720; // from MODIFIER LETTER STRESS AND HIGH TONE - while (c <= 0xa7b9) // ..to LATIN SMALL LETTER U WITH STROKE + while (c <= 0xa7bf) // ..to LATIN SMALL LETTER GLOTTAL U charset[i++] = c++; - c = 0xa7f7; // from LATIN EPIGRAPHIC LETTER SIDEWAYS I + c = 0xa7c2; // from LATIN CAPITAL LETTER ANGLICANA W + while (c <= 0xa7ca) // ..to LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY + charset[i++] = c++; + c = 0xa7f5; // from LATIN CAPITAL LETTER REVERSED HALF H while (c <= 0xa7ff) // ..to LATIN EPIGRAPHIC LETTER ARCHAIC M charset[i++] = c++; // A800..A82F; Syloti Nagri c = 0xa800; // from SYLOTI NAGRI LETTER A - while (c <= 0xa82b) // ..to SYLOTI NAGRI POETRY MARK-4 + while (c <= 0xa82c) // ..to SYLOTI NAGRI SIGN ALTERNATE HASANTA charset[i++] = c++; // A830..A83F; Common Indic Number Forms c = 0xa830; // from NORTH INDIC FRACTION ONE QUARTER @@ -1208,7 +1202,7 @@ void init() charset[i++] = c++; // AB30..AB6F; Latin Extended-E c = 0xab30; // from LATIN SMALL LETTER BARRED ALPHA - while (c <= 0xab65) // ..to GREEK LETTER SMALL CAPITAL OMEGA + while (c <= 0xab6b) // ..to MODIFIER LETTER RIGHT TACK charset[i++] = c++; // AB70..ABBF; Cherokee Supplement c = 0xab70; // from CHEROKEE SMALL LETTER A @@ -1374,7 +1368,7 @@ void init() charset[i++] = c++; // 10190..101CF; Ancient Symbols c = 0x10190; // from ROMAN SEXTANS SIGN - while (c <= 0x1019b) // ..to ROMAN CENTURIAL SIGN + while (c <= 0x1019c) // ..to ASCIA SYMBOL charset[i++] = c++; charset[i++] = 0x101a0; // GREEK SYMBOL TAU RHO // 101D0..101FF; Phaistos Disc @@ -1616,6 +1610,14 @@ void init() c = 0x10e60; // from RUMI DIGIT ONE while (c <= 0x10e7e) // ..to RUMI FRACTION TWO THIRDS charset[i++] = c++; +// 10E80..10EBF; Yezidi + c = 0x10e80; // from YEZIDI LETTER ELIF + while (c <= 0x10ea9) // ..to YEZIDI LETTER ET + charset[i++] = c++; + charset[i++] = 0x10eab; // YEZIDI COMBINING HAMZA MARK + charset[i++] = 0x10ead; // YEZIDI HYPHENATION MARK + charset[i++] = 0x10eb0; // YEZIDI LETTER LAM WITH DOT ABOVE + charset[i++] = 0x10eb1; // YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE // 10F00..10F2F; Old Sogdian c = 0x10f00; // from OLD SOGDIAN LETTER ALEPH while (c <= 0x10f27) // ..to OLD SOGDIAN LIGATURE AYIN-DALETH @@ -1624,6 +1626,14 @@ void init() c = 0x10f30; // from SOGDIAN LETTER ALEPH while (c <= 0x10f59) // ..to SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT charset[i++] = c++; +// 10FB0..10FDF; Chorasmian + c = 0x10fb0; // from CHORASMIAN LETTER ALEPH + while (c <= 0x10fcb) // ..to CHORASMIAN NUMBER ONE HUNDRED + charset[i++] = c++; +// 10FE0..10FFF; Elymaic + c = 0x10fe0; // from ELYMAIC LETTER ALEPH + while (c <= 0x10ff6) // ..to ELYMAIC LIGATURE ZAYIN-YODH + charset[i++] = c++; // 11000..1107F; Brahmi c = 0x11000; // from BRAHMI SIGN CANDRABINDU while (c <= 0x1104d) // ..to BRAHMI PUNCTUATION LOTUS @@ -1649,7 +1659,7 @@ void init() while (c <= 0x11134) // ..to CHAKMA MAAYYAA charset[i++] = c++; c = 0x11136; // from CHAKMA DIGIT ZERO - while (c <= 0x11146) // ..to CHAKMA VOWEL SIGN EI + while (c <= 0x11147) // ..to CHAKMA LETTER VAA charset[i++] = c++; // 11150..1117F; Mahajani c = 0x11150; // from MAHAJANI LETTER A @@ -1657,9 +1667,6 @@ void init() charset[i++] = c++; // 11180..111DF; Sharada c = 0x11180; // from SHARADA SIGN CANDRABINDU - while (c <= 0x111cd) // ..to SHARADA SUTRA MARK - charset[i++] = c++; - c = 0x111d0; // from SHARADA DIGIT ZERO while (c <= 0x111df) // ..to SHARADA SECTION MARK-2 charset[i++] = c++; // 111E0..111FF; Sinhala Archaic Numbers @@ -1731,10 +1738,11 @@ void init() charset[i++] = c++; // 11400..1147F; Newa c = 0x11400; // from NEWA LETTER A - while (c <= 0x11459) // ..to NEWA DIGIT NINE + while (c <= 0x1145b) // ..to NEWA PLACEHOLDER MARK + charset[i++] = c++; + c = 0x1145d; // from NEWA INSERTION SIGN + while (c <= 0x11461) // ..to NEWA SIGN UPADHMANIYA charset[i++] = c++; - charset[i++] = 0x1145d; // NEWA INSERTION SIGN - charset[i++] = 0x1145e; // NEWA SANDHI MARK // 11480..114DF; Tirhuta c = 0x11480; // from TIRHUTA ANJI while (c <= 0x114c7) // ..to TIRHUTA OM @@ -1762,7 +1770,7 @@ void init() charset[i++] = c++; // 11680..116CF; Takri c = 0x11680; // from TAKRI LETTER A - while (c <= 0x116b7) // ..to TAKRI SIGN NUKTA + while (c <= 0x116b8) // ..to TAKRI LETTER ARCHAIC KHA charset[i++] = c++; c = 0x116c0; // from TAKRI DIGIT ZERO while (c <= 0x116c9) // ..to TAKRI DIGIT NINE @@ -1786,15 +1794,42 @@ void init() while (c <= 0x118f2) // ..to WARANG CITI NUMBER NINETY charset[i++] = c++; charset[i++] = 0x118ff; // WARANG CITI OM +// 11900..1195F; Dives Akuru + c = 0x11900; // from DIVES AKURU LETTER A + while (c <= 0x11906) // ..to DIVES AKURU LETTER E + charset[i++] = c++; + c = 0x1190c; // from DIVES AKURU LETTER KA + while (c <= 0x11913) // ..to DIVES AKURU LETTER JA + charset[i++] = c++; + charset[i++] = 0x11915; // DIVES AKURU LETTER NYA + charset[i++] = 0x11916; // DIVES AKURU LETTER TTA + c = 0x11918; // from DIVES AKURU LETTER DDA + while (c <= 0x11935) // ..to DIVES AKURU VOWEL SIGN E + charset[i++] = c++; + charset[i++] = 0x11937; // DIVES AKURU VOWEL SIGN AI + charset[i++] = 0x11938; // DIVES AKURU VOWEL SIGN O + c = 0x1193b; // from DIVES AKURU SIGN ANUSVARA + while (c <= 0x11946) // ..to DIVES AKURU END OF TEXT MARK + charset[i++] = c++; + c = 0x11950; // from DIVES AKURU DIGIT ZERO + while (c <= 0x11959) // ..to DIVES AKURU DIGIT NINE + charset[i++] = c++; +// 119A0..119FF; Nandinagari + c = 0x119a0; // from NANDINAGARI LETTER A + while (c <= 0x119a7) // ..to NANDINAGARI LETTER VOCALIC RR + charset[i++] = c++; + c = 0x119aa; // from NANDINAGARI LETTER E + while (c <= 0x119d7) // ..to NANDINAGARI VOWEL SIGN VOCALIC RR + charset[i++] = c++; + c = 0x119da; // from NANDINAGARI VOWEL SIGN E + while (c <= 0x119e4) // ..to NANDINAGARI VOWEL SIGN PRISHTHAMATRA E + charset[i++] = c++; // 11A00..11A4F; Zanabazar Square c = 0x11a00; // from ZANABAZAR SQUARE LETTER A while (c <= 0x11a47) // ..to ZANABAZAR SQUARE SUBJOINER charset[i++] = c++; // 11A50..11AAF; Soyombo c = 0x11a50; // from SOYOMBO LETTER A - while (c <= 0x11a83) // ..to SOYOMBO LETTER KSSA - charset[i++] = c++; - c = 0x11a86; // from SOYOMBO CLUSTER-INITIAL LETTER RA while (c <= 0x11aa2) // ..to SOYOMBO TERMINAL MARK-2 charset[i++] = c++; // 11AC0..11AFF; Pau Cin Hau @@ -1862,6 +1897,13 @@ void init() c = 0x11ee0; // from MAKASAR LETTER KA while (c <= 0x11ef8) // ..to MAKASAR END OF SECTION charset[i++] = c++; +// 11FB0..11FBF; Lisu Supplement + charset[i++] = 0x11fb0; // LISU LETTER YHA +// 11FC0..11FFF; Tamil Supplement + c = 0x11fc0; // from TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH + while (c <= 0x11ff1) // ..to TAMIL SIGN VAKAIYARAA + charset[i++] = c++; + charset[i++] = 0x11fff; // TAMIL PUNCTUATION END OF TEXT // 12000..123FF; Cuneiform c = 0x12000; // from CUNEIFORM SIGN A while (c <= 0x12399) // ..to CUNEIFORM SIGN U U @@ -1881,6 +1923,10 @@ void init() c = 0x13000; // from EGYPTIAN HIEROGLYPH A001 while (c <= 0x1342e) // ..to EGYPTIAN HIEROGLYPH AA032 charset[i++] = c++; +// 13430..1343F; Egyptian Hieroglyph Format Controls + c = 0x13430; // from EGYPTIAN HIEROGLYPH VERTICAL JOINER + while (c <= 0x13438) // ..to EGYPTIAN HIEROGLYPH END SEGMENT + charset[i++] = c++; // 14400..1467F; Anatolian Hieroglyphs c = 0x14400; // from ANATOLIAN HIEROGLYPH A001 while (c <= 0x14646) // ..to ANATOLIAN HIEROGLYPH A530 @@ -1927,24 +1973,35 @@ void init() charset[i++] = c++; // 16F00..16F9F; Miao c = 0x16f00; // from MIAO LETTER PA - while (c <= 0x16f44) // ..to MIAO LETTER HHA + while (c <= 0x16f4a) // ..to MIAO LETTER RTE charset[i++] = c++; - c = 0x16f50; // from MIAO LETTER NASALIZATION - while (c <= 0x16f7e) // ..to MIAO VOWEL SIGN NG + c = 0x16f4f; // from MIAO SIGN CONSONANT MODIFIER BAR + while (c <= 0x16f87) // ..to MIAO VOWEL SIGN UI charset[i++] = c++; c = 0x16f8f; // from MIAO TONE RIGHT while (c <= 0x16f9f) // ..to MIAO LETTER REFORMED TONE-8 charset[i++] = c++; // 16FE0..16FFF; Ideographic Symbols and Punctuation - charset[i++] = 0x16fe0; // TANGUT ITERATION MARK - charset[i++] = 0x16fe1; // NUSHU ITERATION MARK + c = 0x16fe0; // from TANGUT ITERATION MARK + while (c <= 0x16fe4) // ..to KHITAN SMALL SCRIPT FILLER + charset[i++] = c++; + charset[i++] = 0x16ff0; // VIETNAMESE ALTERNATE READING MARK CA + charset[i++] = 0x16ff1; // VIETNAMESE ALTERNATE READING MARK NHAY // 17000..187FF; Tangut c = 0x17000; // from - while (c <= 0x187f1) // ..to + while (c <= 0x187f7) // ..to charset[i++] = c++; // 18800..18AFF; Tangut Components c = 0x18800; // from TANGUT COMPONENT-001 - while (c <= 0x18af2) // ..to TANGUT COMPONENT-755 + while (c <= 0x18aff) // ..to TANGUT COMPONENT-768 + charset[i++] = c++; +// 18B00..18CFF; Khitan Small Script + c = 0x18b00; // from KHITAN SMALL SCRIPT CHARACTER-18B00 + while (c <= 0x18cd5) // ..to KHITAN SMALL SCRIPT CHARACTER-18CD5 + charset[i++] = c++; +// 18D00..18D8F; Tangut Supplement + c = 0x18d00; // from + while (c <= 0x18d08) // ..to charset[i++] = c++; // 1B000..1B0FF; Kana Supplement c = 0x1b000; // from KATAKANA LETTER ARCHAIC E @@ -1954,6 +2011,12 @@ void init() c = 0x1b100; // from HENTAIGANA LETTER RE-3 while (c <= 0x1b11e) // ..to HENTAIGANA LETTER N-MU-MO-2 charset[i++] = c++; +// 1B130..1B16F; Small Kana Extension + charset[i++] = 0x1b150; // HIRAGANA LETTER SMALL WI + charset[i++] = 0x1b152; // HIRAGANA LETTER SMALL WO + c = 0x1b164; // from KATAKANA LETTER SMALL WI + while (c <= 0x1b167) // ..to KATAKANA LETTER SMALL N + charset[i++] = c++; // 1B170..1B2FF; Nushu c = 0x1b170; // from NUSHU CHARACTER-1B170 while (c <= 0x1b2fb) // ..to NUSHU CHARACTER-1B2FB @@ -2083,6 +2146,23 @@ void init() c = 0x1e026; // from COMBINING GLAGOLITIC LETTER YO while (c <= 0x1e02a) // ..to COMBINING GLAGOLITIC LETTER FITA charset[i++] = c++; +// 1E100..1E14F; Nyiakeng Puachue Hmong + c = 0x1e100; // from NYIAKENG PUACHUE HMONG LETTER MA + while (c <= 0x1e12c) // ..to NYIAKENG PUACHUE HMONG LETTER W + charset[i++] = c++; + c = 0x1e130; // from NYIAKENG PUACHUE HMONG TONE-B + while (c <= 0x1e13d) // ..to NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER + charset[i++] = c++; + c = 0x1e140; // from NYIAKENG PUACHUE HMONG DIGIT ZERO + while (c <= 0x1e149) // ..to NYIAKENG PUACHUE HMONG DIGIT NINE + charset[i++] = c++; + charset[i++] = 0x1e14e; // NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ + charset[i++] = 0x1e14f; // NYIAKENG PUACHUE HMONG CIRCLED CA +// 1E2C0..1E2FF; Wancho + c = 0x1e2c0; // from WANCHO LETTER AA + while (c <= 0x1e2f9) // ..to WANCHO DIGIT NINE + charset[i++] = c++; + charset[i++] = 0x1e2ff; // WANCHO NGUN SIGN // 1E800..1E8DF; Mende Kikakui c = 0x1e800; // from MENDE KIKAKUI SYLLABLE M001 KI while (c <= 0x1e8c4) // ..to MENDE KIKAKUI SYLLABLE M060 NYON @@ -2092,7 +2172,7 @@ void init() charset[i++] = c++; // 1E900..1E95F; Adlam c = 0x1e900; // from ADLAM CAPITAL LETTER ALIF - while (c <= 0x1e94a) // ..to ADLAM NUKTA + while (c <= 0x1e94b) // ..to ADLAM NASALIZATION MARK charset[i++] = c++; c = 0x1e950; // from ADLAM DIGIT ZERO while (c <= 0x1e959) // ..to ADLAM DIGIT NINE @@ -2103,6 +2183,10 @@ void init() c = 0x1ec71; // from INDIC SIYAQ NUMBER ONE while (c <= 0x1ecb4) // ..to INDIC SIYAQ ALTERNATE LAKH MARK charset[i++] = c++; +// 1ED00..1ED4F; Ottoman Siyaq Numbers + c = 0x1ed01; // from OTTOMAN SIYAQ NUMBER ONE + while (c <= 0x1ed3d) // ..to OTTOMAN SIYAQ FRACTION ONE SIXTH + charset[i++] = c++; // 1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols c = 0x1ee00; // from ARABIC MATHEMATICAL ALEF while (c <= 0x1ee03) // ..to ARABIC MATHEMATICAL DAL @@ -2175,13 +2259,7 @@ void init() charset[i++] = c++; // 1F100..1F1FF; Enclosed Alphanumeric Supplement c = 0x1f100; // from DIGIT ZERO FULL STOP - while (c <= 0x1f10c) // ..to DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO - charset[i++] = c++; - c = 0x1f110; // from PARENTHESIZED LATIN CAPITAL LETTER A - while (c <= 0x1f16b) // ..to RAISED MD SIGN - charset[i++] = c++; - c = 0x1f170; // from NEGATIVE SQUARED LATIN CAPITAL LETTER A - while (c <= 0x1f1ac) // ..to SQUARED VOD + while (c <= 0x1f1ad) // ..to MASK WORK SYMBOL charset[i++] = c++; c = 0x1f1e6; // from REGIONAL INDICATOR SYMBOL LETTER A while (c <= 0x1f1ff) // ..to REGIONAL INDICATOR SYMBOL LETTER Z @@ -2214,13 +2292,13 @@ void init() charset[i++] = c++; // 1F680..1F6FF; Transport and Map Symbols c = 0x1f680; // from ROCKET - while (c <= 0x1f6d4) // ..to PAGODA + while (c <= 0x1f6d7) // ..to ELEVATOR charset[i++] = c++; c = 0x1f6e0; // from HAMMER AND WRENCH while (c <= 0x1f6ec) // ..to AIRPLANE ARRIVING charset[i++] = c++; c = 0x1f6f0; // from SATELLITE - while (c <= 0x1f6f9) // ..to SKATEBOARD + while (c <= 0x1f6fc) // ..to ROLLER SKATE charset[i++] = c++; // 1F700..1F77F; Alchemical Symbols c = 0x1f700; // from ALCHEMICAL SYMBOL FOR QUINTESSENCE @@ -2230,6 +2308,9 @@ void init() c = 0x1f780; // from BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE while (c <= 0x1f7d8) // ..to NEGATIVE CIRCLED SQUARE charset[i++] = c++; + c = 0x1f7e0; // from LARGE ORANGE CIRCLE + while (c <= 0x1f7eb) // ..to LARGE BROWN SQUARE + charset[i++] = c++; // 1F800..1F8FF; Supplemental Arrows-C c = 0x1f800; // from LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD while (c <= 0x1f80b) // ..to DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD @@ -2246,37 +2327,58 @@ void init() c = 0x1f890; // from LEFTWARDS TRIANGLE ARROWHEAD while (c <= 0x1f8ad) // ..to WHITE ARROW SHAFT WIDTH TWO THIRDS charset[i++] = c++; + charset[i++] = 0x1f8b0; // ARROW POINTING UPWARDS THEN NORTH WEST + charset[i++] = 0x1f8b1; // ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST // 1F900..1F9FF; Supplemental Symbols and Pictographs c = 0x1f900; // from CIRCLED CROSS FORMEE WITH FOUR DOTS - while (c <= 0x1f90b) // ..to DOWNWARD FACING NOTCHED HOOK WITH DOT + while (c <= 0x1f978) // ..to DISGUISED FACE charset[i++] = c++; - c = 0x1f910; // from ZIPPER-MOUTH FACE - while (c <= 0x1f93e) // ..to HANDBALL + c = 0x1f97a; // from FACE WITH PLEADING EYES + while (c <= 0x1f9cb) // ..to BUBBLE TEA charset[i++] = c++; - c = 0x1f940; // from WILTED FLOWER - while (c <= 0x1f970) // ..to SMILING FACE WITH SMILING EYES AND THREE HEARTS - charset[i++] = c++; - c = 0x1f973; // from FACE WITH PARTY HORN AND PARTY HAT - while (c <= 0x1f976) // ..to FREEZING FACE - charset[i++] = c++; - c = 0x1f97c; // from LAB COAT - while (c <= 0x1f9a2) // ..to SWAN - charset[i++] = c++; - c = 0x1f9b0; // from EMOJI COMPONENT RED HAIR - while (c <= 0x1f9b9) // ..to SUPERVILLAIN - charset[i++] = c++; - charset[i++] = 0x1f9c0; // CHEESE WEDGE - charset[i++] = 0x1f9c2; // SALT SHAKER - c = 0x1f9d0; // from FACE WITH MONOCLE + c = 0x1f9cd; // from STANDING PERSON while (c <= 0x1f9ff) // ..to NAZAR AMULET charset[i++] = c++; // 1FA00..1FA6F; Chess Symbols + c = 0x1fa00; // from NEUTRAL CHESS KING + while (c <= 0x1fa53) // ..to BLACK CHESS KNIGHT-BISHOP + charset[i++] = c++; c = 0x1fa60; // from XIANGQI RED GENERAL while (c <= 0x1fa6d) // ..to XIANGQI BLACK SOLDIER charset[i++] = c++; +// 1FA70..1FAFF; Symbols and Pictographs Extended-A + c = 0x1fa70; // from BALLET SHOES + while (c <= 0x1fa74) // ..to THONG SANDAL + charset[i++] = c++; + charset[i++] = 0x1fa78; // DROP OF BLOOD + charset[i++] = 0x1fa7a; // STETHOSCOPE + c = 0x1fa80; // from YO-YO + while (c <= 0x1fa86) // ..to NESTING DOLLS + charset[i++] = c++; + c = 0x1fa90; // from RINGED PLANET + while (c <= 0x1faa8) // ..to ROCK + charset[i++] = c++; + c = 0x1fab0; // from FLY + while (c <= 0x1fab6) // ..to FEATHER + charset[i++] = c++; + charset[i++] = 0x1fac0; // ANATOMICAL HEART + charset[i++] = 0x1fac2; // PEOPLE HUGGING + c = 0x1fad0; // from BLUEBERRIES + while (c <= 0x1fad6) // ..to TEAPOT + charset[i++] = c++; +// 1FB00..1FBFF; Symbols for Legacy Computing + c = 0x1fb00; // from BLOCK SEXTANT-1 + while (c <= 0x1fb92) // ..to UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK + charset[i++] = c++; + c = 0x1fb94; // from LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK + while (c <= 0x1fbca) // ..to WHITE UP-POINTING CHEVRON + charset[i++] = c++; + c = 0x1fbf0; // from SEGMENTED DIGIT ZERO + while (c <= 0x1fbf9) // ..to SEGMENTED DIGIT NINE + charset[i++] = c++; // 20000..2A6DF; CJK Unified Ideographs Extension B c = 0x20000; // from - while (c <= 0x2a6d6) // ..to + while (c <= 0x2a6dd) // ..to charset[i++] = c++; // 2A700..2B73F; CJK Unified Ideographs Extension C c = 0x2a700; // from @@ -2298,6 +2400,10 @@ void init() c = 0x2f800; // from CJK COMPATIBILITY IDEOGRAPH-2F800 while (c <= 0x2fa1d) // ..to CJK COMPATIBILITY IDEOGRAPH-2FA1D charset[i++] = c++; +// 30000..3134F; CJK Unified Ideographs Extension G + c = 0x30000; // from + while (c <= 0x3134a) // ..to + charset[i++] = c++; // E0000..E007F; Tags c = 0xe0020; // from TAG SPACE while (c <= 0xe007f) // ..to CANCEL TAG diff --git a/lib/metasploit/framework/password_crackers/cracker.rb b/lib/metasploit/framework/password_crackers/cracker.rb index a3c9864850..04603da63d 100644 --- a/lib/metasploit/framework/password_crackers/cracker.rb +++ b/lib/metasploit/framework/password_crackers/cracker.rb @@ -1,7 +1,6 @@ module Metasploit module Framework module PasswordCracker - class PasswordCrackerNotFoundError < StandardError end @@ -84,38 +83,38 @@ module Metasploit # @return [String] The file path to the wordlist to use attr_accessor :wordlist - validates :config, :'Metasploit::Framework::File_path' => true, if: -> { config.present? } + validates :config, 'Metasploit::Framework::File_path': true, if: -> { config.present? } - validates :cracker, inclusion: {in: %w[john hashcat]} + validates :cracker, inclusion: { in: %w[john hashcat] } - validates :cracker_path, :'Metasploit::Framework::Executable_path' => true, if: -> { cracker_path.present? } + validates :cracker_path, 'Metasploit::Framework::Executable_path': true, if: -> { cracker_path.present? } validates :fork, numericality: { - only_integer: true, - greater_than_or_equal_to: 1 + only_integer: true, + greater_than_or_equal_to: 1 }, if: -> { fork.present? } - validates :hash_path, :'Metasploit::Framework::File_path' => true, if: -> { hash_path.present? } + validates :hash_path, 'Metasploit::Framework::File_path': true, if: -> { hash_path.present? } - validates :pot, :'Metasploit::Framework::File_path' => true, if: -> { pot.present? } + validates :pot, 'Metasploit::Framework::File_path': true, if: -> { pot.present? } validates :max_runtime, numericality: { - only_integer: true, - greater_than_or_equal_to: 0 + only_integer: true, + greater_than_or_equal_to: 0 }, if: -> { max_runtime.present? } validates :max_length, numericality: { - only_integer: true, - greater_than_or_equal_to: 0 + only_integer: true, + greater_than_or_equal_to: 0 }, if: -> { max_length.present? } - validates :wordlist, :'Metasploit::Framework::File_path' => true, if: -> { wordlist.present? } + validates :wordlist, 'Metasploit::Framework::File_path': true, if: -> { wordlist.present? } # @param attributes [Hash{Symbol => String,nil}] - def initialize(attributes={}) + def initialize(attributes = {}) attributes.each do |attribute, value| public_send("#{attribute}=", value) end @@ -152,7 +151,7 @@ module Metasploit '1731' # hashcat requires a format we dont have all the data for # in the current dumper, so this is disabled in module and lib - #when 'oracle', 'des,oracle' + # when 'oracle', 'des,oracle' # return '3100' when 'oracle11', 'raw-sha1,oracle' '112' @@ -203,17 +202,14 @@ module Metasploit when 'ssha512' '1711' when 'mscash' - '1100' + '1100' when 'mscash2' - '2100' + '2100' when 'Raw-MD5u' - '30' - else - nil + '30' end end - # This method sets the appropriate parameters to run a cracker in incremental mode def mode_incremental self.increment_length = nil @@ -229,7 +225,6 @@ module Metasploit end end - # This method sets the appropriate parameters to run a cracker in wordlist mode # # @param[String] a file location of the wordlist to use @@ -247,20 +242,18 @@ module Metasploit end end - # This method sets the appropriate parameters to run a cracker in a pin mode (4-8 digits) on hashcat def mode_pin self.rules = nil if cracker == 'hashcat' self.attack = '3' - self.mask = '?d'*8 + self.mask = '?d' * 8 self.incremental = true - self.increment_length = [4,8] - self.max_runtime = 300 #5min on an i7 got through 4-7 digits. 8digit was 32min more + self.increment_length = [4, 8] + self.max_runtime = 300 # 5min on an i7 got through 4-7 digits. 8digit was 32min more end end - # This method sets the john to 'normal' mode def mode_normal if cracker == 'john' @@ -273,7 +266,6 @@ module Metasploit end end - # This method sets the john to single mode # # @param[String] a file location of the wordlist to use @@ -287,7 +279,6 @@ module Metasploit end end - # This method follows a decision tree to determine the path # to the cracker binary we should use. # @@ -300,11 +291,11 @@ module Metasploit else # Look in the Environment PATH for the john binary if cracker == 'john' - path = Rex::FileUtils.find_full_path("john") || - Rex::FileUtils.find_full_path("john.exe") + path = Rex::FileUtils.find_full_path('john') || + Rex::FileUtils.find_full_path('john.exe') elsif cracker == 'hashcat' - path = Rex::FileUtils.find_full_path("hashcat") || - Rex::FileUtils.find_full_path("hashcat.exe") + path = Rex::FileUtils.find_full_path('hashcat') || + Rex::FileUtils.find_full_path('hashcat.exe') else raise PasswordCrackerNotFoundError, 'No suitable Cracker was selected, so a binary could not be found on the system' end @@ -321,16 +312,14 @@ module Metasploit # # @yield [String] a line of output from the cracker command # @return [void] - def crack + def crack(&block) if cracker == 'john' results = john_crack_command elsif cracker == 'hashcat' results = hashcat_crack_command end - ::IO.popen(results, "rb") do |fd| - fd.each_line do |line| - yield line - end + ::IO.popen(results, 'rb') do |fd| + fd.each_line(&block) end end @@ -343,25 +332,47 @@ module Metasploit cmd = binary_path elsif cracker == 'hashcat' cmd = binary_path - cmd << (" -V") + cmd << (' -V') end - ::IO.popen(cmd, "rb") do |fd| + ::IO.popen(cmd, 'rb') do |fd| fd.each_line do |line| if cracker == 'john' # John the Ripper 1.8.0.13-jumbo-1-bleeding-973a245b96 2018-12-17 20:12:51 +0100 OMP [linux-gnu 64-bit x86_64 AVX2 AC] # John the Ripper 1.9.0-jumbo-1 OMP [linux-gnu 64-bit x86_64 AVX2 AC] # John the Ripper password cracker, version 1.8.0.2-bleeding-jumbo_omp [64-bit AVX-autoconf] # John the Ripper password cracker, version 1.8.0 - return $1.strip if line =~ /John the Ripper(?: password cracker, version)? ([^\[]+)/ + return Regexp.last_match(1).strip if line =~ /John the Ripper(?: password cracker, version)? ([^\[]+)/ elsif cracker == 'hashcat' # v5.1.0 - return $1 if line =~ /(v[\d\.]+)/ + return Regexp.last_match(1) if line =~ /(v[\d.]+)/ end end end nil end + # This method is used to determine which format of the no log option should be used + # --no-log vs --nolog https://github.com/openwall/john/commit/8982e4f7a2e874aab29807a05b421373015c9b61 + # We base this either on a date being in the version, or running the command and checking the output + # + # @return [String] The nolog format to use + def john_nolog_format + if /(\d{4}-\d{2}-\d{2})/ =~ cracker_version + # we lucked out and theres a date, we'll check its older than the commit that changed the nolog + if Date.parse(Regexp.last_match(1)) < Date.parse('2020-11-27') + return '--nolog' + end + + return '--no-log' + end + + # no date, so lets give it a run with the old format and check if we raise an error + ::IO.popen([binary_path, '--nolog', { err: %i[child out] }], 'rb') do |fd| + return '--nolog' unless fd.read.include? 'Unknown option' + end + '--no-log' + end + # This method builds an array for the command to actually run the cracker. # It builds the command from all of the attributes on the class. # @@ -369,46 +380,47 @@ module Metasploit # @return [Array] An array set up for {::IO.popen} to use def john_crack_command cmd_string = binary_path - cmd = [cmd_string, '--session=' + cracker_session_id, '--no-log'] + + cmd = [cmd_string, '--session=' + cracker_session_id] if config.present? - cmd << ("--config=" + config) + cmd << ('--config=' + config) else - cmd << ("--config=" + john_config_file) + cmd << ('--config=' + john_config_file) end if pot.present? - cmd << ("--pot=" + pot) + cmd << ('--pot=' + pot) else - cmd << ("--pot=" + john_pot_file) + cmd << ('--pot=' + john_pot_file) end if fork.present? && fork > 1 - cmd << ("--fork=" + fork.to_s) + cmd << ('--fork=' + fork.to_s) end if format.present? - cmd << ("--format=" + format) + cmd << ('--format=' + format) end if wordlist.present? - cmd << ("--wordlist=" + wordlist) + cmd << ('--wordlist=' + wordlist) end if incremental.present? - cmd << ("--incremental=" + incremental) + cmd << ('--incremental=' + incremental) end if rules.present? - cmd << ("--rules=" + rules) + cmd << ('--rules=' + rules) end if max_runtime.present? - cmd << ("--max-run-time=" + max_runtime.to_s) + cmd << ('--max-run-time=' + max_runtime.to_s) end if max_length.present? - cmd << ("--max-len=" + max_length.to_s) + cmd << ('--max-len=' + max_length.to_s) end cmd << hash_path @@ -421,16 +433,16 @@ module Metasploit # @return [Array] An array set up for {::IO.popen} to use def hashcat_crack_command cmd_string = binary_path - cmd = [cmd_string, '--session=' + cracker_session_id, '--logfile-disable'] + cmd = [cmd_string, '--session=' + cracker_session_id, '--logfile-disable'] if pot.present? - cmd << ("--potfile-path=" + pot) + cmd << ('--potfile-path=' + pot) else - cmd << ("--potfile-path=" + john_pot_file) + cmd << ('--potfile-path=' + john_pot_file) end if format.present? - cmd << ("--hash-type=" + jtr_format_to_hashcat_format(format)) + cmd << ('--hash-type=' + jtr_format_to_hashcat_format(format)) end if optimize.present? @@ -459,33 +471,33 @@ module Metasploit # wouldn't be tested inside of MSF since most users are using the MSF modules for word list and easy cracks. # Anything of length where this would cut off is most likely being done independently (outside MSF) - cmd << ("-O") + cmd << ('-O') end if incremental.present? - cmd << ("--increment") + cmd << ('--increment') if increment_length.present? - cmd << ("--increment-min=" + increment_length[0].to_s) - cmd << ("--increment-max=" + increment_length[1].to_s) + cmd << ('--increment-min=' + increment_length[0].to_s) + cmd << ('--increment-max=' + increment_length[1].to_s) else # anything more than max 4 on even des took 8+min on an i7. # maybe in the future this can be adjusted or made a variable # but current time, we'll leave it as this seems like reasonable # time expectation for a module to run - cmd << ("--increment-max=4") + cmd << ('--increment-max=4') end end if rules.present? - cmd << ("--rules-file=" + rules) + cmd << ('--rules-file=' + rules) end if attack.present? - cmd << ("--attack-mode=" + attack) + cmd << ('--attack-mode=' + attack) end if max_runtime.present? - cmd << ("--runtime=" + max_runtime.to_s) + cmd << ('--runtime=' + max_runtime.to_s) end cmd << hash_path @@ -505,21 +517,21 @@ module Metasploit # # @return [Array] the output from teh command split on newlines def each_cracked_password - ::IO.popen(show_command, "rb").readlines + ::IO.popen(show_command, 'rb').readlines end # This method returns the path to a default john.conf file. # # @return [String] the path to the default john.conf file def john_config_file - ::File.join(::Msf::Config.data_directory, "jtr", "john.conf") + ::File.join(::Msf::Config.data_directory, 'jtr', 'john.conf') end # This method returns the path to a default john.pot file. # # @return [String] the path to the default john.pot file def john_pot_file - ::File.join(::Msf::Config.config_directory, "john.pot") + ::File.join(::Msf::Config.config_directory, 'john.pot') end # This method is a getter for a random Session ID for the cracker. @@ -538,24 +550,21 @@ module Metasploit cmd_string = binary_path pot_file = pot || john_pot_file - if cracker=='hashcat' - cmd = [cmd_string, "--show", "--potfile-path=#{pot_file}", "--hash-type=#{jtr_format_to_hashcat_format(format)}"] - elsif cracker=='john' - cmd = [cmd_string, "--show", "--pot=#{pot_file}", "--format=#{format}"] + if cracker == 'hashcat' + cmd = [cmd_string, '--show', "--potfile-path=#{pot_file}", "--hash-type=#{jtr_format_to_hashcat_format(format)}"] + elsif cracker == 'john' + cmd = [cmd_string, '--show', "--pot=#{pot_file}", "--format=#{format}"] if config cmd << "--config=#{config}" else - cmd << ("--config=" + john_config_file) + cmd << ('--config=' + john_config_file) end end cmd << hash_path end - private - end - end end end diff --git a/spec/lib/metasploit/framework/password_crackers/cracker_spec.rb b/spec/lib/metasploit/framework/password_crackers/cracker_spec.rb index 53b2a2ec5e..beb654057a 100644 --- a/spec/lib/metasploit/framework/password_crackers/cracker_spec.rb +++ b/spec/lib/metasploit/framework/password_crackers/cracker_spec.rb @@ -2,7 +2,6 @@ require 'spec_helper' require 'metasploit/framework/password_crackers/cracker' RSpec.describe Metasploit::Framework::PasswordCracker::Cracker do - subject(:cracker) { described_class.new } let(:cracker_type) { 'john' } let(:cracker_path) { '/path/to/john' } @@ -15,12 +14,10 @@ RSpec.describe Metasploit::Framework::PasswordCracker::Cracker do let(:hash_path) { '/path/to/hashes' } let(:nt_format) { 'nt' } let(:incremental) { 'Digits5' } - let(:rules) { 'Rule34'} + let(:rules) { 'Rule34' } let(:max_runtime) { 5000 } describe '#binary_path' do - - context 'when the user supplied a cracker_path' do before(:example) do cracker.cracker_path = cracker_path @@ -60,9 +57,9 @@ RSpec.describe Metasploit::Framework::PasswordCracker::Cracker do end it 'returns 1000 for nt' do - expect(cracker.jtr_format_to_hashcat_format('nt')).to eq "1000" + expect(cracker.jtr_format_to_hashcat_format('nt')).to eq '1000' end - end + end describe '#john_crack_command' do before(:example) do @@ -80,7 +77,7 @@ RSpec.describe Metasploit::Framework::PasswordCracker::Cracker do end it 'sets the nolog flag' do - expect(cracker.john_crack_command).to include '--nolog' + expect(cracker.john_crack_command).to include '--no-log' end it 'adds a config directive if the user supplied one' do @@ -124,14 +121,13 @@ RSpec.describe Metasploit::Framework::PasswordCracker::Cracker do it 'uses the user supplied max-run-time' do cracker.max_runtime = max_runtime - expect(cracker.john_crack_command).to include "--max-run-time=#{max_runtime.to_s}" + expect(cracker.john_crack_command).to include "--max-run-time=#{max_runtime}" end it 'puts the path to the has file at the end' do cracker.hash_path = hash_path expect(cracker.john_crack_command.last).to eq hash_path end - end describe '#show_command' do @@ -180,25 +176,25 @@ RSpec.describe Metasploit::Framework::PasswordCracker::Cracker do it 'produces the correct error message for config' do cracker.config = config expect(cracker).to_not be_valid - expect(cracker.errors[:config]).to include "is not a valid path to a regular file" + expect(cracker.errors[:config]).to include 'is not a valid path to a regular file' end it 'produces the correct error message for hash_path' do cracker.hash_path = hash_path expect(cracker).to_not be_valid - expect(cracker.errors[:hash_path]).to include "is not a valid path to a regular file" + expect(cracker.errors[:hash_path]).to include 'is not a valid path to a regular file' end it 'produces the correct error message for pot' do cracker.pot = pot expect(cracker).to_not be_valid - expect(cracker.errors[:pot]).to include "is not a valid path to a regular file" + expect(cracker.errors[:pot]).to include 'is not a valid path to a regular file' end it 'produces the correct error message for wordlist' do cracker.wordlist = wordlist expect(cracker).to_not be_valid - expect(cracker.errors[:wordlist]).to include "is not a valid path to a regular file" + expect(cracker.errors[:wordlist]).to include 'is not a valid path to a regular file' end end @@ -211,7 +207,7 @@ RSpec.describe Metasploit::Framework::PasswordCracker::Cracker do it 'produces the correct error message for cracker_path' do cracker.cracker_path = cracker_path expect(cracker).to_not be_valid - expect(cracker.errors[:cracker_path]).to include "is not a valid path to an executable file" + expect(cracker.errors[:cracker_path]).to include 'is not a valid path to an executable file' end end end @@ -226,25 +222,25 @@ RSpec.describe Metasploit::Framework::PasswordCracker::Cracker do it 'produces no error message for config' do cracker.config = config expect(cracker).to be_valid - expect(cracker.errors[:config]).to_not include "is not a valid path to a regular file" + expect(cracker.errors[:config]).to_not include 'is not a valid path to a regular file' end it 'produces no error message for hash_path' do cracker.hash_path = hash_path expect(cracker).to be_valid - expect(cracker.errors[:hash_path]).to_not include "is not a valid path to a regular file" + expect(cracker.errors[:hash_path]).to_not include 'is not a valid path to a regular file' end it 'produces no error message for pot' do cracker.pot = pot expect(cracker).to be_valid - expect(cracker.errors[:pot]).to_not include "is not a valid path to a regular file" + expect(cracker.errors[:pot]).to_not include 'is not a valid path to a regular file' end it 'produces no error message for wordlist' do cracker.wordlist = wordlist expect(cracker).to be_valid - expect(cracker.errors[:wordlist]).to_not include "is not a valid path to a regular file" + expect(cracker.errors[:wordlist]).to_not include 'is not a valid path to a regular file' end end @@ -257,7 +253,7 @@ RSpec.describe Metasploit::Framework::PasswordCracker::Cracker do it 'produces no error message for cracker_path' do cracker.cracker_path = cracker_path expect(cracker).to be_valid - expect(cracker.errors[:cracker_path]).to_not include "is not a valid path to an executable file" + expect(cracker.errors[:cracker_path]).to_not include 'is not a valid path to an executable file' end end end From d01594a5703d574c00e24dbad02732bc90274715 Mon Sep 17 00:00:00 2001 From: h00die Date: Mon, 17 Jan 2022 17:40:35 -0500 Subject: [PATCH 3/4] spec not working quite right --- .../framework/password_crackers/cracker.rb | 3 +- .../password_crackers/cracker_spec.rb | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/metasploit/framework/password_crackers/cracker.rb b/lib/metasploit/framework/password_crackers/cracker.rb index 04603da63d..d29e3a694f 100644 --- a/lib/metasploit/framework/password_crackers/cracker.rb +++ b/lib/metasploit/framework/password_crackers/cracker.rb @@ -367,6 +367,7 @@ module Metasploit end # no date, so lets give it a run with the old format and check if we raise an error + # on *nix 'unknown option' goes to stderr ::IO.popen([binary_path, '--nolog', { err: %i[child out] }], 'rb') do |fd| return '--nolog' unless fd.read.include? 'Unknown option' end @@ -381,7 +382,7 @@ module Metasploit def john_crack_command cmd_string = binary_path - cmd = [cmd_string, '--session=' + cracker_session_id] + cmd = [cmd_string, '--session=' + cracker_session_id, john_nolog_format] if config.present? cmd << ('--config=' + config) diff --git a/spec/lib/metasploit/framework/password_crackers/cracker_spec.rb b/spec/lib/metasploit/framework/password_crackers/cracker_spec.rb index beb654057a..7a319d94bb 100644 --- a/spec/lib/metasploit/framework/password_crackers/cracker_spec.rb +++ b/spec/lib/metasploit/framework/password_crackers/cracker_spec.rb @@ -1,10 +1,13 @@ require 'spec_helper' require 'metasploit/framework/password_crackers/cracker' +require 'rex' RSpec.describe Metasploit::Framework::PasswordCracker::Cracker do subject(:cracker) { described_class.new } let(:cracker_type) { 'john' } let(:cracker_path) { '/path/to/john' } + let(:no_log_new) { '--no-log' } + let(:no_log_old) { '--nolog' } let(:other_cracker_path) { '/path/to/other/john' } let(:session_id) { 'Session1' } let(:config) { '/path/to/config.conf' } @@ -61,11 +64,38 @@ RSpec.describe Metasploit::Framework::PasswordCracker::Cracker do end end + describe '#john_nolog_format' do + before(:example) do + cracker.cracker = cracker_type + end + it 'returns nolog for old date' do + expect(cracker).to receive(:cracker_version).and_return '1999-01-01' + expect(cracker.john_nolog_format).to eq no_log_old + end + it 'returns no-log for new date' do + expect(cracker).to receive(:cracker_version).and_return '2022-01-01' + expect(cracker.john_nolog_format).to eq no_log_new + end + it 'returns nolog for popen check' do + expect(cracker).to receive(:cracker_version).and_return '' + expect(cracker).to receive(:binary_path).and_return cracker_path + expect(::IO).to receive(:popen).and_return 'Password files required, but none specifie' + expect(cracker.john_nolog_format).to eq no_log_old + end + it 'returns no-log for popen check' do + expect(cracker).to receive(:cracker_version).and_return '' + expect(cracker).to receive(:binary_path).and_return cracker_path + expect(::IO).to receive(:popen).and_return 'Unknown option: "--nolog"' + expect(cracker.john_nolog_format).to eq no_log_new + end + end + describe '#john_crack_command' do before(:example) do cracker.cracker = cracker_type expect(cracker).to receive(:binary_path).and_return cracker_path expect(cracker).to receive(:cracker_session_id).and_return session_id + expect(cracker).to receive(:john_nolog_format).and_return no_log_new end it 'starts with the john binary path' do From f6d3788d252bfb2e0431bb57108e845c767cd3d8 Mon Sep 17 00:00:00 2001 From: h00die Date: Tue, 18 Jan 2022 04:42:49 -0500 Subject: [PATCH 4/4] fix spec for cracker --- .../password_crackers/cracker_spec.rb | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/spec/lib/metasploit/framework/password_crackers/cracker_spec.rb b/spec/lib/metasploit/framework/password_crackers/cracker_spec.rb index 7a319d94bb..ad4a359536 100644 --- a/spec/lib/metasploit/framework/password_crackers/cracker_spec.rb +++ b/spec/lib/metasploit/framework/password_crackers/cracker_spec.rb @@ -68,25 +68,28 @@ RSpec.describe Metasploit::Framework::PasswordCracker::Cracker do before(:example) do cracker.cracker = cracker_type end - it 'returns nolog for old date' do - expect(cracker).to receive(:cracker_version).and_return '1999-01-01' - expect(cracker.john_nolog_format).to eq no_log_old + + [ + { date: '1999-01-01', expected: '--nolog' }, + { date: '2022-01-01', expected: '--no-log' } + ].each do |test| + it 'returns test[:expected] for old date' do + expect(cracker).to receive(:cracker_version).and_return test[:date] + expect(cracker.john_nolog_format).to eq test[:expected] + end end - it 'returns no-log for new date' do - expect(cracker).to receive(:cracker_version).and_return '2022-01-01' - expect(cracker.john_nolog_format).to eq no_log_new - end - it 'returns nolog for popen check' do - expect(cracker).to receive(:cracker_version).and_return '' - expect(cracker).to receive(:binary_path).and_return cracker_path - expect(::IO).to receive(:popen).and_return 'Password files required, but none specifie' - expect(cracker.john_nolog_format).to eq no_log_old - end - it 'returns no-log for popen check' do - expect(cracker).to receive(:cracker_version).and_return '' - expect(cracker).to receive(:binary_path).and_return cracker_path - expect(::IO).to receive(:popen).and_return 'Unknown option: "--nolog"' - expect(cracker.john_nolog_format).to eq no_log_new + + [ + { mock_popen: 'Password files required, but none specified', expected: '--nolog' }, + { mock_popen: 'Unknown option: "--nolog"', expected: '--no-log' } + ].each do |test| + it "returns #{test[:expected]} for popen check" do + expect(cracker).to receive(:cracker_version).and_return '' + expect(cracker).to receive(:binary_path).and_return cracker_path + mock_fd = StringIO.new(test[:mock_popen]) + expect(::IO).to receive(:popen).and_yield(mock_fd) + expect(cracker.john_nolog_format).to eq test[:expected] + end end end