Декодировать пакет UDP в Netflow

Я столкнулся с функцией Wireshark decode as, где я могу декодировать UDP-пакет как CFLOW, чтобы получить данные Netflow.

Можно ли написать сценарий, который декодирует пакет UDP и получает данные Netflow?

В настоящее время я пробую это с помощью python3-scapy. Где я обнюхиваю интерфейс и получаю только UDP-пакет. Я застрял сейчас, потому что я не знаю, что мне делать дальше.

Примечание. Мое внимание сосредоточено на Netflow версии 9.

Ниже мой код:

from scapy.all import *

## Create a Packet Counter
counter = 0
INTERFACE = "<interface_name>"

## Define our Custom Action function
def custom_action(pkts):
    for packet in pkts:
        if (packet.haslayer(UDP)):
             # do something , what should i do?

if __name__ == "__main__":
    ## Setup sniff, filtering for IP traffic
    sniff(iface=INTERFACE, prn = custom_action, store=0)

person z.yea    schedule 05.12.2017    source источник


Ответы (1)


К вашему сведению, вы можете использовать layer in pkt вместо «старого» pkt.haslayer(layer). Это будет работать с разрабатываемой версией Scapy (которая работает с Python 3).

Обратный вызов prn принимает пакет, а не список пакетов или генератор.

Если вы хотите использовать NetflowHeader() для (попытки) анализа любого пакета UDP, вы можете сделать:

def custom_action(pkt):
    if UDP in pkt:
        pkt[UDP].payload = NetflowHeader(raw(pkt[UDP].payload))

pkts = sniff(iface=INTERFACE, prn=custom_action)

Но самым близким способом к функциональности Wireshark «декодировать как» в Scapy было бы просто перезаписать атрибут UDP .payload_guess:

UDP.payload_guess = [({}, NetflowHeader)] 
pkts = sniff(iface=INTERFACE)
person Pierre    schedule 05.12.2017
comment
Где я могу получить NetflowHeader() и как они используются? p.s. Я довольно новичок в scapy. благодарю вас - person z.yea; 06.12.2017
comment
NetflowHeader() — это слой Scapy, который вам нужно использовать для декодирования данных как Netflow. Загрузите последнюю версию с сайта github.com/secdev/scapy. - person Pierre; 06.12.2017
comment
Спасибо! Мне удается заставить работать NetflowHeader(). Когда я прочитал документацию по Netflow v9 для scapy. Означает ли это, что когда я хочу декодировать пакет UDP в Netflow v9, мне просто нужно изменить это на это: pkt[UDP].payload = NetflowHeaderV9(Raw(pkt[UDP].payload))? Он вернет мне объект Raw Netflow v9. Это оно? - person z.yea; 07.12.2017
comment
Нет. Вы увидите NetflowHeaderV9 слои, когда NetflowHeader декодирует версию как 9. NetflowHeader должен начинаться с номера версии. - person Pierre; 07.12.2017