· 5 years ago · Oct 17, 2020, 08:04 PM
1from scapy.all import sniff, raw
2import json
3
4n = 0
5ipcky = {}
6with open("extern.json", 'r') as handle:
7 data = json.loads(handle.read())
8
9
10def getJson(where, what):
11 return data[where].get(what)
12
13
14def llcSsap(ssap):
15 if(data['llcSsap'].get(ssap)):
16 print(getJson('llcSsap', ssap))
17
18
19def eth(ethtype):
20 if(data['ethtypes'].get(ethtype)):
21 print(getJson('ethtypes', ethtype))
22
23
24def ipv(pkt): # vnoreny protokol v ipv4, ak je znamy vypise sa.
25 if(str(pkt[24] + pkt[25] + pkt[26] + pkt[27]) == "0800"):
26 print("zdrojová IP adresa: ", end="")
27 print(int(str(pkt[52] + pkt[53]), 16), int(str(pkt[54] + pkt[55]), 16),
28 int(str(pkt[56] + pkt[57]), 16), int(str(pkt[58] + pkt[59]), 16), sep=".")
29 print("cieľová IP adresa: ", end="")
30 print(int(str(pkt[60] + pkt[61]), 16), int(str(pkt[62] + pkt[63]), 16),
31 int(str(pkt[64] + pkt[65]), 16), int(str(pkt[66] + pkt[67]), 16), sep=".")
32 ipdst = str(pkt[60] + pkt[61] + pkt[62] + pkt[63] +
33 pkt[64] + pkt[65] + pkt[66] + pkt[67])
34 if(ipdst in ipcky.keys()):
35 ipcky[ipdst] += 1
36 else:
37 ipcky[ipdst] = 1
38 prt = str(int(pkt[46]+pkt[47], 16))
39 print(getJson('protocols', prt))
40 portsrc = str(int(pkt[68]+pkt[69]+pkt[70]+pkt[71], 16))
41 portdst = str(int(pkt[72]+pkt[73]+pkt[74]+pkt[75], 16))
42 if(prt == "6"): # tcp typy portov v dec
43 if(data['tcpports'].get(portsrc)):
44 print(getJson('tcpports', portsrc).upper())
45 print("zdrojový port:", portsrc, "\ncieľový port:", portdst)
46 elif(data['tcpports'].get(portdst)):
47 print(getJson('tcpports', portdst).upper())
48 print("zdrojový port:", portsrc, "\ncieľový port:", portdst)
49 if(prt == "17"):
50 if(data['udpports'].get(portsrc)):
51 print(getJson('udpports', portsrc).upper())
52 print("zdrojový port:", portsrc, "\ncieľový port:", portdst)
53 elif(data['udpports'].get(portdst)):
54 print(getJson('udpports', portdst).upper())
55 print("zdrojový port:", portsrc, "\ncieľový port:", portdst)
56
57
58def getMac(pkt): # Zdrojova a cielova MAC adresa
59 print("Zdrojová MAC adresa: ", end="") # zdrojova MAC adresa
60 for i in range(12, 24):
61 print(pkt[i].upper(), end="")
62 if(i % 2 and i != 23):
63 print(" ", end="")
64 print("\nCieľová MAC adresa: ", end="") # cielova MAC adresa
65 for i in range(0, 12):
66 print(pkt[i].upper(), end="")
67 if(i % 2 and i != 11):
68 print(" ", end="")
69 print()
70
71
72def printFrame(pkt, api):
73 for i in range(0, api*2):
74 print(pkt[i].upper(), end="")
75 if((i+1) % 2 == 0):
76 print(" ", end="")
77 if((i+1) % 16 == 0):
78 print(" ", end="")
79 if((i+1) % 32 == 0):
80 print("")
81 print("\n")
82
83
84def ipStats(ipdest):
85 print(ipdest)
86
87
88def getFrame(frame):
89 global n
90 n += 1
91 # print('\033[45m', "rámec", n, '\033[0m')
92 print("rámec", n)
93
94 # dĺžka rámca pcap API a po médiu
95 api = len(frame)
96 print("dĺžka rámca poskytnutá pcap API -",
97 api, "B")
98 media = api + 4
99 if(media < 64):
100 media = 64
101 print("dĺžka rámca prenášaného po médiu -",
102 media, "B")
103
104 pkt = raw(frame).hex()
105
106 # urcenie typu rámca E2/IEEE
107 type = str(pkt[24] + pkt[25] + pkt[26] + pkt[27]) # ak 8004 tak E2
108 if(int(type, 16) > 2000):
109 # print('\33[33m')
110 print("Ethernet II")
111 # print('\033[0m')
112 eth(str(int(pkt[24]+pkt[25]+pkt[26]+pkt[27], 16)))
113 getMac(pkt)
114 ipv(pkt)
115 printFrame(pkt, api)
116 else:
117 if(str(pkt[28]+pkt[29]+pkt[30]+pkt[31]) == 'ffff'):
118 # print('\33[34m')
119 print("IEEE 802.3 - RAW\nIPX")
120 # print('\033[0m')
121 getMac(pkt)
122 printFrame(pkt, api)
123 elif(str(pkt[28]+pkt[29]+pkt[30]+pkt[31]) == 'aaaa'):
124 # print('\33[36m')
125 print("IEEE 802.3 - LLC + SNAP")
126 # print('\033[0m')
127 getMac(pkt)
128 eth(str(int(pkt[40]+pkt[41]+pkt[42]+pkt[43], 16)))
129 printFrame(pkt, api)
130 else:
131 # print('\33[37m')
132 print("IEEE 802.3 LLC")
133 llcSsap(str(int(pkt[30]+pkt[31], 16)))
134 # print('\033[0m')
135 getMac(pkt)
136 printFrame(pkt, api)
137
138
139def main():
140
141 #sniff(offline="C:\\Users\\Lucia\\Desktop\\FIIT\\5.Semester\\PKS\\Zadania\\vzorky_pcap_na_analyzu\\eth-3.pcap", prn=getFrame)
142 sniff(offline="C:\\Users\\Lucia\\Desktop\\FIIT\\5.Semester\\PKS\\Zadania\\vzorky_pcap_na_analyzu\\trace-26.pcap", prn=getFrame)
143 #sniff(offline="C:\\Users\\Lucia\\Desktop\\FIIT\\5.Semester\\PKS\\Zadania\\vzorky_pcap_na_analyzu\\trace-23.pcap", prn=getFrame)
144 #sniff(offline="C:\\Users\\Lucia\\Desktop\\FIIT\\5.Semester\\PKS\\Zadania\\vzorky_pcap_na_analyzu\\trace-27.pcapng", prn=getFrame)
145
146 print("IP adresy prijímajúcich uzlov:")
147 for key in ipcky:
148 print(int(key[0]+key[1], 16), int(key[2]+key[3], 16), int(key[4] +
149 key[5], 16), int(key[6]+key[7], 16), sep=".")
150
151 print("\nAdresa uzla s najväčším počtom prijatých paketov:")
152 maxip = max(ipcky, key=ipcky.get)
153 print(int(maxip[0]+maxip[1], 16), int(maxip[2]+maxip[3], 16), int(maxip[4] +
154 maxip[5], 16), int(maxip[6]+maxip[7], 16), sep=".", end=" ")
155 print(max(ipcky.values()), "paketov")
156
157
158if __name__ == "__main__":
159 main()
160