Nmap 常用参数 & 使用技巧 - from DEFCON

Nmap (网络映射器)是由 Gordon Lyon设计,用来探测计算机网络上的主机和服务的一种安全扫描器。为了绘制网络拓扑图,Nmap的发送特制的数据包到目标主机,然后对返回数据包进行分析。Nmap是一款枚举和测试网络的强大工具。

Nmap的作用:

  1. 主机探测:探测网络上的主机,例如列出响应TCP和ICMP请求、icmp请求、开放特别端口的主机。
  2. 端口扫描:探测目标主机所开放的端口。
  3. 版本检测:探测目标主机的网络服务,判断其服务名称及版本号。
  4. 系统检测:探测目标主机的操作系统及网络设备的硬件特性。
  5. 防火墙检测: 探测目标主机使用什么类型的报文过滤器/防火墙
  6. 支持探测脚本的编写:使用Nmap的脚本引擎(NSE)和Lua编程语言。

常用参数

目标说明

  • -iL <inputfilename>从列表中输入
  • -iR <num hosts> 随机选取n个主机,0表示无限
  • --exclude <host1[,host2][,host3],...> 排除这些主机
  • --excludefile <exclude_file> 排除文件中的这些主机

主机发现

由于不同的用户对感兴趣的主机服务不一样,Nmap提供了多种不同的方式。

  • -sL 列表扫描,打印主机列表
  • -sP 仅仅使用ping进行主机发现,默认情况下会发送一个ICMP回声请求和一个TCP报文到80端口
  • -P0 无视主机发现,均认为是活跃的。
  • -PS TCP SYN Ping 尝试发送SYN包,如果收到SYN/ACK即认为正在运行
  • -PA TCP ACK Ping 尝试发送ACK包,回应RST报文即为运行
  • -PU 发送一个空的UDP包,如果收到无法到达说明机器正在运行

PS PA PU如果不指定端口,默认为31338端口,使用这个端口的原因是选择一个不常用的端口进行主机活跃性探测。

扫描方式

Nmap所识别的6个端口状态

端口状态 说明
open 应用程序正在该端口接收TCP 连接或者UDP报文
close 关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。
filtered 由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。
unfiltered 未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。
open or filtered 当无法确定端口是开放还是被过滤的,Nmap就把该端口划分成 这种状态。开放的端口不响应就是一个例子。
closed or filtered 该状态用于Nmap不能确定端口是关闭的还是被过滤的。 它只可能出现在IPID Idle扫描中

常见的扫描方式:

  • -sS TCP SYN扫描

    默认方式,只发送SYN包,不建立连接。

  • -ST TCP connect()扫描

    用户没有权限发送原始报文时,采用这种方式

  • -sU UDP扫描
  • -sN;-sF;-sX TCP nullFINXmas扫描

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    这三种扫描类型 (甚至用下一节描述的 --scanflags 选项的更多类型) 在TCP RFC 中发掘了一个微妙的方法来区分open(开放的)和 closed(关闭的)端口。
    如果 [目标]端口状态是关闭的: 请求的的不含RST的报文导致一个RST响应。
    如果不设置SYN,RST,或者ACK位的报文发送到开放端口,理论上,这不应该发生,如果您确实收到了,丢弃该报文,返回。
    那么有以下规则:
    如果扫描系统遵循该RFC,当端口关闭时,任何不包含SYN,RST,或者ACK位的报文会导致 一个RST返回,而当端口开放时,应该没有任何响应。只要不包含SYN,RST,或者ACK, 任何其它三种(FIN,PSH,and URG)的组合都行。Nmap有三种扫描类型利用这一点:
    Null扫描 (-sN)
    不设置任何标志位(tcp标志头是0)
    FIN扫描 (-sF)
    只设置TCP FIN标志位。
    Xmas扫描 (-sX)
    设置FIN,PSH,和URG标志位,就像点亮圣诞树上所有的灯一样。

    除了探测报文的标志位不同,这三种扫描在行为上完全一致。 如果收到一个RST报文,该端口被认为是closed(关闭的),而没有响应则意味着 端口是open|filtered(开放或者被过滤的)。 如果收到ICMP不可到达错误(类型 3,代号 1,2,3,9,10,或者13),该端口就被标记为filtered被过滤的。

  • -sA TCP ACK扫描

    它不能确定open(开放的)或者 open|filtered(开放或者过滤的))端口。 它用于发现防火墙规则,确定它们是有状态的还是无状态的,哪些端口是被过滤的. 无论此端口是否开放,均会返回RST报文。

  • --scanflags 定制TCP扫描
    指定任意标志位,可以是数字或URG, ACK,PSH, RST,SYN,and FIN

端口说明

  • -p 指定端口范围

    1
    U:53,111,137,T:21-25,80,139,8080
  • -F 快速扫描有限端口

    nmap-services文件中

  • -r 不要按随机顺序扫描端口,默认是随机顺序

服务版本检测

  • -sV 版本探测
  • --allports 不为版本探测排除任何端口
  • --version-intensity <intensity> 版本扫描强度

