密码暴力破解与防御
一般的网络安全指的是网络空间安全,网络空间安全必须在密码学的基础上建立起来:
密码暴力破解的本质
- 连续性的尝试:直至猜中为止
- 使用字典【而不是枚举,枚举的效率低】
- 自动化【而不是手动输入】
密码(password)的作用
- 加密:实现内容的机密性
- 完整性:实现内容的完整性。
- 保证发送的内容不被他人篡改,可采用哈希算法来校验内容的完整性。
- 哈希算法的特点:若原文的内容发生改变(甚至是微小的改变),则编码后的密文发生改变。
- 身份认证(口令):解决身份冒充的问题。
- 实现用户的身份鉴别
密码安全的分类
- 存储安全:属于数据安全层面
- 一般用户的密码存储在数据库中。【一定不能使用明文存储】
- 漏洞利用手段:针对存储安全的攻击,可采用SQL注入等方式连接到数据库,来获取数据库用户、密码,在解密加密后的密码。
- 传输安全:属于狭义的网络安全
- 不能直接传输明文,至少加密后在传输。 -P.S.一般的网络安全指的是网络空间安全
- 漏洞利用手段:针对传输安全的攻击,可采用窃听通信数据、抓包等方式解密加密后的密码。
- 输入安全(登录界面):用户的身份鉴别
- 例如:Web网站的登录界面
- 权限管理:认证、授权
- 漏洞利用手段:直接在登录框中进行密码暴力猜测
不安全密码的类型
- 默认密码:出厂后的密码
- 弱口令:
- 已经泄露的密码
- 默认密码:账号不是用户主动注册的,而是系统自动导入、批量注册。(或系统在初始化时,设置默认密码)或(设备出厂时,设置的默认密码。)或(路由器的默认密码)
- 例如:身份证号后六位、空密码、123456、000000、手机号后六位等
- 某些网站对世界各地、各个品牌的产品设备的默认密码(E.G.路由器、摄像头等)账号、密码进行了收集。
- routerpasswords.com
- datarecovery.com/rd/default-passwords/
- toolmao.com/baiduapp/routerpwd
- 用户为方便记忆,设置的弱口令。
- 下述网址可用于查询全世界各个国家用户最常用的密码:(在各种各样泄露的数据库中统计的使用次数)
- nordpass.com/most-common-passwords-list/
- 脱库的密码(网站中被泄露的密码)
- CSDN-中文IT社区-600万.rar 104MB
- 人人网 500W_16610.rar 49.5MB
- 撞库:【用一个网站的数据库,去尝试登录其他网站】(若用户在注册不同的网站时,都使用相同的密码)。黑客可用某个已经泄露的数据库密码,去尝试其他网站。
- 下述网站可用于查询:目前为止,您注册使用的账号对应的密码是否出现在泄露的数据库中
- haveibeenpwned.com
- 注意:在使用网站进行账号密码的泄露检测时,需要注意寻找大型的正规平台,否则可能出现某某网站打着泄漏检测的幌子,来收集用户的邮箱号或则手机号。
密码生成方式
- 密码生成器:crunch
- Hydra中-x选项
密码猜测范围的确定
- 密码长度:可由网站的注册界面来获取密码长度和内容范围的限制规则
- 密码内容:
- 26个小写字母:a-z
- 26个大写字母:A-Z
- 10个数字:0123456789
- 32个字符:(!@#$%^&*(){}?;....)32+1(空格)
- 密码内容中的一位对应94中可能性【若允许可以使用空格时】
- 理论上:若某网站要求最低的密码长度为6位,且上述所有的密码内容都可以使用。(则每一位的可能性位为94),所以一个最低6位的密码,所有的可能性为96*96*96*96*96*96=96^6=6898 6978 1056
- 理论上,一个最低6位的密码,所有的可能性大约6000亿种可能
字典(wordlist或dictionary)
- 设置字典的目的:为提升暴力破解的概率、减少暴力破解的时间,我们可以将使用频率更高的口令放到一个文档中,此文档则为字典。
- 字典来源:
- 网站下载:
- github.com/TgeaUs/Weak-password
- github.com/fuzz-security/SuperWordlist
- 注意:在使用字典时,需要注意使用场合:例如Web网站密码字典、WiFi密码字典、操作系统用户密码字典、数据库密码字典等多种场合
- 指定生成的字典格式:Kali自带字典生成工具crunch
- crunch用法:
- crunch 最小长度 最大长度 允许的字符内容 选项参数
- 内容:
- 26个小写字母:a-z
- 26个大写字母:A-Z
- 10个数字:0123456789
- 33个字符:32+1(空格)
- 参数:
- -b:指定字典文件输出的大小
- -c:指定字典文件中行数,即包含密码的个数
- -d:限制相同元素出现的次数
- -e:定义停止字符,即到该字符串就停止生成
- -f:调用库文件: /usr/share/crunch/charset.lst方便用户定义列表内容
- -o:将生成的字典文件输出到指定文件中
- -t:指定密码输出的格式
- @ 小写字母 【若写一个@,表明这一位只能生成小写字母】
- , 大写字母
- % 数字
- ^ 字符【33个字符:32+1(空格)】
- -z:压缩生成的字典文件
- -s:指定开始的字符
- 例如:使用crunch生成一个6位数字的验证码,从000000-999999
- 社工字典:
- 用于精准爆破一个用户的信息,利用各种信息收集的手段收集与该用户相关的信息,来生成专用的社工字典
- 针对国外的社工字典:cupp【kali中使用apt安装】
- 针对中国的社工字典:
- 在线社工字典生成网址:bugku.com/mima/
python实现暴力破解
示例:使用python代码猜解密码
一、启动DVWA靶场
1、准备用于爆破的密码字典pass.txt
修改BP中的安全级别
P.S、成功登录与错误登录出现的提示不同
2、获取:发起HTTP请求的地址
Fn + F12:
P.S.所有的值都是固定的值,只有密码字段需要被替换。【用密码字典中读取的值来替换】
3、获取HTTP响应
P.S.如果出现字符串”Username and/or password incorrect.”,则爆破失败,反之则成功。
4、使用python发起HTTP请求:
使用python发起HTTP请求很简单,只需要引入requests模块即可
P.S、cmd/导入requests模块
5、密码字典pass.txt与python密码爆破文件需要放置在同一路径下
P.S.完整python代码如下:
import requests
# 获取密码文件中的密码值
# 打开密码文件pass.txt,将文件中所有的值读取到一个列表中pwds
pwds = open("pass.txt")
# 从列表pwds中逐条读出口令的值pwd
for pwd in pwds:
# print(pwd)
# 路径
url = "http://127.0.0.1/dvwa/vulnerabilities/brute/"
# 参数:用户名、密码、登录的动作、headers请求头
# pwd.strip():对获取到的每一个密码值,去除掉它的前后空格
# headers请求头:需要加入cookie值
# 在发起HTTP请求后,将获取到的响应赋值给resp
resp = requests.get(url=url, params={"username": "admin", "password": pwd.strip(), "Login": "Login"},
headers={"Cookie": "security=low; PHPSESSID=t0ea0t7klshqhjt62p9did6ahs"})
# print(resp.text) 获取响应中的文本值
if 'Username and/or password incorrect.' in resp.text:
print(f"爆破失败:{pwd}")
else:
print(f"爆破成功:{pwd}")
break
# 关闭文件
pwds.close()
P.S.爆破成功
总结如下:
- 从字典文件中读取口令值【用python读取文本文件中的值】
- 发起一个HTTP请求,访问账号/密码登录的后端地址.【HTTP连接到需要爆破的地址】
- 获得HTTP响应,分析响应结果,看是否出现错误提示(例如:welcome、incorrect)【登录只有成功或失败两种结果】
- 若密码猜解失败,则继续下一次循环
- 反之,则退出循环。爆破成功。
BurpSuite实现暴力破解
示例:使用BP对一个简单场景进行密码爆破
【P.S.使用python代码实现密码爆破时,当我们需要对一个地址发起登录请求时,我们需要将这个地址和参数手动填入。】但使用BP工具对一个地址发起登录请求时,不需要将这个地址和参数手动填入。因为我们是通过抓包来获取地址及其参数的,在获得一次HTTP登录请求的数据包后,将此数据包发送到intruder模块,不断利用这个HTTP请求包,重复的发起请求。
一、启动DVWA靶场
P.S.账户:admin
密码:password
1、启动BP,并配置BP中的代理:
【添加一个代理,将浏览器的所有请求发送到BP监听的本机8080端口。】
2、配置浏览器中的代理:
【安装火狐浏览器中的插件:foxyproxy】
P.S.在配置好代理后,如何让浏览器所有的请求全部都发送到BP监听的8080端口?
在浏览器中启用BP代理、在BP中开启拦截浏览器的按钮。
P.S.浏览器中访问目的网页,在BP中即可拦截到一个HTTP请求登录包
3、发送到Intruder模块
【Intruder模块:可对Web应用程序发起自动化攻击。】
P.S.清空原有的所有分节符。
【分节符:用于设置对哪些字段进行攻击】
4、①设置攻击模式、对密码的值添加分节符(进行猜解)
4、②设置Payloads攻击字段
4、③对请求并发线程的设置。
【默认:使用最高10个并发的线程池。】
P.S.目前为止,我们已经对攻击模式的设置(Sniper)、攻击字段(密码字段的值)、字段值的来源(pass.txt字典)、其他设置默认即可,便可以发起一个攻击了。
5、如何从多个请求中,找出唯一正确的密码。
方法一:
对响应的长度(Length)进行排序。
【因为密码正确、密码错误,响应内容不容,内容不一样、长度大概不一样】
验证:查看BP的响应中,是否具有”Welcome to the password protected area admin”字段。若有,则密码猜解成功。
暴力破解防御手段
分别从网站开发者、网站用户的角度,给出降低密码被爆破的风险。
作为网站管理人员:
- sleep:
- 当用户密码输入错误时,延迟返回(使用sleep函数),从而降低单线程爆破的速度。
- 使用CSRF Token:
- 增加一次与服务器之间的通信,且不允许多线程访问。
- 超过密码错误次数上限、锁定账户:
- 限制密码输入错误的尝试的次数,超过后,则自动锁定账户或根据IP锁定对应的客户端。
- 加入二次验证:
- 目的:防止用户发起自动化尝试登录的动作。
- 验证码的类型
- 设备的验证
- 文字或图形的点选、滑动、旋转等
- 人机识别
- 生物特征:人脸/虹膜/指纹识别等
- 行为识别:
- 例如:异地登录
- 购买安全产品:
- 例如:在阿里云上购买一个入侵防御的服务
- 强制用户修改密码:
- 当用户长时间未登录时(可能该密码已被泄露),强制用户修改密码。【一定程度上可能会降低用户体验,但保证了用户账户/密码的安全性】
- 取消密码登录:
- 设置密码的目的:主要为用户身份的识别、用户权限的识别。
- 密码在当今并不是那么安全,所以可采用其他身份识别的方式。
- 取消密码登录的好处:若没有密码,则不存在密码爆破、猜解。
- 例如:通过手机号-验证码、微信扫码登录等。
作为用户:
- 尽量使用复杂密码
- 黑客用于密码爆破的字典,尝试的多为密码使用频率较高、且较为简单的密码。
- 在设置密码时,在密码中最好包括大写字母、特殊符号。
- 不同网站使用不同密码
- 若所有网站都采用同一个密码:存在撞库风险。
- 可使用密码管理器:简化用户对密码的管理
- 例如:LastPass插件
- 定期修改密码
- 防止被钓鱼
其他暴力破解的工具
- 除了用代码、BP实现暴力破解外,还可有其他暴力破解的工具。
- wfuzz:【kali中自带】
- 本质上与使用代码或BP中的intruder模块类似。
- wfuzz是一个HTTP的循环发送工具,可以自动化的发起HTTP的请求,所以可用于帮我们猜解HTTP中URL中的参数、暴力破解web中的密码、目录扫描、压力测试、找出网站过滤的参数等功能。
- 示例:使用kail中自带的wfuzz工具实现密码的暴力破解
1、Kali中访问pikachu靶场
P.S.获取请求登录的地址【Fn + F12】
P.S.因为是POST请求,所以用户名、密码值不放在URL中。所以需要对其参数进行设置
【对pikachu网站进行爆破的参数设置如下:】
-z file:表示用户名的字典、密码字典均采用文件的方式加载
-d:指定payload【因为为post请求,所以需要用-d来指定表单中的参数】
FUZZ:使用FUZZ来占位
FUZ2Z:第二个占位的参数
P.S.用于爆破的用户字典与密码字典如下:
P.S.一共108个请求,可以通过word、chars的长度来寻找正确的爆破
P.S、当存在上万的请求响应时,不便于用肉眼查找,可使用参数过滤。【过滤大部分一样的结果】
【E.G、使用- -hw 1797:过滤单词数为1797的响应 】
--hc:根据响应码过滤
--hl: 根据行数过滤
--hw:根据单词数过滤
--hh:根据字符数过滤
验证:账号、密码猜解成功
- Hydra:【九头蛇】【kali中自带】
- 可支持多种协议的爆破【例如:支持HTTP、HTTPS、数据库MYSQL、Oracle、LDAP、ICQ、邮件协议POP3、SMB、SSH等协议的暴力破解】
- SSH协议:Linux操作系统登录的一种加密协议。
- 参数:
- S:SSL连接
- s:指定端口
- l:用户名字典。-L:指定用户名文件
- p:密码字典。 -P:指定密码文件
- x:密码生成
- 4/6:使用IPv4/IPv6地址
- v:显示爆破的详细信息
- Medusa:【美杜莎】【kali中自带】
- 参数:medusa -h
- M:指定爆破的协议
- h:指定单个主机名或IP
- H:指定主机名或IP文件
- u:用户名。-H:用户名文件
- p:密码。 -P:密码文件
- O:将结果输出到指定文件
- 参数:medusa -h
- msf辅助模块:【kali自带】
- 在msf辅助模块中,也可用于对SSH协议的爆破
- 启动msf:msfconsole
- 使用SSH的登录模块:
- 设置爆破的用户名、密码字典、受害机IP
- 开始攻击:exploit(或run)
验证码识别
- 有的网站为了防止代码、机器进行自动攻击,加入了验证码。
验证码的作用与分类
- 验证码的作用:
- 验证身份:验证是否为用户本人
- 触发二次验证的敏感操作:
- 异地登录、修改密码、注销等操作
- 验证行为:区分当前操作是人类,还是机器人
- 使用代码等手段发起批量自动化的操作
- 触发操作:投票、抢购、爬虫、注册、发帖等
- CAPTCHA:【全自动区分计算机和人类的图灵测试】
- 验证身份:验证是否为用户本人
- 验证码的分类:
- 静态验证码:EG.图片验证码、问答式验证码等
- 行为式验证码:E.G.鼠标的点击、拖动滑块等
- 浏览器:对用户拖动滑块的动作进行了信息的收集(例如:对此接口的访问频率,用户访问此网页的地理位置、浏览器、IP信息,拖动轨迹、拖动速度等)
- 间接式验证码:通过短信、邮电、语音等
- 脱离当前的网页,需要依赖其他的设备、系统(例如短信、邮箱等)。
- 无感验证码【最高级的验证码】
- 用户在使用时,用户并不知道在此操作下隐藏着身份的认证。
- 无感验证仅在存在风险时,出现提示。
- 原理:在用户进行此操作时,默默收集用户行为特征的信息,来对用户进行认证。
验证码的实现原理
- 本地PHP代码开发实现:从PHP代码来分析验证码的实现原理
- 接入第三方服务来实现:
验证码的识别
- OCR【光学字符识别】:用代码来自动识别图片中的内容的技术
- 例如:识别和提取pdf文件中,内容由拍照生成的图片中的文字。
- utools工具:
- 原理:在utools软件中,调用一个远程接口,将图片发送到服务器上进行识别,识别完毕后,将结果响应给客户端。
- OCR识别的组件:esayocr组件【免费、开源】
- github.com/jaidedai/easyocr
BP插件识别验证码爆破
- 在使用BP进行密码暴力破解时,可以安装插件,来自动实现验证码的识别与填入。【在BP中使用插件,集成验证码识别功能,来实现密码爆破】
- 步骤:
- 在BP中安装插件:
- github.com/f0ng/captcha-killer-modified
- 启动本地验证码识别的服务
- cmd/执行python文件codereg.py【来启动验证码识别服务】
- 在BP中抓验证码的包,并发送到插件模块中(右键/Extensions/captcha-killer-modified/captcha-killer/Send to captcha panel)
- 使用BP中自带的浏览器
- 在插件模块中,配置图片识别服务的模板
- 抓到登录的包,开始爆破。
- 将配置好的插件集成到intruder模块
- 在BP中安装插件: