黑客/工具/网络/Nmap
黑客 Fyodor(Gordon Lynn)编写了nmap
来协助端口扫描和网络分析。他于 Phrack 杂志,第 7 卷,第 51 期,文章 11 中发布了原始源代码,现在在 Insecure.org 上维护该工具。世界各地的安全专家都使用 nmap
进行简单的网络检查,检测开放端口和服务版本;美国国家安全局 在大型看板上列出了安全工具及其当前版本——包括 nmap
、Snort 和 Nessus。
nmap
不仅仅检测开放端口;它还检测服务和操作系统版本。可以使用 nmap
扫描默认端口范围或特定子集;它可以扫描单个主机、范围或集合;它可以找出主机是启动还是关闭。对于熟练的用户来说,nmap
可以成为一个强大的工具,用于善或恶。
nmap
网络扫描工具提供了一组多样的选项来控制其行为。它可以扫描多个主机和主机范围;使用各种扫描技术;识别操作系统和服务版本;甚至执行隐形扫描以避免触发某些入侵检测系统和入侵防御系统工具。
使用示例
nmap -A -v <目标 IP 地址>
nmap -Pn -sS -A <目标 IP 地址>
首先,让我们了解一下 nmap
的一些基本用法。至少应该知道如何扫描主机和检查特定端口;这些基本知识将向你展示目标网络上有哪些端口是开放的。
nmap
的基本用法就是扫描目标 IP 地址或域名。例如
bluefox@ice-ldap:~$ nmap webserv1 Starting Nmap 4.10 ( http://www.insecure.org/nmap/ ) at 2007-04-01 15:52 EDT Interesting ports on webserv1 (192.168.30.11): Not shown: 1644 closed ports, 28 filtered ports PORT STATE SERVICE 21/tcp close ftp 22/tcp close ssh 80/tcp close http 111/tcp close rpcbind 199/tcp close smux 443/tcp open https 1008/tcp close ufsd Nmap finished: 1 IP address (1 host up) scanned in 15.142 seconds
在这种操作模式下,nmap
显示开放端口和该端口上运行的常见服务。nmap
不会准确显示移动到其他端口的服务;例如,端口 21 上的 http 将显示为 ftp。
也可以在 nmap
的命令行上指定多个主机
bluefox@ice-ldap:~$ nmap dbserv1 webserv1 Starting Nmap 4.10 ( http://www.insecure.org/nmap/ ) at 2007-04-01 15:56 EDT Interesting ports on 192.168.40.11: Not shown: 1667 closed ports PORT STATE SERVICE 22/tcp close ssh 135/tcp filtered msrpc 136/tcp filtered profile 137/tcp filtered netbios-ns 138/tcp filtered netbios-dgm 139/tcp filtered netbios-ssn 199/tcp open smux 445/tcp filtered microsoft-ds 1720/tcp filtered H.323/Q.931 3306/tcp open mysql 3389/tcp filtered ms-term-serv 5631/tcp filtered pcanywheredata Interesting ports on webserv1 (192.168.30.11): Not shown: 1644 closed ports, 28 filtered ports PORT STATE SERVICE 21/tcp close ftp 22/tcp close ssh 80/tcp close http 111/tcp close rpcbind 199/tcp close smux 443/tcp open https 1008/tcp close ufsd Nmap finished: 2 IP addresses (2 hosts up) scanned in 17.001 seconds
如你所见,我的 Web 服务器暴露了太多端口,我的 MySQL 服务器的防火墙很弱;我从 DMZ 运行了此扫描,它必须通过防火墙才能进入我的网络。在这里我们可以看到 nmap
的强大之处:我知道应该将防火墙切换到默认拒绝并仅允许通过显式配置的必需服务。nmap
通过缺乏响应来识别过滤的端口;当尝试打开关闭的端口时,它们会发送带有 RST 标志的 TCP 数据包,表明服务器收到了数据包并且本应允许你连接到任何监听该端口的服务。
nmap
命令行上的一个有用选项是“详细”开关。在命令行中包含 -v 或 -vv 将增加 nmap
生成的输出量。
bluefox@ice-ldap:~$ nmap -vv webserv1
nmap
允许你使用 IP 地址目标来针对基于简单语法的各种集合和范围。
x-y
- 指定从 x 到 y。nmap 192.168.0-1.1-2
将扫描 192.168.0.1、192.168.1.1、192.168.0.2 和 192.168.1.2*
- 替换为0-255
。你的 shell 可能发出很多文件名,所以只使用0-255
。x,y
- 指定x
和y
。nmap 192.168.0.1,2,4
将扫描 192.168.0.1、192.168.0.2 和 192.168.0.4。此外,nmap 192.168.0.1-2,4
将扫描同一组主机。/n
- 扫描 CIDR 表示的子网。例如,nmap 192.168.0.0/16
与nmap 192.168.0-255.0-255
相同。
可以将这些表示法以任何你想要的方式组合起来。例如,如果要扫描 192.168.0.0/12 上的一些子网,可以使用 nmap 192.168.0,16,64,96.0/4
。通常情况下,你不希望做如此大规模的扫描,可以只扫描单个主机;但是,如果你需要,你应该知道如何做。请记住,nmap
映射的是网络,而不仅仅是主机。 ? " Vs " ss1 area title yahoo<>facebook<>ip address<>
- 开关:
-p
有时你不需要知道主机上所有开放的端口,有时你只想确保 proFTPd 和 Apache 正在运行,SMTP 服务器没有死机,并查看 SSH 是否正在监听。对于这些情况,可以指定要扫描的端口。端口指定可以用与目标指定相同的方式进行操作,使用 x-y
和 x,y
表示法。
~$ nmap -p21-22,25,80,443 webserv1
- 开关:
-p
和-V
(服务版本)
包括扫描端口的服务版本
~$ nmap -sV -p21-22,25,80,443 host1.example.com
- 开关:
-sn
,之前和现在已弃用-sP
基本网络 ping 扫描,用于发现响应 icmp 请求(ping)的主机。
~$ nmap -sn 192.168.0.*
- 开关:
-sV
、-A
nmap
能够执行服务扫描和 RPC 磨损;换句话说,它可以告诉你哪个高级协议、应用程序、版本、版本(如果服务提供 [(SSL)] 连接,则为 libssl 版本等)在端口上监听,而不是将端口号与常见服务匹配。nmap
还使用 RPC 磨损,它对运行 RPC 服务的端口进行 RPC 连接;通常,单个RPC 端口映射器端口会告诉你哪些端口运行 RPC,但如果防火墙阻止了该端口,则 nmap
会自行找到它。
让我们先看看针对我身后服务器的扫描。这台服务器提供了一个非常好的例子,因为我已经配置了它,以便让我在大学的防火墙上戳洞,因此它看起来非常奇怪。一个典型的 nmap
扫描结果还算不错
bluefox@icebox:/home/shared/qemu$ nmap 192.168.1.40 Starting Nmap 4.20 ( http://insecure.org ) at 2007-04-03 20:58 EDT Interesting ports on 192.168.1.40: Not shown: 1688 closed ports PORT STATE SERVICE 21/tcp close ftp 22/tcp close ssh 53/tcp filter domain 80/tcp close http 81/tcp close hosts2-ns 139/tcp close netbios-ssn 389/tcp close ldap 443/tcp open https 445/tcp close microsoft-ds Nmap finished: 1 IP address (1 host up) scanned in 0.971 seconds
上面显示了 FTP、DNS、hosts2-ns、HTTP/SSL 和 Microsoft 目录服务(Active Directory)。我们可以使用 -sV
使用 nmap
服务扫描进行更仔细地查看。下面的输出给我们带来了截然不同的结果。
bluefox@icebox:/home/shared/qemu$ nmap -sV 192.168.1.40 Starting Nmap 4.20 ( http://insecure.org ) at 2007-04-03 21:01 EDT Interesting ports on 192.168.1.40: Not shown: 1688 closed ports PORT STATE SERVICE VERSION 21/tcp open ssh OpenSSH 4.3p2 Debian 5ubuntu1 (protocol 2.0) 22/tcp open ssh OpenSSH 4.3p2 Debian 5ubuntu1 (protocol 2.0) 53/tcp open ssh OpenSSH 4.3p2 Debian 5ubuntu1 (protocol 2.0) 80/tcp open http Apache httpd 2.0.55 ((Ubuntu) PHP/5.1.6) 81/tcp open http Apache httpd 2.0.55 ((Ubuntu) PHP/5.1.6) 139/tcp open netbios-ssn Samba smbd 3.X (workgroup: MSHOME) 389/tcp open ldap OpenLDAP 2.2.X 443/tcp open ssh OpenSSH 4.3p2 Debian 5ubuntu1 (protocol 2.0) 445/tcp open netbios-ssn Samba smbd 3.X (workgroup: MSHOME) Service Info: OS: Linux Service detection performed. Please report any incorrect results at http://insecure.org/nmap/submit/ . Nmap finished: 1 IP address (1 host up) scanned in 13.747 seconds
看来这台服务器确实使用 Apache 在两个端口上提供 http 服务;OpenSSH 通过 FTP、DNS 和 HTTPS 端口提供服务;Samba 提供 SMB 连接。此外,我们可以看到服务器在 OpenSSH 4.3p2 Debian 5ubuntu1 上使用 SSH 2.0 协议,这是一个本地的 Ubuntu .deb,而不是自定义构建。我们可以比较准确地猜测这台服务器运行的是 Ubuntu,即使没有进行操作系统扫描;要么就是管理员真的不知道自己在做什么,要么就是他设法使用重写代理更改了横幅以欺骗我们。
值得注意的是,-A
开关也激活了服务扫描。
您可以使用 nmap
运行许多类型的 advanced port scans。除了标准的 connect()
端口扫描外,nmap
还需要 root 权限才能执行这些 advanced scans,因为它需要创建原始套接字并构建原始 TCP/IP 数据包。
nmap
程序在有和没有 root 权限的情况下获取的信息不同。使用 root 权限,nmap
可以执行高级 TCP/IP 扫描;操作系统检测;以及 MAC 地址识别。
首先,让我们看看普通用户使用 nmap
以及 -A
选项的情况。nmap -A
激活操作系统和服务扫描,与 nmap -O -sV
相同。操作系统检测需要 root 权限,因此操作系统检测根本无法进行。我在一台 Linksys WRT54G 无线路由器上执行了以下扫描。
bluefox@icebox:~$ nmap -A -p80,1 192.168.1.1 Starting Nmap 4.20 ( http://insecure.org ) at 2007-04-04 12:18 EDT Interesting ports on 192.168.1.1: PORT STATE SERVICE VERSION 1/tcp closed tcpmux 80/tcp open http Linksys wireless-G WAP http config (Name Icelink) Service Info: Device: WAP Service detection performed. Please report any incorrect results at http://insecure.org/nmap/submit/ . Nmap finished: 1 IP address (1 host up) scanned in 6.199 seconds
如您所见,nmap
只是跳过了操作系统检测阶段。然而,当我们将 nmap
作为 root 运行时,我们看到它还可以查找更多信息。下面,我们看到它发现了 MAC 地址并识别了拥有该 MAC 地址空间的供应商;操作系统和有关操作系统的详细信息;正常运行时间;以及网络距离。它还为我们提供了设备类型;nmap
看到一个用于桌面、无线路由器或网络存储的 Linux 操作系统,因此将该设备分类为通用、WAP 或存储。
bluefox@icebox:~$ sudo nmap -A -p80,1 192.168.1.1 Starting Nmap 4.20 ( http://insecure.org ) at 2007-04-04 12:18 EDT Interesting ports on 192.168.1.1: PORT STATE SERVICE VERSION 1/tcp closed tcpmux 80/tcp open http Linksys wireless-G WAP http config (Name Icelink) MAC Address: 00:13:10:7D:06:C6 (Cisco-Linksys) Device type: general purpose|WAP|storage-misc Running: Linux 2.4.X, Linksys Linux 2.4.X, Asus Linux 2.4.X, Maxtor Linux 2.4.X OS details: Linux 2.4.20 - 2.4.32, Linux-based embedded device (Linksys WRT54GL WAP, Buffalo AirStation WLA-G54 WAP, Maxtor Shared Storage Drive, or Asus Wireless Storage Router) Uptime: 29.285 days (since Tue Mar 6 04:28:28 2007) Network Distance: 1 hop Service Info: Device: WAP OS and Service detection performed. Please report any incorrect results at http://insecure.org/nmap/submit/ . Nmap finished: 1 IP address (1 host up) scanned in 7.833 seconds
nmap
在拥有 root 权限的情况下变得更加强大;但是,出于安全原因,您不应该随意赋予 nmap
SUID 权限。您可以通过 sudo
特别允许用户运行 nmap
,但请注意,任何允许用户获得 root 权限的内容(SUID 位、sudo
等)都存在安全风险。
- 开关:
-O
-O
开关启用 nmap
操作系统检测。操作系统检测尝试使用目标 TCP/IP 堆栈的特征来指纹识别远程操作系统;通常它可以识别 Linux、Windows 和 BSD,并找到像 Windows NT/XP 或 95/98/ME 这样的一系列版本和家族。典型的操作系统检测扫描如下所示。
bluefox@ice-ldap:~$ sudo nmap -O 192.168.1.105 -P0 Starting Nmap 4.10 ( http://www.insecure.org/nmap/ ) at 2007-04-05 18:43 EDT Warning: OS detection will be MUCH less reliable because we did not find at least 1 open and 1 closed TCP port Interesting ports on 192.168.1.105: Not shown: 1677 filtered ports PORT STATE SERVICE 139/tcp open netbios-ssn 445/tcp open microsoft-ds MAC Address: 00:0C:76:96:A5:DC (Micro-star International CO.) Device type: general purpose Running: Microsoft Windows NT/2K/XP OS details: Microsoft Windows XP SP2 Nmap finished: 1 IP address (1 host up) scanned in 32.272 seconds
- 开关:
-sT
nmap
在所有情况下都允许进行 TCP connect() 扫描,无论是否具有管理权限;当您在没有 root 权限的情况下指定其他扫描类型时,nmap
会自动替换此扫描类型。
在这种扫描模式下,nmap
像 Web 浏览器或 FTP 客户端一样打开到端口的连接,并检查 TCP/IP 堆栈如何响应。以下结果来自此扫描
- open:
nmap
能够完成连接,然后关闭了端口。 - closed:
nmap
尝试连接,但收到错误信息,告知它端口已关闭(操作系统收到 RST 数据包)。 - filtered:
nmap
尝试连接,但操作系统给了它其他错误,例如主机或端口不可达或连接超时。
TCP connect() 扫描适用于所有权限级别,但执行速度可能很慢,并生成过多数据包。它们通常还会在目标上创建更多日志,并且可能导致编写得很差的服务崩溃。
- 开关:
-sS
nmap
TCP SYN 扫描 使用简单的 SYN 数据包连接到端口以确定其状态。nmap
在拥有原始套接字权限时默认使用此方法。
TCP SYN 扫描发送一个 SYN 数据包,就像打开连接一样,并检查结果。以下状态来自此测试
- open:
nmap
从主机上的该端口收到 SYN/ACK。nmap
不需要采取进一步的行动;操作系统没有连接记录,并使用 RST 响应 SYN/ACK,拆除目标上的连接。 - closed:
nmap
从主机上的该端口收到 RST。 - filtered:
nmap
收到其他内容或没有收到任何内容。
TCP SYN 扫描执行速度非常快,创建的日志更少,并且行为更隐蔽。
您也可以使用 nmap
穿透防火墙。nmap
可以执行扫描,这些扫描有助于确定防火墙是否使用有状态过滤;以及防火墙允许哪些端口通过。您可以使用它扫描防火墙后面的目标并发现防火墙规则,从而允许进行更具针对性的扫描,并可能规避防火墙日志记录。
- 开关:
-sA
不幸的是,如果您扫描通过某些 IPS 或 IDS 机器,您会从代理端口获得大量无用信息。这会造成一些小麻烦。我不得不修剪下面的输出,因为它包含数千行文本。我在下面隐藏了扫描的主机;我选择了一个互联网上的活动主机来扫描,因为我没有他们使用的 IPS 硬件。
Starting Nmap 4.10 ( http://www.insecure.org/nmap/ ) at 2007-04-01 16:14 EDT Stats: 0:00:02 elapsed; 0 hosts completed (1 up), 1 undergoing Connect() Scan Connect() Scan Timing: About 20.95% done; ETC: 16:14 (0:00:09 remaining) Interesting ports on %%% (%%%): Not shown: 861 closed ports PORT STATE SERVICE 2/tcp open compressnet 3/tcp open compressnet 7/tcp open echo 10/tcp open unknown 12/tcp open unknown 14/tcp open unknown 15/tcp open netstat 18/tcp open msp 19/tcp open chargen 20/tcp open ftp-data 21/tcp open ftp 25/tcp open smtp 27/tcp open nsw-fe 28/tcp open unknown 29/tcp open msg-icp 30/tcp open unknown 31/tcp open msg-auth 32/tcp open unknown 33/tcp open dsp 34/tcp open unknown 35/tcp open priv-print 38/tcp open rap 39/tcp open rlp 40/tcp open unknown 41/tcp open graphics 43/tcp open whois 47/tcp open ni-ftp 56/tcp open xns-auth 58/tcp open xns-mail 59/tcp open priv-file 60/tcp open unknown 64/tcp open covia 66/tcp open sql*net ..... 134/tcp open ingres-net 135/tcp filtered msrpc 136/tcp filtered profile 137/tcp filtered netbios-ns 138/tcp filtered netbios-dgm 139/tcp filtered netbios-ssn 141/tcp open emfis-cntl 143/tcp open imap 145/tcp open uaac 147/tcp open iso-ip 148/tcp open cronus 149/tcp open aed-512 150/tcp open sql-net 155/tcp open netsc-dev ..... 27001/tcp open flexlm1 27002/tcp open flexlm2 27005/tcp open flexlm5 27007/tcp open flexlm7 27008/tcp open flexlm8 27009/tcp open flexlm9 27010/tcp open flexlm10 27374/tcp open subseven 27665/tcp open Trinoo_Master 31337/tcp filtered Elite 32775/tcp open sometimes-rpc13 32777/tcp open sometimes-rpc17 32779/tcp open sometimes-rpc21 32787/tcp open sometimes-rpc27 38037/tcp open landesk-cba 43188/tcp open reachout 47557/tcp open dbbrowse 50000/tcp open iiimsf 54320/tcp open bo2k 61441/tcp open netprowler-sensor 65301/tcp open pcanywhere Nmap finished: 1 IP address (1 host up) scanned in 23.251 seconds
幸运的是,您可以执行隐形扫描来规避这种情况;不幸的是,隐形扫描花费的时间要长得多。通常,进行一次 礼貌 扫描就足够了,它每分钟只产生 150 个数据包。
~$ nmap -T polite %%%
-T
选项接受五个参数中的一个,按名称或编号给出。这些是
paranoid
(0) - 不进行并行扫描。发送数据包之间间隔 5 分钟。sneaky
(1) - 不进行并行扫描。发送数据包之间间隔 15 秒。polite
(2) - 不进行并行扫描。发送数据包之间间隔 0.4 秒。normal
(3) - 默认扫描。尝试在不超载网络的情况下快速完成扫描。aggressive
(4) - 比 normal 快,但会超载网络。insane
(5) - 并行扫描,在 15 分钟内超时主机,不会为单个探测等待超过 0.3 秒。丢失大量信息。
nmap
还提供选项来控制扫描超时。将这些与上述选项结合使用,可以实现更精细的扫描,例如每分钟执行 100 个数据包的扫描
~$ nmap -T sneaky --scan_delay 600
让我们再次尝试上面的扫描,这次礼貌地进行。
bluefox@icebox:~$ nmap -T polite Starting Nmap 4.20 ( http://insecure.org ) at 2007-04-02 19:52 EDT Interesting ports on %%% (%%%): Not shown: 1658 closed ports, 26 filtered ports PORT STATE SERVICE 21/tcp open ftp 25/tcp open smtp 80/tcp open http 110/tcp open pop3 143/tcp open imap 389/tcp open ldap 443/tcp open https 1026/tcp open LSA-or-nterm 1027/tcp open IIS 1433/tcp open ms-sql-s 3389/tcp open ms-term-serv 8000/tcp open http-alt 9999/tcp open abyss Nmap finished: 1 IP address (1 host up) scanned in 693.146 seconds
如我们所见,此扫描花费了 693 秒而不是 23 秒,是之前的 30 倍。
- nping 数据包生成、响应分析和响应时间测量