python-scapy: como traduzir números de portas para nomes de serviços?
Pergunta
Uma camada de TCP em scapy contém porta de origem:
>>> a[TCP].sport
80
Existe uma maneira simples para a porta número convertido ao nome do serviço? Eu vi scapy tem TCP_SERVICES
e UDP_SERVICES
para traduzir o número da porta, mas
print TCP_SERVICES[80] # fails
print TCP_SERVICES['80'] # fails
print TCP_SERVICES.__getitem__(80) # fails
print TCP_SERVICES['www'] # works, but it's not what i need
80
Alguém sabe como posso mapear portas para os serviços?
Agradecemos antecipadamente
Solução
Se isto é algo que você precisa fazer com freqüência, você pode criar um mapeamento inverso do TCP_SERVICES
:
>>> TCP_REVERSE = dict((TCP_SERVICES[k], k) for k in TCP_SERVICES.keys())
>>> TCP_REVERSE[80]
'www'
Outras dicas
Python do tomada módulo irá fazer isso:
>>> import socket
>>> socket.getservbyport(80)
'http'
>>> socket.getservbyport(21)
'ftp'
>>> socket.getservbyport(53, 'udp')
'domain'
Isso pode funcionar para você (filtragem do dicionário com base no valor):
>>> [k for k, v in TCP_SERVICES.iteritems() if v == 80][0]
'www'
Se você estiver usando Unix ou Linux há um arquivo / etc / serviços que contém esse mapeamento.
Eu encontrei uma boa solução de enchimento mais self.MYTCP_SERVICES dict
for p in scapy.data.TCP_SERVICES.keys():
self.MYTCP_SERVICES[scapy.data.TCP_SERVICES[p]] = p
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow