PDF文件密码破解
0x01 前言
今天在整理文档的时候发现,有几个随机数字命名的加密pdf文件,回想了一下相关情况,好像密码是6位以内的数字加字母。正好记录一下使用hashcat和john爆破PDF文件密码的用法。顺便学习记录一下hashcat和john的用法
本文由“壹伴编辑器”提供技术支持
0x02 hashcat
下载地址:
https://github.com/hashcat/hashcat/releases/download/v6.1.1/hashcat-6.1.1.7z
kali下自带有该工具,但是不能发挥出它的功力,想好好利用它,还是需要下载到本地,使用显卡或者CPU去跑最好。
hashcat号称是世界上最快的hash破解工具,然而获取文件hash这个事情还是需要用john的脚本。
也可能太菜了没找到hashcat的脚本
这里使用john的提取pdf文件密码hash的脚本pdf2john。
john的脚本目录在/usr/share/john/下,把pdf文件传上去,执行即可。
使用一个在线的网站也可以。
https://www.onlinehashcrack.com/tools-pdf-hash-extractor.php
对比一下hashcat的选项
垃圾的我一时不知道该用哪个好了。
时间是19年末,应该是用的比较高级的加密算法,所以这里我赌10700哈哈哈
hashcat.exe -m 10700 -a 3 $pdf$4*4*128*-4*1*16*f8e0565b3c4d9795db089448fcf5426e*32*6cff45e6bdfcecaf9039ba17cdb06ae700000000000000000000000000000000*32*f78487d59915fc93bd17f9c687bf84d1360e98df8e382132d494ed78dc3518b1 -1 ?l?u?d ?1?1?1?1?1?1
简单解释一下
-m 指定hash类型
-a 选择爆破方式
0 Straight(字典破解)
1 Combination(组合破解)
3 Brute-force(掩码暴力破解)
6 Hybrid dict + mask(混合字典+掩码)
7 Hybrid mask + dict(混合掩码+字典)
-1 字符集 这里是?l?u?d 指数字+字母大小写
总共?1有6个,代表有6位
执行后发现不行。尝试使用多个hash类型匹配这个hash。
最后10500成功了。看了下CPU,并没有跑满,应该是还需要设置一些参数。
跑了一分钟就已经受不了了,这个垃圾电脑电扇声音太大了,跑密码这种事情还是扔到服务器上慢慢跑比较实在。随后在服务器上扔着慢慢跑就行了。如果没记错那就能跑出来。
后边又去测试了一波跑HASH:
找了个word文件-另存为-编辑加了个密码-随便设置一个6位纯数字密码
体会下速度。3秒,是真的快
侧面也说明了密码设置8位以上数字加字母和特殊字符的必要性。
本文由“壹伴编辑器”提供技术支持
0x03 John
接下来体验一把john,这个工具在渗透中用过几次,用来跑密码也是非常不错的。
一般平常在使用这个工具的时候往往需要准备一个密码字典去跑密码,其次可以通过其配置文件对密码字典中的密码进行变换,如末尾增加@,开头字母大写等。
-pwfile:<file>[,..]
用于指定存放密文所在的文件名,(可以输入多个,文件名“,”分隔,也可以使用*或者这两个通配符引用一批文件)。也可以不使用此参数,将文件名放在命令行的最后即可。
-wordfile:<字典文件名>-stdin
指定的用于解密用的字典文件名。你也可以使用STDIO来输入,就是在键盘中输入。
-rules
在解密过程中使用单词规则变化功能。如将尝试cool单词的其他可能,如COOLER、Cool等,详细规则可以在JOHN.INI文件中的[List.Rules:Wordlist]部分查到,我们在下面详细解释。
-incremental[:<模式名称>]
使用遍历模式,就是组合密码的所有可能情况,同样可以在JOHN.INI文件中的[Incremental]部分查到,我们在下面详细解释。
-single
使用单一模式进行解密,主要是根据用户名产生变化来猜测解密,可以消灭笨蛋用户。其组合规则可以在JOHN.INI文件中的[List.Rules:Single]部分查到。
-external:<模式名称>
使用自定义的扩展解密模式,你可以在john.ini中定义自己需要的密码组合方式。JOHN也在INI文件中给出了几个示例,在INI文件的[List.External]中所定义的自订破解功能。
-restore[:<文件名>]
继续上次的破解工作,JOHN被中断后,当前的解密进度情况被存放在RESTORE文件中,你可以拷贝这个文件到一个新的文件中。如果参数后不带文件名,JOHN默认使用RESTORE文件。
-makechars:<文件名>
制作一个字符表,你所指定的文件如果存在,则将会被覆盖。JOHN尝试使用内在规则在相应密匙空间中生成一个最有可能击中的密码组合,它会参考在JOHN.POT文件中已经存在的密匙。
-show
显示已经破解出的密码,因为JOHN.POT文件中并不包含用户名,同时你应该输入相应的包含密码的文件名,JOHN会输出已经被解密的用户连同密码的详细表格。
首先来看一下这个配置文件(etc/john/john.conf)
里面配置了一些默认设置和规则,如默认的密码字典,默认的解密模式
在这里我们可以设置自己的特定符号 如0 = [a-zA-Z-0-9],就代表数字加字母的组合
也可以制定自己想要的密码处理模式
只需要在配置文件里添加
[List.Rules:myrules1]
cAz"[0-9]" //代表首字母大写,另外末尾增加一个数字后缀。可以将password变为Possword1。
cAz"[0-9][!@#]" //也可以加特殊符号
: 不操作:对输入词不做任何操作
l 转换为小写
u 转换为大写
c 首字母大写
C 第一个字母小写,其余字母大写
t 单词中所有字符的切换大小写
TN 在N位置切换字符的大小写
WN 切换字符在N位置的移位
r 颠倒:"Fred"->"derF"
d 重复:"Fred" -> "FredFred"
f 联想:"Fred"->"FredderF"
{ 向左旋转单词“jsmith"->"smithj"
} 向右旋转单词:"smithj"->"jsmith"
$X 将字符X附加到单词
^X 在单词前面加上X字符
sXY 将单词中的所有字符X替换为Y
s?CY 将单词中包含C类的所有字符替换为Y
@X 从单词中清除所有字符X
@?C 从单词中清除包含C类的所有字符
!X 如果单词包含字符X,则拒绝该单词
!?C 如果单词包含C类字符,则拒绝该单词
还有很多就不一一列举了,机翻的不一定准确,还需要在实际运用中自己把握,毕竟是老外的东西,角度是从字母出发的。跟我们的拼音密码还是有差距的。
我们找到爆破模块,然后自定义一个6位数的纯数字模块。
默认这个模块是[Incremental:ASCII]枚举13位的ascii的所有字符。
这里有一个[Incremental:ASCII]模块机,看了说明,应该就是数字,意思是20位数字爆破,改一下好了。把MinLen和MaxLen都改成6去调用看看。
[Incremental:ASCII]
File = $JOHN/digits.chr
MinLen = 1
MaxLen = 20
CharCount = 10
速度也是很快。
如果要深究怎么使用的可以去看官方文档,这个工具不仅仅可以用来破解hash,还有一些其他功能。
https://github.com/openwall/john/tree/bleeding-jumbo/doc
可以看以下几个文档,通读后绝对熟练掌握,哈哈。
* INSTALL - installation instructions
* OPTIONS - command line options and additional utilities
* MODES - cracking modes: what they are
* CONFIG (*) - how to customize
* RULES (*) - wordlist rules syntax
* EXTERNAL (*) - defining an external mode
* EXAMPLES - usage examples - strongly recommended
end
- JAVAScript柯里化、部分应用参数终极理解
- 翻转句子中单词的顺序
- 即将举行的全球区块链峰会强调东西方合作
- 区块链兄弟社区问答精选:关于51%攻击,你了解有多少?
- 编程小技巧
- use vue vuex vue-router, not use webpack
- 从尾到头打印链表
- Webpack+Vue如何导入Jquery和Jquery的第三方插件
- [Hadoop大数据]——Hive部署入门教程
- Vuex原来可以这样上手
- 《Hive编程指南》—— 读后总结
- Event(事件)的传播与冒泡
- [Hadoop大数据]——Hive数据的导入导出
- 区块链技术在电子游戏与博彩行业备受追捧 有望实现数字商品货币化
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- springboot开发之配置自定义的错误界面和错误信息
- springboot开发之删除员工
- LeetCode | 1.两数之和
- springboot开发之配置嵌入式Servlet容器两种方式
- jvaa之初始化块
- java之匿名内部类
- springboot配置之获取配置文件中属性的第二种方法(@Value)不同于@ConfigurationProperties
- mybatis动态sql之内置参数_parameter和_databaseId
- Redis | Redis 字符串相关命令
- java之抽象类
- springboot配置之yaml
- properties和yaml配置文件
- java之模板方法设计模式
- java之接口
- PHP 代码混淆处理思路