aboutsummaryrefslogtreecommitdiff
path: root/parse_pcap.py
blob: 3214f15c0b31ec27b8eff502d7ebdce3c5284f98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import dpkt
import binascii
from keystore import KEYSTORE
from cStringIO import StringIO
from inform import InformSerializer, Cryptor


def add_colons_to_mac(mac_addr):
    mac_addr = binascii.hexlify(mac_addr)
    return ":".join([mac_addr[i*2:i*2+2] for i in range(12/2)]).lower()


for ts, buf in dpkt.pcap.Reader(open("/Users/mcrute/Desktop/http_fast.pcap")):
    eth = dpkt.ethernet.Ethernet(buf)
    data = eth.data.tcp.data.split("\r\n")
    header, data = data[0], data[-1]

    keys = [
        KEYSTORE.get(add_colons_to_mac(eth.src)),
        KEYSTORE.get(add_colons_to_mac(eth.dst)),
        KEYSTORE.get("00:00:00:00:00:00")
    ]

    if not data.startswith("TNBU"):
        continue

    for key in keys:
        if key is None:
            continue

        ser = InformSerializer(key)

        try:
            packet = ser.parse(StringIO(data))
            ser._decrypt_payload(packet)

            if not packet.raw_payload.startswith("{"):
                continue
            else:
                break
        except ValueError as err:
            if '16' in err.message:
                #to_add = 16 - (len(data[40:]) % 16)
                #decrypted = Cryptor(KEY, packet.iv).decrypt(data[40:] + ("\x00" * to_add))
                continue
            else:
                raise

        packet = None


        if not packet:
            print "Bad Packet"
            continue
        else:
            print packet.raw_payload

        #type = packet.payload.get('_type', None)

        #if type and (not type == 'noop'):
        #    print packet.raw_payload