########################################################### # Reduction Port Scanner # Cuenta total de puertos desinatarios por cada sip # Despliega lista de puertos por cada destination ip ############################################################ from silk import * startDate = "2009/04/20" endDate = "2009/04/22" minPort = 20 maxPort= 60000 flowHash={} otherHash= {} myNum = 0 counter = 0 #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 = 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={} flow_Counter=0 for filename in FGlob(classname="all", type="all", start_date=startDate, end_date=endDate, site_config_file="/data/silk.conf", data_rootdir="/data"): for rec in silkfile_open(filename, READ):#reading the flow file flow_Counter+=1 dport= rec.dport #print "First", str(rec.sip), str(rec.dip) if (':' in str(rec.dip)) or (num != 0 and ipConversion(str(rec.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 (dport >= 1 and dport < minPort) or 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 posA = ipConversion(str(rec.dip), num) #devuelve la primera clase del ip en notacion string if posA in sampleHash: sampleHash[posA] += 1 #print (posA) else: sampleHash[posA] = 1 #print (posA) print flow_Counter return sampleHash def UltimoAnalisis(flowHash, num): sampleHash = {} flow_counter = 0 #print flowHash for filename in FGlob(classname="all", type="all", start_date=startDate, end_date=endDate, site_config_file="/data/silk.conf", data_rootdir="/data"): for rec in silkfile_open(filename, READ):#reading the flow file flow_counter +=1 dport = rec.dport print "Ultimo", str(rec.sip), str(rec.dip) if (':' in str(rec.dip)) or (num != 0 and ipConversion(str(rec.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 (dport >= 1 and dport < minPort) or 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 posA = ipConversion(str(rec.dip), num) #devuelve la primera clase del ip en notacion string print posA if posA in sampleHash: sampleHash[posA].append(dport) else: sampleHash[posA] = [dport] print flow_counter 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) print otherHash #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(): print dports if len(dports)>= 1: #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 for dips, dports in otherHash.items(): counter +=1 #para contar los elementos del hash print (counter)