Skip to content

Instantly share code, notes, and snippets.

@dmoisset
Created October 14, 2015 20:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dmoisset/9e20479c30b9735e48e0 to your computer and use it in GitHub Desktop.
Save dmoisset/9e20479c30b9735e48e0 to your computer and use it in GitHub Desktop.
import json
import sys
# You need scapy installed to run this
from scapy.utils import PcapReader
import scapy.layers.inet
def main():
if len(sys.argv) != 2:
sys.stderr.write("Usage: %s <filename.pcap>\n\n" % sys.argv[0])
filename = sys.argv[1]
# Pick up only TCP messages
messages = [seg for seg in PcapReader(filename) if "TCP" in seg]
segments = []
last_ack = {}
for m in messages:
segment = {}
segment["src"] = m.sprintf("%IP.src%:%TCP.sport%")
segment["dst"] = m.sprintf("%IP.dst%:%TCP.dport%")
flags = m.sprintf("%TCP.flags%")
segment["syn"] = "S" in flags
segment["fin"] = "F" in flags
segment["rst"] = "R" in flags
# Acks are special. Not only the A bit must be set, but also the seq number should increase
if "A" in flags:
conn_key = (segment["src"], segment["dst"])
if conn_key in last_ack:
old_ack = last_ack[conn_key]
else:
old_ack = m["TCP"].ack-1
last_ack[conn_key] = m["TCP"].ack
segment["ack"] = old_ack != m["TCP"].ack
else:
segment["ack"] = False
segments.append(segment)
sys.stdout.write("[\n ")
sys.stdout.write(",\n ".join(json.dumps(seg) for seg in segments))
sys.stdout.write("\n]")
if __name__=="__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment