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
87 lines
3.9 KiB
# 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分钟
|
|
# 使用正则表达式匹配 -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
|
|
|
|
|
|
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. 针对可能包含“vulnerability”、“warning”、“potential”等关键字的行进行提取。
|
|
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)}"
|
|
|
|
return result
|