暴力破解(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(撞库)
攻击者可以使用受害者历史上泄露的数据获得凭据,通过凭据重叠来访问目标帐户。
Login.html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Logintitle>
head>
<body>
<h1>随便登录h1>
<form action="checkLogin.php" method="post">
Username: <input type="text" name="username"/>
Password: <input type="password" name="password"/>
<input type="submit" value="Submit">
form>
body>
html>
checkLogin.php
$username=$_POST['username'];
$password=$_POST['password'];
if($username=="root" && $password=='root'){
echo "Success!";
}else{
echo "Fail!";
}
?>
以上代码为一个简单的表单提交到后台,判断账号,密码都为root则登陆成功。
接下来burpsuite抓包使用Intruder模块进行爆破,通过对比数据包的长度可以很好的判断是否爆破成功,因为爆破成功和失败的长度是不一样的。
在数据包中选定欲爆破的参数
设置爆破的字典
根据响应的数据包的长度可以判断出正确的账号、密码。
PS:进阶技巧
(1)默认凭证
在对某一服务进行暴力破解之前,我们首先应该尝试该服务的默认口令,这样也许可以节约大量的时间和工作量。通过搜索引擎等方式可以获取到不同服务的默认口令,以下是一些默认口令的合集。
通过对这些默认口令的分析不难发现,很多都是以admin
、root
、administrator
、password
等字样出现,而如果不更改掉默认口令,攻击者往往就能以此轻松突破。
(2)好用的字典
爆破的字典选什么是一个技巧,并非越全越好,这里整理了一些好用的字典仓库(感谢众大佬的分享),仅供参考。
(3)自定义字典
如果前期已经通过社工等方式搜集到目标有关信息,也许根据目标生成的专属字典能增加破解效率。
使用到的工具:pydictor—— 一个强大实用的黑客暴力破解字典建立工具
详细使用方法可以参考其用法示例
在通过一定方式获得密码哈希后,进一步要做的就是将其破解了。
何为hash?Hash 一般翻译为“散列”,也可直接音译为“哈希”的。这个加密函数对一个任意长度的字符串数据进行一次加密函数运算,然后返回一个固定长度的字符串。Hash 主要用于信息安全领域中加密算法,渗透测试中获取目标系统的明文或 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破解过程如下:
hashcat -a 0 -m 1000 --force 32ed87bdb5fdc5e9cba88547376818d4 password.txt
-a 0
字典破解
hashcat –-help 可以看到 LM 和 NTLM 对应的 hash 编号分别为3000
和1000
在线Hash破解
https://www.cmd5.com/
https://www.objectif-securite.ch/ophcrack
建立一个test用户进行测试,密码test
useradd -m test
passwd test
Linux 密码信息保存在两个文件中,分别为: /etc/passwd
和 /etc/shadow
/etc/passwd
普通用户权限能够查看
保存用户信息,每一行代表一个用户,每一行通过冒号:分为七个部分
/etc/shadow
# tail -n 1 /etc/passwd
test:x:1001:1001::/home/test:/bin/sh
/etc/shadow
只有 root 用户权限能够查看
保存加密后的密码和用户的相关密码信息,每一行代表一个用户,每一行通过冒号:分为九个部分
# tail -n 1 /etc/shadow
test:$6$7uNh9hzdvpT3BRuB$ndF3AH.faJPvlgA.d57JOmFTLeQEuzgVFc.sYfI5VZDkOC6D78x9at.d8eTqRuTJsqjd6uboKmmYp75wbqE1e/:18825:0:99999:7:::
注意:
密文由三部分组成:$id$salt$encrypted
,id表示加密算法,salt 表示密码学中的 Salt, 系统随机生成 encrypted 表示密码的 hash
破解Hash
方式一:John the Ripper
这里使用kali自带的John工具进行破解
使用字典破解
john --wordlist=/usr/share/john/password.lst /etc/shadow
或直接暴力破解
john /etc/shadow
结果如下:
方式二:Hashcat
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:字典文件
结果如图:
Mysql爆破
使用工具–Kali-Hydra
hydra 192.168.100.250 -l wyw -P password.txt mysql -V
#hydra IP地址 -l 单个账户名 -P 字典路径 服务名 -V
使用工具–Kali-Metasploit
①:use auxiliary/scanner/mysql/mysql_login
②:show options
③:set RHOSTS IP地址
④:set USERNAME 单个账户
⑤:set PASS_FILE 字典路径地址
⑥:set RPORT 端口号
⑦:run
遇到的坑:
3306端口需对外开放
mysql用户允许远程连接数据库
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
若出现如下错误,需修改mysql字符集
修改my.ini
character-set-server=utf8
类似的,FTP、SSH、Tomcat等也可以利用此工具爆破。
msf
use auxiliary/scanner/ftp/ftp_login
Hydra
hydra 192.168.146.141 -l admin -P /top1500.txt ftp -V
msf
use auxiliary/scanner/ssh/ssh_login
Hydra
hydra 192.168.146.141 -l root -P /top1500.txt ssh -V
msf
use auxiliary/scanner/http/tomcat_mgr_login
前面描述了针对登录用户和密码的暴力破解,暴力破解是否还可以用在其他场景呢?答案是肯定的,因为涉及人机交互的内容本质还是一个题目验证场景,在以下这些场景中,也有可能遭遇到暴力破解攻击。
图形验证码–同样的使用穷举方法,假设Web应用的登录验证码的范围是一个可衡量的值,攻击者可以使用工具将所有的验证码问题请求及结果保存为合集,并在后续的破解过程中调用这个结果合集;
短信/邮箱验证码–针对四到六位纯数字的短信或邮箱验证码,也可以用暴力破解的方法进行猜解攻击尝试;
关键参数–针对应用中的关键参数的,亦可以用穷举法进行遍历,当存在权限控制不当时,这种遍历方法还能批量获取敏感信息。如枚举订单号后并提交订单查询,在权限控制不当的Web应用中,这会导致批量的用户订单信息泄露。
针对暴力破解攻击,应用的安全设计要多方考量,从每一个可能的受攻击面出发,结合逆向的逻辑思路,建立合理的防御机制。常见的防御措施如下。
1)用户名或密码输入错误时统一返回“登录错误,请重试”提示信息
2)在用户登录时增加验证码,防止通过程序自动枚举账户
3)验证码应具有足够的随机性和干扰性,考虑逻辑和交互式验证码
4)确保所有类型的验证码能够用后即失效,防范可被重用
5)在用户登录中增加对同一IP地址尝试次数的限制
6)系统自身安全性增强:强制要求用户注册时满足口令复杂度要求
7)定期对比数据库存储的密码密文值与top500弱密码的密文值
[1] 暴力破解
[2] Windows 用户密码的加密方法与破解
[3] web渗透—暴力破解
[4] 【技术工场】浅谈暴力破解攻击
[5] 暴力破解方法汇总——远程服务爆破篇
[6] Linux 下的密码 Hash破解方法