端口扫描是网络安全工作者的必备的利器, 通过对端口的扫描, 了解网站中出现的漏洞以及端口的开放情况, 对网站安全方面有着不可或缺的贡献, 目前在市面上主要的端口扫描工具是 X_ScanSuperScannmap, 其中在这里主推的是 nmap, 因为 nmap 具有以下的这一些优点:
1 多种多样的参数, 丰富的脚本库, 满足用户的个人定制需求, 其中脚本库还提供了很多强大的功能任你选择
2 强大的可移植性, 基本上能在所有的主流系统上运行, 而且代码是开源的
3 详细的文档说明, 和强大的社区团队进行支持, 方面新人上手
Nmap 是一款开源免费的网络发现 (Network Discovery) 和安全审计 (Security Auditing) 工具, 但是 nmap 也是有一些缺点的, 比如说上手较难, 但是难上手是相对的, 与其他达到这种功能性的软件产品相比, 还是比较容易上手的, 但是这也不妨碍 nmap 成为世界千万安全专家列为必备的工具之一. 直接从百度上下载 nmap, 然后安装的步骤跟其他的软件一样, 最后确认安装成功只需要在命令行中输入 nmap 回车, 有相关的参数输出即为安装成功.
当目标主机上使用了防火墙路由器代理服务或其它安全设备时, 使用 Nmap 扫描结果可能会存在一些偏差或者当扫描的远程目标主机不在本地网络内时, 也有可能会出现误导信息在使用 Nmap 实施扫描时, 一些选项需要提升权限在 Unix 和 Linux 系统中, 必须使用 root 登录或者使用 sudo 命令执行 Nmap 命令
在扫描互联网服务提供商网络时(如政府或秘密服务器网站), 如果没有被允许的话, 不要进行扫描否则, 会惹上法律麻烦全面扫描某些主机时, 可能会导致主机崩溃停机或数据丢失等不良结果所以, 在扫描关键任务时要小心谨慎
Nmap 可实现: 主机发现, 端口扫描, 服务和版本探测, OS 版本探测
Nmap 工具默认扫描前 1000 个端口, 即 1-1000 如果用户想扫描 1000 以上端口的话, 需要使用 - p 选项来指定
目标说明
-iL
主机发现:
(默认: ICMP,SYN,ACK,UDP Ping)
-sL: 列表扫描, 列表扫描是主机发现的退化形式, 它仅仅列出指定网络上的每台主机, 不发送任何报文到目标主机
-sP: Ping 扫描, 该选项告诉 Nmap 仅仅 进行 ping 扫描 (主机发现), 然后打印出对扫描做出响应的那些主机它可以很方便地得出 网络上有多少机器正在运行或者监视服务器是否正常运行常常有人称它为 地毯式 ping
-P0 (无 ping)
该选项完全跳过 Nmap 发现阶段 通常 Nmap 在进行高强度的扫描时用它确定正在运行的机器 默认情况下, Nmap 只对正在运行的主机进行高强度的探测如 端口扫描, 版本探测, 或者操作系统探测用 - P0 禁止 主机发现会使 Nmap 对每一个指定的目标 IP 地址 进行所要求的扫描所以如果在命令行指定一个 B 类目标地址空间(/16), 所有 65,536 个 IP 地址都会被扫描 -P0 的第二个字符是数字 0 而不是字母 O 和列表扫描一样, 跳过正常的主机发现, 但不是打印一个目标列表, 而是继续执行所要求的功能, 就好像每个 IP 都是活动的
-PS [portlist] (TCP SYN Ping)
该选项发送一个设置了 SYN 标志位的空 TCP 报文 默认目的端口为 80 (可以通过改变 nmap.h) 文件中的 DEFAULT-TCP-PROBE-PORT 值进行配置, 但不同的端口也可以作为选项指定 甚至可以指定一个以逗号分隔的端口列表(如 -PS22,23,25,80,113,1050,35000), 在这种情况下, 每个端口会被并发地扫描
SYN 标志位告诉对方您正试图建立一个连接 通常目标端口是关闭的, 一个 RST (复位) 包会发回来 如果碰巧端口是开放的, 目标会进行 TCP 三步握手的第二步, 回应 一个 SYN/ACK TCP 报文然后运行 Nmap 的机器则会扼杀这个正在建立的连接, 发送一个 RST 而非 ACK 报文, 否则, 一个完全的连接将会建立 RST 报文是运行 Nmap 的机器而不是 Nmap 本身响应的, 因为它对收到 的 SYN/ACK 感到很意外
Nmap 并不关心端口开放还是关闭 无论 RST 还是 SYN/ACK 响应都告诉 Nmap 该主机正在运行
在 UNIX 机器上, 通常只有特权用户 root 能否发送和接收 原始的 TCP 报文因此作为一个变通的方法, 对于非特权用户, Nmap 会为每个目标主机进行系统调用 connect(), 它也会发送一个 SYN 报文来尝试建立连接如果 connect()迅速返回成功或者一个 ECONNREFUSED 失败, 下面的 TCP 堆栈一定已经收到了一个 SYN/ACK 或者 RST, 该主机将被 标志位为在运行 如果连接超时了, 该主机就标志位为 down 掉了这种方法也用于 IPv6 连接, 因为 Nmap 目前还不支持原始的 IPv6 报文
-PA [portlist] (TCP ACK Ping)
TCP ACK ping 和刚才讨论的 SYN ping 相当类似 也许您已经猜到了, 区别就是设置 TCP 的 ACK 标志位而不是 SYN 标志位 ACK 报文表示确认一个建立连接的尝试, 但该连接尚未完全建立 所以远程主机应该总是回应一个 RST 报文, 因为它们并没有发出过连接请求到运行 Nmap 的机器, 如果它们正在运行的话
-PA 选项使用和 SYN 探测相同的默认端口 (80), 也可以 用相同的格式指定目标端口列表如果非特权用户尝试该功能, 或者指定的是 IPv6 目标, 前面说过的 connect() 方法将被使用 这个方法并不完美, 因为它实际上发送的是 SYN 报文, 而不是 ACK 报文
提供 SYN 和 ACK 两种 ping 探测的原因是使通过防火墙的机会尽可能大 许多管理员会配置他们的路由器或者其它简单的防火墙来封锁 SYN 报文, 除非 连接目标是那些公开的服务器像公司网站或者邮件服务器 这可以阻止其它进入组织的连接, 同时也允许用户访问互联网 这种无状态的方法几乎不占用防火墙 / 路由器的资源, 因而被硬件和软件过滤器 广泛支持 Linux Netfilter/iptables 防火墙软件提供方便的 --syn 选项来实现这种无状态的方法 当这样的无状态防火墙规则存在时, 发送到关闭目标端口的 SYN ping 探测 (-PS) 很可能被封锁这种情况下, ACK 探测格外有闪光点, 因为它正好利用了 这样的规则
另外一种常用的防火墙用有状态的规则来封锁非预期的报文 这一特性已开始只存在于高端防火墙, 但是这些年类它越来越普遍了 Linux Netfilter/iptables 通过 --state 选项支持这一特性, 它根据连接状态把报文 进行分类 SYN 探测更有可能用于这样的系统, 由于没头没脑的 ACK 报文 通常会被识别成伪造的而丢弃解决这个两难的方法是通过即指定 -PS 又指定 - PA 来即发送 SYN 又发送 ACK
-PU [portlist] (UDP Ping)
还有一个主机发现的选项是 UDP ping, 它发送一个空的(除非指定了 --data-length UDP 报文到给定的端口端口列表的格式和前面讨论过的 - PS 和 - PA 选项还是一样 如果不指定端口, 默认是 31338 该默认值可以通过在编译时改变 nmap.h 文件中的 DEFAULT-UDP-PROBE-PORT 值进行配置默认使用这样一个奇怪的端口是因为对开放端口 进行这种扫描一般都不受欢迎
如果目标机器的端口是关闭的, UDP 探测应该马上得到一个 ICMP 端口无法到达的回应报文 这对于 Nmap 意味着该机器正在运行 许多其它类型的 ICMP 错误, 像主机 / 网络无法到达或者 TTL 超时则表示 down 掉的或者不可到达的主机 没有回应也被这样解释如果到达一个开放的端口, 大部分服务仅仅忽略这个 空报文而不做任何回应这就是为什么默认探测端口是 31338 这样一个 极不可能被使用的端口少数服务如 chargen 会响应一个空的 UDP 报文, 从而向 Nmap 表明该机器正在运行
该扫描类型的主要优势是它可以穿越只过滤 TCP 的防火墙和过滤器 例如我曾经有过一个 Linksys BEFW11S4 无线宽带路由器默认情况下, 该设备对外的网卡过滤所有 TCP 端口, 但 UDP 探测仍然会引发一个端口不可到达 的消息, 从而暴露了它自己
-PE; -PP; -PM (ICMP Ping Types)
除了前面讨论的这些不常见的 TCP 和 UDP 主机发现类型, Nmap 也能发送世人皆知的 ping 程序所发送的报文 Nmap 发送一个 ICMP type 8 (回声请求)报文到目标 IP 地址, 期待从运行的主机得到一个 type 0 (回声响应)报文 对于网络探索者而言, 不幸的是, 许多主机和 防火墙现在封锁这些报文, 而不是按期望的那样响应, 参见 RFC 1122 因此, 仅仅 ICMP 扫描对于互联网上的目标通常是不够的 但对于系统管理员监视一个内部网络, 它们可能是实际有效的途径 使用 - PE 选项打开该回声请求功能
虽然回声请求是标准的 ICMP ping 查询, Nmap 并不止于此 ICMP 标准 (RFC 792)还规范了时间戳请求, 信息请求 request, 和地址掩码请求, 它们的代码分别是 13,15 和 17 虽然这些查询的表面目的是获取信息如地址掩码和当前时间, 它们也可以很容易地用于主机发现 很简单, 回应的系统就是在运行的系统 Nmap 目前没有实现信息请求报文, 因为它们还没有被广泛支持 RFC 1122 坚持 主机不应该实现这些消息 时间戳和地址掩码查询可以分别用 - PP 和 - PM 选项发送 时间戳响应 (ICMP 代码 14) 或者地址掩码响应 (代码 18) 表示主机在运行 当管理员特别封锁了回声请求报文而忘了其它 ICMP 查询可能用于 相同目的时, 这两个查询可能很有价值
-PR (ARP Ping)
最常见的 Nmap 使用场景之一是扫描一个以太局域网 在大部分局域网上, 特别是那些使用基于 RFC1918 私有地址范围的网络, 在一个给定的时间绝大部分 IP 地址都是不使用的 当 Nmap 试图发送一个原始 IP 报文如 ICMP 回声请求时, 操作系统必须确定对应于目标 IP 的硬件 地址(ARP), 这样它才能把以太帧送往正确的地址 这一般比较慢而且会有些问题, 因为操作系统设计者认为一般不会在短时间内 对没有运行的机器作几百万次的 ARP 请求
当进行 ARP 扫描时, Nmap 用它优化的算法管理 ARP 请求 当它收到响应时, Nmap 甚至不需要担心基于 IP 的 ping 报文, 既然它已经知道该主机正在运行了 这使得 ARP 扫描比基于 IP 的扫描更快更可靠 所以默认情况下, 如果 Nmap 发现目标主机就在它所在的局域网上, 它会进行 ARP 扫描 即使指定了不同的 ping 类型(如 -PI 或者 -PS) ,Nmap 也会对任何相同局域网上的目标机使用 ARP 如果您真的不想要 ARP 扫描, 指定 --send-ip
-n (不用域名解析)
告诉 Nmap 永不对它发现的活动 IP 地址进行反向域名解析 既然 DNS 一般比较慢, 这可以让事情更快些
-R (为所有目标解析域名)
告诉 Nmap 永远 对目标 IP 地址作反向域名解析 一般只有当发现机器正在运行时才进行这项操作
--system-dns (使用系统域名解析器)
默认情况下, Nmap 通过直接发送查询到您的主机上配置的域名服务器 来解析域名为了提高性能, 许多请求 (一般几十个 ) 并发执行如果您希望使用系统自带的解析器, 就指定该选项 (通过 getnameinfo()调用一次解析一个 IP)除非 Nmap 的 DNS 代码有 bug-- 如果是这样, 请联系我们 一般不使用该选项, 因为它慢多了系统解析器总是用于 IPv6 扫描
端口扫描基础
许多传统的端口扫描器只列出所有端口是开放还是关闭的, Nmap 的信息粒度比它们要细得多 它把端口分成六个状态: open(开放的), closed(关闭的),filtered(被过滤的), unfiltered(未被过滤的), open|filtered(开放或者被过滤的), 或者 closed|filtered(关闭或者被过滤的)
Nmap 所识别的 6 个端口状态
open(开放的)
应用程序正在该端口接收 TCP 连接或者 UDP 报文发现这一点常常是端口扫描 的主要目标安全意识强的人们知道每个开放的端口 都是攻击的入口攻击者或者入侵测试者想要发现开放的端口 而管理员则试图关闭它们或者用防火墙保护它们以免妨碍了合法用户 非安全扫描可能对开放的端口也感兴趣, 因为它们显示了网络上那些服务可供使用
closed(关闭的)
关闭的端口对于 Nmap 也是可访问的 (它接受 Nmap 的探测报文并作出响应), 但没有应用程序在其上监听 它们可以显示该 IP 地址上(主机发现, 或者 ping 扫描) 的主机正在运行 up 也对部分操作系统探测有所帮助 因为关闭的关口是可访问的, 也许过会儿值得再扫描一下, 可能一些又开放了 系统管理员可能会考虑用防火墙封锁这样的端口 那样他们就会被显示为被过滤的状态, 下面讨论
filtered(被过滤的)
由于包过滤阻止探测报文到达端口, Nmap 无法确定该端口是否开放过滤可能来自专业的防火墙设备, 路由器规则 或者主机上的软件防火墙这样的端口让攻击者感觉很挫折, 因为它们几乎不提供 任何信息有时候它们响应 ICMP 错误消息如类型 3 代码 13 (无法到达目标: 通信被管理员禁止), 但更普遍的是过滤器只是丢弃探测帧, 不做任何响应 这迫使 Nmap 重试若干次以访万一探测包是由于网络阻塞丢弃的 这使得扫描速度明显变慢
unfiltered(未被过滤的)
未被过滤状态意味着端口可访问, 但 Nmap 不能确定它是开放还是关闭 只有用于映射防火墙规则集的 ACK 扫描才会把端口分类到这种状态 用其它类型的扫描如窗口扫描, SYN 扫描, 或者 FIN 扫描来扫描未被过滤的端口可以帮助确定 端口是否开放
open|filtered(开放或者被过滤的)
当无法确定端口是开放还是被过滤的, Nmap 就把该端口划分成 这种状态开放的端口不响应就是一个例子没有响应也可能意味着报文过滤器丢弃 了探测报文或者它引发的任何响应因此 Nmap 无法确定该端口是开放的还是被过滤的 UDP,IP 协议, FIN,Null, 和 Xmas 扫描可能把端口归入此类
closed|filtered(关闭或者被过滤的)
该状态用于 Nmap 不能确定端口是关闭的还是被过滤的 它只可能出现在 IPID Idle 扫描中
端口端口一般是有下面这几种状态的
如果 Nmap 报告状态组合 open|filtered 和 closed|filtered 时, 那说明 Nmap 无法确定该端口处于两个状态中的哪一个状态
端口扫描技术
-sS (TCP SYN 扫描)
SYN 扫描作为默认的也是最受欢迎的扫描选项, 是有充分理由的 它执行得很快, 在一个没有入侵防火墙的快速网络上, 每秒钟可以扫描数千个 端口 SYN 扫描相对来说不张扬, 不易被注意到, 因为它从来不完成 TCP 连接 它也不像 Fin/Null/Xmas,Maimon 和 Idle 扫描依赖于特定平台, 而可以应对任何兼容的 TCP 协议栈 它还可以明确可靠地区分 open(开放的), closed(关闭的), 和 filtered(被过滤的) 状态
它常常被称为半开放扫描, 因为它不打开一个完全的 TCP 连接它发送一个 SYN 报文, 就像您真的要打开一个连接, 然后等待响应 SYN/ACK 表示端口在监听 (开放), 而 RST (复位)表示没有监听者如果数次重发后仍没响应, 该端口就被标记为被过滤如果收到 ICMP 不可到达错误 (类型 3, 代码 1,2,3,9,10, 或者 13), 该端口也被标记为被过滤
-sT (TCP connect()扫描)
当 SYN 扫描不能用时, CP Connect()扫描就是默认的 TCP 扫描 当用户没有权限发送原始报文或者扫描 IPv6 网络时, 就是这种情况 Instead of writing raw packets as most other scan types do,Nmap 通过创建 connect() 系统调用要求操作系统和目标机以及端口建立连接, 而不像其它扫描类型直接发送原始报文 这是和 Web 浏览器, P2P 客户端以及大多数其它网络应用程序用以建立连接一样的 高层系统调用它是叫做 Berkeley Sockets API 编程接口的一部分 Nmap 用 该 API 获得每个连接尝试的状态信息, 而不是读取响应的原始报文
当 SYN 扫描可用时, 它通常是更好的选择因为 Nmap 对高层的 connect()调用比对原始报文控制更少, 所以前者效率较低 该系统调用完全连接到开放的目标端口而不是像 SYN 扫描进行 半开放的复位这不仅花更长时间, 需要更多报文得到同样信息, 目标机也更可能 记录下连接 IDS(入侵检测系统)可以捕获两者, 但大部分机器没有这样的警报系统 当 Nmap 连接, 然后不发送数据又关闭连接, 许多普通 UNIX 系统上的服务会在 syslog 留下记录, 有时候是一条加密的错误消息 此时, 有些真正可怜的服务会崩溃, 虽然这不常发生如果管理员在日志里看到来自同一系统的 一堆连接尝试, 她应该知道她的系统被扫描了
-sU (UDP 扫描)
虽然互联网上很多流行的服务运行在 TCP 协议上, UDP 服务也不少 DNS,SNMP, 和 DHCP (注册的端口是 53,161/162, 和 67/68)是最常见的三个 因为 UDP 扫描一般较慢, 比 TCP 更困难, 一些安全审核人员忽略这些端口 这是一个错误, 因为可探测的 UDP 服务相当普遍, 攻击者当然不会忽略整个协议 所幸, Nmap 可以帮助记录并报告 UDP 端口
UDP 扫描用 - sU 选项激活它可以和 TCP 扫描如 SYN 扫描 (-sS)结合使用来同时检查两种协议
UDP 扫描发送空的 (没有数据)UDP 报头到每个目标端口 如果返回 ICMP 端口不可到达错误(类型 3, 代码 3), 该端口是 closed(关闭的) 其它 ICMP 不可到达错误(类型 3, 代码 1,2,9,10, 或者 13) 表明该端口是 filtered(被过滤的) 偶尔地, 某服务会响应一个 UDP 报文, 证明该端口是 open(开放的) 如果几次重试后还没有响应, 该端口就被认为是 open|filtered(开放 | 被过滤的) 这意味着该端口可能是开放的, 也可能包过滤器正在封锁通信 可以用版本扫描 (-sV) 帮助区分真正的开放端口和被过滤的端口
UDP 扫描的巨大挑战是怎样使它更快速 开放的和被过滤的端口很少响应, 让 Nmap 超时然后再探测, 以防探测帧或者 响应丢失关闭的端口常常是更大的问题 它们一般发回一个 ICMP 端口无法到达错误但是不像关闭的 TCP 端口响应 SYN 或者 Connect 扫描所发送的 RST 报文, 许多主机在默认情况下限制 ICMP 端口不可到达消息 Linux 和 Solaris 对此特别严格例如, Linux 2.4.20 内核限制一秒钟只发送一条目标不可到达消息 (见 net/ipv4/icmpc)
Nmap 探测速率限制并相应地减慢来避免用那些目标机会丢弃的无用报文来阻塞 网络不幸的是, Linux 式的一秒钟一个报文的限制使 65,536 个端口的扫描要花 18 小时以上加速 UDP 扫描的方法包括并发扫描更多的主机, 先只对主要端口进行快速 扫描, 从防火墙后面扫描, 使用 --host-timeout 跳过慢速的 主机
-sN; -sF; -sX (TCP Null,FIN,and Xmas 扫描)
这三种扫描类型 (甚至用下一节描述的 --scanflags 选项的更多类型) 在 TCP RFC 中发掘了一个微妙的方法来区分 open(开放的)和 closed(关闭的)端口第 65 页说如果 [目标]端口状态是关闭的.... 进入的不含 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), 该端口就被标记为 被过滤的
这些扫描的关键优势是它们能躲过一些无状态防火墙和报文过滤路由器 另一个优势是这些扫描类型甚至比 SYN 扫描还要隐秘一些但是别依赖它 -- 多数 现代的 IDS 产品可以发现它们一个很大的不足是并非所有系统都严格遵循 RFC 793 许多系统不管端口开放还是关闭, 都响应 RST 这导致所有端口都标记为 closed(关闭的) 这样的操作系统主要有 Microsoft Windows, 许多 Cisco 设备, BSDI, 以及 IBM OS/400 但是这种扫描对多数 UNIX 系统都能工作这些扫描的另一个不足是 它们不能辨别 open(开放的)端口和一些特定的 filtered(被过滤的)端口, 从而返回 open|filtered(开放或者被过滤的)
-sA (TCP ACK 扫描)
这种扫描与目前为止讨论的其它扫描的不同之处在于 它不能确定 open(开放的)或者 open|filtered(开放或者过滤的))端口 它用于发现防火墙规则, 确定它们是有状态的还是无状态的, 哪些端口是被过滤的
ACK 扫描探测报文只设置 ACK 标志位 (除非您使用 --scanflags) 当扫描未被过滤的系统时, open(开放的)和 closed(关闭的) 端口 都会返回 RST 报文 Nmap 把它们标记为 unfiltered(未被过滤的), 意思是 ACK 报文不能到达, 但至于它们是 open(开放的)或者 closed(关闭的) 无法确定不响应的端口 或者发送特定的 ICMP 错误消息 (类型 3, 代号 1,2,3,9,10, 或者 13) 的端口, 标记为 filtered(被过滤的)
-sW (TCP 窗口扫描)
除了利用特定系统的实现细节来区分开放端口和关闭端口, 当收到 RST 时不总是打印 unfiltered, 窗口扫描和 ACK 扫描完全一样 它通过检查返回的 RST 报文的 TCP 窗口域做到这一点 在某些系统上, 开放端口用正数表示窗口大小(甚至对于 RST 报文) 而关闭端口的窗口大小为 0 因此, 当收到 RST 时, 窗口扫描不总是把端口标记为 unfiltered, 而是根据 TCP 窗口值是正数还是 0, 分别把端口标记为 open 或者 closed
该扫描依赖于互联网上少数系统的实现细节, 因此您不能永远相信它不支持它的系统会通常返回所有端口 closed 当然, 一台机器没有开放端口也是有可能的 如果大部分被扫描的端口是 closed, 而一些常见的端口 (如 22, 25,53) 是 filtered, 该系统就非常可疑了 偶尔地, 系统甚至会显示恰恰相反的行为 如果您的扫描显示 1000 个开放的端口和 3 个关闭的或者被过滤的端口, 那么那 3 个很可能也是开放的端口
-sM (TCP Maimon 扫描)
Maimon 扫描是用它的发现者 Uriel Maimon 命名的他在 Phrack Magazine issue #49 (November 1996)中描述了这一技术 Nmap 在两期后加入了这一技术 这项技术和 Null,FIN, 以及 Xmas 扫描完全一样, 除了探测报文是 FIN/ACK 根据 RFC 793 (TCP), 无论端口开放或者关闭, 都应该对这样的探测响应 RST 报文 然而, Uriel 注意到如果端口开放, 许多基于 BSD 的系统只是丢弃该探测报文
--scanflags (定制的 TCP 扫描)
真正的 Nmap 高级用户不需要被这些现成的扫描类型束缚 --scanflags 选项允许您通过指定任意 TCP 标志位来设计您自己的扫描 让您的创造力流动, 躲开那些仅靠本手册添加规则的入侵检测系统!
--scanflags 选项可以是一个数字标记值如 9 (PSH 和 FIN), 但使用字符名更容易些 只要是 URG, ACK,PSH, RST,SYN,and FIN 的任何组合就行例如,--scanflags URGACKPSHRSTSYNFIN 设置了所有标志位, 但是这对扫描没有太大用处 标志位的顺序不重要
除了设置需要的标志位, 您也可以设置 TCP 扫描类型(如 - sA 或者 - sF) 那个基本类型告诉 Nmap 怎样解释响应例如, SYN 扫描认为没有响应意味着 filtered 端口, 而 FIN 扫描则认为是 open|filtered 除了使用您指定的 TCP 标记位, Nmap 会和基本扫描类型一样工作 如果您不指定基本类型, 就使用 SYN 扫描
-sI
除了极端隐蔽 (由于它不从真实 IP 地址发送任何报文), 该扫描类型可以建立机器间的基于 IP 的信任关系 端口列表从 zombie 主机的角度显示开放的端口 因此您可以尝试用您认为(通过路由器 / 包过滤规则) 可能被信任的 zombies 扫描目标
如果您由于 IPID 改变希望探测 zombie 上的特定端口, 您可以在 zombie 主机后加上一个冒号和端口号 否则 Nmap 会使用默认端口(80)
-sO (IP 协议扫描)
IP 协议扫描可以让您确定目标机支持哪些 IP 协议 (TCP,ICMP,IGMP, 等等)从技术上说, 这不是端口扫描 , 既然它遍历的是 IP 协议号而不是 TCP 或者 UDP 端口号 但是它仍使用 -p 选项选择要扫描的协议号, 用正常的端口表格式报告结果, 甚至用和真正的端口扫描一样 的扫描引擎因此它和端口扫描非常接近, 也被放在这里讨论
除了本身很有用, 协议扫描还显示了开源软件的力量 尽管基本想法非常简单, 我过去从没想过增加这一功能也没收到任何对它的请求 在 2000 年夏天, Gerhard Rieger 孕育了这个想法, 写了一个很棒的补丁程序, 发送到 nmap-hackers 邮件列表 我把那个补丁加入了 Nmap, 第二天发布了新版本 几乎没有商业软件会有用户有足够的热情设计并贡献他们的改进
协议扫描以和 UDP 扫描类似的方式工作它不是在 UDP 报文的端口域上循环, 而是在 IP 协议域的 8 位上循环, 发送 IP 报文头 报文头通常是空的, 不包含数据, 甚至不包含所申明的协议的正确报文头 TCP,UDP, 和 ICMP 是三个例外它们三个会使用正常的协议头, 因为否则某些系 统拒绝发送, 而且 Nmap 有函数创建它们协议扫描不是注意 ICMP 端口不可到达消息, 而是 ICMP 协议不可到达消息如果 Nmap 从目标主机收到 任何协议的任何响应, Nmap 就把那个协议标记为 open ICMP 协议不可到达 错误 (类型 3, 代号 2) 导致协议被标记为 closed 其它 ICMP 不可到达协议(类型 3, 代号 1,3,9,10, 或者 13) 导致协议被标记为 filtered (虽然同时他们证明 ICMP 是 open ) 如果重试之后仍没有收到响应, 该协议就被标记为 open|filtered
-b
当 Nmap1997 年发布时, 这个弱点被广泛利用, 但现在大部分已经被 fix 了 脆弱的服务器仍然存在, 所以如果其它都失败了, 这也值得一试 如果您的目标是绕过防火墙, 扫描目标网络上的开放的 21 端口 (或者 甚至任何 ftp 服务, 如果您用版本探测扫描所有端口), 然后对每个尝试弹跳扫描 Nmap 会告诉您该主机脆弱与否 如果您只是试着玩 Nmap, 您不必(事实上, 不应该) 限制您自己 在您随机地在互联网上寻找脆弱的 FTP 服务器时, 考虑一下系统管理员不太喜欢您这样滥用他们的服务器
端口说明和扫描顺序
Nmap 提供选项说明那些端口被扫描以及扫描是随机还是顺序进行 默认情况下, Nmap 用指定的协议对端口 1 到 1024 以及 nmap-services 文件中列出的更高的端口在扫描
-p
当既扫描 TCP 端口又扫描 UDP 端口时, 您可以通过在端口号前加上 T: 或者 U: 指定协议 协议限定符一直有效您直到指定另一个 例如, 参数 -p U:53,111,137,T:21-25,80,139,8080 将扫描 UDP 端口 53,111, 和 137, 同时扫描列出的 TCP 端口注意, 要既扫描 UDP 又扫描 TCP, 您必须指定 -sU , 以及至少一个 TCP 扫描类型 (如 -sS,-sF, 或者 -sT) 如果没有给定协议限定符, 端口号会被加到所有协议列表
-F (快速 (有限的端口) 扫描)
在 nmap 的 nmap-services 文件中 (对于 - sO, 是协议文件) 指定您想要扫描的端口 这比扫描所有 65535 个端口快得多 因为该列表包含如此多的 TCP 端口 (1200 多), 这和默认的 TCP 扫描 scan (大约 1600 个端口) 速度差别不是很大如果您用 --datadir 选项指定您自己的 小小的 nmap-services 文件 , 差别会很惊人
-r (不要按随机顺序扫描端口)
默认情况下, Nmap 按随机顺序扫描端口 (除了出于效率的考虑, 常用的端口前移)这种随机化通常都是受欢迎的, 但您也可以指定 - r 来顺序端口扫描
服务和版本探测
Nmap 试图确定服务协议 (如 ftp,ssh,telnet,http), 应用程序名 (如 ISC Bind,Apache httpd,Solaris telnetd), 版本号, 主机名, 设备类型(如 打印机, 路由器), 操作系统家族 (如 Windows,Linux) 以及其它的细节, 如 如是否可以连接 X server,SSH 协议版本 , 或者 KaZaA 用户名)当然, 并非所有服务都提供所有这些信息
-sV (版本探测)
打开版本探测 您也可以用 - A 同时打开操作系统探测和版本探测
--allports (不为版本探测排除任何端口)
默认情况下, Nmap 版本探测会跳过 9100 TCP 端口, 因为一些打印机简单地打印送到该端口的 任何数据, 这回导致数十页 HTTP get 请求, 二进制 SSL 会话请求等等被打印出来这一行为可以通过修改或删除 nmap-service-probes 中的 Exclude 指示符改变, 您也可以不理会任何 Exclude 指示符, 指定 --allports 扫描所有端口
- --version-intensity
- --version-light (打开轻量级模式)
这是 --version-intensity 2 的方便的别名轻量级模式使 版本扫描快许多, 但它识别服务的可能性也略微小一点
--version-all (尝试每个探测)
--version-intensity 9 的别名, 保证对每个端口尝试每个探测报文
--version-trace (跟踪版本扫描活动)
这导致 Nmap 打印出详细的关于正在进行的扫描的调试信息 它是您用 --packet-trace 所得到的信息的子集
-sR (RPC 扫描)
这种方法和许多端口扫描方法联合使用 它对所有被发现开放的 TCP/UDP 端口执行 SunRPC 程序 NULL 命令, 来试图 确定它们是否 RPC 端口, 如果是, 是什么程序和版本号因此您可以有效地获得和 rpcinfo -p 一样的信息, 即使目标的端口映射在防火墙后面 (或者被 TCP 包装器保护)Decoys 目前不能和 RPC scan 一起工作 这作为版本扫描(-sV) 的一部分自动打开 由于版本探测包括它并且全面得多,-sR 很少被需要
操作系统探测
Nmap 采用 TCP/IP 协议栈 fingerprinting 进行远程操作系统探测 Nmap 发送一系列 TCP 和 UDP 报文到远程主机, 检查响应中的每一个比特, 把结果和数据库 nmap-os-fingerprints 中超过 1500 个已知的操作系统的 fingerprints 进行比较, 如果有匹配, 就打印出操作系统的详细信息 每个 fingerprint 包括一个自由格式的关于 OS 的描述文本, 和一个分类信息, 它提供供应商名称(如 Sun), 下面的操作系统(如 Solaris),OS 版本(如 10), 和设备类型(通用设备, 路由器, switch, 游戏控制台, 等)
-O (启用操作系统检测)
也可以使用 - A 来同时启用操作系统检测和版本检测
--osscan-limit (针对指定的目标进行操作系统检测)
如果发现一个打开和关闭的 TCP 端口时, 操作系统检测会更有效 采用这个选项, Nmap 只对满足这个条件的主机进行操作系统检测, 这样可以 节约时间, 特别在使用 - P0 扫描多个主机时这个选项仅在使用 -O 或 - A 进行操作系统检测时起作用
--osscan-guess; --fuzzy (推测操作系统检测结果)
当 Nmap 无法确定所检测的操作系统时, 会尽可能地提供最相近的匹配, Nmap 默认 进行这种匹配, 使用上述任一个选项使得 Nmap 的推测更加有效
防火墙 / IDS 躲避和哄骗
-f (报文分段); --mtu (使用指定的 MTU)
-f 选项要求扫描时 (包挺 ping 扫描) 使用 小的 IP 包分段其思路是将 TCP 头分段在几个包中, 使得包过滤器 IDS 以及其它工具的检测更加困难必须小心使用这个选项, 有些系 统在处理这些小包时存在问题, 例如旧的网络嗅探器 Sniffit 在接收 到第一个分段时会立刻出现分段错误该选项使用一次, Nmap 在 IP 头后将包分成 8 个字节或更小因此, 一个 20 字节的 TCP 头会被分成 3 个 包, 其中 2 个包分别有 TCP 头的 8 个字节, 另 1 个包有 TCP 头的剩下 4 个字 节当然, 每个包都有一个 IP 头再次使用 - f 可使用 16 字节的分段 (减少分段数量) 使用 --mtu 选项可 以自定义偏移的大小, 使用时不需要 - f, 偏移量必须 是 8 的倍数包过滤器和防火墙对所有的 IP 分段排队, 如 Linux 核心中的 CONFIG-IP-ALWAYS-DEFRAG 配置项, 分段包不会直接使用一些网络无法 承受这样所带来的性能冲击, 会将这个配置禁止其它禁止的原因有分段 包会通过不同的路由进入网络一些源系统在内核中对发送的报文进行 分段, 使用 iptables 连接跟踪模块的 Linux 就是一个例子当使用类似 Ethereal 的嗅探器时, 扫描必须保证发送的报文要分段如果主机操作系统会产 生问题, 尝试使用 --send-eth 选项以避开 IP 层而直接 发送原始的以太网帧
-D
使用逗号分隔每个诱饵主机, 也可用自己的真实 IP 作为诱饵, 这时可使用 ME 选项说明如果在第 6 个位置或 更后的位置使用 ME 选项, 一些常用 端口扫描检测器 (如 Solar Designers excellent scanlogd) 就不会报告 这个真实 IP 如果不使用 ME 选项, Nmap 将真实 IP 放在一个随机的位置
注意, 作为诱饵的主机须在工作状态, 否则会导致目标主机的 SYN 洪水攻击 如果在网络中只有一个主机在工作, 那就很容易确定哪个主机在扫描也可 使用 IP 地址代替主机名(被诱骗的网络就不可能在名字服务器日志中发现)
诱饵可用在初始的 ping 扫描 (ICMPSYNACK 等) 阶段或真正的端口扫描 阶段诱饵也可以用于远程操作系统检测 (-O) 在进行版 本检测或 TCP 连接扫描时, 诱饵无效
使用过多的诱饵没有任何价值, 反而导致扫描变慢并且结果不准确 此外, 一些 ISP 会过滤哄骗的报文, 但很多对欺骗 IP 包没有任何限制
-S
这个标志的另一个用处是哄骗性的扫描, 使得目标认为是另 一个地址在进行扫描可以想象某一个竞争对手在不断扫描某个公司! -e 选项常在这种情况下使用, 也可采用 - P0 选项
-e
--source-port
对这些问题有安全解决方案, 通常是应用级代理或协议分析防火墙模块 但也存在一些不安全的方案注意到 DNS 响应来自于 53 端口, FTP 连接 来自于 20 端口, 很多管理员会掉入一个陷阱, 即允许来自于这些端口的数据进入 网络他们认为这些端口里不会有值得注意的攻击和漏洞利用此外, 管理员 或许认为这是一个短期的措施, 直至他们采取更安全的方案但他们忽视了安全的 升级
不仅仅是工作量过多的网络管理员掉入这种陷阱, 很多产品本身也会有这类 不安全的隐患, 甚至是微软的产品 Windows 2000 和 Windows XP 中包含的 IPsec 过滤 器也包含了一些隐含规则, 允许所有来自 88 端口 (Kerberos) 的 TCP 和 UDP 数据流另 一个常见的例子是 Zone Alarm 个人防火墙到 2.1.25 版本仍然允许源端口 53(DNS)或 67(DHCP)的 UDP 包进入
Nmap 提供了 - g 和 --source-port 选项(它们是 等价的), 用于利用上述弱点只需要提供一个端口号, Nmap 就可以从这些 端口发送数据为使特定的操作系统正常工作, Nmap 必须使用不同的端口号 DNS 请求会忽略 --source-port 选项, 这是因为 Nmap 依靠系 统库来处理大部分 TCP 扫描, 包括 SYN 扫描, 可以完全支持这些选项, UDP 扫 描同样如此
- --data-length
- --ttl
- --randomize-hosts (对目标主机的顺序随机排列)
告诉 Nmap 在扫描主机前对每个组中的主机随机排列, 最多可达 8096 个主机这会使得扫描针对不同的网络监控系统来说变得不是很 明显, 特别是配合值较小的时间选项时更有效如果需要对一个较大 的组进行随机排列, 需要增大 nmap.h 文件中 PING-GROUP-SZ 的值, 并重新编译另一种方法是使用列表扫描 (-sL -n -oN
--spoof-mac
输出
Nmap 提供 5 种不同的输出格式, 其中 XML 输出是最重要的输出类型, 可被转换成 HTML, 对于程序处理非常方便, 如用于 Nmap 图形用户接口或导入数据库除了提供输出格式外, Nmap 还提供了选项来控制输出的细节以及调试信息输出内容可发送给标准输出或命名文件, 可以追加或覆盖输出文件还可被用于继续中断的扫描
-oN
-oX
XML 提供了可供软件解析的稳定格式输出, 主要的计算机 语言都提供了免费的 XML 解析器, 如 C/C++,Perl,Python 和 Java 针对这些语言有一些捆绑代码用于处理 Nmap 的输出和特定的执行程序 例如 perl CPAN 中的 Nmap::Scanner 和 Nmap::Parser 对几乎所有与 Nmap 有接口的主要应用来说, XML 是首选的格式
XML 输出引用了一个 XSL 样式表, 用于格式化输出结果, 类似于 HTML 最方便的方法是将 XML 输出加载到一个 Web 浏览器, 如 Firefox 或 IE 由于 nmap.xsl 文件的绝对 路径, 因此通常只能在运行了 Nmap 的机器上工作(或类似配置的机器) 类似于任何支持 Web 机器的 HTML 文件,--stylesheet 选项可用于建立可移植的 XML 文件
-oS
-oG
然面, Grep 输出仍然很常使用它是一种简单格式, 每行一个主机, 可以 通过 UNIX 工具 (如 grepawkcutseddiff) 和 Perl 方便地查找和分解常可 用于在命令行上进行一次性测式查找 ssh 端口打开或运行 Sloaris 的主机, 只需 要一个简单的 grep 主机说明, 使用通道并通过 awk 或 cut 命令打印所需的域
Grep 输出可以包含注释 (每行由 #号开始) 每行由 6 个标记的域组成, 由制表符及 冒号分隔这些域有主机, 端口, 协议, 忽略状态, 操作系统, 序列号, IPID 和状态
这些域中最重要的是 Ports, 它提供 了所关注的端口的细节, 端口项由逗号分隔每个端口项代表一个所关注的端口, 每个子域由 / 分隔这些子域有: 端口号, 状态, 协议, 拥有者, 服务, SunRPCinfo 和版本信息
对于 XML 输出, 本手册无法列举所有的格式, 有关 Nmap Grep 输出的更详细信息可 查阅 http://www.unspecific.com/nmap-oG-output
-oA
细节和调试选项
-v (提高输出信息的详细度)
通过提高详细度, Nmap 可以输出扫描过程的更多信息 输出发现的打开端口, 若 Nmap 认为扫描需要更多时间会显示估计 的结束时间这个选项使用两次, 会提供更详细的信息这个选 项使用两次以上不起作用
大部分的变化仅影响交互式输出, 也有一些影响标准和脚本 小子输出其它输出类型由机器处理, 此时 Nmap 默认提供详细的信 息, 不需要人工干预然而, 其它模式也会有一些变化, 省略一些 细节可以减小输出大小例如, Grep 输出中的注释行提供所有扫描 端口列表, 但由于这些信息过长, 因此只能在细节模式中输出
-d [level] (提高或设置调试级别)
当详细模式也不能为用户提供足够的数据时, 使用调试可以得到更 多的信息使用细节选项 (-v) 时, 可启用命令行参数 (-d), 多次使用可提高调试级别也可在 - d 后面使用参数设置调试级别例如,-d9 设定级别 9 这是 最高的级别, 将会产生上千行的输出, 除非只对很少的端口和目标进行简单扫描
如果 Nmap 因为 Bug 而挂起或者对 Nmap 的工作及原理有疑问, 调试输出 非常有效主要是开发人员用这个选项, 调试行不具备自我解释的特点 例如, Timeoutvals: srtt: -1 rttvar: -1 to: 1000000 delta 14987 ==> srtt: 14987 rttvar: 14987 to: 100000 如果对某行输出不明白, 可以忽略查看源代码或向开发列表 (nmap-dev) 求助有些输出行会有自 我解释的特点, 但随着调试级别的升高, 会越来越含糊
--packet-trace (跟踪发送和接收的报文)
要求 Nmap 打印发送和接收的每个报文的摘要, 通常用于 调试, 有助于新用户更好地理解 Nmap 的真正工作为避免输出过 多的行, 可以限制扫描的端口数, 如 - p20-30 如果只需进行版本检测, 使用 --version-trace
--iflist (列举接口和路由)
输出 Nmap 检测到的接口列表和系统路由, 用于调试路由 问题或设备描述失误(如 Nmap 把 PPP 连接当作以太网对待)
--append-output (在输出文件中添加)
当使用文件作为输出格式, 如 - oX 或 - oN, 默认该文件被覆盖如果希望文件保留现有内容, 将结果添加在现 有文件后面, 使用 --append-output 选项所有指 定的输出文件都被添加但对于 XML(-oX)扫描输出 文件无效, 无法正常解析, 需要手工修改
- --resume
- --stylesheet
- --no-stylesheet (忽略 XML 声明的 XSL 样式表)
使用该选项禁止 Nmap 的 XML 输出关联任何 XSL 样式表 xml-stylesheet 指示被忽略
其它选项
-6 (启用 IPv6 扫描)
从 2002 年起, Nmap 提供对 IPv6 的一些主要特征的支持 ping 扫描(TCP-only) 连接扫描以及版本检测都支持 IPv6 除增加 - 6 选项外, 其它命令语法相同当然, 必须使用 IPv6 地址来替换主机名, 如 3ffe:7501:4819:2000:210:f3ff:fe03:14d0 除所关注的端口行的地址部分为 IPv6 地址
IPv6 目前未在全球广泛采用, 目前在一些国家 (亚洲) 应用较多, 一些高级操作系统支持 IPv6 使用 Nmap 的 IPv6 功能, 扫描的源和目 的都需要配置 IPv6 如果 ISP(大部分)不分配 IPv6 地址, Nmap 可以采用 免费的隧道代理一种较好的选择是 BT Exact, 位于 https://tb.ipv6.btexact.com/ 此外, 还有 Hurricane Electric, 位于 http://ipv6tb.he.net/6to4 隧道是 另一种常用的免费方法
-A (激烈扫描模式选项)
这个选项启用额外的高级和高强度选项, 目前还未确定代表 的内容目前, 这个选项启用了操作系统检测 (-O) 和版本扫描(-sV), 以后会增加更多的功能 目的是启用一个全面的扫描选项集合, 不需要用户记忆大量的 选项这个选项仅仅启用功能, 不包含用于可能所需要的 时间选项(如 - T4) 或细节选项(-v)
- --datadir
- --send-eth (使用原以太网帧发送)
要求 Nmap 在以太网 (数据链路) 层而不是 IP(网络层)发送 报文默认方式下, Nmap 选择最适合其运行平台的方式, 原套接 字 (IP 层) 是 UNIX 主机最有效的方式, 而以太网帧最适合 Windows 操作 系统, 因为 Microsoft 禁用了原套接字支持在 UNIX 中, 如果没有其 它选择(如无以太网连接), 不管是否有该选项, Nmap 都使用原 IP 包
--send-ip (在原 IP 层发送)
要求 Nmap 通过原 IP 套接字发送报文, 而不是低层的以 太网帧这是 --send-eth 选项的补充
--privileged (假定用户具有全部权限)
告诉 Nmap 假定其具有足够的权限进行源套接字包发送 报文捕获和类似 UNIX 系统中根用户操作的权限默认状态下, 如果由 getuid()请求的类似操作不为 0,Nmap 将退出 --privileged 在具有 Linux 内核性能的类似 系统中使用非常有效, 这些系统配置允许非特权用户可以进行 原报文扫描需要明确的是, 在其它选项之前使用这些需要权 限的选项(SYN 扫描操作系统检测等)Nmap-PRIVILEGED 变量 设置等价于 --privileged 选项
-V; --version (打印版本信息)
打印 Nmap 版本号并退出
-h; --help (打印帮助摘要面)
打印一个短的帮助屏幕, 列出大部分常用的 命令选项, 这个功能与不带参数运行 Nmap 是相同的
1Nmap 扫描扫描单个目标
通过指定单个目标, 使用 Nmap 工具可以实现一个基本的扫描指定的目标可以是一个 IP 地址, 也可以是主机名 (Nmap 会自动解析其主机名) 其中, 语法格式如下所示:
nmap [目标]
- nmap 192.168.1.105
- Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-05 18:44 CST
- Nmap scan report for localhost (192.168.1.105)
- Host is up (0.00010s latency).
- Not shown: 995 closed ports
- PORT STATE SERVICE
- 21/tcp open ftp
- 22/tcp open ssh
- 23/tcp open telnet
- 111/tcp open rpcbind
- 445/tcp open microsoft-ds
- MAC Address: 00:0C:29:31:02:17 (VMware)
- Nmap done: 1 IP address (1 host up) scanned in 0.87 seconds
可以看到目标主机 192.168.1.105 上开启的端口有 212223111445, 及这些端口所对应的服务而且, 还可以看到该目标主机的 MAC 地址为 00:0C:29:31:02:17 从最后一行信息, 可以看出目标主机是活动的(up), 并且扫描该目标主机共用了 0.87 秒
使用 Nmap 扫描单个目标时, 指定的 IP 地址可以是 IPv4, 也可以是 IPv6 上例中指定扫描的目标是使用 IPv4 类地址如果用户指定扫描目标地址是 IPv6 类地址时, 需要使用 - 6 选项如果要使用 IPv6 类地址作为目标时, 则扫描主机和目标主机都必须支持 IPv6 协议否则无法实施扫描例如, 扫描 IP 地址为 fe80::20c:29ff:fe31:217 的目标主机, 则执行命令如下所示:
nmap -6 fe80::20c:29ff:fe31:217
2Nmap 扫描扫描多个目标
Nmap 可以用来同时扫描多个主机当用户需要扫描多个目标时, 可以在命令行中同时指定多个目标, 每个目标之间使用空格分割其中, 语法格式如下所示:
nmap [目标 1 目标 2 ...]
- nmap 192.168.1.1 192.168.1.101 192.168.1.105
- Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-05 19:07 CST
- Nmap scan report for localhost (192.168.1.1)
- Host is up (0.00094s latency).
- Not shown: 997 closed ports
- PORT STATE SERVICE
- 80/tcp open http
- 1900/tcp open upnp
- 49152/tcp open unknown
- MAC Address: 14:E6:E4:84:23:7A (Tp-link Technologies CO.)
- Nmap scan report for localhost (192.168.1.101)
- Host is up (0.0060s latency).
- All 1000 scanned ports on localhost (192.168.1.101) are closed
- MAC Address: 14:F6:5A:CE:EE:2A (Xiaomi)
- Nmap scan report for localhost (192.168.1.105)
- Host is up (0.00038s latency).
- Not shown: 995 closed ports
- PORT STATE SERVICE
- 21/tcp open ftp
- 22/tcp open ssh
- 23/tcp open telnet
- 111/tcp open rpcbind
- 445/tcp open microsoft-ds
- MAC Address: 00:0C:29:31:02:17 (VMware)
- Nmap done: 3 IP addresses (3 hosts up) scanned in 1.00 seconds
从以上输出信息, 可以看到共扫描了三台主机, 并且依次显示了每台主机的扫描结果在以上信息中, 将扫描的每台主机地址行已加粗, 方便用户了解其扫描结果下面分别介绍这三台主机的扫描结果, 如下所示:
192.168.1.1: 从输出信息中可以看到该主机开启了三个端口, MAC 地址为 14:E6:E4:84:23:7A 根据 MAC 地址后面括号中的信息, 可以推断出该主机是一个 Tp-link 路由器
192.168.1.101: 从输出信息中, 可以看到该主机上前 1000 个端口是关闭的但是, 可以看到该主机的 MAC 地址为 14:F6:5A:CE:EE:2A, 设备类型为 Xiaomi 由此可以判断出, 该主机是一个小米手机设备
192.168.1.105: 从输出信息中, 可以看到该主机上 995 个端口是关闭的, 五个端口是开启的其中, MAC 地址为 00:0C:29:31:02:17, 而且是一台 VMware(虚拟机)操作系统
3Nmap 扫描扫描一个目标列表
当用户有大量主机需要扫描时, 可以将这些主机的 IP 地址 (或主机名) 写入到一个文本文件中然后, 使用 Nmap 工具进行扫描这样避免在命令行中手工输入目标其中, 语法格式如下所示:
nmap -iL [IP 地址列表文件]
iL 选项, 就是用来从 IP 地址列表文件中提取所有地址的 IP 地址列表文件中包含了一列被扫描的主机 IP 地址在 IP 地址列表文件中的每个条目必须使用空格 Tab 键或换行符分割
(1)创建 list.txt 文本文件, 并将扫描的主机 IP 地址写入到该文本文件中如下所示:
- vi list.txt
- 192.168.1.1
- 192.168.1.100
- 192.168.1.101
- 192.168.1.102
- 192.168.1.103
- 192.168.1.104
- 192.168.1.105
(2)扫描 list.txt 文件中指定的所有主机执行命令如下所示:
nmap -iL list.txt
4Nmap 扫描扫描随机目标
Nmap 工具提供了一个 - iR 选项, 可以用来选择随机的互联网主机来扫描 Nmap 工具将会随机的生成指定数量的目标进行扫描其中, 语法格式如下所示:
nmap -iR [主机数量]
- nmap -iR 2 #选择两个目标主机进行扫描
- Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-06 11:07 CST
- Nmap scan report for suncokret.vguk.hr (161.53.173.3)
- Host is up (0.43s latency).
- Not shown: 984 closed ports
- PORT STATE SERVICE
- 21/tcp open ftp
- 25/tcp open smtp
- 53/tcp open domain
- 80/tcp open http
- 81/tcp open hosts2-ns
- 110/tcp open pop3
- 135/tcp filtered msrpc
- 139/tcp filtered netbios-ssn
- 143/tcp open imap
- 443/tcp open https
- 444/tcp open snpp
- 445/tcp filtered microsoft-ds
- 593/tcp filtered http-rpc-epmap
- 2002/tcp open globe
- 3306/tcp open mysql
- 4444/tcp filtered krb524
- Nmap done: 3 IP addresses (1 host up) scanned in 29.64 seconds
从输出信息中, 可以看到 Nmap 工具随机生成了三个 IP 地址但是, 只有主机 161.53.137.3 是活动的, 并且显示了对该主机的扫描结果
提示: 一般情况下, 不建议用户实施随机扫描除非你是在做一个研究项目否则经常实施随机扫描可能会给自己的互联网服务提供商带来麻烦
5Nmap 指定 IP 地址范围扫描
用户在指定扫描范围时, 可以通过 IP 地址或子网的方式来实现下面将介绍使用 IP 地址指定扫描范围的方法其中, 语法格式如下所示:
nmap [IP 地址范围] # IP 地址范围之间使用短连字符(-)
使用 Nmap 工具扫描 192.168.1.1 到 100 之间的所有主机执行命令如下所示:
- nmap 192.168.1.1-100
- Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-05 19:40 CST
- Nmap scan report for localhost (192.168.1.1)
- Host is up (0.0014s latency).
- Not shown: 997 closed ports
- PORT STATE SERVICE
- 80/tcp open http
- 1900/tcp open upnp
- 49152/tcp open unknown
- MAC Address: 14:E6:E4:84:23:7A (Tp-link Technologies CO.)
- Nmap scan report for localhost (192.168.1.100)
- Host is up (0.00025s latency).
- Not shown: 986 closed ports
- PORT STATE SERVICE
- 135/tcp open msrpc
- 139/tcp open netbios-ssn
- 443/tcp open https
- 445/tcp open microsoft-ds
- 902/tcp open iss-realsecure
- 912/tcp open apex-mesh
- 1033/tcp open netinfo
- 1034/tcp open zincite-a
- 1035/tcp open multidropper
- 1037/tcp open ams
- 1039/tcp open sbl
- 1041/tcp open danf-ak2
- 2869/tcp open icslap
- 5357/tcp open wsdapi
- MAC Address: 00:E0:1C:3C:18:79 (Cradlepoint)
- Nmap done: 100 IP addresses (2 hosts up) scanned in 3.34 seconds
从以上输出信息中, 可以看到 192.168.1-100 之间, 只有 192.168.1.1 和 192.168.1.100 两台主机是活动的
用户也可以指定扫描多个网络 / 子网范围的主机例如, 扫描 C 类 IP 网络 192.168.1. 到 192.168.100. 之间的所有主机则执行命令如下所示:
nmap 192.168.1-100.* #星号 (*) 是一个通配符, 表示 0-255 之间所有有效的主机
6Nmap 扫描整个子网
Nmap 也可以使用 CIDR(无类别域间路由)格式来扫描整个子网 CIDR 是由网络地址和子网掩码两部分组成, 并且中间使用斜杠 (/) 分割 CIDR 地址中包含标准的 32 位 IP 地址和有关网络前缀位数的信息以 CIDR 地址 222.80.18.18/25 为例, 其中 / 25 表示其前面地址中的前 25 位代表网络部分, 其余位代表主机部分语法格式如下所示:
nmap [CIDR 格式的网络地址]
示例 2-9 使用 Nmap 扫描 192.168.1.1/24 整个子网中的所有主机执行命令如下所示:
- nmap 192.168.1.1/24
- Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-05 19:41 CST
- Nmap scan report for localhost (192.168.1.1)
- Host is up (0.00064s latency).
- Not shown: 997 closed ports
- PORT STATE SERVICE
- 80/tcp open http
- 1900/tcp open upnp
- 49152/tcp open unknown
- MAC Address: 14:E6:E4:84:23:7A (Tp-link Technologies CO.)
- Nmap scan report for localhost (192.168.1.100)
- Host is up (0.00022s latency).
- Not shown: 986 closed ports
- PORT STATE SERVICE
- 135/tcp open msrpc
- 139/tcp open netbios-ssn
- 443/tcp open https
- 445/tcp open microsoft-ds
- 902/tcp open iss-realsecure
- 912/tcp open apex-mesh
- 1033/tcp open netinfo
- 2869/tcp open icslap
- 5357/tcp open wsdapi
- MAC Address: 00:E0:1C:3C:18:79 (Cradlepoint)
- Nmap scan report for localhost (192.168.1.101)
- Host is up (0.0041s latency).
- All 1000 scanned ports on localhost (192.168.1.101) are closed
- MAC Address: 14:F6:5A:CE:EE:2A (Xiaomi)
- Nmap scan report for localhost (192.168.1.103)
- Host is up (0.00027s latency).
- Not shown: 977 closed ports
- PORT STATE SERVICE
- 21/tcp open ftp
- 22/tcp open ssh
- 23/tcp open telnet
- 25/tcp open smtp
- 53/tcp open domain
- 80/tcp open http
- 111/tcp open rpcbind
- 139/tcp open netbios-ssn
- 445/tcp open microsoft-ds
- 512/tcp open exec
- 513/tcp open login
- ......
- 49157/tcp open unknown
- MAC Address: 00:0C:29:DE:7E:04 (VMware)
- Nmap scan report for localhost (192.168.1.102)
- Host is up (0.0000040s latency).
- Not shown: 998 closed ports
- PORT STATE SERVICE
- 80/tcp open http
- 9876/tcp open sd
- Nmap done: 256 IP addresses (9 hosts up) scanned in 3.39 seconds
从输出信息中, 可以看到共扫描了 256 个地址其中, 九台主机是活动的, 并且共用时间为 3.39 秒由于章节的原因, 以上只列举了五台主机的扫描结果其中, 中间部分内容, 使用省略号 (......) 代替了
6Nmap 排除扫描目标
当用户指定一个扫描范围时 (如局域网), 在该范围内可能会包括自己的主机, 或者是自己搭建的一些服务等可能不希望扫描这些主机此时就可以使用 --exclude 命令将这些主机排除用户使用 --exclude 选项, 可以指定排除单个主机范围或者整个网络块(使用 CIDR 格式) 例如, 扫描 192.168.1.1/24 网络内, 除 192.168.1.100-192.168.1.103 之外的所有主机则执行命令如下所示:
nmap [目标] --exclude [目标]
- nmap 192.168.1.1/24 --exclude 192.168.1.101 #扫描 192.168.1.1/24 网络内除 192.168.1.101 以外的所有主机
- nmap 192.168.1.1/24 --exclude 192.168.1.100-103
7Nmap 扫描排除列表中的目标
当用户排除扫描的目标很多时, 也可以将这些目标主机的 IP 地址写入到一个文本文件中然后, 使用 --excludefile 选项来指定排除扫描的目标其中, 排除扫描列表中目标的语法格式如下所示:
nmap [目标] --excludefile [目标列表]
使用 Nmap 扫描 192.168.1.0/24 网络内主机, 但是排除 list.txt 文件列表中指定的目标具体操作步骤如下所示:
(1)创建 list.txt 文件, 并写入要排除扫描目标的 IP 地址如下所示:
- vi list.txt
- 192.168.102
- 192.168.1.103
- 192.168.1.104
- 192.168.1.105
(2)实施扫描执行命令如下所示:
nmap 192.168.1.0/24 --excludefile list.txt
8Nmap 全面扫描
用户可以使用不同的选项, 单独扫描目标主机上的端口应用程序版本或操作系统类型等但是, 选项 - A 可以对目标主机实施全面扫描, 扫描结果中包括各种类型的信息
nmap -A [目标]
使用 Nmap 工具对目标主机 192.168.1.105 实施全面扫描则执行命令如下所示:
- nmap -A 192.168.1.105
- Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-06 15:20 CST
- Nmap scan report for localhost (192.168.1.105)
- Host is up (0.00028s latency).
- Not shown: 995 closed ports
- PORT STATE SERVICE VERSION
- 21/tcp open ftp vsftpd 2.2.2 #FTP 服务版本为 2.2.2, 供应商是 Vsftpd
- | ftp-anon: Anonymous FTP login allowed (FTP code 230) #允许匿名登录
- |drwxr-xr-x 2 14 0 4096 Apr 03 06:10 pub #FTP 服务的根目录为 pub
- 22/tcp open ssh OpenSSH 5.3 (protocol 2.0) #SSH 服务版本是 5.3, 供应商是 OpenSSH
- | ssh-hostkey: #SSH 服务密钥
- | 1024 83:9f:d0:8e:29:3c:7f:d9:11:da:a8:bb:b5:5a:4d:69 (DSA)
- | 2048 2e:ea:ee:63:03:fd:9c:ae:39:9b:4c:e0:49:a9:8f:5d (RSA)
- 23/tcp open telnet Linux telnetd #Telnet 服务
- 111/tcp open rpcbind 2-4 (RPC #100000)
- | rpcinfo: #RPC 详细信息
- | program version port/proto service
- | 100000 2,3,4 111/tcp rpcbind
- | 100000 2,3,4 111/udp rpcbind
- | 100024 1 34525/tcp status
- |_ 100024 1 51866/udp status
- 445/tcp open netbios-ssn Samba smbd 3.X (workgroup: MYGROUP)#Samba 服务版本为 3.X, 供应商为 smbd
- MAC Address: 00:0C:29:31:02:17 (VMware) #目标主机的 MAC 地址
- Device type: general purpose #设备类型
- Running: Linux 2.6.X|3.X #正在运行的系统
- OS CPE: cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:3 #操作系统中央处理单元
- OS details: Linux 2.6.32 - 3.10 #操作系统详细信息
- Network Distance: 1 hop #网络距离
- Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel #服务信息
- Host script results:
- | smb-os-discovery: #SMB 操作系统发现
- | OS: Unix (Samba 3.6.9-151.el6) #操作系统为 Unix,Samba 版本为 3.6.9
- | Computer name: router #计算机名
- | NetBIOS computer name: #NetBIOS 计算机名
- | Domain name: #域名
- | FQDN: router #完全合格域名(FQDN)
- |_ System time: 2015-05-06T15:20:28+08:00 #系统时间
- | smb-security-mode:
- | Account that was used for smb scripts:
可以明显看出比前面例子扫描结果更详细可以看到目标主机上开启的端口服务器版本操作系统版本内核系统类型等根据分析输出的信息, 可知目标主机上运行了 FTPSSHTelnet 等服务, 并且可以看到各服务的版本及权限信息而且, 还可以知道目标主机的操作系统是 Linux, 内核版本为 2.6.32 等
端口扫描
1TCP 全链接扫描(-sT)
这是一种最为普通的扫描方法, 这种扫描方法的特点是: 扫描的速度快, 准确性高, 对操作者没有权限上的要求, 但是容易被防火墙和 IDS(防入侵系统)发现
运行的原理: 通过建立 TCP 的三次握手连接来进行信息的传递
Client 端发送 SYN;
Server 端返回 SYN/ACK, 表明端口开放;
Client 端返回 ACK, 表明连接已建立;
Client 端主动断开连接
2SYN 扫描(-sS)
这是一种秘密的扫描方式之一, 因为在 SYN 扫描中 Client 端和 Server 端没有形成 3 次握手, 所以没有建立一个正常的 TCP 连接, 因此不被防火墙和日志所记录, 一般不会再目标主机上留下任何的痕迹, 但是这种扫描是需要 root 权限(对于 windows 用户来说, 是没有 root 权限这个概念的, root 权限是 linux 的最高权限, 对应 windows 的管理员权限)
运行的原理图如下:
3NULL 扫描
NULL 扫描是一种反向的扫描方法, 通过发送一个没有任何标志位的数据包给服务器, 然后等待服务器的返回内容这种扫描的方法比前面提及的扫描方法要隐蔽很多, 但是这种方法的准确度也是较低的, 主要的用途是用来判断操作系统是否为 windows, 因为 windows 不遵守 RFC 793 标准, 不论端口是开启还是关闭的都返回 RST 包
但是虽然 NULL 具有这样的一些用处, 但是本人却认为不宜使用 NULL
1NULL 方法的精确度不高, 端口的状态返回的不是很准确
2 要获取目标主机的运行系统, 可以使用参数(-O), 来获取对于一些操作系统无法准确判断的, 可以加上参数(-osscan-guess)
3NULL 扫描易被过滤
4FIN 扫描
FIN 扫描的原理与 NULL 扫描的原理基本上是一样的在这里就不重复了
5ACK 扫描
ACK 扫描的原理是发送一个 ACK 包给目标主机, 不论目标主机的端口是否开启, 都会返回相应的 RST 包, 通过判断 RST 包中的 TTL 来判断端口是否开启
运行原理图:
TTL 值小于 64 端口开启, 大于 64 端口关闭
大致上主要的扫描方法就是这些, 除了我们可以按照这样些参数去执行扫描外, 还可以自己定义一个 TCP 扫描包
6UDP 扫描 sU(使用 - sUV 能增加扫描的准确性)
6 自定义 TCP, 参数为 --scanflags
例如: 定制一个包含 ACK 扫描和 SYN 扫描的安装包
命令: nmap --scanflags ACKSYN nmap.org
7 协议扫描 sO 获取服务器支持哪些协议
7 输出命令
-oN 文件名 输出普通文件
-oX 文件名 输出 xml 文件
8 错误调试:
--log-errors 输出错误日志
--packet-trace 获取从当前主机到目标主机的所有节点
接着讲上节的内容, 上节中提到了一个时间优化的问题是使用参数 - n, 通过不解析地址来进行优化时间的, 但是优化时间的方法还有很多, 比如说我们可以通过时间优化(0-5), 指定单位时间内的探针数, 设置组的大小
9 时间优化(0-5)
时间优化的参数是(-T0~5), 最快的扫描速度为 - T5, 最慢的扫描速度为 - T0, 实现的原理: 通过设置各个端口的扫描周期, 从而来控制整个扫描的时间, 比如说 T0 各个端口的扫描周期大约为 5 分钟, 而 T5 各个端口的扫描周期为 5ms, 但是过快的扫描也是有缺点的, 扫描的周期过快, 会很容易被防火墙和 IDS 发现并记录, 因为防火墙大多数会将端口周期过段识别为扫描从而屏蔽掉, 如果不对其进行设置的话, 默认值为 T4
--min-hostgroup/--max-hostgroup size 设置组的大小
--min-parallelism/--max-parellelism time 指定时间内的探针数
具体的使用方法就不做介绍了, 有兴趣的话, 可以试一试研究一下变知道怎样使用了
在上节中还讲漏了一个知识点获取指定端口的参数(-p), 这个参数的意义在于对于我们有时候只想监控某个特定的端口的状态, 这个参数是即为有用的, 可以节约了不少的时间
例如: 监控 nmap.org 的 80 端口的状态
命令: nmap -p 80 nmap.org
Nmap - Zenmap GUI
来源: http://www.bubuko.com/infodetail-2521490.html