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.

87 lines
3.9 KiB

2 months ago
# Nikto工具类
import re
from tools.ToolBase import ToolBase
class NiktoTool(ToolBase):
def validate_instruction(self, instruction):
'''
检查指令,过滤规则----暂时屏蔽一些高性能参数
1.-ssl 强制启用 SSL/TLS 连接扫描若目标服务器未优化加密处理可能导致资源消耗过大
:param instruction:
:return:
'''
timeout = 60*30 #30分钟
2 months ago
# 使用正则表达式匹配 -ssl 参数及其相邻的空格
cleaned_command = re.sub(r'\s+-ssl\b|\b-ssl\b', '', instruction, flags=re.IGNORECASE)
# 处理可能残留的多余空格
command = re.sub(r'\s+', ' ', cleaned_command).strip()
command = command.replace("-p80","-p 80")
#添加输出文件
if "-output" not in instruction:
instruction += " -output nikto_out.txt"
return command,timeout
2 months ago
def analyze_result(self, result,instruction,stderr,stdout):
# 检查结果
if stderr:
result = stderr
# else:
# result = self.parse_nikto_full_info(result)
return result
def parse_nikto_full_info(self,nikto_output: str) -> dict:
"""
Nikto 扫描结果中提取尽可能多的漏洞信息和对后续渗透测试有用的信息
解析思路
1. 通过正则表达式提取以+开头的行Nikto 输出通常以+开头
2. 针对常见漏洞格式 OSVDB-xxxx进行匹配
3. 针对可能包含vulnerabilitywarningpotential等关键字的行进行提取
4. 针对配置或其他信息 "Allowed HTTP Methods", "Cookie", "Directory indexing" 也进行匹配
5. 对于未知格式尽量保留原始提示以供后续人工分析
返回的字典包含以下键
- vulnerabilities: 漏洞相关信息 OSVDB 编号潜在漏洞提示等
- configuration_issues: 与服务器配置HTTP 方法Cookie安全策略等相关的提示
- misc_info: 其他可能对渗透测试有帮助的信息
- error: 如解析过程中发生异常则记录异常信息
"""
result = {
"vulnerabilities": [],
"configuration_issues": [],
"misc_info": []
}
try:
# 获取所有以 + 开头的行
plus_lines = re.findall(r'^\+\s*(.+)$', nikto_output, re.MULTILINE)
# 定义一些常见关键词,出现这些关键词的行我们认为是漏洞或安全问题
vuln_keywords = [
"OSVDB", "vulnerab", "potential", "insecure", "misconfig", "expos",
"Directory indexing", "Outdated", "Deprecated", "SSL", "Cookie", "error"
]
config_keywords = [
"Allowed HTTP Methods", "Server:", "Banner", "HTTP Options", "Headers", "trace", "PUT", "DELETE"
]
for line in plus_lines:
# 先将行统一为小写做匹配,但保留原始行内容
low_line = line.lower()
# 判断是否属于漏洞信息
if re.search(r'osvdb-\d+', line):
result["vulnerabilities"].append(line.strip())
elif any(kw.lower() in low_line for kw in vuln_keywords):
result["vulnerabilities"].append(line.strip())
# 判断是否属于配置问题(例如HTTP方法、Cookie安全、服务器banner异常等)
elif any(kw.lower() in low_line for kw in config_keywords):
result["configuration_issues"].append(line.strip())
else:
# 其他信息,可能对后续渗透测试有启示
result["misc_info"].append(line.strip())
except Exception as e:
result["error"] = f"解析过程中出现异常: {str(e)}"
2 months ago
return result