浅谈暴力破解
0x01 原理
暴力破解(brute force),又名暴力攻击、暴力猜解,从数学和逻辑学的角度,它属于穷举法在现实场景的运用。当密码未知或获得密码哈希时,攻击者会使用暴力破解来试图登录帐户,即通过利用大量猜测和穷举的方式来尝试获取用户口令的攻击方式。在ATT&CK中暴力破解有如下四种子技术。
Password Guessing(密码猜测)
事先不了解系统和环境,攻击者会猜测密码以尝试登录帐户。在不了解帐户密码的情况下,攻击者可能会在操作过程中通过使用常用密码字典来猜测登录密码,而无须事先了解系统或环境密码。
Password Cracking(密码破解)
当获得凭证材料(例如密码哈希)时,攻击者可能会解密密码来尝试恢复可用的凭据,例如纯文本密码。
Password Spraying(密码喷洒)
使用多个密码来暴力破解一个账号可能会导致该账号被锁定,攻击者可能会针对许多不同帐户使用单个或少量的常用密码列表,以尝试获取有效帐户凭据。
密码喷洒常常针对如下服务:
SSH (22/TCP)
Telnet (23/TCP)
FTP (21/TCP)
NetBIOS/SMB /Samba (139/TCP & 445/TCP)
LDAP (389/TCP)
Kerberos (88/TCP)
RDP/终端服务 (3389/TCP)
HTTP/HTTP管理服务 (80/TCP & 443/TCP)
MSSQL (1433/TCP)
Oracle (1521/TCP)
MySQL (3306/TCP)
VNC (5900/TCP)
Credential Stuffing(撞库)
攻击者可以使用受害者历史上泄露的数据获得凭据,通过凭据重叠来访问目标帐户。
0x02 实验
1.密码猜测
Login.html
1 |
|
checkLogin.php
1 |
|
以上代码为一个简单的表单提交到后台,判断账号,密码都为root则登陆成功。
接下来burpsuite抓包使用Intruder模块进行爆破,通过对比数据包的长度可以很好的判断是否爆破成功,因为爆破成功和失败的长度是不一样的。
在数据包中选定欲爆破的参数
设置爆破的字典
根据响应的数据包的长度可以判断出正确的账号、密码。
PS:进阶技巧
(1)默认凭证
在对某一服务进行暴力破解之前,我们首先应该尝试该服务的默认口令,这样也许可以节约大量的时间和工作量。通过搜索引擎等方式可以获取到不同服务的默认口令,以下是一些默认口令的合集。
- http://www.vulnerabilityassessment.co.uk/passwordsC.htm‘
- https://192-168-1-1ip.mobi/default-router-passwords-list/
- https://datarecovery.com/rd/default-passwords/
- https://bizuns.com/default-passwords-list
- https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/default-passwords.csv
- https://www.cirt.net/passwords
- https://www.passwordsdatabase.com/
通过对这些默认口令的分析不难发现,很多都是以admin
、root
、administrator
、password
等字样出现,而如果不更改掉默认口令,攻击者往往就能以此轻松突破。
(2)好用的字典
爆破的字典选什么是一个技巧,并非越全越好,这里整理了一些好用的字典仓库(感谢众大佬的分享),仅供参考。
- https://github.com/Dormidera/WordList-Compendium
- https://github.com/danielmiessler/SecLists
- https://github.com/3had0w/Fuzzing-Dicts
(3)自定义字典
如果前期已经通过社工等方式搜集到目标有关信息,也许根据目标生成的专属字典能增加破解效率。
使用到的工具:pydictor—— 一个强大实用的黑客暴力破解字典建立工具
详细使用方法可以参考其用法示例
2.密码破解
在通过一定方式获得密码哈希后,进一步要做的就是将其破解了。
何为hash?Hash 一般翻译为“散列”,也可直接音译为“哈希”的。这个加密函数对一个任意长度的字符串数据进行一次加密函数运算,然后返回一个固定长度的字符串。Hash 主要用于信息安全领域中加密算法,渗透测试中获取目标系统的明文或 Hash 往往是整个渗透测试过程中重要的一环。
Window Hash
在 Windows 系统中本机用户的密码 Hash 是放在本地的 SAM(Security Account Manager) 文件里面,域内用户的密码 Hash是存在域控的 NTDS.DIT 文件里面。
分类
LM
LAN Manager(LM)哈希是 Windows 系统所用的第一种密码哈希算法,是一种较古老的 Hash,在 LAN Manager协议中使用,非常容易通过暴力破解获取明文凭据。它只有唯一一个版本且一直用到了 NT LAN Manager(NTLM)哈希的出现,在 Windows Vista/Windows 7/Windows Server 2008 以及后面的系统中,LM哈希算法是默认关闭的,LM 算法是在 DES 基础上实现的,不区分字母大小写。
NTLM
NT LAN Manager(NTLM)哈希是Windows系统认可的另一种算法,用于替代古老的 LM-Hash,一般指 Windows 系统下 Security Account Manager(SAM)中保存的用户密码 Hash,在 Windows Vista/Windows 7/Windows Server 2008 以及后面的系统中,NTLM 哈希算法是默认启用的。
获取
Hash的获取可以使用mimikatz工具
项目地址:https://github.com/gentilkiwi/mimikatz
下图为使用mimikatz获取win10用户的密码Hash
Hashcat 破解
在拿到 LM 或者 NTLM 的密文时,如果没有明文的时候,最直接的方法当然是直接将其解密啦,这里使用Hashcat来进行密码解密。
如上图我们通过msf获取到目标主机的hash
LM:44efce164ab921caaad3b435b51404ee
NTLM:32ed87bdb5fdc5e9cba88547376818d4
SHA1:6ed5833cf35286ebf8662b7b5949f0d742bbec3f
实际明文为:123456
Hashcat破解过程如下:
1 | hashcat -a 0 -m 1000 --force 32ed87bdb5fdc5e9cba88547376818d4 password.txt |
-a 0
字典破解
hashcat –-help 可以看到 LM 和 NTLM 对应的 hash 编号分别为3000
和1000
在线Hash破解
https://www.objectif-securite.ch/ophcrack
Linux Hash
建立一个test用户进行测试,密码test
1 | useradd -m test |
Linux 密码信息保存在两个文件中,分别为: /etc/passwd
和 /etc/shadow
/etc/passwd
普通用户权限能够查看
保存用户信息,每一行代表一个用户,每一行通过冒号:分为七个部分
- 用户名
- 密码,x 表示密码保存在
/etc/shadow
- UID,0 代表 root
- GID,表示所在组
- 描述信息,依次为 Full Name、Room Number、Work Phone、Home Phone 和 Other
- 用户主目录
- 默认 shell 类型
1 | tail -n 1 /etc/passwd |
/etc/shadow
只有 root 用户权限能够查看
保存加密后的密码和用户的相关密码信息,每一行代表一个用户,每一行通过冒号:分为九个部分
- 用户名
- 加密后的密码
- 上次修改密码的时间 (从 1970.1.1 开始的总天数)
- 两次修改密码间隔的最少天数,如果为 0,则没有限制
- 两次修改密码间隔最多的天数, 表示该用户的密码会在多少天后过期,如果为 99999 则没有限制
- 提前多少天警告用户密码将过期
- 在密码过期之后多少天禁用此用户
- 用户过期日期 (从 1970.1.1 开始的总天数),如果为 0,则该用户永久可用
- 保留
1 | tail -n 1 /etc/shadow |
注意:
- 密码字符串为*,表示系统用户不能被登入
- 密码字符串为!,表示用户名被禁用,可以在机器上转到该用户,但无法远程登录
- 密码字符串为空,则表示没有密码
密文由三部分组成:$id$salt$encrypted
,id表示加密算法,salt 表示密码学中的 Salt, 系统随机生成 encrypted 表示密码的 hash
- DES和明文开头无标记
- id为1时,采用md5进行加密;
- id为5时,采用SHA256进行加密;
- id为6时,采用SHA512进行加密。
破解Hash
方式一:John the Ripper
这里使用kali自带的John工具进行破解
使用字典破解
1 | john --wordlist=/usr/share/john/password.lst /etc/shadow |
或直接暴力破解
1 | john /etc/shadow |
结果如下:
方式二:Hashcat
1 | hashcat -m 1800 -o found1.txt /etc/shadow /usr/share/john/password.lst |
参数说明:
-m 1800:hash-type,1800对应SHA512
-o found1.txt:破解结果输出到found1.txt中
/etc/shadow:含要破解密文的文件
/usr/share/john/password.lst:字典文件
结果如图:
3.密码喷洒
Mysql爆破
使用工具–Kali-Hydra
1 | hydra 192.168.100.250 -l wyw -P password.txt mysql -V |
使用工具–Kali-Metasploit
①:use auxiliary/scanner/mysql/mysql_login
②:show options
③:set RHOSTS IP地址
④:set USERNAME 单个账户
⑤:set PASS_FILE 字典路径地址
⑥:set RPORT 端口号
⑦:run
遇到的坑:
3306端口需对外开放
mysql用户允许远程连接数据库
1
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
若出现如下错误,需修改mysql字符集
修改my.ini
1 | character-set-server=utf8 |
类似的,FTP、SSH、Tomcat等也可以利用此工具爆破。
- FTP
msf
1 | use auxiliary/scanner/ftp/ftp_login |
Hydra
1 | hydra 192.168.146.141 -l admin -P /top1500.txt ftp -V |
- SSH
msf
1 | use auxiliary/scanner/ssh/ssh_login |
Hydra
1 | hydra 192.168.146.141 -l root -P /top1500.txt ssh -V |
- Tomcat
msf
1 | use auxiliary/scanner/http/tomcat_mgr_login |
0x03 其他场景
前面描述了针对登录用户和密码的暴力破解,暴力破解是否还可以用在其他场景呢?答案是肯定的,因为涉及人机交互的内容本质还是一个题目验证场景,在以下这些场景中,也有可能遭遇到暴力破解攻击。
图形验证码–同样的使用穷举方法,假设Web应用的登录验证码的范围是一个可衡量的值,攻击者可以使用工具将所有的验证码问题请求及结果保存为合集,并在后续的破解过程中调用这个结果合集;
短信/邮箱验证码–针对四到六位纯数字的短信或邮箱验证码,也可以用暴力破解的方法进行猜解攻击尝试;
关键参数–针对应用中的关键参数的,亦可以用穷举法进行遍历,当存在权限控制不当时,这种遍历方法还能批量获取敏感信息。如枚举订单号后并提交订单查询,在权限控制不当的Web应用中,这会导致批量的用户订单信息泄露。
0x04 防御方法
针对暴力破解攻击,应用的安全设计要多方考量,从每一个可能的受攻击面出发,结合逆向的逻辑思路,建立合理的防御机制。常见的防御措施如下。
1)用户名或密码输入错误时统一返回“登录错误,请重试”提示信息
2)在用户登录时增加验证码,防止通过程序自动枚举账户
3)验证码应具有足够的随机性和干扰性,考虑逻辑和交互式验证码
4)确保所有类型的验证码能够用后即失效,防范可被重用
5)在用户登录中增加对同一IP地址尝试次数的限制
6)系统自身安全性增强:强制要求用户注册时满足口令复杂度要求
7)定期对比数据库存储的密码密文值与top500弱密码的密文值
参考资料
[1] 暴力破解
[3] web渗透—暴力破解
[4] 【技术工场】浅谈暴力破解攻击