Keyboard-Walk-Generators icon indicating copy to clipboard operation
Keyboard-Walk-Generators copied to clipboard

Generate Keyboard Walk Dictionaries for cracking

Methods to Generate Keyboard Walks for Password Cracking

Author: Rich Kelley, rk5devmail[A T]gmail[D O T]com, @RGKelley5

More info at: www.bytesdarkly.com

Overview

The "Method 1 - Tree Walks" folder contains the following files:

  • QwertyTreeWalker.py
  • qwerty_graph.py

The "Method 2 - Combinator Script" folder contains the following files:

  • 4_Walk_seed.txt
  • Combinator.py
  • walk.rule

Method 1 Usage

Version 2.0.0 of QwertyTreeWalker supports two modes to display output, stdout and write-to-files

The main process will parse the qwerty_graph datastructure provided, and split the work among a
number of worker processes. Each worker process will output a file with the walks generated. If the 
file size exceeds 524288000 bytes then a new file will be created to continue output. Output by default
will be located in an OUTPUT folder located in the same directory QwertyTreeWalker.py is being run. 

Commandline Arguments:
----------------------
usage: QwertyTreeWalker.py [-h] [-l [L]] [-p [P]] [-x] [-H] [--stdout][--noplain][file_name]

Generate walks for Qwerty Keyboard

positional arguments:
  file_name             File with adjacency list of format {'letter':{'direction': 'letter connected'}}

optional arguments:
  -h, --help                show this help message and exit
  -l [L], -length [L]       Walk length
  -p [P], -processes [P]    Number of processses to divide work
  -x, -exclude              Will trigger prompt for link exclude list
  -H, -hash                 Output NTLM hash
  --stdout                  Output to screen
  --noplain                 Do not print plain text hash

EXAMPLE - Interactive Mode:

python QwertyTreeWalker.py qwerty_graph.txt -l 16 -p 7

Executing the above command will drop you into an interactive status prompt and begin output keyboard walks of length 16 to files located in {working dir}/OUTPUT.

Interative Prompt:
------------------

**********************************************************************
***************** WARNING: This may take a while *********************
***************** Type: [S]tatus [Q]uit ******************************
**********************************************************************


[ 8-step walk STARTED at:       2014-07-22-131636 with 8 workers ]
7134.00000000 walks/sec  Walks: 19889 Walks Left: 57548663119

Once the run is completed (or the user has exited the program with the Q command) the interactive prompt will look like this

**********************************************************************
***************** WARNING: This may take a while *********************
***************** Type: [S]tatus [Q]uit ******************************
**********************************************************************


[ 8-step walk STARTED at:       2014-07-22-131636 with 8 workers ]
7134.00000000 walks/sec  Walks: 19889 Walks Left: 57548663119
[ 8-step walk ENDED at:         2014-07-22-131652 ]

Writing files. Please wait this could take several minutes. [Done]

        [Run Stats]
                Elasped Time: 0.271800001462 minutes
                9988.00000000 walks/sec/worker
                162164 walks generated
                
Example STDOUT:

python QwertyTreeWalker.py qwerty_graph.txt -l 16 -p 1 --stdout > 16_Walk.txt

Executing the above command will output the following to 16_Walk.txt. NOTE: This will probably NOT complete in your lifetime. Porting this to use GPUs might be able to though. If anyone tries using GPUs please share your results.  

...
$bhu8.;[=\`zxXAw
$bhu8.;[=\`zxXAs
$bhu8.;[=\`zxXA`
$bhu8.;[=\`zxXAS
$bhu8.;[=\`zxXA=
$bhu8.;[=\`zxXAx
$bhu8.;[=\`zxXAq
$bhu8.;[=\`zxXA"
$bhu8.;[=\`zxXAa
$bhu8.;[=\`zxXA`
$bhu8.;[=\`zxXAZ
$bhu8.;[=\`zxXAQ
...

Some notes on usage:
--------------------

1. When using the -p option with --stdout you may only use 1 process. Since the processes are non-blocking you will get gibberish instead of walks when using multiple processes

2. The -x option is used for pruning the graph. You will be prompted (shown below) for a csv list of edges to exclude from parsing. 

    [1] diag_up_right
    [2] right
    [3] diag_up_left
    [4] up
    [5] shift_right
    [6] diag_down_left
    [7] diag_down_right
    [8] shift_loop
    [9] shift_left
    [10] shift_diag_up_left
    [11] down
    [12] shift_down
    [13] shift_up
    [14] shift_diag_down_right
    [15] shift_diag_down_left
    [16] shift_diag_up_right
    [17] loop
    [18] left
    Enter Links to exclude as csv (EX:1,2,3)
    >> 2,3,4

3. The -H and --noplain options are there for testing purposes incase you want to generate a combination of hashes and plain text walks. 

Method 2 Usage

Commandline Arguments:
----------------------
usage: Combinator.py [-h] [-l [L]] [file_name]

    Combinator: Combine strings into arbitrary length strings

    positional arguments:
      file_name            File with strings of same length

    optional arguments:
      -h, --help           show this help message and exit
      -l [L], -length [L]  Length of final strings
      
EXAMPLE: To create a dictionary of keyboard walks of length 16 the best results come from combining the seed file into length 8 and then into a 16 length file.

python Combinator.py 4_Walk_seed.txt -l 8 > 8_Walk.txt
python Combinator.py 8_Walk.txt -l 16 > 16_Walk.txt

Executing the above commands should generate a file of around 5GB in size. Then you can input the resulting 16_Walk.txt file and walk.rule file into a password cracker. NOTE: The walk.rule rules were written for oclHashcat, but may work in other crackers such as John. 

Analysis Tools:

The WalkCheck.py script can be used to detected keyboard walks in a word list. It's more of a proof of concept, but can be useful for analysis.

Commandline Arguments:
----------------------
WalkCheck.py - Checks strings and detects keyboard walks

usage: WalkCheck.py [-h] [-l [L]] [-strict] [-loop] [-stats]
                [graph_file_name] [input]

Check if string(s) are keyboard walks

positional arguments:
  graph_file_name      File with adjacency list of format {'letter':
                       {'direction': 'letter connected'}}
  input                File name or single string to check

optional arguments:
  -h, --help           show this help message and exit
  -l [L], -length [L]  Walk length
  -strict              Only find exact walks of length specified by -l option
  -loop                Consider adjacent dublicate letters as walks
  -stats               Do some calculations

EXAMPLE: python WalkCheck.py qwerty_graph.txt rockyou.txt -l 8 

The above command will print out all the words in rockyou.txt that contain keyboard walks of length 8.