#!/opt/local/bin/python2.6 # ^ valid for scapy-2.6 package on macports # # Pcapline # Timeline Generation for pcap files # # Wesley McGrew # Mississippi State University National Forensics Training Center # http://security.cse.msstate.edu/ftc # # wesley@mcgrewsecurity.com # http://mcgrewsecurity.com # import sys import os import time import re import hashlib import struct from scapy.all import * version = '0.9' global pkt_num global flow_num global pcap_filename global first_pkt_time global first_pkt_time_set global carve_num flows = {} def hex_dump(data): output = '' i = 0 while i < len(data): offset = '%08X ' % i hex_field = '' ascii_field = '' for j in range(0,16): if (i+j) < len(data): hex_field += '%02X ' % ord(data[i+j]) if ord(data[i+j]) > 31 and ord(data[i+j]) < 127: ascii_field += data[i+j] else: ascii_field += '.' else: hex_field += ' ' ascii_field += ' ' if j == 7: hex_field += ' ' ascii_field += ' ' output += offset + '| ' + hex_field + '| ' + ascii_field + '\n' i += 16 return output def flags_to_str(flags): flags_str = '' if flags & 0x80: flags_str += 'C' else: flags_str += '-' if flags & 0x40: flags_str += 'E' else: flags_str += '-' if flags & 0x20: flags_str += 'U' else: flags_str += '-' if flags & 0x10: flags_str += 'A' else: flags_str += '-' if flags & 0x08: flags_str += 'P' else: flags_str += '-' if flags & 0x04: flags_str += 'R' else: flags_str += '-' if flags & 0x02: flags_str += 'S' else: flags_str += '-' if flags & 0x01: flags_str += 'F' else: flags_str += '-' return flags_str def get_flow_tuple(pkt): src_ip = pkt.getlayer(IP).src dst_ip = pkt.getlayer(IP).dst if pkt.getlayer(IP).proto == 6: src_port = pkt.getlayer(TCP).sport dst_port = pkt.getlayer(TCP).dport elif pkt.getlayer(IP).proto == 17: src_port = pkt.getlayer(UDP).sport dst_port = pkt.getlayer(UDP).dport else: src_port = -1 dst_port = -1 return (src_ip,src_port,dst_ip,dst_port) class Flow: num_pkts = 0 flow_id = 0 start_time = 0 last_time = 0 data_len = 0 flow_tuple = () protocol = '' dataseg_num = -1 dataseg_host = '' dataseg_filename = '' dataseg = '' # Add carvers for various formats to this function. # Currently, it has carvers that specifically target # what is required for the challenge: # * HTTP GET requests # * HTTP responses def carve_from_segment(self,data): global carve_num s = '' if re.search(r'^GET .*? HTTP/',data): s += '
%s\n' % file_output s += '
| Packets\n' r += ' | Start Time\n' r += ' | Source\n' r += ' | Destination\n' r += ' | Data Bytes\n' r += ' |
| %s - %s\n' % (self.pkt_numbers[i], ignore_until) r += ' | %f\n' % (self.loaded_pkts[i].time - first_pkt_time) r += ' | %s:%i\n' % (self.loaded_pkts[i].getlayer(IP).src, self.loaded_pkts[i].getlayer(UDP).sport) r += ' | %s:%i\n' % (self.loaded_pkts[i].getlayer(IP).dst, self.loaded_pkts[i].getlayer(UDP).dport) r += ' | %i\n' % len(data) r += ' |
View data:\n' r += '
| Packets\n' r += ' | Start Time\n' r += ' | Source\n' r += ' | Destination\n' r += ' | Data Bytes\n' r += ' |
| %s - %s\n' % (self.pkt_numbers[i], ignore_until) r += ' | %f\n' % (self.loaded_pkts[i].time - first_pkt_time) r += ' | %s:%i\n' % (self.loaded_pkts[i].getlayer(IP).src, self.loaded_pkts[i].getlayer(TCP).sport) r += ' | %s:%i\n' % (self.loaded_pkts[i].getlayer(IP).dst, self.loaded_pkts[i].getlayer(TCP).dport) r += ' | %i\n' % len(data) r += ' |
View data:\n' r += '
| Packet #\n' r += ' | Time\n' r += ' | Source\n' r += ' | Destination\n' r += ' | IP ID#\n' r += ' | Sequence #\n' r += ' | Ack #\n' r += ' | TCP Flags\n' r += ' |
| %i\n' % self.pkt_numbers[i] r += ' | %f\n' % (self.loaded_pkts[i].time - first_pkt_time) r += ' | %s:%i\n' % (self.loaded_pkts[i].getlayer(IP).src, self.loaded_pkts[i].getlayer(TCP).sport) r += ' | %s:%i\n' % (self.loaded_pkts[i].getlayer(IP).dst, self.loaded_pkts[i].getlayer(TCP).dport) r += ' | %i\n' % self.loaded_pkts[i].getlayer(IP).id r += ' | %i\n' % self.loaded_pkts[i].getlayer(TCP).seq r += ' | %i\n' % self.loaded_pkts[i].getlayer(TCP).ack r += ' | %s\n' % flags_to_str(self.loaded_pkts[i].getlayer(TCP).flags) r += ' |
| Flow #\n' s += ' | Protocol\n' s += ' | Host 1\n' s += ' | Host 2\n' s += ' | Start Time\n' s += ' | Last Packet Time\n' s += ' | Bytes of Data\n' s += ' | Packet #s\n' s += ' |