我在一次主机探测实验中,使用过这个工具,网上搜了与nping相关的使用教程,发现其功能是真的强大,不愧是网络探测中的中流砥柱,为此,我想写这篇文章来归纳nping的大致用法,内容绝大部分是扒网上的,对于一些读者看起来比较模糊的知识点我稍微做了解释。只供学习使用,切勿用于非法使用,否则后果自负
一、前言
nping为nmap的子命令,和nmap一样为免费开源的探测器,只要安装好nmap就能使用nping,支持高度自定义的报文定制及探测,本文将从nping五大探测模式及各个参数用法详细展开介绍。
二、探测模式(PROBE MODES)
参数 | 说明 |
--tcp connect | 无特权的tcp连接探测 |
--tcp | tcp探测 |
--udp | udp探测 |
--icmp | icmp探测 |
--arp | arp/rarp探测 |
--tr/--traceroute | 路由跟踪模 |
下面我将对以上各个模式具体说明其用法。
1. tcp连接模式(--tcp connect)
此模式包含-p、-g两大基础参数,分别为指定dest port
(目的端口)
、src port
(源端口)
:
参数 | 说明 |
---|---|
-p/--dest-port | 指定目的端口 |
-g/--source-port | 指定源端口 |
例:指定目的端口探测(-p/--dest-port):
nping --tcp-connect -p 80 192.168.1.1
有连接的探测,可以看到屏幕输出正常完成80端口的tcp建联,且不指定探测次数默认只发起5次,指定次数可用-c参数。
-p参数可以指定单个或多个端口,比如指定特定的几个端口:
nping --tcp-connect -p 22,80,443 192.168.1.1
指定端口范围:
nping --tcp-connect -p 22-443 192.168.1.1
2)指定源端口探测(-g/--source-port)
使用65535高端口对目标主机22端口发起探测,-c指定次数为1次:
nping --tcp-connect -g 65535 -p 22 192.168.1.1 -c 1
可以看到客户端和服务端正常完成握手(65535 -> 22),如果是非开放端口,则收到的显示是这样的:
客户端发起SYN申请握手,被对端RST,ACK
回绝了。
2.tcp探测模式(--tcp)
参数 | 说明 |
---|---|
-p/--dest-port | 指定目的端口 |
-g/--source-port | 指定源端口 |
--seq | 指定序列号 |
--flags | 指定tcp标识 |
--ack | 指定ack数 |
--win | 指定窗口大小 |
--badsum | 使用随机无效checksum |
tcp探测模式和tcp-connect探测模式最大的不同是,前者不需要完成建联,效率相对更高,以下将从常用的几个参数中依次展开说明。
1)指定源/目的端口(-p/-g)
nping --tcp -p 80 -c 1 192.168.1.1
nping --tcp -g 65535 -p 80 -c 1 192.168.1.1
--tcp
模式下显示的参数较--tcp-connect模式
下的报文字段更详细:
和--tcp-connect
显而易见的区别是--tcp模式
并不需要完成建联,收到SYN,ACK
后则判断为端口开放,之后发RST中断连接,和nmap的-sS
半开扫描探测逻辑一致,这样可以省去不必要的交互,节省流量的同时提高探测效率。
2)指定tcp标志位(--flags)
指定标识可以发起任意标识的tcp探测,例如发起一个标志位为SYN的请求包:
nping --tcp -g 65535 -p 80 -c 1 --flags syn 192.168.1.1
nping --tcp -g 65535 -p 80 -c 1 --flags s 192.168.1.1
写成syn或者缩写s都行,甚至不区分大小写,也可以配合使用,比如SA即SYN,ACK
,PA即PSH,ACK
3)指定窗口大小(--win)
指定客户端Window size
为1600字节:
nping --tcp -g 65535 -p 80 -c 1 --win 1600 192.168.1.1
说明:窗口大小即本端向对端说明目前本端缓冲区还能处理的最大字节数,希望对端发出的包不要超过这个值,同时如果从单个包大小的维度去看则和MTU有关,每次发包大小都由两端MTU最小的一方决定每个报文最大size,超过则需要分片发送。
3.udp探测模式(--udp)
参数 | 说明 |
---|---|
-g/--source-port | 指定源端口 |
-p/--dest-port | 指定目的端口 |
1)指定目的端口探测(-p/--dest-port)
nping --udp -p 53 -c 1 192.168.1.197
对端回复了Port unreachabel
端口不可达,即说明端口为关闭状态或者被防火墙拦截了。
2)指定源端口及目的端口(-g/--source-port)
3)配合payload选项使用(--data-string)
nping --udp -g 65535 -p 8080 -c 1 --data-string test 192.168.1.197
设置发起探测时的udp paylaod
,前提是目的主机能识别payload
并作出回应,这里用socat在目的主机上做了udp监听及回显功能:
4.icmp探测模式(--icmp)
参数 | 说明 |
---|---|
--icmp-type | 设置icmp type |
--icmp-code | 设置icmp code |
--icmp-id | 设置标识id |
--icmp-seq | 设置序列号 |
--icmp-redirect-addr | 设置重定向地址 |
--icmp-param-pointer | 设置参数问题指针 |
--icmp-advert-entry | 添加路由实体 |
--icmp-orig-time | 设置初始时间戳 |
--icmp-recv-time | 设置接收时间戳 |
--icmp-trans-time | 设置传输时间戳 |
支持自定义的icmp参数相对较多,将详细讲解常用且不鸡肋的参数。
1)指定icmp type发起探测(--icmp-type)
nping允许用户发起自定义的icmp type
、icmp code
,高度自定义请求,但对于主动式的探测场景来讲,常用类型并不多,对于被动服务式则可以派上用场。
发起icmp request:
nping --icmp --icmp-type 8 -c 1 192.168.1.1
这其实是一个正常的icmp请求,同时也会统计rtt时延,如果不指定--icmp-type则默认也是8。
如果是icmp reply:
nping --icmp --icmp-type 0 -c 1 192.168.1.1
这是一个没有意义的请求,在目的主机看来,自己并没有发icmp request却收到了icmp reply,对与莫名其妙的请求对端肯定是置之不理的,并不符合协议交互逻辑,但这个包确实可以单独发出来。
对了,看到这里,可能有人不太理解icmp type,于是我在网上扒下一张图,希望有助于读者的理解:
2)指定icmp code发起探测(--icmp-code)
每个icmp type
都会对应一组icmp code
,用于细化状态。
比如目的不可达的icmp type
为3,同时icmp code
为3,则会模拟端口不可达请求(Port unreachabel
):
nping --icmp --icmp-type 3 --icmp-code 3 -c 1 192.168.1.1
3)指定icmp id探测(--icmp-id)
顾名思义,此参数可以指定icmp identifier,用于过滤特定ident报文,特别是在大流量场景下,对端主机可以进准过滤出来自源端发起的某个包的探测,设置范围为:0<=N<2^16
,即N∈[0-65536)
,比如指定icmp id
:
nping --icmp --icmp-code 0 --icmp-id 1024 -c 1 -vv 192.168.1.1 #-vv参数可以详细展示输出
需要注意的是,当发起的是icmp不可达报文时,则icmp头部里面并不会包含id信息:
4)指定icmp seq探测(--icmp-seq)
和id功能类似,指定seq序列号:
nping --icmp --icmp-seq 1 -c 1 -v 192.168.1.1
5.arp/rarp探测模式(--arp)
参数 | 说明 |
---|---|
--arp-type | arp探测类型,可接:arp、arp-reply、rarp、rarp-reply |
--arp-sender-mac | 指定发送者的MAC地址 |
--arp-sender-ip | 指定发送者的IP地址 |
--arp-target-mac | 指定目标主机的MAC地址 |
--arp-target-ip | 指定目标主机的IP地址 |
1)指定探测类型(--arp-type)
指定ARP的探测类型,可以是ARP也可以是RARP以及对应的reply报文。
通过向对端主机发送arp报文,拿到对应的mac地址:
nping --arp --arp-type arp -c 1 192.168.1.1
同理也可以发起arp-reply,主动向对端发送自己的MAC地址:
nping --arp --arp-type arp-reply -c 1 192.168.1.1
对了,这里我对 "tcpdump -i any -nn -s 0 host 192.168.1.99 and arp -v"这条命令解释一下:
-
-i any:指定抓取所有网卡的数据包。这意味着不仅仅抓取一个特定的网卡,而是所有可用的网卡。
-
-nn:禁用主机名解析和端口号解析。这样,tcpdump 将直接显示 IP 地址而不是主机名,以及端口号而不是服务名称。
-
-s 0:设置抓取数据包的最大长度为无限制。这将捕获完整的数据包。
-
host 192.168.1.99 and arp:指定抓取目标主机 192.168.1.99 的数据包,并且只关注 ARP(地址解析协议)数据包。
-
-v:启用详细模式,以显示更多的信息。
综上所述,这条命令的目的是在所有网卡上抓取目标主机 192.168.1.99 的 ARP 数据包,并显示详细信息。
2)指定发送者的MAC地址(--arp-sender-mac)
利用此参数可以指定mac发送给对端主机,因此可以利用此行为来刷新对端的arp地址表,达到arp欺骗的目的:
nping --arp --arp-type arp-reply --arp-sender-mac 00:00:00:00:00:01 -c 1 192.168.1.1
3)指定发送者的IP地址(--arp-sender-ip)
同理,此参数可以伪造arp头部里的send ip address
字段,让对端主机认为arp地址请求是此源地址发送的,因此也会reply给此源地址:
nping --arp --arp-type arp --arp-sender-ip 192.168.1.197 -c 1 192.168.1.1
和--arp-sender-ip
搭配使用,可以达到伪造IP+伪造MAC,向广播域发送arp请求,并且将请求指定回应给设置的伪造地址:
nping --arp --arp-type arp --arp-sender-ip 192.168.1.197 --arp-sender-mac 00:0c:29:50:c6:dc -c 1 192.168.1.84
4)指定目的主机MAC地址及IP地址(--arp-target-mac/--arp-target-ip)/ARP泛洪
配合前面几个参数使用,指定arp头部可伪造的所有IP/MAC字段,比如将1.84捆绑到一个不正确的MAC地址上,向网关主机发送arp reply
,刷新、填充其ARP表:
nping --arp --arp-type arp-reply --arp-target-mac 00:0C:29:BE:5A:26 --arp-target-ip 192.168.1.1 --arp-sender-ip 192.168.1.84 --arp-sender-mac 00:00:00:00:00:01 -c 1 192.168.1.1
当捆绑伪造的IP-MAC
地址对足够庞大时,使网关的arp条目耗尽,合法用户不能维持正确的arp地址表,则会导致通信中断,这种行为通常称之为arp泛洪攻击
。
6.探测模式的路由跟踪(--tr/--traceroute)
此模式可适用于TCP/UDP/ICMP
探测模式,不适用于TCP全连接和ARP模式。
当想确认链路是否有丢包,对端又禁ping了,只放开了特定协议,那么此模式配合TCP/UDP/ICMP可以精准控制路由跟踪使用的协议,--tr
参数会将沿途经过的所有路由节点都探测一遍,有些路由只转发不响应(俗称拒绝回显)在client端看来其实也是超时不响应的。
对tcp/53端口进行路由跟踪:
nping --tcp -p 53 --traceroute -c 12 --flags syn -v 119.29.29.29
因为内网用openwrt做了劫持转发,--tr
只会看到一跳,这里使用另一台机器做测试。
- 这里的-c 12也就是整个命令只发起12个探测包,可以理解为只探测沿途经过的12个节点,默认每个节点探测一次。
- 最后显示丢包5个(41.67%),并不是真正意义上的丢包,探测的是对端的53/dns服务端口,没有发起
dns query
请求,在对端看来没有响应的必要,因此对探测机来讲,只要对端不响应,就会视为丢包。
前面说过,中间节点有不响应的可能,因为出于安全原因会设置某些策略禁止回显,但nping也会把这部分不响应的数据也计算到丢包率里面去做一个综合性统计,根据实际输出判断即可,不用太依赖最终的丢包率,实际工作中仅作为特定协议的路径跟踪也是不错的选择。
ICMP/UDP同理:
nping --udp -p 53 --traceroute -c 12 -v 119.29.29.29
nping --icmp --traceroute -c 9 -v 114.114.114.114
三、探测选项详解(OPTIONS)
1.IPv4 OPTIONS
将从如下常用参数讲解V4参数选项:
选项 | 说明 |
---|---|
-S/--source-ip | 设置源地址 |
--dest-ip | 设置目的地址 |
--id | 设置identification字段 |
--df | 不允许分片 |
--ttl | 设置生存周期0-255 |
--mtu | 设置MTU大小 |
、1)指定源主机(-S/--source-ip)
此参数望文生义,指定源地址的作用,可以指定其他网卡的IP,也可以指定任意IP来做伪造,比如指定网关IP向目的主机1.197发送80端口的syn探测:
nping --tcp -S 192.168.1.1 --flags syn -p 80 -c 1 192.168.1.197
此参数适用于所有具备IP层的探测模式。
2)指定目的主机(--dest-ip)
即指定目的主机,加不加都一样,默认会携带此参数
nping --icmp --icmp-type 8 -c 1 --dest-ip 192.168.1.1 192.168.1.197 #向1.1和1.197发起icmp探测
nping --icmp --icmp-type 8 -c 1 --dest-ip 192.168.1.0/24 #向整个C端发起icmp探测
3)指定identification(--id)
identification字段,对于指定包的分析非常好用,上面说过,icmp可通过--icmp-id
及--icmp-seq
来标识报文,便于后期精准过滤出我们发送的特定包,同理其他探测模式也有--id
字段,--id
为IP层的identification
,因此arp没有。
指定tcp探测的id字段,则可以写成:
nping --tcp -p 22 --id 1024 192.168.1.1 -v -c 1 #指定id为102
udp探测:
nping --udp -p 8080 --id 1024 --data-string test 192.168.1.197 -c 1 -v
可通过ip.id筛选我们发送的特定报文,之后跟踪udp.stream即可看到一条完整流:
4)设置不分片标志位(--df)
即Don't Fragment
不允许分片的意思,当报文大小超过client和server端协商的最小MTU时,默认会进行分片传输,此参数则指定不允许进行分片操作,所发即所得,即使对端处理不了DROP掉也还是不允许分片,此标志位在IP层,因此所有在IP层或之上的协议都能设置此字段,显而易见支持TCP、UDP、ICMP三大探测模式。
nping --tcp -p 80 --df 192.168.1.1 -c 1
那么,其他探测模式同理:
nping --udp -p 53 --df 192.168.1.1 -c 1
nping --icmp --icmp-type 8 --df 192.168.1.1 -c 1
5)设置生存周期(--ttl)
指定time to live,即报文生存周期,每经过一个路由节点,ttl减一,如果不设置ttl,则会读取系统默认ttl值,不同OS默认ttl也会不一样。
ttl在IP层头部,那么理所当然,ICMP/TCP/UDP均能被支持。
如指定ttl为1:
nping --icmp --ttl 1 -c 1 -v 192.168.1.1
nping --udp -p 53 --ttl 1 -c 1 -v 192.168.1.1
nping --tcp -p 80 --ttl 1 -c 1 -v 192.168.1.1
6)设置MTU大小(--mtu)
指定发送方最大传输单元(Maximum Transmission Unit
),如果超出设定的值则需要分片发送。
2.回显模式(ECHO CLIENT/SERVER)
选项 | 说明 |
---|---|
--ec/--echo-client | 客户端模式 |
--es/--echo-server | 服务端模式 |
--ep/--echo-port | 使用自定义端口来监听或连接 |
--nc/--no-crypto | 关闭加密和验证 |
--once | 一次连接后停止服务器 |
1)client和server端(--ec/--echo-client、--es/--echo-server)
这两个参数需要一起配合使用,一个作为服务端,一个客户端,和iperf3的c/s测速模式差不多,但nping此参数则是用来作为探测用的,主要用来持续性测试点到点之间的延时。
server端:
nping --echo-server "public" -e ens192 -vvv #public为任意字符串即可,要和client对应
client端:
nping --echo-client "public" 192.168.1.197 --tcp -p 80
2)指定监听端口(--ep/--echo-port)
此参数可加可不加,即指定echo server的监听端口,不加默认为9929端口
server端:
nping --echo-server "public" -e ens192 -v3 --ep 10 --nc #--nc不做加密即验证,加上此参数后则client端也要对应加上
client端:
nping --echo-client "pubulic" 192.168.1.197 --tcp -p 80 --ep 10 --nc -c 2
3)一次性监听(--once)
此参数用于server端,当client端一次完整探测结束后,就关闭server端的监听。
server端:
nping --echo-server "public" -e ens192 -v3 --nc --once
client端:
nping --echo-client "pubulic" 192.168.1.197 --udp -p 8080 --nc -c 2 --once
3.延时和速率(Timing&Performance)
选项 | 说明 |
---|---|
--delay | 指定探测延时(单位:ms、s、m、h) |
--rate | 每秒发送包量 |
1)指定探测延时/间隔(--delay)
--delay
参数可以指定每次探测包与包之间的延时间隔,当对端限制单位时间内访问频率时可用此参数来绕过检测。
每2s秒发一次SYN探测则可以写成:
nping --tcp -p 80,443 --flag syn -v --delay 2s -c 2 www.qq.com
每10s发起一次udp探测:
nping --udp -p 53 -v -c 2 --delay 10s --data-length 16 192.168.1.197
icmp则可以是:
nping --icmp --icmp-type 8 -c 2 --delay 10s 192.168.1.1
此参数适用于所有探测模式。
2)指定每秒发包量(--rate)
默认情况下,nping单位时间1s只发一次包,通过--rate
可以指定任意值。
承接上面的icmp探测,指定发包量可以写成:
nping --icmp --icmp-type 8 --rate 5 --delay 0.01s 192.168.1.1
--rate指定了单位时间发5个包,--delay将发包间隔设定为0.01s,可以快速拿到返回结果。
同理,tcp的syn探测:
nping --tcp -p 80 -v --rate 10 192.168.1.197
此参数也适用于所有探测模式。
4.其他参数
选项 | 说明 |
---|---|
-c | 到达发包次数后停止 |
-e/--interface | 指定网卡 |
-H/--hide-sent | 不显示发送的包 |
-N/--no-capture | 不抓响应包 |
-v/-vlevel | 显示详细输出,一共1-4个等级 |
-d/-dlevel | 显示debug信息,一共3个等级 |
--debug | 显示输出信息及debug信息为最高级 |
以上参数说明已经写的很详细,且部分已经做过演示,这里不再一一举例说明。
四、总结
以上涵盖了nping的各个探测使用指南,功能并不逊色于nmap,有些高级功能是nmap覆盖不到的,同时两者定位也不一样,nping更偏向于网络延时分析、路径跟踪等场景,nmap更适用于端口扫描。nping也是安全领域工具中不可或缺的一部分,前期的信息收集对于渗透测试至关重要,同时也是攻击者囊中利器。