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