快速破解各种散列hash [ john入门篇 ]



0x00 前言
    john[又名JTR] 本身是用来专门破解linux系统用户hash的,但现在已经不再那么局限了,它同样也提供了非常多的散列类型,虽然,跟hashcat在某些方面确实还差了一个量级,但它也有自己很独到的地方,多用你就知道了,废话不多说,咱们开始吧

0x01 尝试在Ubuntu16.04.2 LTS上编译安装john 1.8[当然啦,也有已经编译好对应的win版下的,不过实际破解还是更推荐用linux],像类似的hash破解工具,不用多说,单独找个显卡或者CPU性能好点的机器是必须的,要不,意义何在呢,编译安装的过程就非常简单了,如下[如果嫌手敲的累,自己放脚本里跑跑就好了]

1
2
3
4
5
6
7
8
9
# wget http://www.openwall.com/john/j/john-1.8.0.tar.xz
# tar xvfJ john-1.8.0.tar.xz
# cd john-1.8.0/src
# make 选择对应的系统平台进行编译
# make clean linux-x86-64
# echo $?
# cd ../run/
# ./john --test 测试当前系统的破解速度
# echo $?

安装完以后,看到如下的情况,基本就算安装成功了


0x02 下面是john 默认破解规则的配置文件(可自行设置每种模式下的具体破解规则,一般没有极特殊的需求,我们是很少改配置的,有兴趣可以仔细阅读):

1
# cat john.conf

0x03 john在运行期间会在当前目录产生一个john.pot文件,用来缓存破解时的数据,主要是用来记录破解进度什么的,如果你每次想从头开始破解,直接把这个文件手工删除,然后重新跑即可

1
# rm -fr john.pot

0x04 john 的一些常用选项:

1
2
3
4
5
6
7
8
9
10
11
--single 简单破解模式,也是默认的执行模式,就是根据用户和家目录名进行一些简单的变形猜解
--incremental 逐个遍历模式[其实跟hashcat的increment模式是一样的],直到尝试完所有可能的组合
--wordlist 纯字典模式,后面跟上字典的路径即可
--external 扩展[自定义]破解规则模式,今天先不讲,有闲工夫会专门说
--restore 从上次的破解进度接着执行破解过程,它会把破解的过程存到john.pot文件中,下次破解会先读取该文件,如果不想让它从这儿读取,而是从头跑,直接把它删掉就好了
--show 显示已经破解出来的hash及所对应的明文密码
--users 只破解指定用户的hash,可以是用户名或者对应的uid
--groups 只破解指定用户组的hash,可以是组名或者对应的gid
--shells 只破解指定shell的hash,可以用逗号分隔多个shell程序
--format 指定要破解的hash所对应的加密类型,可以不用手工指定,john会自动识别
--stdout 从标准重定中获接收指定字符

关于不同破解模式的官方介绍,如下,没事儿还是建议多看看官方文档,对你肯定会有很大的帮助:

1
http://www.openwall.com/john/doc/MODES.shtml

0x05 关于Incremental模式的一些默认破解规则,最大跑8位,为了节省时间,建议挨个字符集尝试,特别不建议一上来就给个特别大的范围,比如,all,机器性能不是太好的话,可能要跑很久:

1
2
3
4
5
6
7
8
9
破解模式的具体方法 破解的密码长度 所包含的字符
Incremental:all 0-8 All 95 printable ASCII characters
Incremental:all15 0-5 All 95 printable ASCII characters
Incremental:all6 6 All 95 printable ASCII characters
Incremental:all7 7 All 95 printable ASCII characters
Incremental:all8 8 All 95 printable ASCII characters
Incremental:alpha 1-8 A-Z 纯大写字母
Incremental:digits 1-8 0-9 纯数字
Incremental:lanman 0-7 A-Z, 0-9, and some special characters 大写字母,数字加一些特殊字符

0x06 暂以破解linux系统用户密码hash为例,我们需要先合并下linux的用户/组及密码配置文件(实际中,你可以想办法直接把目标的账户和密码hash文件先down下来,然后再在本地合并,另外,在john中有个比较好的地方,如果实在不知道某条hash的具体散列类型,直接在john后跟上要破解的hash即可,它会去轮训其所支持的所有hash类型直到找出匹配的类型,然后先尝试简单模式,如果简单模式破不出来,会自动再切换到incremental模式):

1
2
3
4
# ./unshadow /etc/passwd /etc/shadow > user_hash.txt
# cat user_hash.txt
# ./unshadow /etc/group /etc/gshadow >> group_hash.txt
# cat group_hash.txt

0x07 实际测试用户如下:

1
2
3
4
5
6
klion:x:1002:1002::/home/klion:
sec:x:1003:1003::/home/sec:
master:x:1004:1004::/home/master:
webadmin:x:1005:1005::/home/webadmin:
httpd:x:1006:1006::/home/httpd:
elk:x:1007:1007::/home/elk:/usr/sbin/noglogin

0x08 正式开始破解linux系统用户密码hash[新一点的发行版默认基本都是基于’sha512crypt’加密的],实际破解中,最好指定用户名,shell类型,以节省时间,接下来的演示中,为了能尽快演示给大家看到实际的破解效果,会尽量选择字典模式,实际破解中,按照下面的爆破顺序来就好了:


首先,使用默认的爆模式,它会先尝试single模式,然后再尝试incremental模式,直到把所有的规则都跑完,很显然,如果用户比较多,这样耗时必然就会很长,可以看到,由于我的密码设的都比较简单,所以瞬间就出来了,实际中可没那么轻松:

