Scapy извлечь IP-адрес без повторов - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь извлечь IP-адрес назначения, затем сохранить его в словаре, но я хочу его только один раз

Ввод

from scapy.all import *

pkts = rdpcap('example.pcap')

test = ""
for pkt in pkts:
    temp = pkt.sprintf("%IP.dst%",)
    test = test + temp

print(test)


В настоящее время мой вывод похож на

??,????,????,????,??0.0.0.0,255.255.255.255192.168.1.1,192.168.1.2380.0.0.0,255.255.255.255192.168.1.1,192.168.1.238192.168.1.1,192.168.1.2380.0.0.0,255.255.255.255192.168.1.1,192.168.1.238??,????,????,????,????,??192.168.1.238,192.168.1.1192.168.1.1,192.168.1.238192.168.1.238,89.30.121.15089.30.121.150,192.168.1.238192.168.1.238,89.30.121.150192.168.1.238,89.30.121.15089.30.121.150,192.168.1.238192.168.1.238,89.30.121.150192.16

Я хочу, чтобы выходные данные выглядели так, и я хочу, чтобы конечный IP-адрес был только без повторов

89.30.121.150
198.50.110.244
89.30.121.14
89.30.121.23

Вместо этого я получаю огромный список IP-адресов. Мне нужен только IP-адрес назначения, но только ОДИН РАЗ (без повторов) не для каждого пакета

Я также пробовал это, но это зависает?

def print_summary(pkt):
    if IP in pkt:
        ip_dst=pkt[IP].dst
    print(ip_dst)

sniff(offline=pkts, filter="ip",prn=print_summary)

Может кто-нибудь придумать более быстрое решение для извлекать IP-адреса из больших файлов PCAP, используя Scapy

1 Ответ

0 голосов
/ 20 февраля 2020

Если вы хотите поместить в словарь, вы должны использовать словарь.

Вы получаете повторное значение, потому что вы не сохраняете его в python dict.

Вот один из способов сохранить src-->dest ip без повторения путем изменения вашего кода:

from scapy.all import *

pkts = rdpcap('example.pcap')

dic = {}
for pkt in pkts:
    temp = pkt.sprintf("%IP.dst%")
    dic[temp] = 1

for ip in dic.keys():
    print(ip)

вывод:

192.168.1.1
192.37.115.0
192.168.1.2
212.242.33.35
192.168.1.251
147.137.21.94
147.137.21.122
147.234.1.253

Один из самых быстрых методов:

from scapy.all import *

IP.payload_guess = []

ips = set(p[IP].dst for p in PcapReader('example.pcap') if IP in p)

for ip in ips:
    print(ip)
...