密码暴力破解与防御---基础阶段

密码暴力破解与防御

一般的网络安全指的是网络空间安全,网络空间安全必须在密码学的基础上建立起来:

密码暴力破解的本质

  1. 连续性的尝试:直至猜中为止
  2. 使用字典【而不是枚举,枚举的效率低】
  3. 自动化【而不是手动输入】

密码(password)的作用

  • 加密:实现内容的机密性
  • 完整性:实现内容的完整性。
    • 保证发送的内容不被他人篡改,可采用哈希算法来校验内容的完整性。
    • 哈希算法的特点:若原文的内容发生改变(甚至是微小的改变),则编码后的密文发生改变。
  • 身份认证(口令):解决身份冒充的问题。
    • 实现用户的身份鉴别

密码安全的分类

  • 存储安全:属于数据安全层面
    • 一般用户的密码存储在数据库中。【一定不能使用明文存储】
    • 漏洞利用手段:针对存储安全的攻击,可采用SQL注入等方式连接到数据库,来获取数据库用户、密码,在解密加密后的密码。
  • 传输安全:属于狭义的网络安全
    • 不能直接传输明文,至少加密后在传输。 -P.S.一般的网络安全指的是网络空间安全
    • 漏洞利用手段:针对传输安全的攻击,可采用窃听通信数据、抓包等方式解密加密后的密码。
  • 输入安全(登录界面):用户的身份鉴别
    • 例如:Web网站的登录界面
    • 权限管理:认证、授权
    • 漏洞利用手段:直接在登录框中进行密码暴力猜测

不安全密码的类型

  • 默认密码:出厂后的密码
  • 弱口令:
  • 已经泄露的密码
  1. 默认密码:账号不是用户主动注册的,而是系统自动导入、批量注册。(或系统在初始化时,设置默认密码)或(设备出厂时,设置的默认密码。)或(路由器的默认密码)
    • 例如:身份证号后六位、空密码、123456、000000、手机号后六位等
  2. 某些网站对世界各地、各个品牌的产品设备的默认密码(E.G.路由器、摄像头等)账号、密码进行了收集。
    • routerpasswords.com
    • datarecovery.com/rd/default-passwords/
    • toolmao.com/baiduapp/routerpwd
  3. 用户为方便记忆,设置的弱口令。
    • 下述网址可用于查询全世界各个国家用户最常用的密码:(在各种各样泄露的数据库中统计的使用次数)
    • nordpass.com/most-common-passwords-list/
  4. 脱库的密码(网站中被泄露的密码)
    • 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 最小长度 最大长度 允许的字符内容 选项参数
    • 内容:
      1. 26个小写字母:a-z
      2. 26个大写字母:A-Z
      3. 10个数字:0123456789
      4. 33个字符:32+1(空格)
    • 参数:
      1. -b:指定字典文件输出的大小
      2. -c:指定字典文件中行数,即包含密码的个数
      3. -d:限制相同元素出现的次数
      4. -e:定义停止字符,即到该字符串就停止生成
      5. -f:调用库文件: /usr/share/crunch/charset.lst方便用户定义列表内容
      6. -o:将生成的字典文件输出到指定文件中
      7. -t:指定密码输出的格式
        • @ 小写字母 【若写一个@,表明这一位只能生成小写字母】
        • , 大写字母
        • % 数字
        • ^ 字符【33个字符:32+1(空格)】
      8. -z:压缩生成的字典文件
      9. -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:将结果输出到指定文件
  • 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模块
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值