Source Code for network and port scanner, TRW algorithm, and reduction method implementations.

PS_reduc.py 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #Reduction Port Scanner
  2. import ipaddress
  3. import json
  4. #Para usar Silk
  5. #SilkFile object (represents a channel for writing to or reading from Silk flow file)
  6. #FGlob object (allows retireval of filenames in a silk data store.)
  7. minPort = 20
  8. maxPort= 60000
  9. flowHash={}
  10. otherHash= {}
  11. myNum = 0
  12. counter = 0
  13. PATH = '/Users/Sara/Documents/Univ Classes/Investigacion/Programas/netflows.txt'
  14. myFile = open(PATH, 'r')
  15. ip = myFile.read()
  16. flow = json.loads(ip)
  17. #Funcion que convierte el int ipaddress en notacion string y devuelve los numeros
  18. #hasta la posicion del punto dada en los parametros
  19. def ipConversion(number, position):
  20. mystr = ''
  21. ipadd = (str(ipaddress.IPv4Address(number))).split(".") #Devuelve un arreglo
  22. for i in range(position+1):
  23. if i ==position:
  24. mystr = mystr + ipadd[i]
  25. else:
  26. mystr = mystr + ipadd[i] + '.'
  27. return mystr #devuelve los numeros en notacion string
  28. #Funcion que verifica los flows y guarda su dip y, primero un counter de sus puertos,
  29. #y luego los puertos, en un hash. Recibe dos parametros, un hash para verificar
  30. #si ignorar o no el flow (dado en el main), y un numero para la idea de reduccion
  31. def PrimerAnalisis(flowHash, num):
  32. sampleHash={}
  33. for i in flow["flows"]: #itera por cada elemento del diccionario de flows
  34. posA = ipConversion(i["dip"], num) #devuelve la primera clase del ip en notacion string
  35. if num != 0 and ipConversion(i["dip"], num-1) not in flowHash: #Si en el paso anterior se vio que no
  36. #tiene el length de puertos requerido, se ignora
  37. continue
  38. elif (i['dport'] >= 1 and i['dport'] < minPort) or i['dport'] > maxPort: #verifica que sean puertos validos (creo que se dice asi)
  39. continue
  40. else: #agrega a un hash cada puerto con un counter de sus destination ips
  41. if posA in sampleHash:
  42. sampleHash[posA] += 1
  43. #print (posA)
  44. else:
  45. sampleHash[posA] = 1
  46. #print (posA)
  47. return sampleHash
  48. def UltimoAnalisis(flowHash, num):
  49. sampleHash = {}
  50. for i in flow["flows"]: #itera por cada elemento del diccionario de flows
  51. posA = ipConversion(i["dip"], num) #devuelve la primera clase del ip en notacion string
  52. if ipConversion(i["dip"], num-1) not in flowHash: #Si en el paso anterior se vio que no
  53. #tiene el length de puertos requerido, se ignora
  54. continue
  55. elif (i['dport'] >= 1 and i['dport'] < minPort) or i['dport'] > maxPort: #verifica que sean puertos validos (creo que se dice asi)
  56. continue
  57. else: # Como es el caso de la ultima busqueda, se agrega una lista de los puertos
  58. if posA in sampleHash:
  59. sampleHash[posA].append(i['dport'])
  60. else:
  61. sampleHash[posA] = [i['dport']]
  62. return sampleHash
  63. #MAIN:
  64. while myNum <3: #Se itera las cuatro veces de acuerdo con la notacion de ipv4
  65. flowHash= PrimerAnalisis(otherHash, myNum)
  66. otherHash = {} #Se borra el hash para agregar elementos nuevos con la nueva etapa de la busqueda
  67. for dips, dports in flowHash.items(): #se itera por todos los dip y sus counters o puertos
  68. if dports >= 100: #si la cantidad de puertos es mayor o igual a 100, nos interesan
  69. #y por lo tanto se guardan en un hash
  70. otherHash[dips] = dports
  71. myNum += 1
  72. #print (flowHash)
  73. #Ultimo chequeo, utilizando el ip completo
  74. flowHash = UltimoAnalisis(otherHash, myNum)
  75. otherHash = {} #Se borra el hash para agregar elementos nuevos con la nueva etapa de la busqueda
  76. for dips, dports in flowHash.items():
  77. if len(dports)>= 100: #si la cantidad de puertos es mayor o igual a 100, nos interesan
  78. #y por lo tanto se guardan en un hash
  79. otherHash[dips] = dports
  80. print (flowHash)
  81. for dips, dports in otherHash.items():
  82. counter +=1 #para contar los elementos del hash
  83. print (counter)