如何在海量的nessus扫描结果中,快速筛选和标记目标IP的漏洞信息

📅 2026/7/2 12:53:47
如何在海量的nessus扫描结果中,快速筛选和标记目标IP的漏洞信息
1. 引言在日常安全运维和漏洞管理工作中我们经常面临这样的挑战Nessus扫描器生成的扫描结果文件通常包含数百甚至数千个IP地址的漏洞信息而我们真正关心的可能只是其中一小部分特定系统的扫描结果。手动从海量数据中筛选目标IP的漏洞信息不仅耗时耗力还容易出错。为了解决这个问题我开发了两个实用的Python工具filter_ip.py- 从Nessus扫描结果中按系统清单筛选特定IP的漏洞信息源代码如下importpandasaspdimportos# Add missing import for path handling# 读取xlsx文件中的IP清单假设IP在第一个工作表的第一列defget_ip_list_from_xlsx(xlsx_path):# Add validation for file existenceifnotos.path.exists(xlsx_path):raiseFileNotFoundError(fExcel file not found:{xlsx_path})dfpd.read_excel(xlsx_path,headerNone)# 假设没有表头# Add basic IP format validationip_listdf[0].dropna().tolist()# Remove empty valuesreturn[ipforipinip_listifisinstance(ip,str)and.inip]# Simple IP check# 读取csv文件并根据IP清单筛选deffilter_csv_by_ips(csv_path,ip_list,output_path):# Add validation for file existenceifnotos.path.exists(csv_path):raiseFileNotFoundError(fCSV file not found:{csv_path})# 读取csv文件假设IP Address是列名dfpd.read_csv(csv_path)# Validate CSV column existsifIP Addressnotindf.columns:raiseValueError(CSV file missing required IP Address column)# 获取CSV中的所有唯一IPcsv_ipsset(df[IP Address].dropna())# 筛选出IP Address在清单中的行filtered_dfdf[df[IP Address].isin(ip_list)]# 保存结果到新的csv文件filtered_df.to_csv(output_path,indexFalse,encodingutf-8-sig)# 修改为带BOM的UTF-8编码print(f筛选完成共找到{len(filtered_df)}条匹配记录已保存到{output_path})# 检查无匹配的IPunmatched_ips[ipforipinip_listifipnotincsv_ips]ifunmatched_ips:unmatched_output_pathos.path.join(os.path.dirname(output_path),无匹配结果IP.xlsx)pd.DataFrame(unmatched_ips,columns[无匹配IP]).to_excel(unmatched_output_path,indexFalse)print(f发现{len(unmatched_ips)}个IP在源CSV中无匹配已保存到{unmatched_output_path})else:print(所有IP均在源CSV中找到匹配)if__name____main__:# Use absolute paths or handle working directorybase_diros.path.dirname(os.path.abspath(__file__))# Get script directoryxlsx_fileos.path.join(base_dir,ip_list.xlsx)# 包含IP清单的xlsx文件csv_fileos.path.join(base_dir,source.csv)# 原始csv文件output_fileos.path.join(base_dir,主机扫描结果.csv)# 输出文件# Add file overwrite protectionifos.path.exists(output_file):raiseFileExistsError(fOutput file already exists:{output_file})# 获取IP清单ip_listget_ip_list_from_xlsx(xlsx_file)# 筛选并保存结果filter_csv_by_ips(csv_file,ip_list,output_file)vulMark.py- 在主机扫描清单中标记各IP的漏洞严重等级源代码如下importpandasaspdimportosdefprocess_vulnerability_marks(excel_path,csv_path):# 验证文件存在性ifnotos.path.exists(excel_path):raiseFileNotFoundError(fExcel文件未找到:{excel_path})ifnotos.path.exists(csv_path):raiseFileNotFoundError(fCSV文件未找到:{csv_path})# 读取主机扫描清单 (保留原始数据以便写回)excel_dfpd.read_excel(excel_path)# 验证必要列是否存在ifIP地址notinexcel_df.columns:raiseValueError(Excel文件缺少IP地址列)if漏洞情况notinexcel_df.columns:excel_df[漏洞情况]# 如果不存在则创建该列# 确保漏洞情况列为字符串类型避免 dtype 不兼容问题excel_df[漏洞情况]excel_df[漏洞情况].astype(str)# 读取source.csv并按IP分组处理漏洞等级csv_dfpd.read_csv(csv_path)ifIP Addressnotincsv_df.columnsorSeveritynotincsv_df.columns:raiseValueError(CSV文件缺少必要的IP Address或Severity列)# 按IP分组并收集去重的漏洞等级ip_severity_map{}forip,groupincsv_df.groupby(IP Address):# 提取唯一的漏洞等级并按CriticalHighMediumLow排序severitiessorted(group[Severity].dropna().unique(),keylambdax:[Critical,High,Medium,Low].index(x))ip_severity_map[ip],.join(severities)# 遍历Excel中的IP地址进行匹配forindex,rowinexcel_df.iterrows():iprow[IP地址]ifpd.isna(ip):excel_df.at[index,漏洞情况]IP地址为空continueifipinip_severity_map:excel_df.at[index,漏洞情况]ip_severity_map[ip]else:excel_df.at[index,漏洞情况]无匹配结果# 保存更新后的Excel文件excel_df.to_excel(excel_path,indexFalse)print(主机扫描清单.xlsx处理完成)# 修改为指定输出信息# 主程序执行if__name____main__:# 配置文件路径 - 使用绝对路径确保文件能被找到excel_filec:/Users/CTL-NBC-0077/Documents/Project/test/ScanFilter/主机扫描清单.xlsxcsv_filec:/Users/CTL-NBC-0077/Documents/Project/test/ScanFilter/source.csvtry:process_vulnerability_marks(excel_file,csv_file)exceptExceptionase:print(f处理过程中出错:{str(e)})2. 工具一filter_ip.py - IP筛选工具2.1 功能概述filter_ip.py的主要功能是从Nessus扫描结果文件中按照指定的系统IP清单筛选出目标IP的漏洞扫描结果并输出为独立的CSV文件。2.2 配置文件说明使用前需要修改代码中的三个文件路径# 1. IP清单文件路径xlsx_fileos.path.join(base_dir,ip_list.xlsx)# 说明将需要筛选的IP地址粘贴到该Excel文件的第一列无需表头# 2. Nessus原始扫描结果文件路径csv_fileos.path.join(base_dir,source.csv)# 说明source.csv的IP列名默认为IP Address可根据实际情况修改代码# 3. 输出文件路径output_fileos.path.join(base_dir,主机扫描结果.csv)# 说明生成的筛选结果文件可自定义文件名2.3 使用步骤准备IP清单创建Excel文件ip_list.xlsx将需要筛选的IP地址粘贴到第一列A列注意不要添加表头直接从A1单元格开始粘贴IP准备扫描结果确保Nessus扫描结果已导出为CSV格式文件名为source.csv确认CSV文件中IP地址列的列名为IP Address运行脚本python filter_ip.py2.4 输出结果成功匹配生成主机扫描结果.csv文件包含所有目标IP的漏洞信息部分匹配失败生成无匹配结果IP.xlsx文件列出在source.csv中未找到的IP地址全部匹配成功控制台输出所有IP均在源CSV中找到匹配2.5 友好特性输出的CSV文件使用utf-8-sig编码确保中文正常显示提供清晰的反馈信息便于问题排查3. 工具二vulMark.py - 漏洞标记工具3.1 功能概述vulMark.py用于读取主机扫描清单到Nessus扫描结果中查询每个IP地址的漏洞情况并在清单中标记出’Critical’、‘High’、‘Medium’、Low’等级别的漏洞存在情况。3.2 配置文件说明使用绝对路径确保文件能被正确找到# 1. 主机扫描清单文件路径使用绝对路径excel_filec:/Users/..../ScanFilter/主机扫描清单.xlsx# 说明要标记的主机清单文件绝对路径# 2. Nessus原始扫描结果文件路径csv_filec:/Users/....../ScanFilter/source.csv# 说明nessus原始扫描结果文件绝对路径3.3 准备工作在使用vulMark.py之前需要预处理主机扫描清单添加漏洞情况列在Excel文件中添加一列列名为漏洞情况确认IP列名称确保IP地址列的列名为IP地址文件结构示例| IP地址 | 主机名 | 系统类型 | 漏洞情况 | |------------|--------|----------|----------| | 192.168.1.1 | server1 | Linux | | | 192.168.1.2 | server2 | Windows | |3.4 运行脚本python vulMark.py3.5 标记规则脚本会按照以下规则在漏洞情况列中进行标记查询到漏洞按最高严重等级标记如“Critical, High”如果存在多个等级用逗号分隔查询不到漏洞标记为无匹配结果IP不存在于扫描结果同样标记为无匹配结果4. 实际应用场景4.1 场景一按系统类型筛选漏洞当需要针对特定系统类型如Web服务器、数据库服务器进行漏洞分析时从资产清单中提取该类型系统的所有IP使用filter_ip.py筛选出这些IP的漏洞信息生成专门的漏洞报告4.2 场景二漏洞修复优先级排序安全团队需要确定漏洞修复的优先级使用vulMark.py标记所有主机的漏洞严重等级按漏洞情况列排序优先处理标记为Critical的主机制定分阶段的修复计划4.3 场景三定期漏洞监控建立自动化漏洞监控流程每周运行Nessus扫描使用filter_ip.py筛选关键系统的扫描结果使用vulMark.py更新主机漏洞状态生成周度漏洞报告5. 工具优势与特点5.1 效率提升手动筛选100个IP的漏洞信息可能需要数小时使用工具可在几分钟内完成相同工作减少人为错误提高准确性5.2 灵活性支持自定义输入输出文件路径可适应不同的文件命名规范输出格式友好便于后续处理5.3 易用性清晰的配置说明友好的错误提示和反馈中文支持良好6. 注意事项与最佳实践6.1 文件编码确保所有CSV文件使用UTF-8编码如有中文乱码问题可调整编码参数6.2 数据一致性定期验证IP清单的准确性确保Nessus扫描结果是最新的建立文件命名和存储规范6.3 错误处理运行前备份原始文件检查日志输出及时处理错误对于大量IP处理建议分批进行7. 总结通过filter_ip.py和vulMark.py这两个工具安全运维人员可以快速筛选目标IP的漏洞信息提高工作效率智能标记漏洞严重等级便于优先级排序标准化漏洞管理流程减少人为错误自动化重复性工作释放人力资源这两个工具特别适合需要频繁处理Nessus扫描结果的安全团队、系统管理员和合规审计人员。通过简单的配置和运行即可获得精准的漏洞分析结果为安全决策提供有力支持。8. 后续优化方向未来可以考虑以下功能增强支持批量处理多个系统清单添加图形化界面(GUI)集成到漏洞管理平台增加邮件通知功能支持更多扫描器格式如OpenVAS、Nexpose等使用提示建议将这两个脚本放在专门的工具目录中建立标准化的操作流程文档并定期对脚本进行维护和更新以适应不断变化的安全需求。