Извлечь данные c байт в полезной нагрузке из файла pcap, используя scapy - PullRequest
2 голосов
/ 21 февраля 2020

Я пытаюсь извлечь указанный c байт из каждого пакета в файле pcap. Все пакеты являются ICMP.

В разделе данных есть байт, который изменяет каждый пакет. Он находится в одинаковом положении для каждого. Я хотел бы извлечь этот байт.

enter image description here

Используя scapy:

pkts = rdpcap('test.pcap')
pl = PacketList([p for p in pkts])

bytes(pl[12].payload)

возвращает следующее:

b'E\x00\x00T]\xa7\x00\x00***J***\x01!A\xc0\xa88\x01\xc0\xa88o\x08\x004\xe9\xbf2\x00\x00^"\x87\xbe\x00\x0c2\xf4\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567'

Я вложил байт, который хочу извлечь, в три звезды. Однако, если я распечатаю байты для каждого пакета, то байт, который я хочу извлечь, будет иметь другое смещение.

Если я запускаю hexdump для каждого пакета следующим образом:

hexdump(bytes(pl[12].payload))

Указанный c байт, который я хочу извлечь, всегда находится в одной и той же позиции, но я не знаю, как его извлечь.

Как можно извлечь указанный c байт из pcap, используя scapy?

После этого ответа здесь: Получить спецификацию c байт в полезной нагрузке из файла pcap

Если я выполняю ту же команду, она ничего не делает полезно:

>>> hexdump(pkts[14][2].load[8])
0000  00 00 00 00 00 00 00 00                          ........
>>>

1 Ответ

4 голосов
/ 22 февраля 2020

Вы хотите TTL?

Давайте начнем с высокого уровня и опустимся вниз.

Scapy дает вам созданный пакет. Если вы хотите TTL пакета, вызовите атрибут:

>>> plist[182].ttl
64

Если вы хотите получить указанный c байт пакета, давайте посмотрим на hexdump:

>>> hexdump(plist[182])
0000  AA BB CC 66 42 DE AA BB CC 3F 52 A3 08 00 45 00  .a.lM..M.AK...E.
0010  00 5B 58 B9 40 00 40 06 64 96 C0 A8 01 28 AC D9  .[X.@.@.d....(..
...

Это в шестнадцатеричном формате, первое поле 0000 - это смещение, затем 16 байтов в шестнадцатеричном, затем ascii.

Offset  Bytes                                            ASCII
======  ===============================================  ================
0000    AA BB CC 66 42 DE AA BB CC 3F 52 A3 08 00 45 00  .a.lM..M.AK...E.

Вещи начинаются с 0, поэтому адреса байтов равны 0..15 для первой строки. Во второй строке смещение составляет 16 (16 * 1). Таким образом, адреса байтов 16..31. Третья строка, смещение 32 (16 * 2). Таким образом, адреса байтов 32..47

Вы выделили 7-й байт в строке 2:

Offset Bytes                                            ASCII
       0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
====== ===============================================  ================
0010   00 5B 58 B9 40 00 40 06 64 96 C0 A8 01 28 AC D9  .[X.@.@.d....(..

Этот адрес:

offset + byte_address.
offset = 16 * 1
byte_address = 6

Что дает нам:

16 + 6 = 22

Теперь мы можем получить байтовый адрес 22 из необработанного пакета:

>>> b = raw(plist[182])
>>> b[22]
64

Обратите внимание, что номера пакетов wireshark начинаются с 1. Пакеты в python начнем с 0. Итак, в моем примере пакет 182 соответствует пакету 183. В Wireshark.

plist [182] .payload дает вам IP-часть пакета, поэтому смещения будут другими, так как мы больше не смотрим на весь пакет. Мы можем получить то же значение, используя атрибут .ttl. Или, зная, что адрес - это байт 8 в заголовке IP:

>>> plist[182].payload.ttl
64
>>> raw(plist[182].payload)[8]
64
...