#Reduction Port Scanner import ipaddress import json #Para usar Silk #SilkFile object (represents a channel for writing to or reading from Silk flow file) #FGlob object (allows retireval of filenames in a silk data store.) minPort = 20 maxPort= 60000 flowHash={} otherHash= {} myNum = 0 counter = 0 PATH = '/Users/Sara/Documents/Univ Classes/Investigacion/Programas/netflows.txt' myFile = open(PATH, 'r') ip = myFile.read() flow = json.loads(ip) #Funcion que convierte el int ipaddress en notacion string y devuelve los numeros #hasta la posicion del punto dada en los parametros def ipConversion(number, position): mystr = '' ipadd = (str(ipaddress.IPv4Address(number))).split(".") #Devuelve un arreglo for i in range(position+1): if i ==position: mystr = mystr + ipadd[i] else: mystr = mystr + ipadd[i] + '.' return mystr #devuelve los numeros en notacion string #Funcion que verifica los flows y guarda su dip y, primero un counter de sus puertos, #y luego los puertos, en un hash. Recibe dos parametros, un hash para verificar #si ignorar o no el flow (dado en el main), y un numero para la idea de reduccion def PrimerAnalisis(flowHash, num): sampleHash={} for i in flow["flows"]: #itera por cada elemento del diccionario de flows posA = ipConversion(i["dip"], num) #devuelve la primera clase del ip en notacion string if num != 0 and ipConversion(i["dip"], num-1) not in flowHash: #Si en el paso anterior se vio que no #tiene el length de puertos requerido, se ignora continue elif (i['dport'] >= 1 and i['dport'] < minPort) or i['dport'] > maxPort: #verifica que sean puertos validos (creo que se dice asi) continue else: #agrega a un hash cada puerto con un counter de sus destination ips if posA in sampleHash: sampleHash[posA] += 1 #print (posA) else: sampleHash[posA] = 1 #print (posA) return sampleHash def UltimoAnalisis(flowHash, num): sampleHash = {} for i in flow["flows"]: #itera por cada elemento del diccionario de flows posA = ipConversion(i["dip"], num) #devuelve la primera clase del ip en notacion string if ipConversion(i["dip"], num-1) not in flowHash: #Si en el paso anterior se vio que no #tiene el length de puertos requerido, se ignora continue elif (i['dport'] >= 1 and i['dport'] < minPort) or i['dport'] > maxPort: #verifica que sean puertos validos (creo que se dice asi) continue else: # Como es el caso de la ultima busqueda, se agrega una lista de los puertos if posA in sampleHash: sampleHash[posA].append(i['dport']) else: sampleHash[posA] = [i['dport']] return sampleHash #MAIN: while myNum <3: #Se itera las cuatro veces de acuerdo con la notacion de ipv4 flowHash= PrimerAnalisis(otherHash, myNum) otherHash = {} #Se borra el hash para agregar elementos nuevos con la nueva etapa de la busqueda for dips, dports in flowHash.items(): #se itera por todos los dip y sus counters o puertos if dports >= 100: #si la cantidad de puertos es mayor o igual a 100, nos interesan #y por lo tanto se guardan en un hash otherHash[dips] = dports myNum += 1 #print (flowHash) #Ultimo chequeo, utilizando el ip completo flowHash = UltimoAnalisis(otherHash, myNum) otherHash = {} #Se borra el hash para agregar elementos nuevos con la nueva etapa de la busqueda for dips, dports in flowHash.items(): if len(dports)>= 100: #si la cantidad de puertos es mayor o igual a 100, nos interesan #y por lo tanto se guardan en un hash otherHash[dips] = dports print (flowHash) for dips, dports in otherHash.items(): counter +=1 #para contar los elementos del hash print (counter)