Nmap 一行命令完成内网资产测绘,比你手动敲快 10 倍

Nmap 一行命令完成内网资产测绘,比你手动敲快 10 倍

入职新公司第三天,领导甩过来一个任务:"把内网资产摸一遍,下周出个报告。"

我看着 10.0.0.0/8 的网段,心里凉了半截。手动 ping?那得 ping 到天荒地老。用 masscan?扫完还得一个个识别服务。折腾了两天,同事路过看我屏幕,丢过来一行命令:

nmap -sn -PE -PA21,22,25,80,443,3389 --min-rate 1000 10.0.0.0/8 -oX alive.xml && nmap -sV -O -p- --min-rate 500 -iL alive.xml -oX full_scan.xml

十五分钟,资产清单出来了。那一刻我才知道,Nmap 的精髓不在于会多少参数,而在于怎么组合

基础篇:先活下来再说

内网资产测绘第一步,不是扫描端口,是发现主机。你得先知道网段里有哪些机器还活着。

快速主机发现

# ARP 扫描(同一子网,最快最准)
nmap -sn -PR 192.168.1.0/24

# ICMP + TCP 组合探测(跨子网)
nmap -sn -PE -PA21,22,80,443 10.0.0.0/16

# 跳过 DNS 解析(省时间)
nmap -sn -n -PE 10.10.0.0/24

踩坑记录:-sn 只做主机发现,不扫端口。但很多人不知道,-sn 在有权限的情况下会发 ARP 请求,没权限才用 ICMP。所以同子网扫描,-sn -PR 最靠谱。

指定端口 vs 全端口

# 快速扫描常见端口(1000个默认端口)
nmap -sV 10.10.1.0/24

# 指定端口(精准控制)
nmap -p 21,22,23,80,443,445,3306,3389,8080,8443 10.10.1.0/24

# 全端口扫描(慢但彻底)
nmap -p- --min-rate 1000 10.10.1.0/24

实战经验:全端口扫描(-p-)扫 65535 个端口,不用 --min-rate 会慢到怀疑人生。但 --min-rate 设太高容易丢包,我一般设 500-1000。

进阶篇:让 Nmap 帮你"认人"

发现主机只是开始,更关键的是识别服务和操作系统。你得知道这台机器跑的是什么、什么版本、有没有已知漏洞。

服务版本识别

# 服务版本检测
nmap -sV -p 22,80,443 10.10.1.100

# 更激进的版本检测(准确性更高,但更慢)
nmap -sV --version-intensity 9 10.10.1.100

# OS 检测(需要 root 权限)
nmap -O --osscan-guess 10.10.1.100

输出示例:

PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 7.4 (protocol 2.0)
80/tcp  open  http    Apache httpd 2.4.6
443/tcp open  ssl/http Apache httpd 2.4.6

看到 Apache 2.4.6 就该警觉了——这个版本有好几个已知漏洞。服务版本识别是漏洞发现的前置步骤,别跳过。

NSE 脚本:Nmap 的"外挂"

Nmap 最强大的功能之一是 NSE(Nmap Scripting Engine)脚本。常用的安全相关脚本:

# 漏洞扫描
nmap --script vuln 10.10.1.0/24

# SMB 漏洞检测(永恒之蓝等)
nmap --script smb-vuln* -p 445 10.10.1.0/24

# HTTP 标题抓取(快速识别 Web 服务)
nmap --script http-title -p 80,443,8080 10.10.1.0/24

# SSH 弱口令检测
nmap --script ssh-brute -p 22 10.10.1.0/24

# SSL/TLS 漏洞检测
nmap --script ssl-enum-ciphers -p 443 10.10.1.0/24

踩坑记录:NSE 脚本有些会发大量请求,比如 ssh-brute。在生产环境跑之前,先在测试环境验证。别问我怎么知道的。

实战篇:我的内网测绘工作流

说了这么多参数,实际工作中怎么组合?分享一下我的标准流程:

第一步:快速发现存活主机

# 同子网 ARP 扫描
nmap -sn -PR -n 192.168.1.0/24 -oG alive_192.168.1.txt

# 跨子网 TCP 探测
nmap -sn -n -PE -PA21,22,80,443 --min-rate 1000 10.0.0.0/16 -oG alive_10.txt

-oG 输出 grep 格式,方便后续处理:

# 提取存活 IP
grep "Status: Up" alive_10.txt | awk '{print $2}' > live_hosts.txt

第二步:快速端口扫描

