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 默认破解规则的配置文件(可自行设置每种模式下的具体破解规则,一般没有极特殊的需求,我们是很少改配置的,有兴趣可以仔细阅读):
0x03 john在运行期间会在当前目录产生一个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会自动帮你识别,并提示你):
基于纯字典的爆破模式[wordlist,顾名思义,你需要事先精心准备好一个高质量字典,字典不用过大,可以多在质量上做些文章]:
1
| #john --wordlist=./weakpass.txt --users=elk,root user_hash.txt
|
只破解特定shell类型的用户hash,如果用户实在比较多,我们只需要破解那些可以登录到系统中的用户就好了,伪用户可以暂时不用管:
逐个遍历的爆破模式,这里暂以纯数字为例[incremental 实际破解速度可能会比较的慢,毕竟是一位位的猜解,组合比较多]:
显示已经破解出的hash:
0x09 实际破解中推荐的爆破顺序,为了尽量节省爆破时间,可以自行尝试:
1
| single模式 -> wordlist模式 -> incremental模式 -> 默认模式
|
0x09 破解一些常见的加密方式
破解最普通的md5:
破解 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:
破解mysql 系列数据库用户hash:
破解oracle 11g 数据库用户hash:
破解 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:
破解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还是有着比较大差距的[就免费版来说],估计专业版应该会好很多吧,反正我自己没用过