123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- 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)
|