本文介绍了一些网络扫描的技术手段,其中包括主机扫描、路由扫描、批量服务扫描。
常用命令:fping、hping、traceroute、mtr、nmap、nc、tcpdump
fping
fping是一个小型命令行工具,用于向网络主机发送ICMP回应请求,类似于ping,但在ping多个主机时性能要高得多。fping与ping不同的地方在于,fping可以在命令行中指定要ping的主机数量范围,也可以指定含有要ping的主机列表文件。
作用:批量的给目标主机发送ping请求,测试主机的存活情况
特点:并行发送、结果易读
安装:
wget http://www.fping.org/dist/fping-4.2.tar.gz
tar xf fping-4.2.tar.gz
./configure
make && make install
参数说明:
# fping -h
-a:只显示存活主机
-u:只显示不存活主机
-l:循环ping
-g:通过指定起始地址与终止地址产生目标列表(192.168.1.0/24)
目标IP地址的输入方式:
fping IP1 IP2 IP3 ...;
fping -f filename;
fping -g IP1 IP2(IP1地址开始范围,IP2地址结束范围)
用法示例:
# fping 192.168.20.152 192.168.20.153
# fping -g 192.168.20.150 192.168.20.153
# fping -a -g 192.168.20.150 192.168.20.153
# fping -g 192.168.20.150 192.168.20.153 2>/dev/null
192.168.20.151 is alive
192.168.20.152 is alive
192.168.20.150 is unreachable
192.168.20.153 is unreachable
hping
官方站点:http://www.hping.org/
特点:支持使用的TCP/IP数据包组装、分析工具
安装:
wget https://github.com/antirez/hping/archive/master.zip
unzip master.zip
解决依赖:
yum install -y libpcap-devel //安装依赖 (或者在rpmfind.net中下载rpm包)
yum -y install tcl tcl-devel
ln -s /usr/include/pcap-bpf.h /usr/include/net/bpf.h
cd hping-master/
./configure
make && make install
参数说明:
-c:发送数据包的个数
-d:每个数据包的大小
-p:端口
-S:设置TCP模式SYN包
-a:伪造IP地址
用法示例:
1.对指定目标端口发起tcp探测
hping -p 22 -S 192.168.20.151
#可以设置151机器禁ping查看效果: sysctl -w net.ipv4.icmp_echo_ignore_all=1
2.伪造来源IP,模拟Ddos攻击
hping -p 22 -S 192.168.20.151 -a 192.168.20.150
在151机器上开启tcpdump抓取来自攻击源的数据包:
# tcpdump -i eth0 src host 192.168.20.150
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
20:00:23.471610 IP 192.168.20.150.spice > 192.168.20.151.ssh: Flags [S], seq 1309245604:1309245704, win 512, length 100
20:00:24.471781 IP 192.168.20.150.xiip > 192.168.20.151.ssh: Flags [S], seq 1698714277:1698714377, win 512, length 100
20:00:25.472009 IP 192.168.20.150.discovery-port > 192.168.20.151.ssh: Flags [S], seq 1558244712:1558244812, win 512, length 100
20:00:26.472229 IP 192.168.20.150.egs > 192.168.20.151.ssh: Flags [S], seq 317559446:317559546, win 512, length 100
20:00:27.472494 IP 192.168.20.150.videte-cipc > 192.168.20.151.ssh: Flags [S], seq 1828776172:1828776272, win 512, length 100
补充:
tcpdump抓包常用参数和用法
tcpdump tcp -s 0 -i eth0 and host 192.168.20.151 -w /tools/0427.pcap
参数说明:
tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
-i eth0 : 只抓经过接口eth0的包
host 192.168.20.151 只抓取本机器和192.168.20.151机器之间的数据包
-s 0 : 抓取数据包时默认抓取长度为68字节。加上-s 0 后可以抓到完整的数据包
-w /tools/0427.pcap : 指定保存的路径保存成pcap文件,方便用ethereal(即wireshark)分析
详细用法可以参考:https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
tcpdump
查询一个主机到另一个主机经过的路由跳数、及数据延迟情况。
常用工具:traceroute、mtr
traceroute
参考链接:https://www.cnblogs.com/peida/archive/2013/03/07/2947326.html
通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。linux系统中,我们称之为traceroute
,在MS Windows中为tracert
。 traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。
在大多数情况下,我们会在linux主机系统下,直接执行命令行:traceroute hostname
参数说明:
默认使用uDP协议(3000以上的端口)
使用TCP协议 -T -p
使用ICMP协议 -I
-d 使用Socket层级的排错功能。
-f 设置第一个检测数据包的存活数值TTL的大小。
-F 设置勿离断位。
-g 设置来源路由网关,最多可设置8个。
-i 使用指定的网络界面送出数据包。
-I 使用ICMP回应取代UDP资料信息。
-m 设置检测数据包的最大存活数值TTL的大小。
-n 直接使用IP地址而非主机名称。
-p 设置UDP传输协议的通信端口。
-r 忽略普通的Routing Table,直接将数据包送到远端主机上。
-s 设置本地主机送出数据包的IP地址。
-t 设置检测数据包的TOS数值。
-v 详细显示指令的执行过程。
-w 设置等待远端主机回报的时间。
-x 开启或关闭数据包的正确性检验。
使用示例:
1.traceroute 用法简单、最常用的用法
# traceroute www.baidu.com
2.跳数设置
# traceroute -m 10 www.baidu.com
3.显示IP地址,不查主机名
# traceroute -n www.baidu.com
4.探测包使用的基本UDP端口设置6888
# traceroute -p 6888 www.baidu.com
5.把探测包的个数设置为值4
# traceroute -q 4 www.baidu.com
6.绕过正常的路由表,直接发送到网络相连的主机
# traceroute -r www.baidu.com
7.把对外发探测包的等待响应时间设置为3秒
# traceroute -w 3 www.baidu.com
说明:
# traceroute -T -p 80 -n www.imooc.com
traceroute to www.imooc.com (117.121.101.40), 30 hops max, 60 byte packets
1 192.168.20.11 0.406 ms 0.366 ms 0.337 ms
2 * * *
3 123.150.144.153 26.616 ms 26.922 ms 26.897 ms
4 221.238.7.233 11.441 ms 7.298 ms 6.792 ms
5 221.238.222.65 7.000 ms 6.978 ms 7.318 ms
6 219.150.49.181 11.389 ms 219.150.49.169 10.847 ms 219.150.49.189 8.933 ms
7 36.110.245.26 13.724 ms 36.110.245.22 9.259 ms 8.925 ms
8 * * *
9 220.181.17.122 6.568 ms 17.669 ms 17.606 ms
10 * * *
11 117.121.99.82 7.455 ms 7.894 ms 8.721 ms
12 * * *
13 117.121.101.40 10.137 ms 7.703 ms 7.699 ms
记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是 ms,其实就是-q的默认参数。探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果用 traceroute -q 4 www.baidu.com
,表示向每个网关发送4个数据包。
有时我们traceroute 一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。
有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现问题时,不能解析主机名、域名时,也会 有延时长的现象;可以加-n
参数来避免DNS解析,以IP格式输出数据。
如果在局域网中的不同网段之间,我们可以通过traceroute 来排查问题所在,是主机的问题还是网关的问题。
mtr
MTR 是一个强大的网络诊断工具,管理员能够用它诊断和隔离网络错误,并向上游提供商提供有关网络状态的有用报告。MTR 通过更大的采样来跟踪路由,就像 traceroute + ping 命令的组合。
网络诊断工具包括 ping
,traceroute
和 mtr
,使用“ICMP”数据包来测试互联网上两点之间的节点和流量。当用户在互联网上 ping 主机时,会向主机发送一系列 ICMP 报文,主机通过发送报文进行响应。用户的客户端能够计算互联网上两点之间的往返时间。相比之下,诸如 traceroute 和 MTR 之类的工具会以递增增加的 TTL 发送 ICMP 数据包,以便查看数据包在源和目的地之间进行的路由或一系列跳数。 TTL 或生存时间控制数据包在“死亡”并返回主机之前将产生多少“跳”。通过发送一系列数据包,使它们在一跳之后死亡并返回,然后两个,然后三个,客户端机器能够组合在因特网上的主机之间的流量所占用的路由。
MTR 收集关于中间主机的状态,连接和响应性的其他信息,而不是简单地概述流量跨越 Internet 的路由。
使用mtr:
测试到目标主机 example.com 的流量的路由和连接质量: mtr -rw example.com
如果没有丢包丢失,可以使用更快的间隔时间运行:mtr -rwc 50 -i 0.2 example.com
参数说明:
r 选项标志生成报告(缩写为–report)
w 选项标志使用长版本的主机名,您可以看到每个跳的完整主机名(–report-wide的缩写)
c 选项标志设置报告中发送和记录的数据包数量。当不使用时,默认值通常为 10,但是对于更快的间隔,您可能希望将其设置为50或100.报告可能需要较长时间才能完成
i 选项标志以更快的速率运行报告,以显示只能在网络拥塞期间发生的数据包丢失。该标志指示MTR每n秒发送一个数据包。默认值为1秒,因此将其设置为十分之一秒(0.1,0.2等)通常是有帮助的
输出参数的解释:
Loss% 丢包率,单位是”%”;
Snt sent包的数量
Last 最后一个包的延时
Avg 所有包的平均延时
Best 延时最小的包
Wrst 延时最大的包
StDev 标准偏差
如何使用MTR诊断网络问题:https://www.cnblogs.com/xzkzzz/p/7413177.html
批量主机存活扫描、针对主机服务扫描
能更方便快捷获取网络中主机的存活状态;更加细致、只能获取主机服务侦查情况
常用命令:nmap、ncat
nmap
NMap,也就是Network Mapper,是Linux下的网络扫描和嗅探工具包。包含四项基本功能:
nmap端口状态解析:
open: 应用程序在该端口接收 TCP 连接或者 UDP 报文。
closed:关闭的端口对于nmap也是可访问的, 它接收nmap探测报文并作出响应。但没有应用程序在其上监听。
filtered:由于包过滤阻止探测报文到达端口,nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由规则 或者主机上的软件防火墙。
unfiltered:未被过滤状态意味着端口可访问,但是nmap无法确定它是开放还是关闭。 只有用于映射防火墙规则集的 ACK 扫描才会把端口分类到这个状态。
open | filtered:无法确定端口是开放还是被过滤, 开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃了探测报文或者它引发的任何反应。UDP,IP协议,FIN, Null 等扫描会引起。
closed|filtered:(关闭或者被过滤的):无法确定端口是关闭的还是被过滤的
主机发现:
-sP :进行ping扫描
# nmap -sP 192.168.20.0/24 //打印出对ping扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测)可以用于探测局域网有哪些机器
-sn: Ping Scan - disable port scan
# nmap -sn 192.168.20.0/24
-sA:发送tcp的ack包进行探测,可以探测主机是否存活
# nmap -sA 192.168.20.0/24
端口扫描:
扫描tcp端口:
# nmap 192.168.20.215
# nmap 192.168.20.215 -p 1-65535 //区别在于不加-p 时,显示的都是已知协议的端口,对于未知协议的端口没显示
# nmap 192.168.20.215 -p 1-100,27017,27018 //连续的端口可以使用横线连起来,端口之间可以使用逗号隔开
指定端口范围使用-p
参数,如果不指定要扫描的端口,Nmap默认扫描从1到1024再加上nmap-services列出的端口,假如有的服务不在nmap-services,可能nmap就不会去扫描,这就是明明一些端口已经是处于监听状态,nmap默认没扫描出来的原因,需要加入-p
参数让其扫描所有端口。
扫描udp端口:
# nmap -sU 192.168.20.215 //对于udp端口扫描比较慢
-sU:表示udp scan , udp端口扫描
-Pn:不对目标进行ping探测(不判断主机是否在线)(直接扫描端口)
扫描多个IP用法:
# nmap 192.168.20.215 192.168.20.216 // 中间用空格分开
# nmap 192.168.20.215,216 // 使用逗号分割
# nmap 192.168.20.215-218 // 扫描连续的ip地址
# nmap 192.168.20.0/24 // 扫描一个子网网段所有IP
# nmap -iL ip.txt // 扫描文件里的IP
# nmap 192.168.20.215-218 --exclude 192.168.20.217 // 扫描地址段是排除某个IP地址
# nmap 192.168.20.215-218 --exclude 192.168.20.216-217 //扫描时排除多个IP地址,排除连续的,可以使用横线连接起来
# nmap 192.168.20.215-218 --exclude 192.168.20.216,192.168.20.217 //扫描时排除多个IP地址,排除分散的,使用逗号隔开
# nmap 192.168.20.215-218 --excludefile ex.txt //扫描多个地址时排除文件里的IP地址
端口扫描的高级用法:
Tcp SYN Scan (-sS) //tcp半开放扫描(非3次握手的tcp扫描)
优点:Nmap发送SYN包到远程主机,但是它不会产生任何会话,目标主机几乎不会把连接记入系统日志。(防止对方判断为扫描攻击),扫描速度快,效率高,在工作中使用频率最高
缺点:它需要root/administrator权限执行
# nmap -sS 192.168.20.215
Tcp connect() scan(-sT) //tcp全开放扫描(3次握手方式tcp的扫描)
默认的扫描模式,不同于Tcp SYN扫描,Tcp connect()扫描需要完成三次握手,并且要求调用系统的connect().
优点:你勿需root权限。普通用户也可以使用。
缺点:这种扫描很容易被检测到,在目标主机的日志中会记录大批的连接请求以及错误信息,由于它要完成3次握手,效率低,速度慢,建议使用-sS
# nmap -sT 192.168.20.215 等同于 # nmap 192.168.20.215
Udp scan(-sU) //udp端口的扫描
这种扫描技术用来寻找目标主机打开的UDP端口.它不需要发送任何的SYN包,因为这种技术是针对UDP端口的。UDP扫描发送UDP数据包到目标主机,并等待响应,
如果返回ICMP不可达的错误消息,说明端口是关闭的,如果得到正确的适当的回应,说明端口是开放的.udp端口扫描速度比较慢
# nmap -sU 192.168.20.215
FIN scan (-sF) //也是tcp的扫描一种,发送一个FIN标志的数据包
有时候TcpSYN扫描不是最佳的扫描模式,因为有防火墙的存在.目标主机有时候可能有IDS和IPS系统的存在,防火墙会阻止掉SYN数据包。发送一个设置了FIN标志的数据包并不需要完成TCP的握手.
和sS扫描效果差不多,比sT速度快
# nmap -sF 192.168.20.215
版本侦测:
-sV:版本检测(sV),用来扫描目标主机和端口上运行的软件的版本
# nmap -sV 192.168.20.215
Starting Nmap 5.51 ( http://nmap.org ) at 2018-04-21 13:48 CST
Nmap scan report for 192.168.20.215
Host is up (0.00046s latency).
Not shown: 998 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
80/tcp open http Apache httpd 2.4.6 ((CentOS))
MAC Address: 00:0C:29:A5:9D:95 (VMware)
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.24 seconds
操作系统侦测:
Nmap最重要的特点之一是能够远程检测操作系统和软件,Nmap的OS检测技术在渗透测试中用来了解远程主机的操作系统和软件是非常有用的,通过获取的信息你可以知道已知的漏洞。Nmap有一个名为的nmap-OS-DB数据库,该数据库包含超过2600操作系统的信息。 Nmap把TCP和UDP数据包发送到目标机器上,然后检查结果和数据库对照。
# nmap -O 192.168.20.215
参考链接:
https://www.cnblogs.com/nmap/p/6232207.html
https://www.cnblogs.com/hanxiaobei/p/5603491.html
ncat
nc
是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具。
nc的作用:
常用参数:
-l:用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。
-s:指定发送数据的源IP地址,适用于多网卡机
-u:指定nc使用UDP协议,默认为TCP
-v:输出交互或出错信息,新手调试时尤为有用
-w:超时秒数,后面跟数字
-z:表示zero,表示扫描时不发送任何数据
组合参数:-zvw
用法:
用法一:网络连通性测试和端口扫描
nc可以作为server端启动一个tcp的监听:
在192.168.20.215机器上启动一个tcp的监听端口
# nc -l 9999
客户端测试:
# telnet 192.168.20.215 9999
# nmap 192.168.20.215 -p 9999
# nc -zvw 2 192.168.20.215 9999
Connection to 192.168.20.215 9999 port [tcp/distinct] succeeded!
# nc -zvw 2 192.168.20.215 9998-9999 //扫描连续的两个端口
nc作为server端启动一个udp的监听:-u
在192.168.20.215机器上启动一个udp的监听端口
# nc -ul 9999
客户端测试:
//udp的端口无法在客户端使用telnet去测试
# nc -zuvw 2 192.168.20.215 9999
Connection to 192.168.20.215 9999 port [udp/distinct] succeeded!
用法二:使用nc传输文件和目录
方法1:传输文件演示(先启动接收命令)
把151机器上的一文件发送到215机器上 //receiver先侦听端口,sender向receiver所在机器的该端口发送数据。
1.先在215机器上启动一个接收文件的监听,格式如下
nc -l port >file
# nc -l 9999 > test.sh //把来自9999端口接收到的数据都写到file文件里(这里文件名随意取)
2.在151机器上往215机器的9999端口发送数据
# nc 192.168.20.215 9999 < system_optimization.sh
215机器接收完毕,它会自动退出监听,文件大小和A机器一样,md5值也一样
# ll system_optimization.sh
-rw-r--r-- 1 root root 4176 Apr 21 16:20 system_optimization.sh
# ll test.sh
-rw-r--r--. 1 root root 4176 4月 9 13:20 test.sh
方法2:传输文件演示(先启动发送命令)
1.先在151机器上,启动发送文件命令
# nc -l 9998 < php-5.6.35.tar.gz //通过本地的9998端口发送php-5.6.35.tar.gz文件
2.在215机器上接受文件
# nc 192.168.20.151 9998 > php.tar.gz
方法3:传输目录演示(方法发送文件类似)
1.在215机器上启动监听
# nc -l 9999 | tar zxf - //传输目录需要结合其它的命令,比如tar
2.151机器上打包文件发送给215机器
# tar zcf - * | nc 192.168.20.215 9999 //管道前面表示把当前目录的所有文件打包为 - ,然后使用nc发送给215机器
用法三:测试网速
测试网速其实利用了传输文件的原理,就是把来自一台机器的/dev/zero
发送给另一台机器的/dev/null
就是把一台机器的无限个0,传输给另一个机器的空设备上,然后新开一个窗口使用dstat
命令监测网速
yum install -y dstat
1.215机器先启动接收数据的命令,监听自己的9999端口,把来自这个端口的数据都输出给空设备(这样不写磁盘,测试网速更准确)
# nc -l 9999 > /dev/null
2.151机器发送数据,把无限个0发送给A机器的9991端口
# nc 192.168.20.215 9999 < /dev/zero
在复制的窗口上使用dstat
命令查看当前网速,dstat命令比较直观,它可以查看当前cpu,磁盘,网络,内存页和系统的一些当前状态指标。
我们只需要看下面net/total
这2列即可,recv
是receive的缩写,表示接收的意思,send
是发送数据,另外注意数字后面的单位B,KB,MB。
参考链接:https://www.cnblogs.com/nmap/p/6148306.html
常见的攻击方法:
方式1:减少发送syn+ack包时重试次数
sysctl -w net.ipv4.tcp_synack_retries=3
sysctl -w net.ipv4.tcp_syn_retries=3
方式2:syn cookies技术
sysctl -w net.ipv4.tcp_syncookies=1
方式3:增加backlog队列
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
linux下其他预防策略:
策略1.关闭ICMP协议请求
sysctl -w net.ipv4.icmp_echo_ignore_all=1
策略2.通过iptables防止扫描
iptables -A FORWARD -p tcp -syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT