Kali Linux 教程:端口扫描工具-Nmap

介绍

Nmap(Network Mapper)是Kali内置最经典端口扫描器,底层基于TCP/IP栈,可做端口探测、服务识别、操作系统指纹识别、脚本检测。

Nmap 常用参数

nmap [扫描类型] [参数] <目标IP/网段>
参数 作用说明
-sS SYN半开扫描(默认root权限下,最常用,不完成TCP三次握手)
-sT TCP全连接扫描,普通用户权限可用,容易被日志记录
-sU UDP端口扫描,速度慢,用于DNS、SNMP等UDP服务
-sF FIN隐秘扫描,针对部分无状态防火墙
-Pn 不进行主机存活探测,直接扫描端口;目标禁ping时必用
-sn 仅主机存活扫描,不扫端口(ping扫描)
-p 端口 指定端口:-p 80;多端口-p 22,80,443;范围-p 1-1000;全部端口-p-
-F 快速扫描,只扫描常用100个端口
-T0 ~ T5 扫描时序模板:T0最慢(极隐秘),T5最快(暴力,极易触发WAF);常用-T4
-oN 输出普通文本报告
-oX 输出XML报告,可导入Metasploit、Nessus
-oG grep格式报告,方便shell处理
-A 全能扫描:同时开启服务版本探测+操作系统识别+脚本扫描+路由追踪
-sV 服务版本探测,识别端口上运行程序与版本号
-O 操作系统指纹识别(OS识别)
--script 调用NSE脚本引擎
-iL 从文件读取目标列表,批量扫描

端口扫描基础用法

  1. 简单SYN扫描(root)
    nmap -sS 192.168.1.100
    
  2. 指定端口范围扫描
    nmap -sS -p 1-1000 192.168.1.100
    
  3. 扫描全部65535端口
    nmap -sS -p- 192.168.1.100
    
  4. 目标禁止ping,跳过主机探测
    nmap -sS -Pn 192.168.1.100
    

服务探测

探测端口对应的应用程序、版本信息,用于后续漏洞查找。

nmap -sS -sV -p 22,80,443 192.168.1.100

输出示例:

PORT    STATE SERVICE VERSION
80/tcp  open  http    Apache httpd 2.4.49

4. 操作系统版本识别 -O

依靠TCP/IP协议栈指纹比对识别目标操作系统。

限制:需要root权限;目标防火墙可能伪造指纹,结果为推测,不是100%准确。

nmap -sS -O 192.168.1.100

-A 等价于 -sV -O --script default -traceroute,一键全能扫描:

nmap -sS -A 192.168.1.100

Nmap 高级用法

1. 隐秘扫描(规避检测)

  1. SYN半开扫描 -sS
    不完成三次握手,目标系统日志一般不会记录完整连接,是最常用低噪音扫描。

    必须root权限。

  2. FIN扫描 -sF
    发送FIN包;关闭端口会返回RST,开放端口忽略。
    局限性:Windows系统会对FIN包统一返回RST,对Windows无效。

    nmap -sF -p1-100 192.168.1.100
    
  3. 空闲扫描 -sI(僵尸扫描)
    借助一台“僵尸主机”做中间人,扫描源IP显示为僵尸主机,隐藏自身IP。条件苛刻,现代环境很难成功。

    nmap -sI 僵尸主机IP 目标IP
    
  4. 减速扫描降低告警:-T0

    nmap -sS -T0 -Pn 192.168.1.100
    

2. 批量扫描网段/目标文件

  1. CIDR网段扫描(192.168.1.0/24整个C段)
    nmap -sS -sn 192.168.1.0/24
    
  2. 读取txt文件内多个目标批量扫描
    新建targets.txt每行一个IP:
    192.168.1.100
    192.168.1.101
    
    nmap -sS -iL targets.txt
    

3. Nmap漏洞扫描(NSE脚本引擎)

NSE(Nmap Scripting Engine)内置大量脚本,可做弱口令、漏洞检测、目录探测。
脚本目录:/usr/share/nmap/scripts/

  • 使用漏洞分类脚本 vuln

    nmap -sS --script vuln 192.168.1.100
    

    vuln脚本只做简单漏洞探测,不等于专业漏扫工具(OpenVAS/Nessus),误报较多。

  • 指定单个脚本(例如检测http弱口令)

    nmap -sS --script http-default-accounts 192.168.1.100
    

4. 输出报告

# 文本报告
nmap -sS -oN scan.txt 192.168.1.100
# XML报告(导入Metasploit)
nmap -sS -oX scan.xml 192.168.1.100
# grep格式方便筛选
nmap -sS -oG scan.gnmap 192.168.1.100

Nmap 端口4种核心状态

Nmap扫描输出中最关键4个状态:open / closed / filtered / unfiltered

1. open(开放)

目标端口正在监听应用程序,收到探测包并正常响应。

含义:该端口对外提供服务,可以建立连接。
示例:80/tcp open http

2. closed(关闭)

端口是开启的,但没有程序监听该端口;目标主机收到探测包后回复RST重置包。

主机存活,但是端口没有服务。
内网环境下常见。

3. filtered(被过滤)

Nmap收不到目标的任何响应包。
原因:防火墙、ACL策略、WAF拦截探测包,丢弃数据包,不返回任何应答。

Nmap无法判断端口是开还是关。

4. unfiltered(未过滤)

仅在TCP ACK扫描 -sA 才会出现。
ACK包发出去收到RST应答,说明数据包可以到达目标,没有防火墙拦截,但无法确定端口本身是open还是closed。

补充两种较少见状态

  • open|filtered:Nmap无法区分开放/过滤,UDP扫描、隐秘扫描经常出现;
  • closed|filtered:无法区分关闭还是被过滤。

快速区分记忆

  1. open:端口有服务,能连通
  2. closed:主机在线,端口没开服务
  3. filtered:包被防火墙丢了,无应答
  4. unfiltered:包可达防火墙,但是不知道端口是否开放(ACK扫描特有)