hashrat - hashing tool supporting several hashes and
recursivity
hashrat [options] [paths to hash]
hashrat -c [options] [input file of hashes]
Hashrat is a hash-generation utility that supports the md5,
sha1, sha256, sha512, whirlpool, jh-224, jh256, jh-384 and jh-512
hash functions, and also the HMAC versions of those functions. It can
output in traditional format (same as md5sum and shasum and the like) or
it's own format.
Hashes can be output in octal, decimal, hexadecimal, uppercase
hexadecimal or base64.
Hashrat also supports directory recursion, hashing entire devices,
and generating a hash for an entire directory. It has a CGI mode that
can be used as a web-page to lookup hashes.
- -?, -help, --help
- Print this help.
- -version,
--version
- Print program version.
- -type
<type>
- Use hash algorithm <type>. Hash types can be chained as a
comma-seperated list.
- -md5
- Use md5 hash algorithm. This is the default hash.
- -sha1
- Use sha1 hash algorithm.
- -sha256
- Use sha256 hash algorithm.
- -sha512
- Use sha512 hash algorithm.
- -whirl
- Use whirlpool hash algorithm.
- -whirlpool
- Use whirlpool hash algorithm.
- -jh224
- Use jh-224 hash algorithm.
- -jh256
- Use jh-256 hash algorithm.
- -jh384
- Use jh-384 hash algorithm.
- -jh512
- Use jh-512 hash algorithm.
- -hmac
- HMAC using specified hash algorithm.
- -8
- Encode with octal instead of hex.
- -10
- Encode with decimal instead of hex.
- -H,
-HEX
- Encode with UPPERCASE hexadecimal.
- -64, -base64
- Encode with base64.
- -i64,
-i64
- Encode with base64, with rearranged characters.
- -p64,
-p64
- Encode with base64 with a-z,A-Z and _-, for best compatibility with
'allowed characters' in websites.
- -x64,
-x64
- Encode with XXencode style base64.
- -u64,
-u64
- Encode with UUencode style base64.
- -g64,
-g64
- Encode with GEDCOM style base64.
- -a85,
-a85
- Encode with ASCII85.
- -z85,
-z85
- Encode with ZEROMQ variant of ASCII85. -t, -trad Output
hashes in traditional md5sum, shaXsum format.
- -tag, --tag
-bsd
- Output hashes in bsdsum format.
- -r
- Recurse into directories when hashing files.
- -hid
- Show hidden (starting with .) files
- -hidden
- Show hidden (starting with .) files
- -f
<listfile>
- Hash files listed in <listfile>.
- -i
<pattern>
- Only hash items matching a comma-seperated list of shell patterns.
Please be aware that -i does not yet work on directories, only files.
- -x
<pattern>
- Exclude items matching a comma-seperated list of shell patterns. Works on
both directories and files.
- -X
<path>
- Exclude items listed in file <path>. Items in the file can be
wildcards.
- -name
<pattern>
- Only hash items matching a comma-seperated list of shell patterns (-name
as in the 'find' command).
- -mtime
<days>
- Only hash items <days> old. Has the same format as the find command,
e.g. -10 is younger than ten days, +10 is older than ten, and 10 is ten
days old.
- -mmin
<mins>
- Only hash items <min> minutes old. Has the same format as the find
command, e.g. -10 is younger than ten mins, +10 is older than ten, and 10
is ten mins old.
- -myear
<years>
- Only hash items <years> old. Has the same format as the find
command, e.g. -10 is younger than ten years, +10 is older than ten, and 10
is ten years old.
- -exec
- In CHECK or MATCH mode only examine executable files.
- -dups
- Search for duplicate files.
- -n
<length>
- Truncate hashes to <length> bytes.
- -c
- CHECK hashes against list from file (or stdin).
- -cf
- CHECK hashes but only show failures.
- -C
<dir>
- CHECK files under dir recursively against a list from file
(or stdin). This can detect 'new' files
- -Cf
<dir>
- CHECK files under dir recursively against a list from file
(or stdin). This can detect 'new' files. Only show failures.
- -m
- MATCH files from a list read from stdin.
- -lm
- Read hashes from stdin, upload them to a memcached server (requires
the -memcached option).
- -memcached
<server>, -mcd <server>
- Specify memcached server. This option overrides reading list from stdin if
used with -m, -c or -cf.
- -h
<script>
- -hook <script> Script to run when a file fails CHECK
mode, or is found in MATCH mode. Script is passed the filename as an
argument. In 'find duplicates' mode a second file name (the duplicate)
will be passed as the second argument.
- -color
- Use ANSI color codes on output when checking hashes.
- -S,
-strict
- Strict mode: when checking, check file mtime, owner, group, and
inode as well as it's hash.
- -d
- Dereference (follow) symlinks.
- -fs
- Stay one filesystem.
- -dir
- -dirmode DirMode: read all files in directory and create one
hash for them (implies -r).
- -devmode
- DevMode: read from a file EVEN OF IT'S A DEVNODE.
- -lines
- Read lines from stdin and hash each line independently.
- -rl,
-rawlines
- Read lines from stdin and hash each line independently, INCLUDING
any trailing whitespace. This is compatible with 'echo text |
md5sum'.
- -cgi
- Run in HTTP CGI mode.
- -net
- Treat 'file' arguments as either ssh or http URLs, and pull files
over the network and then hash them (allows hashing of files on
remote machines). URLs are in the format
ssh://[username]:[password]@[host]:[port] or
http://[username]:[password]@[host]:[port].
- -idfile
<path>
- Path to a ssh private key file to use to authenticate INSTEAD OF A
PASSWORD when pulling files via ssh.
- -xattr
- Use eXtended file ATTRibutes. In hash mode, store
hashes in the file attributes. In check mode compare against
hashes stored in file attributes.
- -txattr
- Use TRUSTED eXtended file ATTRibutes. In hash mode, store
hashes in trusted file attributes. The trusted attributes
can only be read and written by root. Under FreeBSD this means 'SYSTEM'
attributes.
- -cache
- Use hashes stored in user xattr if they're younger than the mtime
of the file. This speeds up outputting hashes.
- -u
<types>
- Update. In checking mode, update hashes for the files as you go.
The <types> is a comma-separated list of things to update, which can
be xattr memcached or a file name. This will update these targets
with the hash that was found at the time of checking.
- -hide-input
- When reading data from stdin in linemode, set the terminal to not echo
characters, thus hiding typed input.
- -xsel
- Update X11 clipboard and primary selections to the current hash. This
works using Xterm command sequences. The xterm resource 'allowWindowOps'
must be set to 'true' for this to work.
- -star-input
- When reading data from stdin in linemode replace characters with
stars.
Hashrat can also detect if it's being run under any of the
following names (e.g., via symlinks):
- md5sum
- Run with '-trad -md5'.
- shasum
- Run with '-trad -sha1'.
- sha1sum
- Run with '-trad -sha1'.
- sha256sum
- Run with '-trad -sha256'.
- sha512sum
- Run with '-trad -sha512'.
- jh224sum
- Run with '-trad -jh224'.
- jh256sum
- Run with '-trad -jh256'.
- jh384sum
- Run with '-trad -jh384'.
- jh512sum
- Run with '-trad -jh512'.
- whirlpoolsum
- Run with '-trad -whirl'.
- hashrat.cgi
- Run in web-enabled 'cgi mode'.
- hashrat
- Generate a md5 hash of data read from stdin (default hash
type is md5).
- hashrat
-jh256
- Generate a jh-256 hash of data read from stdin.
- hashrat
-sha256 -64
- Generate a sha-256 hash of data read from stdin, output with base64
encoding.
- hashrat
-sha256 -64 -lines
- Read lines from stdin, and generate a sha-256 with base64 encoding FOR
EVERY LINE. This strips any whitespace from the end of the line (including
\r and/or \n line terminators).
- hashrat
-md5 -trad -rawlines
- Read lines from stdin, and generate a md5 hash in traditional
format for every line INCLUDING TRAILING WHITESPACE. This is compatible
with 'echo text | md5sum', where text is one line, as echo adds a newline
to the end of the text it outputs.
- hashrat
-type sha256,whirl,md5 -64
- Generate a sha-256 hash of data read from stdin, then hash the
result with whirlpool, then with md5.
- hashrat
*
- Generate a list of hashes for files in the current directory
(default hash type is md5).
- hashrat
-r -sha1 * > hashes.sha1
- Generate a list of hashes for files in the current directory, AND
ALL SUBDIRECTORIES, using sha1 hashing.
- cat hashes.sha1 |
hashrat -c
- Check hashes listed in hashes.sha1.
- cat hashes.sha1 |
hashrat -c -strict
- Check hashes listed in hashes.sha1. If hashes are NOT in
traditional format than the -strict flag will cause hashrat
to check the files uid, gid, size, mtime and inode and print a failure
message if any of those don't match.
- cat hashes.sha1 |
hashrat -cf
- Check hashes listed in hashes.sha1 but only output failures.
- cat APT1.md5 |
hashrat -m -r /
- Read a list of hashes from stdin and search recursively for files
matching them.
- cat APT1.md5 |
hashrat -lm -memcached 127.0.0.1
- Read a list of hashes from stdin, and register them in a memcached
server.
- hashrat
-m -memcached 127.0.0.1 -r /
- Search recursively for files whose hashes are stored in a memcached
server.
- hashrat
-devmode -whirlpool -64 /dev/sda1
- Generate a whirlpool hash of the entire device /dev/sda1. Output
result in base 64.
- hashrat
-sha1 -net ssh:user:password@myhost/bin/*
- Generate sha1 hashes of files in /bin/* on the remote machine
'myhost'.
- hashrat
-whirlpool -net http://myhost.com/webpage.html
- Generate whirlpool hash for the listed URL. Note, many webpages
have dynamic content that changes every time, so this will only return the
same hash over and over if the page is static and doesn't
change.
- hashrat
-dups -r /home -u xattr
- Search for duplicate files under /home. Update hashes stored in
filesystem attributes as you go.
- 1)
- Strong Passwords
Hashrat can be used to generate strong passwords for websites. So,
you don't have to remember the strong password, if it be always regenerate
with hashrat. You need to remember a handful of moderately decent
passwords, i.e., things that I can't find by grepping in the '10,000 most
popular passwords' list[1], and an additional personal pin. Now, you need to
combine the website name, one of passwords, and the personal pin, into a
string and feed them into hashrat:
$ echo "facebook.com password 1234" | hashrat -sha1 -64
Obviously, a good password isn't 'password' and a good pin isn't '1234', but you
get the idea. This gives a 28-character string that should take "8.02
trillion centuries" to crack with a "massive cracking array",
according to Steve Gibson's Password haystacks utility[2]. This is what I then
use as my password. Unfortunately some websites won't take a 28-character
password, and for these you can truncate to the appropriate length (using the
-n flag), but the results are still stronger than anything you could
remember, and nothing needs storing on disk (as with password managers).
There are some dangers to using the 'echo' method shown above if
you are on a shared machine, or if someone gets hold of your
computer/harddrive. On a shared machine someone could type 'ps ax' to see
all commands running, and if they time it right, they might see your
command-line with your password in it. Another danger lies in using a shell
(like bash) that will record your typed commands so you can recall them
later. Bash stores this information on disk in the file
.bash_history, so if you use the 'echo' method shown above your password
will be saved on disk. To combat this hashrat has line mode:
$ hashrat -sha1 -64 -lines
This reads lines from stdin, so type into hashrat and then press ENTER,
and you'll be given the hash of the line you typed. By this method your
password is neither visible in 'ps ax', nor is ever stored on disk.
A -lines will produce a different hash to the 'echo'
method listed above, because it strips any trailing whiespace off the lines
read. If you want strict compatibility with 'echo' (by default echo adds a
newline to the end of the text to output) then use rawlines mode:
$ hashrat -sha1 -64 -rawlines
Finally, you can prevent shoulder-surfers seeing you type your password by using
the -hide-input or -star-input options to
hide what you type.
[1] https://github.com/discourse/discourse/blob/master/lib/common_passwords/10k-common-passwords.txt
[2] https://www.grc.com/haystack.htm
- 2)
- Watching for file changes
Like md5sum/shasum etc, hashrat can be used to detect
changes in files that might indicate malicious activity. For instance, in
order to get early warning of malware like cryptolocker (that encrypts files
on a users disk, or on network shares, and then demands a ransom for
file recovery) you can scatter about the disk a number of Canary
files that should not change. You need record their hashes and
regularly check them. If they change, you will know something is going
on.
Hashes generated by hashrat can be output to a file,
or stored in extended file attributes, or in a memcached server.
$ hashrat -sha256 -r . > /tmp/files.sha256
$ hashrat -sha256 -r . -xattr
$ hashrat -sha256 -r . -memcached
Similarly these can then be used to check files later:
$ cat /tmp/files.sha256 | hashrat -c -sha256
$ hashrat -C . -sha256 -xattr
$ hashrat -C /tmp -sha256 -memcached
Note that -c checks only check the files in the supplied list. The -C flag
instead checks all files in a directory (supplied on command line) and expects
to find those in the list. This means that -C can find new files that aren't
in the list, whereas -c can't.
There is a slight difference between xattr/memcached checks and checks where a
list is read from stdin. Currently when reading from stdin hashrat will
ONLY check the files in the list. However, in -xattr and
-memcached mode, it will check all files, outputting and error for
those where no stored hash can be found. This is likely to change in
the a future release, with the stdin method being brought into line with the
others.
- 3)
- Finding files that match hashes
Using the -m flag hashrat can be told to read a
range of hashes from stdin, and then search for files matching those
hashes. For Example:
$ cat APT1-AppendixE-MD5s.txt | hashrat -r -m /usr
The last command will search recursively under /usr for files with hashes
matching those in APT1-AppendixE-MD5s.txt. The input on stdin must
begin with a hash, anything written after the hash will be
treated as a comment to be displayed if a file matching the hash
is found.
Hashtypes other than md5 can be used thusly:
$ cat sha1-list.lst | hashrat -r -sha1 -m /usr
Hashes can also be loaded into a memcached server, so that the same file
list can be checked on a number of machines, without needing to store the
hashlist on those machines. First you need load the hashes:
$ cat APT1-AppendixE-MD5s.txt | hashrat -lm -memcached 192.168.1.5
The last line loads the hashes to a memcached server at 192.168.1.5. You
can then search against the memcached server by:
$ hashrat -r -m -memcached 192.168.1.5 /usr
- 4)
- Find duplicate files
Using the -dups flag (usually in combination with the
-r recursive flag) hashrat can be set to search for duplicate
files and output any found to stdout.
Hookscripts, defined using the -h or -hook
command-line options, are scripts that are run for each hashed item.
-h and -hook options take an argument that is the path to the
script. Hookscripts behave differently in different modes:
- Check Hashes
mode.
- The hookscript is called if a file doesn't match it's expected hash, or is
not listed in the expected hashes. It is passed the path of the file.
- Locate files
mode
- The hookscript is called if a file matches the hash to locate. It is
passed the path of the file.
- Find duplicates
mode
- The hookscript is called if a file is a duplicate of another file. It is
passed the paths of both files.
Hashrat can use extended filesystem attributes where these are
supported. This allows a hash to be stored in the filesystem metadata
of the target file. This can then be used for checking hashes,
or for caching hashes to produce faster output during hashing runs.
There are two types of filesystem attribute, trusted attributes, which can
only be set and read by root, and user attributes, which can be set and read
by any user that has the appropriate permissions for the file.
Hashes can be stored against files by using the -xattr
option to set user attributes:
$ hashrat -sha256 -r . -xattr
And using the -txattr flag to set trusted attributes (you must be root to
set trusted attributes):
# hashrat -sha256 -r . -txattr
When checking either flag can be used, but hashrat will always use
trusted attributes when running as root, if those are available, otherwise it
will fall back to user attributes.
$ hashrat -c -sha256 -r . -xattr
The -cache option allows using stored hashes rather than
regenerating hashes. It only considers hashes stored in user
attributes at current.
$ hashrat -r . -cache
This makes getting a report of hashes considerably faster, but it runs
the risk that the hashes may not be accurate. Hashrat will only output
a hash stored in file attributes if the storage time of the
hash is younger than the modify time (mtime) of the file,
however, this means an attacker could change the modify time of the
file to hide changes they've made. Thus this feature should not be used
for security checking purposes (but should be safe for uses like finding files
that have changed and need to be backed up, for instance).
The hashrat was written by Colum Paget
<colums.projects@gmail.com>.
This manual page was written by Joao Eriberto Mota Filho
<eriberto@debian.org> for the Debian project (but may be used by
others).