1
# ./john --user=klion,sec,1004,webadmin,httpd,1007 user_hash.txt


粗暴简单的爆破模式 [single],只爆破指定用户的hash(如果不手工指定hash类型,john会自动帮你识别,并提示你):

1
# ./john --single --user=klion,sec,1004,webadmin,httpd,1007 user_hash.txt


基于纯字典的爆破模式[wordlist,顾名思义,你需要事先精心准备好一个高质量字典,字典不用过大,可以多在质量上做些文章]:

1
#john --wordlist=./weakpass.txt --users=elk,root user_hash.txt


只破解特定shell类型的用户hash,如果用户实在比较多,我们只需要破解那些可以登录到系统中的用户就好了,伪用户可以暂时不用管:

1
# ./john --wordlist=./weakpass.txt --shells=/usr/sbin/noglogin user_hash.txt


逐个遍历的爆破模式,这里暂以纯数字为例[incremental 实际破解速度可能会比较的慢,毕竟是一位位的猜解,组合比较多]:

1
# ./john --incremental:digits --users=webadmin user_hash.txt


显示已经破解出的hash:

1
# ./john --user=klion,sec,1004,webadmin,httpd,1007 user_hash.txt --show


0x09 实际破解中推荐的爆破顺序,为了尽量节省爆破时间,可以自行尝试:

1
single模式 -> wordlist模式 -> incremental模式 -> 默认模式

0x09 破解一些常见的加密方式
破解最普通的md5:

1
# john --wordlist=weakpass.txt --format=Raw-MD5 hash.txt


破解 ntlm,可能是编译的时候,没把有些库加进去,导致john不支持NT2类型的hash,所以后面的掩饰就直接用win版的john代替了(实际测试的hash为2008r2系统用户的hash):

1
2
# john --list=formats 查看john所支持的所有散列类型
# john --wordlist=weakpass.txt --format=NT2 hash.txt


破解mssql 2012系列数据库用户hash:

1
# john --wordlist=weakpass.txt --format=mssql12 hash.txt


破解mysql 系列数据库用户hash:

1
# john --wordlist=weakpass.txt --format=mysql-sha1 hash.txt


破解oracle 11g 数据库用户hash:

1
# john --wordlist=weakpass.txt --format=oracle11 hash.txt


破解 postgresql 数据库用户hash[如果特意指定散列类型貌似不太好使,让它自动识别就好了,不知道今天什么情况,之前在centos7中用一直都没问题的呀]:

1
# john --wordlist=weakpass.txt hash.txt

破解office 系列加密后的hash(2016):

1
2
3
# "c:\Program Files\python27\python.exe" office2john.py sec.docx >> office_hash.txt
# type office_hash.txt
# john --wordlist=weakpass.txt --format=office office_hash.txt


破解drupal7 用户密码hash:

1
# john --wordlist=weakpass.txt --format=drupal7 hash.txt


破解rar系列密码hash(rar和rar5的hash提取破解方法几乎是一模一样的):

1
2
3
# rar2john.exe sec.rar > rar_hash.txt
# type rar_hash.txt
# john --wordlist=weakpass.txt --format=rar rar_hash.txt


1
2
3
# rar2john.exe sec.rar > rar5_hash.txt
# type rar5_hash.txt
# john --wordlist=weakpass.txt --format=rar5 rar5_hash.txt


破解zip密码hash:

1
2
3
# zip2john.exe sec.zip > zip_hash.txt
# type zip_hash.txt
# john --wordlist=weakpass.txt --format=PKZIP zip_hash.txt


破解7z密码hash[可能提取脚本的问题,暂时没空管它,不过还有7z2hashcat.pl的脚本(运行时候可能需要你自己装一些perl模块)可以直接转成hashcat识别的格式,大家可以试试]:

1
2
# "c:\Program Files\python27\python.exe" 7z2john.py sec.7z
# john --wordlist=weakpass.txt --format=7z 7hash.txt

破解pdf密码hash[可能又是脚本的问题,哪天闲下来了统一搞下吧,看样子,脚本估计没几个能用的]:

1
2
3
# "c:\Program Files\python27\python.exe" security-geek-2016-A.pdf > pdf_hash.txt
# type pdf_hash.txt
# john.exe pdf_hash.txt 这里跟pgsql一样,不用特意指定类型,暂时还不知道是什么毛病

破解wpa/wpa2hash[直接从标准输出中读取密码然后挨个尝试]:

1
# john --stdout --incremental:all | aircrack-ng -b 目标ap的mac -w - wpa2*.cap

破解jpg加密[后期成功再贴上来吧]:


0x10 最后,提供两个简明john使用帮助:

1
2
https://countuponsecurity.files.wordpress.com/2016/09/jtr-cheat-sheet.pdf
http://msu-nftc.org/courses/intro/material/9%20Password%20Cracking/Tools/John%20the%20Ripper.pdf



0x10 一点小结:
    作为john的入门使用,到这里基本就差不多了,确实非常简单,里面所支持的散列类型这里就不一一演示了,破解方式几乎都是一样的,关键是知道各种爆破模式的工作细节和各类hash的提取方法,这才是今天要关注的重点,关于自定义规则后续有空会再单独说明,它比hashcat唯一好一点的是,如果你不指定目标的hash类型它会自动匹配,但实际破解中跟hashcat还是有着比较大差距的[就免费版来说],估计专业版应该会好很多吧,反正我自己没用过