123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #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)
|