渗透测试:密码破解总结

0x00 前言

一次渗透测试的过程总会涉及到”密码”与”加解密”.在测试的过程中,对弱口令的尝试是必不可少的过程。

0x01 整理一份优秀的字典

想破解密码,要求我们已经”拥有”别人的密码.要整理一份优秀的字典,可以参考各大网站泄漏数据库,将密码(明文)字段收集后,依出现频率先后生成字典.

这里使用一个对已知的字典文件根据使用频率排序并输出的python脚本:

#!/bin/bash/python
#+------------------------------+
#@Author:Joy_nick
#@Blog:http://byd.dropsec.xyz/
#+------------------------------+
import sys
from collections import Counter

file = open(sys.argv[1], 'r')
readlist = []
count_times = []
for line in file.readlines():
    line = line.strip('\r\n ')
    readlist.append(line)
sortlist = Counter(readlist).most_common()
for line in sortlist:
    print line[0]

示例:

0x02 一手称心如意的工具集

欲善其事,须利其器.密码枚举工具举一些例子:

  • Hydra :各种服务账户密码猜解
  • Medusa : 类似Hydra
  • Patator : Python多协议,全能暴力破解,模块化设计测试工具
  • Hashcat : GPU哈希破解
  • BurpSuite : 多线程密码枚举
  • Rcracki : 彩虹表哈希破解
  • Ophcrack : 离线LMHash/NTHash破解
  • Fcrackzip/Truecrack等特定文件密码破解工具
  • Metasploit : 各种辅助测试脚本
  • Cupp.py : 社工字典生成

0x03 绕过检测

Web层有WAF,Service有IDS/IPS,在测试的时候很容易被发现。在测试前,先通过扫描等方式判断是否有相应的防护,并采取相应手段.Web层可能有验证码,可能有每秒IP连接数限制,可能通过Cookie/Header等信息判断行为.在通过一系列测试后,(如何测试还是要自己探索的),采用最合理的针对方式绕过或尽量避免被检测而拦截枚举账户密码。

0x04 Web账户枚举

Web账户枚举是平日遇到较多的情况

  • 没有做严谨的验证码等防护.
  • 发现别人留下的backdoor.
  • 撞库扫号.

常见的绕过验证的可能:

  • 页面无需刷新验证码无限次使用
  • 密码输入错误数次弹出验证码,但更换账号不会出现验证码
  • 修改Cookie或User-Agent伪装逃避验证码
  • 可批量轮询使用代理ip枚举绕过

在Web枚举中,使用BurpSuite基本可以解决所有常见问题.

开启代理,打开Intercept,登陆网页,输入用户密码,数据包拦截下来,选择Send to Intruder,进入攻击模块.

其中四种模式:

Sniper:只有一个payload,会将payload分别放在每个Fuzz点测试,默认选项,这也是新手发现Payload只能选择1的原因.

Battering Ram:只有一个payload,会将payload同时放在多个Fuzz点测试.

Pitchfork:多个payload,会将多个payload同一行同时放到相应Fuzz点测试.(适用扫号)

Cluster Bomb:多个payload,payload在其Fuzz点循环测试,直到尝试所有可能.(适用多账户枚举密码)

选择好相应模式后,设置payload为runtime file,挂载字典文件.取消Payload Encoding.

如果发现网页有将用户的本地将密码计算MD5后提交,则需要在Payload Processing中添加计算MD5的过程.

设置好后也可添加正则匹配结果等等.之后可以Start attack了.

这个过程中,如果担心IP地址暴露,可以选择加入一个client-ip这个payload来代理ip。

0x05 HTTP基础认证

抓包可以看到,以默认用户名admin,默认密码admin登陆路由,HTTP Header多的部分像是这样:

Authorization: Basic YWRtaW46YWRtaW4=

Base64解密即为admin:admin.针对基础认证密码破解,依旧可以使用,但需要对用户名密码先做处理即先base64编码下,一个demo脚本如下:

#!/usr/bin/python
#+------------------------------+
#@Author:Joy_nick
#@Blog:http://byd.dropsec.xyz/
#+------------------------------+
import os.path,sys,base64

userfile = raw_input("input usr file:")
passfile = raw_input("input pwd file:")
outputfile = raw_input("input out file:")
outputfile = open(outputfile, "w")
userInfile = open(userfile)
passInfile = open(passfile)
userLines = userInfile.readlines()
passLines = passInfile.readlines()

for userLine in userLines:
    for passLine in passLines:
        combinedLine = userLine.strip() + ':' + passLine.strip()
        print combinedLine
        outputfile.write(base64.b64encode(combinedLine) + '\n')
userInfile.close()
passInfile.close()
outputfile.close()

生成字典后以Burp爆破即可.

也可以使用Hydra

hydra -L user.txt -P pass.txt -F http://demourl:2048/auth
其中-L和-P大写均为挂载字典,-F表示全局一旦发现合法用户密码即停止破解,亦可加入-t参数指定线程数.

0x06 服务密码破解

常见服务如FTP/SSH/TELNET/POP3/1433等的破解枚举.

  • FTP

    hydra -L user.txt -P pass.txt -F ftp://127.0.0.1:21
    
  • SSH

    hydra -L user.txt -P pass.txt -F ssh://127.0.0.1:22
    
    patator ssh_login host=127.0.0.1 user=root password=FILE0 0=pass.txt -x ignore:mesg='Authentication failed.'
    
  • SMB

    hydra -L user.txt -P pass.txt -F smb://127.0.0.1
    
  • MSSQL

    hydra -L user.txt -P pass.txt -F mssql://127.0.0.1:1433
    

0x07 社工字典生成

以cupp.py工具为例,创建新字典使用:

python cupp.py -i

用法: cupp.py [选项]

h 帮助
i 交互式填写用户密码等相关信息
w 配置现有的字典文件
l 从库中下载
a 直接使用Alecto数据库的默认用户名和密码
v 版本信息

在填写相关信息后生成字典,然后就可以枚举了。

0x08 哈希破解

普通哈希可以使用Ophcrack破解,官网给出了对应的彩虹表下载,当然,也可以直接查询.

http://www.objectif-securite.ch/en/ophcrack.php

需要破解其他不常见密码哈希(借助已有web破解服务无法解决),暂时便只有三个相对高效的方法:

  • 分布式
  • GPU
  • 彩虹表 (没硬盘的就别想了)

而如果我们在知道密码的一定规则后,亦可按照规则破解密码.

hashcat -m1800 -a3 hashdumpedfile --pw-min=7 --pw-max=11  "hahaha?l?l?l?l"

具体的hashcat密码破解详情请参考:HashCat使用手册

0x09 文件密码

对于zip文件,由于加密方式没有rar强势,故被解密的可能性很大,一个kali下的破解工具命令如下:

fcrackzip -b -v -c a -l 1-4 -u 1.zip

-b指定暴力破解,-v显示详细信息,-c a指定密码为纯字母,-l 1-4指定密码长度位1-4位,-u指使用可能的密码进行解压缩测试(加上,否则会出现很多干扰密码)

具体的其他语法请参考:fcrackzip语法示例

大爷,赏个铜板呗!