Nmap+Fofa 一体化信息搜集工具打造

Nmap+Fofa 一体化信息搜集工具打造

从零打造Nmap+Fofa一体化信息搜集工具:支持C段扫描、存活提取、域名解析

引言

在渗透测试、网络运维或信息搜集场景中,Nmap是端口扫描与主机探测的核心工具,而Fofa作为网络空间搜索引擎,能快速获取目标的公开网络资产信息。但实际使用中,我们常面临这些痛点:手动执行Nmap命令后需单独过滤存活主机、Fofa查询结果字段错位、域名查询无法直接获取对应IP、配置繁琐且容易出错。

基于此,本文将分享一款由本人在日常网络安全渗透中自研的Nmap+Fofa一体化信息搜集工具的开发与使用过程。该工具整合了Nmap的C段扫描能力与Fofa API的资产查询能力,支持自动提取存活主机、域名自动解析IP、结果规范输出等核心功能,彻底解决手动操作的低效问题,适用于渗透测试前期信息搜集、网络资产盘点等场景。

一、工具核心功能

这款工具的核心目标是「简化操作、整合能力、规范输出」,主要功能如下:

  1. Nmap扫描模块

    • 支持17种常用扫描类型(存活探测、快速扫描、全端口扫描、系统探测等)

    • 固定生成 Discovery.gnmap 扫描文件,自动执行 grep+cut 命令提取存活主机(生成 liveHosts.txt

    • 支持C段/单个IP扫描,结果自动保存至 scan_results 目录

    • 跨平台兼容:Linux/Mac默认调用系统命令,Windows自动使用Python兜底逻辑

  2. Fofa API查询模块

    • 支持纯IP、域名、Fofa原生语法(如 title="后台" && port=8080)查询

    • 域名自动解析为IP,解决Fofa返回域名无对应IP的问题

    • 字段自动对齐:修复IP/端口/协议错位问题,自动映射常见端口协议(80→tcp、123→udp)

    • 结果以表格形式展示,同时保存为文本文件,方便后续分析

  3. 通用增强功能

    • 详细的命令行帮助提示,新手友好

    • 自动创建输出目录,无需手动维护

    • 完善的异常处理(配置错误、文件缺失、网络异常等)

    • 结果去重、过长内容截断,保证输出整洁

二、环境准备

2.1 依赖软件

  • Python 3.8+(推荐3.10版本)

  • Nmap 7.90+(需配置环境变量,确保终端可直接执行 nmap 命令)

  • 网络环境:能访问互联网(Fofa API查询需联网)

2.2 依赖Python库

工具依赖的Python库已整理至 requirements.txt,内容如下:

Plain 复制代码
python-nmap==0.7.1
requests==2.31.0
configparser==5.3.0
prettytable==3.9.0
argparse==1.4.0

2.3 Fofa API准备

  1. 注册并登录 Fofa平台

  2. 进入「个人中心」→「API信息」,获取 emailapi_key(需实名认证才能使用API)

三、工具安装与配置

3.1 代码下载

(可将工具代码上传至GitHub/Gitee,此处提供下载链接)

Bash 复制代码
# 克隆代码仓库(示例)
git clone https://github.com/lxw1973/nmap-fofa-info-gather
cd nmap-fofa-tool

3.2 依赖安装

在工具根目录执行以下命令,安装所需Python库:

Bash 复制代码
# 创建虚拟环境(可选,推荐)
python -m venv .venv
# 激活虚拟环境(Windows:.venv\Scripts\activate;Mac/Linux:source .venv/bin/activate)
source .venv/bin/activate
# 安装依赖
pip install -r requirements.txt

3.3 配置Fofa API

工具首次运行会自动生成 config.ini 配置文件,需手动配置Fofa信息,或通过命令行快速配置:

Bash 复制代码
# 配置Fofa email
python main.py --config fofa.email 你的Fofa注册邮箱
# 配置Fofa api_key
python main.py --config fofa.api_key 你的Fofa API密钥

配置完成后,config.ini 文件内容如下:

3.4 验证环境

执行以下命令,验证Nmap和Fofa配置是否正常:

Bash 复制代码
# 查看支持的Nmap扫描类型
python main.py --list-scans
# 验证Fofa配置(无报错即正常)
python main.py --target 127.0.0.1 --fofa

四、核心功能详解

4.1 Nmap扫描功能:从扫描到存活提取全自动化

4.1.1 支持的扫描类型

工具内置17种常用扫描类型,覆盖从快速探测到深度扫描的全场景,执行 python main.py --list-scans 可查看详细说明:

扫描类型 适用场景 核心特点
live_hosts 存活主机探测 仅探测存活状态,生成Discovery.gnmap文件
quick_scan 初步信息搜集 扫描1-1000端口,平衡速度与信息密度
full_port 全面端口探测 扫描0-65535全端口,信息完整
web_ports Web服务探测 仅扫描80/443/8080等Web相关端口
os_detect 操作系统识别 探测目标操作系统类型
complete_scan 深度渗透测试 全端口+系统+服务+默认脚本,最全面
4.1.2 存活主机自动提取逻辑

执行 live_hosts 扫描后,工具会自动触发以下流程:

  1. Nmap扫描生成 scan_results/Discovery.gnmap(固定文件名,与手动执行命令一致)

  2. 优先执行用户指定命令:grep "Status: Up" ./scan_results/Discovery.gnmap | cut -f 2 -d ' ' > ./scan_results/liveHosts.txt

  3. 若命令执行失败(如Windows无grep/cut),自动使用Python内置逻辑兜底,确保 liveHosts.txt 必生成

  4. 结果去重、IP格式验证,最终生成纯IP列表(每行1个存活主机)

shell 复制代码
(.venv) (base) liuxiaowei@xiaoweiM3 nmap_fofo_tool % python main.py --target 192.168.1.0/24 --scan-type live_hosts

    ==================================================
    ||              Nmap-Fofa 信息搜集工具          ||
    ||         集成Nmap扫描与Fofa API查询功能       ||
    ||         2025-12-25    By:Bruce_liu           || 
    ==================================================
    
开始扫描 192.168.1.0/24,类型:live_hosts
执行命令:nmap -sn -v -T4 -oG scan_results/Discovery.gnmap 192.168.1.0/24
扫描完成,固定文件已保存至:scan_results/Discovery.gnmap

✅ Nmap扫描完成!目标:192.168.1.0/24,扫描类型:live_hosts
+---------------+------+----------+----------+----------+
|     IP地址    | 状态 | 开放端口 | 操作系统 | 服务信息 |
+---------------+------+----------+----------+----------+
|  192.168.1.0  | down |    无    |   未知   |    无    |
|  192.168.1.1  |  up  |    无    |   未知   |    无    |
|  192.168.1.10 |  up  |    无    |   未知   |    无    |
| 192.168.1.100 | down |    无    |   未知   |    无    |
.........
| 192.168.1.121 | down |    无    |   未知   |    无    |
| 192.168.1.122 |  up  |    无    |   未知   |    无    |
| 192.168.1.123 | down |    无    |   未知   |    无    |
| 192.168.1.124 | down |    无    |   未知   |    无    |
| 192.168.1.125 | down |    无    |   未知   |    无    |
| 192.168.1.126 | down |    无    |   未知   |    无    |
| 192.168.1.127 | down |    无    |   未知   |    无    |
| 192.168.1.128 | down |    无    |   未知   |    无    |
| 192.168.1.129 | down |    无    |   未知   |    无    |
.......
.......
|  192.168.1.95 | down |    无    |   未知   |    无    |
|  192.168.1.96 | down |    无    |   未知   |    无    |
|  192.168.1.97 | down |    无    |   未知   |    无    |
|  192.168.1.98 | down |    无    |   未知   |    无    |
|  192.168.1.99 | down |    无    |   未知   |    无    |
+---------------+------+----------+----------+----------+
✅ 命令执行成功!已生成文件:./scan_results/liveHosts.txt
(.venv) (base) liuxiaowei@xiaoweiM3 nmap_fofo_tool % 

4.2 Fofa API查询功能:字段对齐+域名自动解析

4.2.1 支持的查询类型

工具支持3种Fofa查询方式,无需手动拼接Fofa语法:

  1. 纯IP查询:直接输入IP(如 111.26.xx.xx),自动补全为 ip=111.26.xx.xx

  2. 纯域名查询:直接输入域名(如 xxx.com),自动补全为 domain=xxx.com 并解析对应IP

  3. 原生语法查询:支持Fofa复杂语法(如 title="后台管理" && port=8080 && country="CN"

4.2.2 核心优化点
  • 字段对齐:修复原Fofa结果中IP带端口、协议显示端口号的问题,严格映射为「IP+端口+协议」

  • 域名解析:输入域名查询时,自动调用 socket 模块解析对应IPv4地址,IP列显示实际IP而非域名

  • 协议自动映射:根据常见端口自动补充协议(80→tcp、123→udp),解决Fofa协议字段缺失问题

  • 结果保存:自动生成带时间戳的结果文件,包含查询语句、总记录数、格式化表格

五、实战使用示例

示例1:Nmap探测C段存活主机

场景:探测内网<192.168.1.0/24>网段的存活主机,自动生成liveHosts.txt

Bash 复制代码
# 执行命令
python main.py --target 192.168.1.0/24 --scan-type live_hosts

执行流程:

  1. 生成 scan_results/Discovery.gnmap 扫描文件

  2. 自动执行grep+cut命令(或Python兜底)

  3. 生成 scan_results/liveHosts.txt 存活IP列表

  4. 终端输出存活主机数量和文件路径

示例2:Fofa查询域名对应的IP和资产信息

场景:查询 jlbcwhg.com 对应的IP、开放端口、服务器信息

Bash 复制代码
# 执行命令
python main.py --target xxx.com --fofa

预期结果:

  • IP列显示解析后的实际IP(如<111.26.xxx.xxx>)

  • 端口列显示开放端口(如80)

  • 协议列自动映射为tcp

  • 结果保存至 scan_results/fofa_result_xxx.txt

示例3:Nmap快速扫描单个IP的常用端口

场景:扫描<111.26.xx.xx>的常用服务端口(21/22/80/443等)

Bash 复制代码
# 执行命令
python main.py --target 111.26.xx.xx --scan-type service_ports

预期结果:

  • 终端以表格形式展示开放端口、服务名称、版本信息

  • 结果文件保存至 scan_results/service_ports_xxx.txt

示例4:Fofa复杂语法查询

场景:查询标题包含「后台」且开放8080端口的国内资产

Bash 复制代码
# 执行命令(注意语法引号转义)
python main.py --target 'title="后台" && port=8080 && country="CN"' --fofa

预期结果:

  • 终端展示符合条件的资产列表(IP、端口、域名、标题等)

  • 自动过滤无效数据,空值显示为「-」

六、常见问题与解决方案

Q1:执行Fofa查询时提示「args未定义」

  • 原因:命令行参数解析逻辑顺序错误,未先解析参数就使用args变量

  • 解决方案:确保main.py中先执行 args = parser.parse_args(),再使用 args.fofa 等变量(参考工具最终版代码)

Q2:Nmap扫描后未生成liveHosts.txt

  • 原因1:Discovery.gnmap中无「Status: Up」的存活主机(换<127.0.0.1>测试)

  • 原因2:路径问题(工具需在根目录执行,确保 ./scan_results 存在)

  • 解决方案:执行 python main.py --target 127.0.0.1 --scan-type live_hosts 测试,查看终端日志排查

Q3:Fofa查询结果字段错位(IP带端口、协议显示数字)

  • 原因:Fofa API返回字段索引映射错误,未处理「IP:端口」格式

  • 解决方案:确保工具使用最新版<main.py>,已实现「IP:端口」分割和协议自动映射

Q4:域名查询时IP解析失败

  • 原因:网络环境无法解析域名(如内网无DNS)或域名不存在

  • 解决方案:手动验证域名解析(ping xxx.com),或更换网络环境

七、工具扩展方向

当前工具已覆盖核心使用场景,后续可根据需求扩展:

  1. 新增Nmap脚本扫描功能(如漏洞探测脚本、弱口令检测)

  2. 结果可视化(生成HTML报告,包含扫描拓扑、资产分布)

  3. 批量扫描功能(读取IP列表文件,批量执行扫描/查询)

  4. 存活主机后续联动(自动对liveHosts.txt中的IP执行端口扫描)

  5. 多线程/异步优化(提升大C段扫描和批量查询效率)

八、总结

这款Nmap+Fofa一体化工具整合了两大核心信息搜集工具的能力,解决了手动操作繁琐、结果格式混乱、配置复杂等痛点。通过本文的安装配置和使用示例,无论是渗透测试工程师、网络运维人员,还是安全爱好者,都能快速上手使用,高效完成网络资产信息搜集工作。

工具的所有代码已优化至稳定版本,支持跨平台使用,后续会持续更新维护。如果在使用过程中遇到问题或有功能建议,欢迎在评论区留言交流~

【工具代码仓库地址】

https://github.com/lxw1973/nmap-fofa-info-gather

相关推荐
SelectDB11 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
大树885 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
LDR0066 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术6 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园6 天前
C++20 Modules 模块详解
java·开发语言·spring
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
swordbob6 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio