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.) #threshold of the ratio p = 5 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 y devuelve el int ipaddress en notacion punto-decimal 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 def AnalisisReduciendo(flowHash, num): connection = [0] * 2 #Lista para contener los valores de conecciones fallidas y conecciones buenas ratioHash = {} for i in flow["flows"]: #itera por cada elemento del diccionario de flows sip = ipConversion(i["sip"], 3) dip = ipConversion(i["dip"], num) #Devuelve el ip en notacion punto-decimal flags = i["tcpflags"].split(",") #array of all tcp flags that are set 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 else: if 'A' in flags: #if the acknowledge flag is set connection[1]=1 #good conections else: connection [0] =1 #failed conections if sip in ratioHash: #si sip esta en ratioHash => que posA esta en sampleHash #por lo tanto ya se puede sumar las conecciones al ratio del dip if dip in ratioHash[sip]: ratioHash[sip][dip][0]+=connection[0] ratioHash[sip][dip][1] += connection[1]] else: ratioHash[sip][dip] = [connection[0], connection[1]] else: #si sip no esta en ratioHash tampoco posA en sampleHash por lo #tanto se inicializa posA en sampleHash y luego sip en ratioHash con su valor de sampleHash ratioHash[sip] = {dip: [connection[0], connection[1]]} return ratioHash while myNum <4: #Se itera las cuatro veces de acuerdo con la notacion de ipv4 flowHash= AnalisisReduciendo(otherHash, myNum) otherHash = {} #Se borra el hash para agregar elementos nuevos con la nueva etapa de la busqueda for sip, dipHash in flowHash.items(): #se itera por todos los dip y sus counters o puertos if (dipHash['dip'][0] / dipHash['dip'][1]) < 0: #si la cantidad de succesful #connections es mas que failed connections #not scanner, ignore else if (dipHash['dip'][0] / dipHash['dip'][1]) < p: #not scanner, ignore else: #scanner, oh oh myNum += 1 #print (flowHash)