Как перевести RAW LOAD из scapy в нотацию KERBEROS, используя python
У меня есть пакет Kerberos перехвата с использованием scapy:
###[ Ethernet ]###
dst = 20:6a:8a:0c:1e:3f
src = 00:25:64:a1:2a:9d
type = 0x800
###[ IP ]###
version = 4L
ihl = 5L
tos = 0x0
len = 213
id = 48219
flags = DF
frag = 0L
ttl = 64
proto = tcp
chksum = 0x4aaf
src = 192.168.88.224
dst = 192.168.88.231
\options \
###[ TCP ]###
sport = 34856
dport = kerberos
seq = 2748677979
ack = 527108396
dataofs = 8L
reserved = 0L
flags = PA
window = 229
chksum = 0x6ab9
urgptr = 0
options = [('NOP', None), ('NOP', None), ('Timestamp', (8241937, 896410))]
###[ Raw ]###
load = '\x00\x00\x00\x9dj\x81\x9a0\x81\x97\xa1\x03\x02\x01\x05\xa2\x03\x02\x01\n\xa3\x0e0\x0c0\n\xa1\x04\x02\x02\x00\x95\xa2\x02\x04\x00\xa4{0y\xa0\x07\x03\x05\x00@\x00\x00\x10\xa1\x120\x10\xa0\x03\x02\x01\x01\xa1\t0\x07\x1b\x05admin\xa2\n\x1b\x08TEST.LAN\xa3\x1d0\x1b\xa0\x03\x02\x01\x02\xa1\x140\x12\x1b\x06krbtgt\x1b\x08TEST.LAN\xa5\x11\x18\x0f20160408162022Z\xa7\x06\x02\x04\x1f\xf2f\x81\xa8\x140\x12\x02\x01\x12\x02\x01\x11\x02\x01\x10\x02\x01\x17\x02\x01\x19\x02\x01\x1a'
И мне нужно перевести (Parses) раздел [Raw] load =\x00\x00\x ... так, как это может понравиться Wireshark, потому что я хочу манипулировать данными, хранящимися в пакете, и отправлять пакет другим измененным получателям. Я знаю, что может быть использована библиотека ASN1, но я не знаю, как. Спасибо за любую помощь
2 ответа
Вы должны быть в состоянии восстановить структуры данных Kerberos из сериализованной формы, скомпилировав спецификацию Kerberos ASN.1 в модуль pyasn1 (Python) с помощью инструмента asn1ate, а затем запустив декодер pyasn1 против вашего захвата. Это преобразует данные Kerberos в живые объекты Python, которые можно изменить в памяти и повторно сериализовать обратно в последовательность октетов.
Некоторые примеры сценариев, декодирующих другие протоколы, можно найти здесь.
Забавный факт: Scapy добавил поддержку Kerberos (документ) в версии 2.5.0!
Вот пример:
>>> pkt[TCP].payload.show()
###[ KerberosTCPHeader ]###
len = 305
###[ Kerberos ]###
\root \
|###[ KRB_AS_REQ ]###
| pvno = 0x5 <ASN1_INTEGER[5]>
| msgType = 'AS-REQ' 0xa <ASN1_INTEGER[10]>
| \padata \
| |###[ PADATA ]###
| | padataType= 'PA-ENC-TIMESTAMP' 0x2 <ASN1_INTEGER[2]>
| | \padataValue\
| | |###[ EncryptedData ]###
| | | etype = 'AES-256' 0x12 <ASN1_INTEGER[18]>
| | | kvno = None
| | | cipher = <ASN1_STRING[b"HHM\xec\xb0\x1c\x9bb\xa1\xca\xbf\xbc?-\x1e\xd8Z\xa5\xe0\x93\xba\x83X\xa8\xce\xa3MC\x93\xaf\x93\xbf!\x1e'O\xa5\x8e\x81Hx\xdb\x9f\rz(\xd9Ns'f\r\xb4\xf3pK"]>
| |###[ PADATA ]###
| | padataType= 'PA-PAC-REQUEST' 0x80 <ASN1_INTEGER[128]>
| | \padataValue\
| | |###[ PA_PAC_REQUEST ]###
| | | includePac= True <ASN1_BOOLEAN[-1]>
| \reqBody \
| |###[ KRB_KDC_REQ_BODY ]###
| | kdcOptions= forwardable, renewable, canonicalize, renewable-ok <ASN1_BIT_STRING[0100000010...0000010000]=b'@\x81\x00\x10' (0 unused bit)>
| | \cname \
| | |###[ PrincipalName ]###
| | | nameType = 'NT-PRINCIPAL' 0x1 <ASN1_INTEGER[1]>
| | | nameString= [<ASN1_GENERAL_STRING[b'win1$']>]
| | realm = <ASN1_GENERAL_STRING[b'DOMAIN.LOCAL']>
| | \sname \
| | |###[ PrincipalName ]###
| | | nameType = 'NT-SRV-INST' 0x2 <ASN1_INTEGER[2]>
| | | nameString= [<ASN1_GENERAL_STRING[b'krbtgt']>, <ASN1_GENERAL_STRING[b'DOMAIN.LOCAL']>]
| | from = None
| | till = 2037-09-13 02:48:05 UTC <ASN1_GENERALIZED_TIME['20370913024805Z']>
| | rtime = 2037-09-13 02:48:05 UTC <ASN1_GENERALIZED_TIME['20370913024805Z']>
| | nonce = 0x701cc5d1 <ASN1_INTEGER[1880933841]>
| | etype = [0x12 <ASN1_INTEGER[18]>, 0x11 <ASN1_INTEGER[17]>, 0x17 <ASN1_INTEGER[23]>, 0x18 <ASN1_INTEGER[24]>, -0x87 <ASN1_INTEGER[-135]>, 0x3 <ASN1_INTEGER[3]>]
| | \addresses \
| | |###[ HostAddress ]###
| | | addrType = 'NetBios' 0x14 <ASN1_INTEGER[20]>
| | | address = <ASN1_STRING[b'WIN1 ']>
| | encAuthorizationData= None
| | additionalTickets= None