def dns_spoofing(pkt,network,IpPuerto,identificador,lenURL,ListaDNS): dstip = pkt['dstip'] ipServidorDNS = config.get("DNS_Spoofing","ipServidorDNS") dns_flags=payload(pkt,90,93) lenPayload = len(pkt['raw'].encode("hex")) #Se comprueba si es una pregunta dns al comprobar el contenido de su bandera if (dns_flags == 0100): if (dstip == ipServidorDNS): enviar.enviar_paquete(pkt,set_network,IpPuerto[dstip]) else: enviar.enviar_paquete(pkt,set_network,IpPuerto[dstip]) enviar.enviar_DNS(pkt,network) identificador=payload(pkt,86,89) lenURL = len(payload(pkt,110,lenPayload-9)) #En caso de que sea una respuesta, que ip corresponde al dominio preguntado elif (dns_flags == 8180): idRespuestas = payload(pkt,86,89) if (idRespuestas == identificador): #Lista en el que se guardaran todas las respuestas DNS ListaDNS.append(pkt) #Tiempo que esperara a que lleguen todas las respuestas DNS tiempo = config.get("DNS_Spoofing","tiempo") time.sleep(tiempo) num = 0 while (num < 2): #A continuacion se extrae la ip que se envia como respuesta del dns ubicacion = lenURL + 142 ''' ipS_Respuestas = payload(pkt,ubicacion,lenPayload-1) cadenaRespuestas = ipS_Respuestas.split('00010001') fila=0 for ip_Respuesta in cadenaRespuestas: ipRespuesta[num][fila]=ip_Respuesta[14:21] fila=fila+1 ''' ip_Respuesta[num] = payload(ListaDNS[num],ubicacion,lenPayload-1) num = num + 1 if (ip_Respuesta[0] == ip_Respuesta[1]): enviar.enviar_paquete(pkt,network,IpPuerto[dstip]) else: num = 0 while(num < 2): if ListaDNS[num]['srcip'] != IPAddr('8.8.8.8'): enviar.enviar_paquete(ListaDNS[num],network,IpPuerto[dstip]) num = num + 0 else: enviar.enviar_paquete(pkt,network,IpPuerto[dstip])
def ejecucion(pkt, network , puertoBloqueado, num): #print "se a recibido el paquete numero = " + str(num) try: switch = pkt['switch'] inport = pkt['inport'] tipoo = pkt['ethtype'] srcmac = pkt['srcmac'] dstmac = pkt['dstmac'] opcode = pkt['protocol'] dstip = pkt['dstip'] srcip = pkt['srcip'] except: print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" if tipoo == 2054: print "paquete arp" for port in network.topology.egress_locations() - {Location(switch,inport)} - {Location(switch, puertoBloqueado)}: puerto = port.port_no print "puerto entrada = " + str(inport) print "puerto switch = " + str(puerto) enviar.enviar_paquete(pkt,network,puerto) print "****************************************" ControladorHoneynet.num=ControladorHoneynet.num+1 elif tipoo == 2048: print "paquete IP " for port in network.topology.egress_locations() - {Location(switch,inport)} - {Location(switch, puertoBloqueado)}: puerto = port.port_no print "puerto entrada = " + str(inport) print "puerto switch = " + str(puerto) enviar.enviar_paquete(pkt,network,puerto) print "//////////////////////////////////////" ControladorHoneynet.num=ControladorHoneynet.num+1 else: print "Paquetes desconocidos " for port in network.topology.egress_locations() - {Location(switch,inport)} - {Location(switch, puertoBloqueado)}: puerto = port.port_no print "puerto entrada = " + str(inport) print "puerto switch = " + str(puerto) enviar.enviar_paquete(pkt,network,puerto) print "???????????????????????????????????????????????" num=num+1
def paquete(self,pkt): print "Se ha recibido un nuevo paquete..." try: switch = pkt['switch'] inport = pkt['inport'] srcmac = pkt['srcmac'] dstmac = pkt['dstmac'] tipoo = pkt['ethtype'] opcode = pkt['protocol'] srcip = pkt['srcip'] dstip = pkt['dstip'] except: print "%%%%%%%%%%%%%%%%%%%%%%%%%%" #Se determinara si el paquete recibido, es o no del tipo ARP" if tipoo == 2054: print "paquete ARP " arp.ejecutarARP(pkt,self.network, self.IpPuerto, self.IpMac, self.paqueteARP, self.IpMacAtacante) #Se determinara si el paquete recibido, es o no del tipo IP" elif tipoo == 2048: print "paquete IP " try: #A continuacion se hace una comprobacion de la ip y el puerto de origen con los datos obtenidos al hacer el ARP #El siguiente lazo if comprueba si se trata de un ip spoofing" if ((self.IpMac[srcip] == srcmac) and (self.IpPuerto[srcip]==inport)): print "NO se trata de un IP SPOOFING" if opcode == 1: print "Paquete ICMP" #con el comando ping y un grep vamos a obtener la direccion de broadcasr del interface de red ipBcast = "ifconfig eth0 | grep 'Bcast'| cut -d':' -f3 | cut -d' ' -f1" broadcast_IP = os.system(ipBcast) #Se hace una comparacion con la direccion de destino si es la de broadcast para decidir a donde enviar el paquete #El siguiente lazo if comprueba si se trata de un ataque smurf print broadcast_IP if broadcast_IP == dstip: #Destino la honeynet enviar.enviar_paquete(pkt,self.network,int(self.puertoHoneynet)) print "ATAQUE SMURF" else: #Destino la red real enviar.enviar_paquete(pkt,self.network,self.IpPuerto[dstip]) print "BUENO" elif opcode == 6: print "Paquete TCP" syn_flood.syn_flood(pkt,self.network, self.IpPuerto, self.ListaAtacantes, self.ListaClientes, self.ListaSolicitudes) # Si corresponde a un paquete UDP elif opcode == 17: print "paquete UDP " #A continuacion de extrae el payload codificado (paquete original) del pkt OpenFlow of_payload_code = pkt['raw'] #A continucaion se codifica en hexadecimal dicho payload of_payload = of_payload_code.encode("hex") #A continuacion se extrae alguas bandetas de TCP, aquellas que nos indican si es syn, syn-ack y ack dstport = of_payload[74:78] if (dstport == 0053): dns_spoofing.dns_spoofing(pkt, self.network, self.IpPuerto, self.identificador, self.lenURL, self.ListaDNS) else: enviar_paquete(pkt,self.network,self.IpPuerto[dstip]) else: print "Otro tipo de paquete IP" #Cualquier otro tipo de paquete que se reciba no se analiza en este proyecto por lo que se envia el paquete sin niguna restriccion. enviar.enviar_paquete(pkt,self.network,self.IpPuerto[dstip]) else: print "Se trata de un IP SPOOFING" enviar_paquete(pkt,self.network,int(self.puertoHoneynet)) except: print "Error con el paquete IP recibido...(diccionarios vacios)" enviar.enviar_ARP(pkt, self.network) #Se determinara si el paquete recibido, es o no del tipo RARP elif tipoo == 32821: print "paquete RARP " #Lista en el que se guardaran todas las respuestas RARP self.ListaRARP.append(pkt) #Tiempo que esperara a que lleguen todas las respuestas RARP tiempo = self.config.get("RARP","tiempo") time.sleep(tiempo) #A continuacion se comprobara si es que llega mas de una respuesta longLista = len(self.ListaRARP) if longLista >= 2: num = 0 while (num < longLista): #En la lista de las respuestas RARP buscamos cual es el atacante para enviarlo a la honeynet if self.ListaRARP[num]['srcmac'] != self.IpMac[srcip]: self.IpMacAtacante[srcip] = srcmac self.IpMac.remove(srcip) enviar.enviar_paquete(paqueteARP,self.network,self.IpPuerto[dstip]) num = num + 1 #Si solo llega una respuesta actualizamos el diccionario IpMac y enviamos el paquete original a que se realice el ARP else: arp.ejecutarARP(paqueteARP,self.network, self.IpPuerto, self.IpMac, self.paqueteARP)
def comprobarFlags(pkt,network,IpPuerto,flag,flagInicial,flagFinal): config = ConfigParser() #config.read("honeynet.cfg") #Se ha creado una instancia de la clase ConfigParser que nos permite leer un archivo de configuracion puertoHoneynet = config.get("PUERTOS","puertoHoneynet") srcip = pkt['srcip'] dstip = pkt['dstip'] #Se obtiene de un archivo de configuracion la ip del servidor ipServidor = config.get("SYNFLOOD","ipServidor") #A continuacion se verifica si se trata de una peticion (SYN) if flag == flagInicial: #A continuacion se obtiene el tamano de la lista de solicitudes para limitar el numero de solicitudes permitidas tamano_actual_listasolicitudes = len(ListaSolicitudes) #Se obtiene de un archivo de configuracion el tamano maximo que puede tener la lista de Solicitudes de conexion TCP que ha recibido el servidor tamano_max_listasolicitudes = config.get("SYNFLOOD","tamano") #A continuacion se verifica que el tamano de la lsiat sea menor al maximo especificado en el archivo de configuracion if tamano_actual_listasolicitudes < tamano_max_listasolicitudes: #A continuacion se verifica que la direccion IP origen del segmento TCP recibido no sea la del servidor if srcip == ipServidor: #En caso que la direccion Ip de origen es la del servidor, el trafico se debe deja pasar sin ninguna restriccion enviar.enviar_paquete(pkt,network,IpPuerto[dstip]) else: #A continuacion se verifica que la direccion IP origen del segmento TCP recibido no se encuentre en la lista de solicitudes if srcip in ListaSolicitudes: #Si la direccion IP origen del segmento TCP recibido SI se encuentre en la lista de solicitudes, entonces se procede a borrarla de dicha lista y, ListaSolicitudes.remove(srcip) # Se la agrega a la lista de Atacantes, puesto que se presume esta intentando hacer un segundo intento de conexion al servidor al mismo timpo.. ListaAtacantes.append(srcip) #Sin embargo se deja pasar un solo paquete paga obtener estadisticas print "Revisar siguiente linea no se debe enviar todos los paquetes..." #Al tratarse de un ataque le enviamos al puerto de la honeynet enviar.enviar_paquete(pkt,network,int(puertoHoneynet)) #A continuacion se verifica que la direccion IP origen del segmento TCP recibido se encuentre en la lista de atacantes elif srcip in ListaAtacantes: #Se envia el paquete a la honeynet print "Revisar a donde se envia el paquete!!!" enviar.enviar_paquete(pkt,network,int(puertoHoneynet)) #A continuacion se verifica que la direccion IP origen del segmento TCP recibido se encuentre en la lista de Clientes lejitimos elif srcip in ListaClientes: enviar.enviar_paquete(pkt,network,IpPuerto[dstip]) else: #Debido a que no estaba en al lista de clientes lejitimos, se procede a anadirla ListaSolicitudes.append(srcip) #Se envia a la LAN enviar.enviar_paquete(pkt,network,IpPuerto[dstip]) else: #En caso de que el tamano de la lista sea mayor al tamano maximo especificado, Se anade a la lista de atacantes la primera solicitud que se agrego a la lista de solicitudes pendientes ListaAtacantes.append(ListaSolicitudes[0]) # A continuacion se procede a borrar la solicitud que se ha enviado a la lista de atacantes de la lista de solicitudes para liberar un espacio del ListaSolicitudes[0] # Y finalmente se agrega la nueva solicitud a la lista de solicitudes pendientes ListaSolicitudes.append(srcip) #A continuacion se verifica si se trata de una respuesta a la peticion (ack) (tercera via de la conexion TCP) elif flag == flagFinal: #A continuacion se verifica si la direccion ip origen es la direccion del servidor if srcip == ipServidor: #Se envia el paquete sin ninguna restriccion enviar.enviar_paquete(pkt,network,IpPuerto[dstip]) else: #A continuacion se verifica si la direccion ip de origen se encuentra en la lista de solicitudes if srcip in ListaSolicitudes: #Se procede a enviar el paquete, ya que se concidera una conexion legitima enviar.enviar_paquete(pkt,network,IpPuerto[dstip]) #Ya que es una conexion lejitima se procede a eliminar de la lista de solicitudes y ListaSolicitudes.remove(srcip) #Se le anade a la lista de clientes legitimos ListaClientes.append(srcip) #A continuacion se verifica si la direccion IP origen esta en la lista de atacantes aun caundo se trata de uan conexion legitima (lenta) debido a que se revico la tercera via TCP. elif srcip in ListaAtacantes: #Se procede a enviar el paquete enviar.enviar_paquete(pkt,network,IpPuerto[dstip]) #Se la remueve de la lista de atacantes ListaAtacantes.remove(srcip) #Se la agrega a la lsita de clientes legitimos. ListaClientes.append(srcip) elif srcip in ListaClientes: #Se trata de uan conexxion legitima por lo que se envia el paquete sin ninguna restriccion. enviar.enviar_paquete(pkt,network,IpPuerto[dstip]) else: #Cualquier otra bandera que se envia no se la analiza en este proyecto por lo que se envia el paquete sin niguna restriccion. enviar.enviar_paquete(pkt,network,IpPuerto[dstip])
def paqueteIP(pkt, network, IpPuerto,IpMac, Listas, puertoHoneynet): srcip = pkt['srcip'] srcmac = pkt['srcmac'] switch = pkt['switch'] inport = pkt['inport'] dstport = pkt['dstport'] if srcip in IpMac: if IpMac[srcip] == srcmac: syn_flood_andres.syn_flood(pkt, network, IpPuerto, IpMac, Listas) else: <<<<<<< HEAD comando = "hping3 -1 " + dstport + "-a 192.168.0.1" ping = os.system(comando) ======= comandoIp = "ping -c 1 " + str(srcip) ping_Ip = os.system(comandoIp) >>>>>>> 94431146b7631208099f15260602a3555f5743fd else: IpMac[srcip]=srcmac for port in network.topology.egress_locations() - {Location(switch,inport)} - {Location(switch, puertoHoneynet)}: puerto = port.port_no enviar.enviar_paquete(pkt,network,puerto)
def paquete(self,pkt ): try: tipoPkt = pkt['ethtype'] red = self.network protocolo = pkt['protocol'] srcip = pkt['srcip'] dstmac = pkt ['dstmac'] except: print pkt respuesta = "" if self.proceso == 0: if tipoPkt == 2054: respuesta = arp.arp_spoofing(pkt, self.ListaARP) elif tipoPkt == 2048: respuesta = ip.ip_spoofing(pkt, self.IpMac, self.Paquete, self.lstSrcMac, self.lstMacAtacante, self.ipGateway) if respuesta == "LAN": if protocolo == 6: respuesta = tcp.tcp_syn_flood(pkt, self.ListaAtacantes, self.ListaClientes, self.ListaSolicitudes, self.IpNumSOLT, self.IpNumCLIT, self.ipServidor, self.num_max_conexiones, self.tamano_max_listasolicitudes) if respuesta == "LAN": if true: respuesta = https.thc_ssl_dos(red, pkt, self.ListaAtacantesT, self.ListaClientesT, self.ListaSolicitudesT, self.IpNumC, self.IpNumS) else: respuesta = "LAN" elif protocolo == 17: respuesta = udp.dns_spoofing(pkt, red, self.ListaAtacantesDNS, self.macGateway) elif protocolo == 1: respuesta = icmp.smurf(pkt) else: print "Paquete desconocido" respuesta = "LAN" elif self.proceso == 1: if tipoPkt == 2054: respuesta = arp.arp_spoofing(pkt, self.dicSolicitudesARP, self.dicRespuestasARP, self.dicMacIp, self.ListaAtacantesARP, self.num_max_solicitudes) else : respuesta = "LAN" elif self.proceso == 2: respuesta = ip.ip_spoofing(pkt, self.IpMac, self.MacPuerto, self.lstMacAtacante, self.puertoHoneynet) elif self.proceso == 3: try: if tipoPkt == 2048 and protocolo == 6: respuesta = tcp.tcp_syn_flood(pkt, self.lstAtacantesT, self.dicSolicitudesT, self.dicClientesT, self.ipServidor, self.num_max_conexiones) else: if (srcip in self.lstAtacantesT): respuesta = "HONEYNET" else: respuesta = "LAN" except: print("ERROR TCP") elif self.proceso == 4: respuesta = udp.dns_spoofing(pkt, self.ListaAtacantesDNS, MAC(self.macGateway)) elif self.proceso == 5: if tipoPkt == 2048 and protocolo == 1: respuesta = icmp.smurf(pkt, IP(self.ipBroadcast)) else: respuesta = "LAN" if self.proceso == 6: try: if tipoPkt == 2048 and protocolo == 6: respuesta = https.thc_ssl_dos(pkt, self.lstAtacantesS, self.dicSolicitudesS, self.dicClientesS, IP(self.ipServidor), self.num_max_conexiones) else: if (srcip in self.lstAtacantesS): respuesta = "HONEYNET" else: respuesta = "LAN" except: print("ERROR TCP") if respuesta == "LAN": enviar.enviar_paquete(pkt, red, self.puertoHoneynet) elif respuesta == "HONEYNET": enviar.enviar_Honeynet(pkt, red, self.puertoHoneynet) elif respuesta == "TODO": enviar.enviar_todo(pkt, red) elif respuesta == "ATACANTE": enviar.enviar_Honeynet(pkt, red,self.MacPuerto[dstmac])