# 对存活主机做快速端口扫描
nmap -sS -p 21,22,23,25,53,80,110,135,139,143,443,445,993,995,1433,1521,3306,3389,5432,5900,6379,8080,8443,9090,27017 --min-rate 1000 -iL live_hosts.txt -oX quick_ports.xml

24 个高价值端口,覆盖了常见的 Web、数据库、远程管理服务。

第三步:服务识别 + 漏洞扫描

# 对开放端口做服务版本检测
nmap -sV -O -iL live_hosts.txt -oX service_scan.xml

# 针对性漏洞扫描(只扫高危端口)
nmap --script vuln -p 21,22,80,443,445,3389 -iL live_hosts.txt -oX vuln_scan.xml

第四步:结果整合

# 合并扫描结果
nmap --stylesheet nmap.xsl -oX merged.xml service_scan.xml vuln_scan.xml

# 转成 HTML 报告
xsltproc merged.xml -o report.html

性能调优:让扫描快起来

内网扫描最头疼的是速度。几个关键参数:

# 并行度控制
nmap --min-parallelism 10 --max-parallelism 256 10.10.0.0/16

# 超时控制
nmap --max-retries 2 --host-timeout 30s 10.10.0.0/16

# 发包速率(慎用,容易丢包)
nmap --min-rate 1000 --max-rate 5000 10.10.0.0/16

# 终极组合:大网段快速扫描
nmap -sn -n -PE -PA21,22,80,443 --min-rate 2000 --max-retries 1 10.0.0.0/8 -oG alive.txt

踩坑记录:--max-retries 设成 1 虽然快,但会漏掉一些响应慢的主机。正式报告用 2,探索阶段用 1。

常见坑点

坑1:防火墙干扰

有些主机明明活着,但 ICMP 被禁了。解决方案:用 TCP SYN 探测代替 ICMP。

# TCP SYN 探测(绕过 ICMP 过滤)
nmap -sn -PS21,22,80,443 10.10.1.0/24

坑2:扫描被 IDS 告警

大网段高速扫描很容易触发 IDS 告警。解决方案:降低速率,分时段扫描。

# 慢速扫描模式
nmap -T2 --max-rate 200 10.10.0.0/16

坑3:IPv6 被忽略

很多内网环境有 IPv6 地址,但扫描时只扫 IPv4。解决方案:

# IPv6 扫描
nmap -6 fe80::/10

自动化脚本

最后给一个我常用的自动化扫描脚本,一键出报告:

#!/bin/bash
# net_scan.sh - 内网资产测绘脚本
TARGET=$1
OUTPUT_DIR="./scan_$(date +%Y%m%d_%H%M)"
mkdir -p $OUTPUT_DIR

echo "[*] 开始主机发现..."
nmap -sn -n -PE -PA21,22,80,443 --min-rate 1000 $TARGET -oG $OUTPUT_DIR/alive.txt

echo "[*] 提取存活主机..."
grep "Status: Up" $OUTPUT_DIR/alive.txt | awk '{print $2}' > $OUTPUT_DIR/live_hosts.txt
LIVE_COUNT=$(wc -l < $OUTPUT_DIR/live_hosts.txt)
echo "[+] 发现 $LIVE_COUNT 台存活主机"

echo "[*] 开始端口扫描..."
nmap -sS -p 21,22,23,25,80,443,445,3306,3389,8080 --min-rate 1000 -iL $OUTPUT_DIR/live_hosts.txt -oX $OUTPUT_DIR/ports.xml

echo "[*] 开始服务识别..."
nmap -sV -O -iL $OUTPUT_DIR/live_hosts.txt -oX $OUTPUT_DIR/services.xml

echo "[*] 开始漏洞扫描..."
nmap --script vuln -p 21,22,80,443,445,3389 -iL $OUTPUT_DIR/live_hosts.txt -oX $OUTPUT_DIR/vulns.xml

echo "[+] 扫描完成,结果保存在 $OUTPUT_DIR/"

用法:

chmod +x net_scan.sh
sudo ./net_scan.sh 10.10.0.0/16

十五分钟,内网资产清单、开放端口、服务版本、已知漏洞,全出来了。

Nmap 这个工具,二十年了还在安全圈子里稳坐第一梯队,不是没原因的。它的参数看起来多,但核心逻辑就三个:发现主机 → 识别服务 → 检测漏洞。把这三个步骤的参数组合搞清楚,内网测绘这件事,真的可以一行命令搞定。


关注「安全值班室」公众号

每天AI安全早报 + 实战攻防案例 + 网安学习路线连载

关注安全值班室

posted on 2026-05-30 15:07  明.Sir  阅读(40)  评论(0)    收藏  举报

导航