你所不知道nmap

Posted 星空下的夜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你所不知道nmap相关的知识,希望对你有一定的参考价值。

一、Nmap基础

1.1、Nmap的简介

Nmap是由Gordon Lyon设计并实现,在1997年开始发布并开源的一个安全扫描软件,Gordon Lyon最初设计Nmap的目的只是打造一个端口扫描工具。但随着时间的推移,Nmap的功能越来越全面,在2009年Nmap发布了标致未来趋势的一个版本5.0版本。这个版本代表着Nmap从最开始的扫描软件变成一个全面的网络安全工具组件。

1.2、Nmap的基本操作

Nmap使用其实特别简单,只需咋需要下输入nmap +目标地址就可以执行扫描任务,如下:

nmap 192.168.0.1
Starting Nmap 7.30 ( https://nmap.org ) at 2018-11-25 14:21 CST
Nmap scan report for 192.168.0.1
Host is up (0.0049s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 1.50 seconds

在扫描的结果中,生成了关于192.168.0.1主机的报告信息。包括;主机是up的,说明这台主机目前处于联网状态,并且有一个80端口是处于开放状态并可以提供http服务进行访问。

1.3、指定范围扫描

1.3.1连续范围扫描

nmap -sn 192.168.0.1-255
备注:sn参数表示主机是否活跃

Starting Nmap 7.30 ( https://nmap.org ) at 2018-11-25 15:26 CST
Nmap scan report for 192.168.0.1
Host is up (0.0077s latency).
Nmap scan report for 192.168.0.103
Host is up (0.049s latency).
Nmap done: 250 IP addresses (2 hosts up) scanned in 20.02 seconds

1.3.2、对子网连续段进行扫描

命令语法:nmap [ip地址/子网掩码]
nmap -sn 192.168.0.1/24

1.3.3 不连续段扫描

命令语法:nmap 【扫描段1 扫描段2 扫描段3】
nmap -sn 192.168.0.1 192.168.0.99 192.168.0.111

1.3.4 排除某个扫描目标

命令语法:nmap 【目标地址】 --exclude [目标地址]
nmap -sn 192.168.0.0/24 --exclude 192.168.0.111

1.3.5 对文件进行扫描

命令语法:nmap -iL [文本文件]
nmap -sn -iL ip.txt
备注:ip.txt 需要制定路径

1.3.6 随机确定扫描目标

命令语法:nmap -iR [目标的数量]
nmap -sn -iR 5
备注:随机的对互联网5个地址进行扫描

二、活跃主机探测

2.1.1基于ARP协议的活跃主机探测原理

ARP协议位于TCP/IP协议的数据链路层和网络层中间的协议,该协议主要目的是物理地址和逻辑地址的转换工作。我们都在 知道在网络上同一网段的主机进行通讯使用逻辑地址(mac地址),不同网段的主机通讯需要使用逻辑地址通讯(IP地址)。而ARP在中间起到桥梁的作用。
nmap基于ARP活跃主机探测的原理:通过构造ARP广播数据包,如果得到对方的回应说明主机为活跃主机。
这种方式的优点是精准度高,几乎没有噪音。缺点是:扩展性差,不能对扩网段主机进行扫描

2.1.2基于ARP主机探测

ARP探测命令语法:nmap -PR [目标主机]
ARP探测实例:nmap -PR 172.16.1.

2.2基于ICMP协议的活跃主机探测

icmp不管是运维还是开发人员应用最为广泛的协议,几乎每天都在使用。icmp报文可以分为两类:1是差错。2是查询。而查询是我们应用非常多的。包括请求和应答
请求和应答又包括响应请求和应答时间戳请求和应答地址掩码请求和应答

2.2.1通过icmp请求和应答进行主机发现

该种方式主要是使用icmp协议。发送请求,如果得到对方主机的回应,说明主机处于活跃状态。其实就是使用的ping命令来完成的。
这种方式的优点是:方便、快捷,系统集成工具,缺点是:在互联网上基本被防火墙过滤造成准确度很低

基于ICMP协议探测命令语法:nmap -PE 【目标】
实例:nmap -PE 172.16.26.55

2.2.2基于时间戳的请求和应答

这种方式的优点是:方便、快捷,缺点是:在互联网上基本被防火墙过滤造成准确度很低

命令语法:nmap -PP [目标]
实例:nmap -PP  -sn 172.16.26.55

2.2.3基于地址掩码请求应答

命令语法:nmap -PM 【目标】
实例:nmap -PM 172.16.1.55

2.3 基于TCP协议的活跃主机探测

tcp是面向连接的、基于字节流的传输层通讯协议,tcp之所以是连接可靠的协议是因为基于三次握手协商。
tcp三次握手
在nmap中常用的tcp扫描有两种,分别是tcp ack扫描和tcp syn扫描。

2.3.1 基于tcp syn扫描探测

nmap中使用 -PS选项向目标主机发送一个syn标志的数据包,默认探测的目标端口是80(端口可以更改),内容为空。如果收到数据包说明目标主机在线,如果没有收到数据包,说明主机不在线。
基于tcp扫描是最强的扫描技术,服务器,可能会过滤icmp协议。但是几乎没有服务器会屏蔽tcp的syn数据包,因为这是网络通讯所必须使用的协议。

命令语法:nmap -PS 【端口1,端口2,端口3】【目标主机IP】
案例:nmap -PS 172.16.1.55 
备注使用默认的端口进行探测

2.3.2 基于tcp ack扫描

tcp ack扫描使用的是tcp三次握手中的ACK标志位,而tcp syn 使用的是SYN标志位。在实际环境中只有A向B发送syn之后,B才会回应ACK数据包。这种方式是A直接发送ACK给B,B因为没有收到syn一般回复RST,这种通讯模式不符合tcp通讯的逻辑规律,所以该种模式非常容易被防火墙拦截。

命令语法:nmap -PA 172.16.1.55

2.4 基于UDP协议的活跃主机探测

UDP协议是一个传输层协议,与TCP相反,UDP是一个面向无连接的协议。该协议简单很多,没有tcp协议的三次握手,导致业务中经常出现的对udp端口无法进行扫描,不能确定其是否开放。但是nmap的强大之处是可以使用nmap对主机进行发现和探测,当一个udp端口收到一个udp数据包时候,如果该端口是关闭的,就给源发送一个icmp端口不可达数据包,如果该端口是开放的,就丢弃数据包,不返回任何信息。这种方式就可以完成udp主机探测,缺点是扫描结果可靠性非常低。

2.4.1基于upd进行扫描探测

命令语法:nmap -PU 【目标】
案例:nmap -sn -PU 10.10.26.55

2.5 基于IP协议的活跃主机探测

IP协议是tcpip协议的载体,tcp、udp、icmp以及应用层协议都是封装成IP数据包在网络上进行传输。ip数据包的格式如下:
ip数据包的格式
ip数据包的格式
在ip协议中有一个协议部分,用于标识是哪个协议向ip传送数据,比如:tcp、udp、icmp等。
在nmap中允许向目标主机发送IP数据包来探测对方主机是否处于活跃状态。

命令语法:nmap -sn -PO 【协议编号】 【目标IP地址】
案例:nmap -sn -PO 1,6 10.10.26.55

这种形式发送的数据包内容是空的,非常容易被防火墙等安全设备检测并过滤,为了解决这个问题,可以指定数据大小添加随机生成的数据

命令语法:nmap --data-length [长度数值] [目标IP地址]
案例:nmap --data-length 66 172.16.36.6

2.6总结

nmap是一个非常强大的工具,以上是我看了《诸神之眼 nmap网络安全审计技术解密》之后写下的一点总结吧。以后还会持续的更新。
其实研究nmap一点要研究他的本质,在nmpa中提供了一种方法--pachket-trace选项,通过它可以观察nmap发出去那些包,收到哪些数据包,可以让你更深入的研究nmap。
使用sctp的PY选项对目标主机进行扫描

root@ubuntu1:/# nmap -sn -PY 122.114.9.2
Starting Nmap 7.01 ( https://nmap.org ) at 2018-11-27 02:48 UTC
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 2.06 seconds

通过扫描发现该主机是不活跃的,但是真实的情况这台主机是处于活跃状态的,导致原因是目标主机不支持sctp协议。如下源主机发送的请求但是没有收到对方的回复数据包。

root@ubuntu1:/# nmap -sn -PY 122.114.9.2 --packet-trace

Starting Nmap 7.01 ( https://nmap.org ) at 2018-11-27 02:59 UTC
SENT (0.0244s) SCTP 172.16.36.185:44449 > 122.114.19.242:80 ttl=48 id=25483 iplen=52 
SENT (1.0255s) SCTP 172.16.36.185:44450 > 122.114.19.242:80 ttl=44 id=15676 iplen=52 
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 2.05 seconds

使用同样的方法对内网主机进行扫描,被扫描的主机也没有安装sctp协议。但是结果却大大出乎我们的意料之外

root@ubuntu1:/# nmap -sn -PY 172.16.36.6

Starting Nmap 7.01 ( https://nmap.org ) at 2018-11-27 03:02 UTC
Nmap scan report for bogon (172.16.36.6)
Host is up (0.00046s latency).
MAC Address: FA:16:3E:18:4B:2F (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 0.26 seconds

同时是没有安装sctp协议,为什么内网主机就有回复的数据包呢,可以使用--packet-trace看一下究竟是什么原因导致的。

root@ubuntu1:/# nmap -sn -PY 172.16.36.6 --packet-trace

Starting Nmap 7.01 ( https://nmap.org ) at 2018-11-27 03:02 UTC
SENT (0.0272s) ARP who-has 172.16.36.6 tell 172.16.36.185
RCVD (0.0277s) ARP reply 172.16.36.6 is-at FA:16:3E:18:47:2F
Nmap scan report for bogon (172.16.36.6)
Host is up (0.00048s latency).
MAC Address: FA:16:3E:18:4B:2F (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 0.26 seconds

通过以上分析,你就更加明白nmap的原理了。
nmap不管在何种情况下都会探测是否属于统一子网环境,如果是处于统一子网环境nmap直接使用arp进行探测,因为nmap认为在局域网中arp是最为精准的。
下一次介绍nmap端口扫描

参考书籍:《诸神之眼 nmap网络安全审计技术解密》--李华峰

三、nmap端口扫描

3.1nmap端口定义

在nmap给出6中端口的不同状态。

状态 描述
open 表明该端口处于开放状态,可以接收相应的报文数据包
closed 表明该端口是不可访问的,没有程序在监听
filtered 存在防火墙等设备对目标数据包进行了过滤,无法判断是否开放状态
unfiltered 表明目标端口是不可访问的,无法判断是否开放相应端口,一般ack扫描会出这种情况
open or filtered 无法确定端口是开放还是被过滤
closed or filtered 无法确定端口是开放还是被过滤,一般只在idle扫描中会出现

3.2 nmap端口扫描

扫描方法 描述
-sS/sT/sA/sW/sM 指定使用tcpsyn/connect()/ack/window/maimon scans的方式对目标主机进行扫描
-sU UDP方式扫描端口
-sN/sF/sX 使用tcp Null、FIN/Xmas scans等方式协助探测对方tcp端口状态
-scanflags 定制tcp包的flags
-sI<zombie host[:probeport]> 指定使用Idle scan扫描目标主机
-sY/sZ 使用sctp init/cookie-echo扫描sctp协议端口情况
-sO 使用ip协议扫描目标主机支持的协议
-b 使用ftp扫描方式
-p 扫描指定端口
-F 快速扫描,仅仅扫描top100端口
-r 随机扫描,不容易被安全设备检测到
--top-ports 扫描开放概率最高的端口个数

3.2.1 SYN扫描

在nmap进行端口扫描中,syn扫描是一种非常好的扫描方式,这种扫描非常准确而且速度快。更重要的是这种扫描方式不会在目标网络的安全设备上被报警
syn扫描原理

syn扫描语法:nmap -sS 【目标地址】
实例:nmap -sS 122.114.19.242

3.2.2 connect扫描

connect扫描语法:nmap -sS 【目标地址】
实例:nmap -sS 122.114.19.242

connect 扫描
connect 扫描方式语SYN扫描方式非常相似,只是在tcp三次握手阶段,syn扫描没有完成三次握手,而connect扫描完成类三次握手,这种方式缺点是容易被对端防火墙拦截或检测。优点是不需要使用管理员权限就可以执行命令。

命令语法:nmap -sT [目标主机]
实例:nmap -sT 10.10.36.55

UDP扫描
udp扫描方式因协议无连接,不可靠性,造成udp扫描到准确率非常低。

命令语法:nmap -sU [target]
案例:nmap -sU 10.10.36.55

FIN扫描放送
tcp fin扫描方式是向目标主机直接发送Fin数据包,对于目标端口如果处于关闭状态,会发送一个RST数据包,表明该端口处于关闭状态

命令语法:nmap -sF [target]
案例:nmap -sF 10.10.36.55

NULL扫描
tcp null扫描方式是想目标系统发送一个不包含任何标志到数据包,目标系统会向源主机发送一个RST
数据包,表明该端口处于关闭状态。

命令语法:nmap -sN [target]
案例:nmap -sN 10.10.36.55

xmas tree扫描
tcp xmas tree扫描方式是向目标端口发送一个含有FIN/URG/PUSH标志位到数据包,对于关闭的端口目标主机返回RST数据包,表示改端口是处于关闭状态。

nmap -sX [target]
nmap -sX 10.10.36.55

idle扫描
该种方式非常隐蔽,扫描着不需要相目标主机发送任何数据包,需要依靠第三方主机对目标进行扫描。

  1. 检测第三方ip.id的值并记录下来
    2.在本机伪造一个源主机为第三方主机到数据包,兵将数据包发送到目标主机端口
    3.查看第三方主机到ip id值是否有变化。
    在这个工程中,需要伪造第三方数据包,在nmap中可以使用decoy scanning (-D)的功能,可以隐藏字自己到身份。通过这种方式目标日志服务器上记录的是第三方地址,这样就可以达到隐藏自己信息到目的。

nmap指定扫描得端口

端口选项 描述
-F[target] 扫描常见到100个端口
-p[port] 指定一个端口
-pU:[udp ports],T:[tcp ports] 使用协议扫描指定端口
-p* 扫描所有端口
--top-ports[number] 扫描常用端口

扫描常见到100个端口

command:nmap -F [target]
case:nmap -f 172.16.36.55

指定一个端口

command:nmap -p [port or portname] [target]
case:    nmap -p 8080,90 172.16.36.55

使用协议指定端口

command:nmap -p U:[udp ports],T:[tcp ports] [target]
case:    nmap -sU -sT -p U:4500,T:22 172.16.36.55

扫描所有端口

command:nmap -p "*" [target]
case:    nmap -p * 172.16.36.55

如上是最经常使用到nmap扫描技术。

以上是关于你所不知道nmap的主要内容,如果未能解决你的问题,请参考以下文章

你所不知道的 C# 中的细节

JS - 你所不知道的EventLoop

《你所不知道的:大神与一般程序猿的区别》读书笔记

几个你所不知道的技巧助你写出更优雅的vue.js代码

sublime text 你所不知道的12个秘密

你所不知道的冒泡排序