Nmap NSE 资产指纹识别:从脚本输出到资产清单
Nmap 是网络探测与端口扫描工具,NSE(Nmap Scripting Engine,脚本引擎)是它内置的脚本扩展机制,用于在探测端口的同时识别服务版本、协议细节和已知配置。用 -sV -sC 配合 NSE 脚本,可以把一次扫描直接产出为可交付的资产清单。
简介
资产盘点要的是"可交付",不是"扫得全"。交付物通常是一张表,五列:
| 地址 | 端口 | 服务 | 版本 | 备注 |
|---|---|---|---|---|
| 10.0.0.12 | 22 | ssh | OpenSSH 9.6 | |
| 10.0.0.12 | 80 | http | nginx 1.24.0 | 标题:内部 Git |
| 10.0.0.58 | 9100 | jetdirect | 打印机 web 面板 | 老设备,需低强度 |
先定清单长什么样,再倒推用什么参数能产出这几列,最后才决定扫哪个段。
安装
bash
# Debian/Ubuntu
apt install -y nmap
# CentOS/RHEL
yum install -y nmap
# 查看 NSE 脚本清单
ls /usr/share/nmap/scripts/ | head
nmap --script-help=default
预期结果 :nmap --version 能输出版本号;脚本目录内存在大量 .nse 文件。
命令使用
日常盘点用得最多的是下面一条:
bash
nmap -sV -sC -T4 -p- --open -oX assets.xml 10.0.0.0/24
参数含义:
| 参数 | 作用 |
|---|---|
-sV |
探测服务与版本 |
-sC |
运行 default 类脚本 |
-T4 |
加速,内网合适;公网降到 -T3 |
-p- |
全端口;赶时间用 --top-ports 1000 |
--open |
只显示开着的端口,减少噪声 |
-oX |
输出 XML,便于后续处理 |
只想先看个大概,用轻量脚本:
bash
nmap -sV --script=banner,http-title,ssl-cert -p 80,443,8080 10.0.0.10
预期结果 :banner 抓原始 banner,http-title 抓网页标题,ssl-cert 抓证书信息,输出里能看到对应字段。三个配合基本能判断一台机器是什么系统、上面跑什么业务。
常用选项
NSE 脚本按类别组织,选之前先判断会不会给目标带来副作用:
| 类别 | 代表脚本 | 用途 | 风险 |
|---|---|---|---|
default |
http-title、ssh-hostkey | 基础信息收集 | 低 |
discovery |
dns-service-discovery、snmp-info | 网络资产发现 | 中 |
safe |
ssl-enum-ciphers | 弱加密套件检测 | 低 |
auth |
http-brute、ssh-brute | 弱口令检测 | 高,需授权 |
vuln |
各 CVE 专项 | 已知漏洞迹象检测 | 高,需授权 |
intrusive |
http-sql-injection | 主动注入类检测 | 高,需授权 |
default、safe 基本只读;auth、vuln、intrusive 会真的发起登录尝试或利用请求。能否运行这类脚本,取决于授权范围,不是技术问题。
使用示例:从 XML 转成清单
Nmap 的 XML 结构规整,用标准库就能转表:
python
import xml.etree.ElementTree as ET
tree = ET.parse("assets.xml")
for host in tree.iter("host"):
addr = host.find("address").get("addr")
for port in host.iter("port"):
if port.find("state").get("state") != "open":
continue
svc = port.find("service")
name = svc.get("name") if svc is not None else "unknown"
ver = (svc.get("product", "") + " " + svc.get("version", "")).strip() if svc is not None else ""
print(f"{addr}\t{port.get('portid')}\t{name}\t{ver}")
预期结果:输出"IP / 端口 / 服务 / 版本"四列,可直接贴文档或导 Excel。脚本原始输出(如 http-title 抓到的标题)单独放附录,正文只留能直接看的信息。
注意事项
- 内网扫描从
-T3起步,看到老设备多的网段再往下降;网络设备(打印机、交换机、摄像头)单独用--top-ports 100低强度扫,避免扫挂管理面板。 - 不打招呼的内网扫描容易触发 IDS 告警,扫之前先报备时间范围和目标网段。
- XML 里的服务名不一定准,
-sV也会猜错,重要资产要人工复核。 vuln类脚本的结果只能当"迹象"看,不能当作"确认漏洞"写进报告。- 全端口扫描慢时,先
--top-ports 1000快扫一遍,再对发现的 IP 补全端口。