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

trw_reducps.py 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import ipaddress
  2. import json
  3. #Para usar Silk
  4. #SilkFile object (represents a channel for writing to or reading from Silk flow file)
  5. #FGlob object (allows retireval of filenames in a silk data store.)
  6. #threshold of the ratio
  7. p = 5
  8. flowHash={}
  9. otherHash= {}
  10. myNum = 0
  11. counter = 0
  12. PATH = '/Users/Sara/Documents/Univ Classes/Investigacion/Programas/netflows.txt'
  13. myFile = open(PATH, 'r')
  14. ip = myFile.read()
  15. flow = json.loads(ip)
  16. #Funcion que convierte y devuelve el int ipaddress en notacion punto-decimal
  17. def ipConversion(number, position):
  18. mystr = ''
  19. ipadd = (str(ipaddress.IPv4Address(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. def AnalisisReduciendo(flowHash, num):
  27. connection = [0] * 2 #Lista para contener los valores de conecciones fallidas y conecciones buenas
  28. ratioHash = {}
  29. for i in flow["flows"]: #itera por cada elemento del diccionario de flows
  30. sip = ipConversion(i["sip"], 3)
  31. dip = ipConversion(i["dip"], num) #Devuelve el ip en notacion punto-decimal
  32. flags = i["tcpflags"].split(",") #array of all tcp flags that are set
  33. if num != 0 and ipConversion(i["dip"], num-1) not in flowHash: #Si en el paso anterior se vio que no
  34. #tiene el length de puertos requerido, se ignora
  35. continue
  36. else:
  37. if 'A' in flags: #if the acknowledge flag is set
  38. connection[1]=1 #good conections
  39. else:
  40. connection [0] =1 #failed conections
  41. if sip in ratioHash: #si sip esta en ratioHash => que posA esta en sampleHash
  42. #por lo tanto ya se puede sumar las conecciones al ratio del dip
  43. if dip in ratioHash[sip]:
  44. ratioHash[sip][dip][0]+=connection[0]
  45. ratioHash[sip][dip][1] += connection[1]]
  46. else:
  47. ratioHash[sip][dip] = [connection[0], connection[1]]
  48. else: #si sip no esta en ratioHash tampoco posA en sampleHash por lo
  49. #tanto se inicializa posA en sampleHash y luego sip en ratioHash con su valor de sampleHash
  50. ratioHash[sip] = {dip: [connection[0], connection[1]]}
  51. return ratioHash
  52. while myNum <4: #Se itera las cuatro veces de acuerdo con la notacion de ipv4
  53. flowHash= AnalisisReduciendo(otherHash, myNum)
  54. otherHash = {} #Se borra el hash para agregar elementos nuevos con la nueva etapa de la busqueda
  55. for sip, dipHash in flowHash.items(): #se itera por todos los dip y sus counters o puertos
  56. if (dipHash['dip'][0] / dipHash['dip'][1]) < 0: #si la cantidad de succesful
  57. #connections es mas que failed connections
  58. #not scanner, ignore
  59. else if (dipHash['dip'][0] / dipHash['dip'][1]) < p:
  60. #not scanner, ignore
  61. else:
  62. #scanner, oh oh
  63. myNum += 1
  64. #print (flowHash)