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

fedora_code_ps_reduc.py 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. ###########################################################
  2. # Reduction Port Scanner
  3. # Cuenta total de puertos desinatarios por cada sip
  4. # Despliega lista de puertos por cada destination ip
  5. ############################################################
  6. from silk import *
  7. startDate = "2009/04/20"
  8. endDate = "2009/04/22"
  9. minPort = 20
  10. maxPort= 60000
  11. flowHash={}
  12. otherHash= {}
  13. myNum = 0
  14. counter = 0
  15. #Funcion que convierte el int ipaddress en notacion string y devuelve los numeros
  16. #hasta la posicion del punto dada en los parametros
  17. def ipConversion(number, position):
  18. mystr = ''
  19. ipadd = number.split(".") #Devuelve un arreglo
  20. for i in range(position+1):
  21. if i ==position:
  22. mystr = mystr + ipadd[i]
  23. else:
  24. mystr = mystr + ipadd[i] + '.'
  25. return mystr #devuelve los numeros en notacion string
  26. #Funcion que verifica los flows y guarda su dip y, primero un counter de sus puertos,
  27. #y luego los puertos, en un hash. Recibe dos parametros, un hash para verificar
  28. #si ignorar o no el flow (dado en el main), y un numero para la idea de reduccion
  29. def PrimerAnalisis(flowHash, num):
  30. sampleHash={}
  31. flow_Counter=0
  32. for filename in FGlob(classname="all", type="all", start_date=startDate, end_date=endDate, site_config_file="/data/silk.conf", data_rootdir="/data"):
  33. for rec in silkfile_open(filename, READ):#reading the flow file
  34. flow_Counter+=1
  35. dport= rec.dport
  36. #print "First", str(rec.sip), str(rec.dip)
  37. 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
  38. #tiene el length de puertos requerido, se ignora
  39. continue
  40. elif (dport >= 1 and dport < minPort) or dport > maxPort: #verifica que sean puertos validos (creo que se dice asi)
  41. continue
  42. else: #agrega a un hash cada puerto con un counter de sus destination ips
  43. posA = ipConversion(str(rec.dip), num) #devuelve la primera clase del ip en notacion string
  44. if posA in sampleHash:
  45. sampleHash[posA] += 1
  46. #print (posA)
  47. else:
  48. sampleHash[posA] = 1
  49. #print (posA)
  50. print flow_Counter
  51. return sampleHash
  52. def UltimoAnalisis(flowHash, num):
  53. sampleHash = {}
  54. flow_counter = 0
  55. #print flowHash
  56. for filename in FGlob(classname="all", type="all", start_date=startDate, end_date=endDate, site_config_file="/data/silk.conf", data_rootdir="/data"):
  57. for rec in silkfile_open(filename, READ):#reading the flow file
  58. flow_counter +=1
  59. dport = rec.dport
  60. print "Ultimo", str(rec.sip), str(rec.dip)
  61. 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
  62. #tiene el length de puertos requerido, se ignora
  63. continue
  64. elif (dport >= 1 and dport < minPort) or dport > maxPort: #verifica que sean puertos validos (creo que se dice asi)
  65. continue
  66. else: # Como es el caso de la ultima busqueda, se agrega una lista de los puertos
  67. posA = ipConversion(str(rec.dip), num) #devuelve la primera clase del ip en notacion string
  68. print posA
  69. if posA in sampleHash:
  70. sampleHash[posA].append(dport)
  71. else:
  72. sampleHash[posA] = [dport]
  73. print flow_counter
  74. return sampleHash
  75. #MAIN:
  76. while myNum <3: #Se itera las cuatro veces de acuerdo con la notacion de ipv4
  77. flowHash= PrimerAnalisis(otherHash, myNum)
  78. otherHash = {} #Se borra el hash para agregar elementos nuevos con la nueva etapa de la busqueda
  79. for dips, dports in flowHash.items(): #se itera por todos los dip y sus counters o puertos
  80. if dports >= 100: #si la cantidad de puertos es mayor o igual a 100, nos interesan
  81. #y por lo tanto se guardan en un hash
  82. otherHash[dips] = dports
  83. myNum += 1
  84. #print (flowHash)
  85. print otherHash
  86. #Ultimo chequeo, utilizando el ip completo
  87. flowHash = UltimoAnalisis(otherHash, myNum)
  88. otherHash = {} #Se borra el hash para agregar elementos nuevos con la nueva etapa de la busqueda
  89. for dips, dports in flowHash.items():
  90. print dports
  91. if len(dports)>= 1: #si la cantidad de puertos es mayor o igual a 100, nos interesan
  92. #y por lo tanto se guardan en un hash
  93. otherHash[dips] = dports
  94. for dips, dports in otherHash.items():
  95. counter +=1 #para contar los elementos del hash
  96. print (counter)