操作系统探测

  • -O 启动操作系统检测
  • --osscan-limit 针对指定目标进行检测
  • --osscan-guess 无法确定时,进行推测

时间与性能

  • -T 设置时间模板,最为常用的选项。数值为0-5

防火墙规避

Nmap提供了一些方式来绕过IDS的检测。

具体的看手册。

1
2
3
4
5
6
7
8
9
10
11
12
13
-f; --mtu <val>: fragment packets (optionally w/given MTU)
-D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys
-S <IP_Address>: Spoof source address
-e <iface>: Use specified interface
-g/--source-port <portnum>: Use given port number
--proxies <url1,[url2],...>: Relay connections through HTTP/SOCKS4 proxies
--data <hex string>: Append a custom payload to sent packets
--data-string <string>: Append a custom ASCII string to sent packets
--data-length <num>: Append random data to sent packets
--ip-options <options>: Send packets with specified ip options
--ttl <val>: Set IP time-to-live field
--spoof-mac <mac address/prefix/vendor name>: Spoof your MAC address
--badsum: Send packets with a bogus TCP/UDP/SCTP checksum

需要实践才能比较好的理解。

输出方式

  • -oN <filespec> 标准输出写入文件
  • -oX <filespec> XML输出
  • -v 提高输出信息详细度
  • --packet-trace 跟踪发送和接受的报文

使用技巧 from DEFCON

源视频地址 - DEFCON 16 Nmap techniques

生成随机ip地址

1
nmap -iR 25000000 -sL -n |awk '{print $5}' | sort -n | uniq >! tp; head -120000 tp >! tcp-allports-1M-IPs; rm tp

-iR为随机生成ip地址,-sL为列表模式不进行扫描,-n为不进行DNS查找,awk ..输出第5个字段(IP地址字段),sort | uniq用于排序和去重,并将其前12000个写入文件

优化主机发现

基于TCP主机发现
  • -PS : TCP SYN packet
  • -PA : TCP ACK packet

常见的防火墙有两种:

  1. 基于状态的(一般会允许SYN packet通过,而ACK packet由于没有对应的连接而被丢弃)
  2. 无状态的(另一种会阻值SYN packet到特定端口,而这种无状态的不知道是否有连接从而让ACK packet通过)

由此可以探查服务器防火墙是什么类型的:

1
2
nmap -sP -PS80 -n example.com
nmap -sP -PA80 -n example.com
基于UDP主机发现
  • -PU : UDP packet

对于UDP端口,open的UDP端口一般是不会回复UDP探针的,而只有close的UDP端口会返回port unreachable packet

基于ICMP的主机发现
  • -PE : ICMP echo request 回显请求
  • -PP : ICMP timestap request 用于同步时间
  • -PM : ICMP netmask request 用于无盘系统获取子网掩码

有些管理员只关闭了echo request可以使用其他的两种,或者混合使用

一些技巧
1
nmap -sP -PE -PP -PS 21,22,23,25,80,113,31339 -PA 80,113,443,10042 –source-port 53 -T4 -iL 5k_file

这是展示的一个扫描技巧的例子,混合使用了多种request

  • –source-port 53

    该端口是DNS查询端口,一般的防火墙都允许来自此端口的数据包

  • --version-intensity 0

    轻量的版本检测会提升很大的速度

  • --top-ports <number>
    使用最常用的number个端口进行扫描
    --top-ports 1000能覆盖93%的端口
    --top-ports 3674 能覆盖100%的端口

最可能开放的TCP端口:

1
2
3
4
5
6
7
8
9
10
80 (http)
23 (telnet)
22 (ssh)
443 (https)
3389 (ms-term-serv)
445 (microsoft-ds)
139 (netbios-ssn)
21 (ftp)
135 (msrpc)
25 (smtp)

最可能开放的UDP端口:

1
2
3
4
5
6
7
8
9
10
137 (netbios-ns)
161 (snmp)
1434 (ms-sql-m)
123 (ntp)
138 (netbios-dgm)
445 (microsoft-ds)
135 (msrpc)
67 (dhcps)
139 (netbios-ssn)
53 (domain)

一个完整的扫描命令:

1
nmap -S [srcip] -d –max-scan-delay 10 -oAlogs/tcp-allports-%T-%D -iL tcp-allports-1M-IPs –max-retries 1–randomize-hosts -p- -PS21,22,23,25,53,80,443 -T4 –min-hostgroup 256 –min-rate175 –max-rate 300

其中-S [srcip] 为伪造源IP地址,-d为输出日志信息,–max-scan-delay为最大扫描时延,防止有些等待太久,oAlogs/tcp-allports-%T-%D用于以xml格式输出%T表示扫描时间,%D表示扫描日期–randomize-hosts,因为文件中的IP已经排序,这里将之打乱,避免被防火墙检查出.

1
nmap -sV -p 80 -T4 –script http*,default scanme.nmap.org

一个扫描web站点的命令