You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

76 lines
3.1 KiB

import os
import shlex
import re
from collections import OrderedDict
from tools.ToolBase import ToolBase
class HydraTool(ToolBase):
def validate_instruction(self, instruction):
timeout = 0
current_path = os.path.dirname(os.path.realpath(__file__))
#hydra过滤 需要判断指令中添加字典文件存不存在
match_p = re.search(r'-P\s+([^\s]+)', instruction)
match_l = re.search(r'-L\s+([^\s]+)', instruction)
if match_p:
str_p = match_p.group(1)
#判断文件是否存在
#if not os.path.exists(str_p): #文件不存在要替换
new_pass_path = os.path.join(current_path, "../payload", "passwords")
instruction = instruction.replace(str_p,new_pass_path)
if match_l:
str_l = match_l.group(1)
#判断文件是否存在
#if not os.path.exists(str_l):
new_user_path = os.path.join(current_path, "../payload", "users")
instruction = instruction.replace(str_l, new_user_path)
#不是双字典的情况加-f
if "-l" in instruction or "-p" in instruction:
if "-f" not in instruction:
instruction = instruction.strip() + " -f" #当是单密码,或单用户名时,使用成功即停止模式
#取消-v -V
instruction = instruction.replace(" -V "," ")
instruction = instruction.replace(" -v "," ")
instruction = instruction.replace(" -vV","")
#加-o 存在个不确定项是:若没有匹配到,输出文件里面是只有一行执行的命令,没有结果描述
if " -o" not in instruction:
instruction = instruction + " -o hydra_result.txt"
# # 加 -q
# if " -q" not in instruction:
# instruction = instruction + " -q"
return instruction,timeout
def merge_info(self,result):
try:
# 按行分割输出,保留非空行
lines = [line.strip() for line in result.splitlines() if line.strip() != ""]
# 使用有序字典统计相同行的出现次数,保持原始顺序
counts = OrderedDict()
for line in lines:
if line in counts:
counts[line] += 1
else:
counts[line] = 1
# 生成整合后的输出,重复的行后面跟上*次数标记
output_lines = []
for line, count in counts.items():
if count > 1:
output_lines.append(f"{line} *{count}")
else:
output_lines.append(line)
consolidated = "\n".join(output_lines)
return consolidated
except Exception as e:
return result
def analyze_result(self, result,instruction,stderr,stdout):
#返回结果
# result = self.merge_info(result)
# print(result)
#加文件后缀了
lines = result.splitlines()
if len(lines) == 1:
result = "没有匹配到成功的结果"
return result