Advertisement
Guest User

PingTalk Client

a guest
Dec 3rd, 2010
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.03 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. import sys
  15.  
  16. try:
  17.     from scapy.all import IP, ICMP, send, sr # Scapy
  18. except:
  19.     print >>sys.stderr, "Este script necesita scapy"
  20.  
  21. from os import devnull # Para suprimir los mensajes de Scapy :P
  22. from os import urandom # para obtener strings pseudo-aleatorias
  23. from time import sleep # para esperar entre mensaje y mensaje
  24.  
  25. buff_size = (1 << 10) # Tamaño del buffer de lectura
  26.  
  27. sleep_time = 0.01 # Tiempo entre comprobaciones de fin de hilos
  28.  
  29. global done
  30. done = 0 # nº de hilos que acabaron
  31. rand_data = False # ¿El data del ping será aleatoria?
  32.  
  33. class ping_client:
  34.     # Genera un identificador de 16-bits a partir del mensaje
  35.     def two_bytes(self,msg):
  36.         x = 0L
  37.         s = msg[ : 2]
  38.         if (len(s) > 1):
  39.             x = (ord(s[0]) + (ord(s[1]) << 8))
  40.         elif (len(s) == 1):
  41.             x = ord(s[0])
  42.         else:
  43.             x = 0
  44.         if (self.debug):
  45.             print >>sys.stderr,  s,"->",
  46.             print >>sys.stderr,hex(x)
  47.         return x
  48.  
  49.     # Actualiza el paquete al próximo número de secuencia
  50.     def next_seq(self, paq):
  51.         paq[1].seq = (paq[1].seq + 1) & 0xFFFF
  52.  
  53.     # Prepara el paquete para mandarlo
  54.     def craft_paq(self,
  55.                  src_ip,
  56.                  dst_ip,
  57.                  data = "A",
  58.                  rep = 56,
  59.                  paq_type = 8,
  60.                  paq_code = 0):
  61.         ip = IP(src = src_ip, dst = dst_ip)
  62.         icmp = ICMP()
  63.         icmp.type = paq_type
  64.         icmp.code = paq_code
  65.         icmp.id = 0
  66.         return [ip, icmp, str(data * rep)]
  67.  
  68.     # Envía un paquete
  69.     def send_paq(self, paq):
  70.         send(paq)
  71.  
  72.     # Ensambla un paquete
  73.     def asm_paq(self, paq):
  74.         return paq[0]/paq[1]/paq[2]
  75.  
  76.     # Inicializa el objeto
  77.     def __init__(self, src_ip, dst_ip,rand_data = False ,debug = False, data = "Hey!", rep = 14, sleep_time = 0.01):
  78.         self.debug = debug
  79.         self.paq = self.craft_paq(src_ip, dst_ip, data, rep)
  80.         self.rand = rand_data
  81.         self.rep = rep
  82.         self.sleep_time = sleep_time
  83.  
  84.     # Manda el mensaje
  85.     def send(self, msg, part = False):
  86.         i = 0
  87.         while True:
  88.             self.next_seq(self.paq) # Siguiente número de secuencia
  89.             if (self.rand): # Si el data es aleatorio, se genera
  90.                 r = urandom(self.rep)
  91.                 self.paq[2] = r
  92.             self.paq[1].id = self.two_bytes(msg) # Se prepara el nuevo id
  93.             self.send_paq(self.asm_paq(self.paq)) # Se envía
  94.  
  95.             # Si no es parte de un mensaje mayor
  96.             # envía todo
  97.             if (not part):
  98.                 if (len(msg) < 1):
  99.                     break
  100.                 msg = msg[2 : ]
  101.  
  102.             # Si lo es, envía todo lo posible y devuelve el resto
  103.             else:
  104.                 msg = msg[2 : ]
  105.                 if (len(msg) < 2):
  106.                     return msg
  107.  
  108.             # Espera un poco para intentar que lleguen en orden
  109.             sleep(sleep_time)
  110.  
  111.     # Envía parte de un mensaje
  112.     def send_part(self, msg):
  113.         return self.send(msg, True)
  114.        
  115. # Muestra las opciones
  116. def show_help(arg0):
  117.     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>] [ -f <archivo a enviar>] [ -u ]"
  118.     print arg0, "-h   : muestra esto"
  119.     print arg0, "-u   : los datos enviados (no los identificadores) son aleatorios"
  120.  
  121. threadN = 1 # Número de hilos
  122. src_ip = "" # IP de origen
  123. dst_ip = "" # IP de destino
  124. times = 10  # Paquetes que enviará cada hilo
  125. data = "A" # Cadena que se enviará
  126. rep = 56    # Veces que se repetirá la cadena
  127. fname = ""
  128.  
  129. # Se leen los parámetros
  130. argc = len(sys.argv)
  131. i = 1
  132. while i < argc:
  133.     if (sys.argv[i] == "-h"):
  134.         show_help(sys.argv[0])
  135.         exit(0)
  136.  
  137.     elif (sys.argv[i] == "-s"):
  138.         i += 1
  139.         src_ip = sys.argv[i]
  140.  
  141.     elif (sys.argv[i] == "-u"):
  142.         rand_data = True
  143.  
  144.     elif (sys.argv[i] == "-d"):
  145.         i += 1
  146.         dst_ip = sys.argv[i]
  147.  
  148.     elif (sys.argv[i] == "-p"):
  149.         i += 1
  150.         times = int(sys.argv[i])
  151.  
  152.     elif (sys.argv[i] == "-t"):
  153.         i += 1
  154.         threadN = int(sys.argv[i])
  155.  
  156.     elif (sys.argv[i] == "-b"):
  157.         i += 1
  158.         data = sys.argv[i]
  159.  
  160.     elif (sys.argv[i] == "-r"):
  161.         i += 1
  162.         rep = int(sys.argv[i])
  163.  
  164.     elif (sys.argv[i] == "-f"):
  165.         i += 1
  166.         fname = sys.argv[i]
  167.  
  168.     else:
  169.         print >>sys.stderr, "Opción [", sys.argv[i], "] desconocida"
  170.         exit(1)
  171.  
  172.     i += 1
  173.  
  174. if (src_ip == "") or (dst_ip == ""):
  175.     print >>sys.stderr, "No se han especificado las IP que se enviarán"
  176.     exit(1)
  177.  
  178. s = ping_client(src_ip, dst_ip, rand_data  = rand_data, data = data, rep = rep)
  179.  
  180. # Elimina los mensajes superfluos de stdout
  181. tmp = sys.stdout
  182.  
  183. # Se escribe el mensaje
  184. if (fname == ""):
  185.     data = raw_input(">>>")
  186.     if (data [-1] == "\n"):
  187.         data = data[:-1]
  188.  
  189.     sys.stdout = open(devnull, "a")
  190.     s.send(data)
  191. else: # Se obtiene de un archivo
  192.     sys.stdout = open(devnull, "a")
  193.     f = open(fname, "r")
  194.     l = "" # Prepara un buffer vacío
  195.     while (True):
  196.         l += f.read(buff_size | 1) # Le añade una carga de datos
  197.         ll = len(l)
  198.         if (ll < buff_size): # Si es el último
  199.             s.send(l) # no hay siguiente mensaje
  200.             break
  201.         l = s.send_part(l) # sino, si lo hay
  202.  
  203. sys.stdout = tmp # Restaura la salida
  204.  
  205. print "[Hecho]"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement