Skip to content

Commit d605730

Browse files
authored
Support pcap_ng captures (#2296)
1 parent a4ef19e commit d605730

File tree

1 file changed

+31
-3
lines changed

1 file changed

+31
-3
lines changed

modules/processing/network.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
sys.path.append(CUCKOO_ROOT)
7979

8080
TLS_HANDSHAKE = 22
81+
PCAP_TYPE = None
8182

8283
Keyed = namedtuple("Keyed", ["key", "obj"])
8384
Packet = namedtuple("Packet", ["raw", "ts"])
@@ -736,7 +737,12 @@ def run(self):
736737
return self.results
737738

738739
try:
739-
pcap = dpkt.pcap.Reader(file)
740+
if PCAP_TYPE == "pcap":
741+
pcap = dpkt.pcap.Reader(file)
742+
elif PCAP_TYPE == "pcapng":
743+
pcap = dpkt.pcapng.Reader(file)
744+
else:
745+
return self.results
740746
except dpkt.dpkt.NeedData:
741747
log.error('Unable to read PCAP file at path "%s"', self.filepath)
742748
return self.results
@@ -1087,6 +1093,8 @@ def _import_ja3_fprints(self):
10871093
return ja3_fprints
10881094

10891095
def run(self):
1096+
global PCAP_TYPE
1097+
PCAP_TYPE = check_pcap_file_type(self.pcap_path)
10901098
self.key = "network"
10911099
self.ja3_file = self.options.get("ja3_file", os.path.join(CUCKOO_ROOT, "data", "ja3", "ja3fingerprint.json"))
10921100
if not IS_DPKT:
@@ -1225,14 +1233,20 @@ def __init__(self, path, linktype=1):
12251233
def write(self, p=None):
12261234
if not self.fileobj:
12271235
self.fileobj = open(self.name, "wb")
1228-
self.fd = dpkt.pcap.Writer(self.fileobj, linktype=self.linktype)
1236+
if PCAP_TYPE == "pcap":
1237+
self.fd = dpkt.pcap.Writer(self.fileobj, linktype=self.linktype)
1238+
elif PCAP_TYPE == "pcapng":
1239+
self.fd = dpkt.pcapng.Writer(self.fileobj, linktype=self.linktype)
12291240
if p:
12301241
self.fd.writepkt(p.raw, p.ts)
12311242

12321243
def __iter__(self):
12331244
if not self.fileobj:
12341245
self.fileobj = open(self.name, "rb")
1235-
self.fd = dpkt.pcap.Reader(self.fileobj)
1246+
if PCAP_TYPE == "pcap":
1247+
self.fd = dpkt.pcap.Reader(self.fileobj)
1248+
elif PCAP_TYPE == "pcapng":
1249+
self.fd = dpkt.pcapng.Reader(self.fileobj)
12361250
self.fditer = iter(self.fd)
12371251
self.linktype = self.fd.datalink()
12381252
return self
@@ -1338,3 +1352,17 @@ def packets_for_stream(fobj, offset):
13381352
fobj.seek(offset)
13391353
for p in next_connection_packets(pcapiter, linktype=pcap.datalink()):
13401354
yield p
1355+
1356+
1357+
def check_pcap_file_type(filepath):
1358+
with open(filepath, "rb") as fd:
1359+
magic_number = fd.read(4)
1360+
fd.seek(0)
1361+
magic_number = int.from_bytes(magic_number, byteorder='little')
1362+
1363+
if magic_number in (0xa1b2c3d4, 0xd4c3b2a1):
1364+
return "pcap"
1365+
elif magic_number == 0x0a0d0d0a:
1366+
return "pcapng"
1367+
else:
1368+
return

0 commit comments

Comments
 (0)