Python, как анализировать пакеты сервера RADIUS?

Я пытаюсь анализировать пакеты UDP с сервера RADIUS, и я пробовал разные инструменты, включая Scapy, Pynids и pypcap. Проблема в том, что некоторые атрибуты Radius не декодируются должным образом, а некоторые из них. Что может быть причиной этого?

Вот мой код:

from scapy.all import sniff, Radius

packets = sniff(iface='eth0', filter='udp', count=5)
packet = packets[0]

print packet.show()

И вот сводка вывода, который я получаю:

###[ Ethernet ]### 
   dst       = 94:57:a5:53:ab:70
   src       = d4:ca:6d:ae:a0:66
   type      = 0x800
###[ UDP ]### 
   sport     = 38667
   dport     = radius
   len       = 205
   chksum    = 0x2bbd
###[ Radius ]### 
   code      = Access-Request
   id        = 80
   len       = 197
   authenticator= "T\xfb\x9c\t\x00 '\x14\xeb\x99\x84t\x9b\xb4\x83\x95"
   \attributes\
    |###[ Radius Attribute ]### 
    |  type      = Framed-Protocol
    |  len       = 6
    |  value     = '\x00\x00\x00\x01'
    |###[ Radius Attribute ]### 
    |  type      = NAS-Port
    |  len       = 6
    |  value     = '\x00\xf6\xa7\xf9'
    |###[ Radius Attribute ]### 
    |  type      = Called-Station-Id
    |  len       = 8
    |  value     = 'Dslam1'
    |###[ Radius Attribute ]### 
    |  type      = 87
    |  len       = 16
    |  value     = 'ether1-Dslam 1'
    |###[ Radius Attribute ]### 
    |  type      = Vendor-Specific
    |  len       = 24
    |  value     = '\x00\x00\x017\x0b\x12\x19\xfc4\xd01\xaf\x03\xd6\x0e!j\xa7H]\xdd;'
    |###[ Radius Attribute ]### 
    |  type      = NAS-Identifier
    |  len       = 15
    |  value     = 'TEH-P'

person Amin Alaee    schedule 24.11.2016    source источник


Ответы (1)


Для будущих посетителей вот как мне удалось разобрать пакеты.

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

from pyrad.packet import Packet
from pyrad.dictionary import Dictionary

from scapy.all import sniff, Radius

def parse_packet(packet):
    radius_packet = str(packet[Radius])
    pkt = Packet(packet=radius_packet, dict=Dictionary("dictionary"))

    for key, value in pkt.iteritems():
        attr =  pkt._DecodeKey(key)
        value = pkt.__getitem__(attr)
        print attr, value

sniff(iface='eth0', prn=parse_packet, filter="udp", store=0)

Это образец ответа, который я получил:

User-Name [u'12345678']
NAS-IP-Address ['192.168.*.*']
NAS-Port [15853417]
Service-Type ['Framed-User']
Framed-Protocol ['PPP']
Framed-IP-Address ['192.168.*.*']
Called-Station-Id [u'service4']
Calling-Station-Id [u'20:A7:5C:75:RA:TD']
NAS-Identifier [u'Test']
Acct-Status-Type ['Alive']
Acct-Delay-Time [0]
Acct-Input-Octets [1003335]
Acct-Output-Octets [15399190]
Acct-Session-Id [u'81c2332b']
Acct-Authentic ['RADIUS']
Acct-Session-Time [76321]
Acct-Input-Packets [15498]
Acct-Output-Packets [21247]
person Amin Alaee    schedule 27.11.2016
comment
Это сработало, но я получаю закодированные данные, вы знаете, как их расшифровать? - person PachinSV; 16.03.2017
comment
@PachinSV Разве значение еще не расшифровано? нравится ответ, который я включил? - person Amin Alaee; 16.03.2017
comment
Я получаю такие значения: 80 [b' \xac)bH\x9c4L\x04i\xb2\x8a\x9a~\xe0\x95'] - person PachinSV; 16.03.2017
comment
@PachinSV Думаю, вам нужно обновить файл словаря, образец можно найти здесь github.com/wichert/pyrad/blob/master/example/dictionary . Это могут быть значения, зависящие от поставщика, со специальной кодировкой. - person Amin Alaee; 17.03.2017
comment
У меня ошибка: IndexError: Layer [Radius] not found ???? - person Morteza Soltanabadiyan; 14.10.2020
comment
@MortezaSoltanabadiyan Не могли бы вы поделиться трассировкой стека? Это в скапи или пираде? - person Amin Alaee; 22.10.2020