Pitão

Construindo seu próprio Monitor de Rede com PyShark

Construindo seu próprio Monitor de Rede com PyShark

Ferramentas existentes

Muitas ferramentas para análise de rede já existem há algum tempo. No Linux, por exemplo, são Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack, bem como velocímetro e ettercap. Para uma descrição detalhada deles, você pode dar uma olhada na comparação de Silver Moon [1].

Então, por que não usar uma ferramenta existente e escrever sua própria, em vez? As razões que vejo são uma melhor compreensão dos protocolos de rede TCP / IP, aprender a codificar corretamente ou implementar apenas o recurso específico de que você precisa para seu caso de uso, porque as ferramentas existentes não fornecem o que você realmente precisa. Além disso, as melhorias de velocidade e carga em seu aplicativo / sistema também podem desempenhar um papel que o motiva a se mover mais nessa direção.

Em estado selvagem, existem várias bibliotecas Python para processamento e análise de rede. Para programação de baixo nível, a biblioteca de soquetes [2] é a chave. Bibliotecas de alto nível baseadas em protocolo são httplib, ftplib, imaplib e smtplib. Para monitorar as portas de rede e os candidatos competitivos do fluxo de pacotes, são usados ​​o python-nmap [3], o dpkt [4] e o PyShark [5]. Para monitorar e alterar o fluxo de pacotes, a biblioteca scapy [6] é amplamente utilizada.

Neste artigo, daremos uma olhada na biblioteca PyShark e monitoraremos quais pacotes chegam a uma interface de rede específica. Como você verá abaixo, trabalhar com o PyShark é simples. A documentação no site do projeto irá ajudá-lo nos primeiros passos - com ela, você alcançará um resultado utilizável muito rapidamente. No entanto, quando se trata do âmago da questão, mais conhecimento é necessário.

O PyShark pode fazer muito mais do que parece à primeira vista e, infelizmente, no momento em que este livro foi escrito, a documentação existente não cobre isso por completo. Isso torna desnecessariamente difícil e fornece um bom motivo para olhar mais profundamente sob o capô.

Sobre PyShark

PyShark [8] é um wrapper Python para Tshark [10]. Ele simplesmente usa sua capacidade de exportar dados XML usando sua análise. O próprio Tshark é a versão de linha de comando do Wireshark. Ambos Tshark e PyShark dependem da biblioteca Pcap que realmente captura pacotes de rede e é mantida sob o capô do Tcpdump [7]. PyShark é desenvolvido e mantido continuamente por Dan (ele usa o nome KimiNewt no Twitter).

Para evitar possíveis confusões, existe uma ferramenta de som semelhante, Apache Spark [11], que é um motor analítico unificado para processamento de dados em grande escala. O nome PySpark é usado para a interface Python do Apache Spark, que não discutimos aqui.

Instalando o PyShark

O PyShark requer que a biblioteca Pcap e o Tshark estejam instalados. Os pacotes correspondentes para Debian GNU / Linux 10 e Ubuntu são nomeados libpcap0.8 e tshark e pode ser configurado da seguinte maneira usando apt-get:

Listagem 1: Instalando a biblioteca Pcap e Tshark

# pip3 install python-pyshark

Se ainda não estiver instalado, Python3 e Pip também devem ser adicionados. Os pacotes correspondentes para Debian GNU / Linux 10 e Ubuntu são chamados de python3 e python3-pip e podem ser instalados da seguinte maneira usando apt-get:

Listagem 2: Instale Python 3 e PIP para Python 3

# apt-get install python3 python3-pip

Agora é hora de adicionar o PyShark. Com base em nossa pesquisa, o PyShark ainda não foi empacotado para nenhuma distribuição Linux importante. A instalação dele é feita usando o instalador de pacote Python pip3 (pip para Python 3) como um pacote para todo o sistema da seguinte maneira:

Listagem 3: Instale o PyShark usando PIP

# pip3 install python-pyshark

Agora, o PyShark está pronto para ser usado em scripts Python em seu sistema Linux. Observe para executar os scripts Python abaixo como um usuário administrativo, por exemplo, usando sudo porque a biblioteca Pcap não permite que você procure por pacotes como um usuário regular.

A instrução a seguir adiciona o conteúdo do módulo PyShark ao namespace do seu script Python:

Listagem 4: Importar o módulo PyShark

importar pyshark

Métodos de captura de pacotes

Pronto para usar, o PyShark vem com dois modos diferentes com os quais oferece a coleta de pacotes da interface de rede observada. Para coleta contínua, use o método LiveCapture (), e para salvar em um arquivo local, use o método FileCapture () do módulo PyShark. O resultado é uma lista de pacotes (objeto iterador Python) que permite que você percorra o pacote de dados capturados por pacote. As listas abaixo demonstram como usar os dois métodos.

Listagem 5: Use o PyShark para capturar da primeira interface Wifi wlan0

importar pyshark
capture = pyshark.LiveCapture (interface = 'wlan0')

Com as declarações anteriores, os pacotes de rede capturados são mantidos na memória. A memória disponível pode ser limitada, no entanto, armazenar os pacotes capturados em um arquivo local é uma alternativa. Em uso está o formato de arquivo Pcap [9]. Isso permite que você processe e interprete os dados capturados por outras ferramentas que estão ligadas à biblioteca Pcap também.

Listagem 6: Use o PyShark para armazenar os pacotes capturados em um arquivo local

importar pyshark
capture = pyshark.FileCapture ('/ tmp / networkpackages.boné')

Executando as listagens 5 e 6, você ainda não terá nenhuma saída. A próxima etapa é restringir os pacotes a serem coletados com mais precisão com base nos critérios desejados.

Seleção de pacotes

O objeto de captura introduzido anteriormente estabelece uma conexão com a interface desejada. Em seguida, os dois métodos sniff () e sniff_continuously () do objeto de captura coletam os pacotes de rede. sniff () retorna ao chamador assim que todos os pacotes solicitados forem coletados. Em contraste, sniff_continuously () entrega um único pacote ao chamador assim que ele é coletado. Isso permite uma transmissão ao vivo do tráfego da rede.

Além disso, os dois métodos permitem que você especifique várias limitações e mecanismos de filtragem de pacotes, por exemplo, o número de pacotes usando o parâmetro packet_count e o período durante o qual os pacotes devem ser coletados usando o parâmetro timeout. A Listagem 7 demonstra como coletar 50 pacotes de rede, apenas, como uma transmissão ao vivo, usando o método sniff_continuously ().

Listagem 7: Colete 50 pacotes de rede de wlan0

importar pyshark
capture = pyshark.LiveCapture (interface = 'wlan0')
para pacote em captura.sniff_continuously (packet_count = 5):
imprimir (pacote)

Vários detalhes do pacote são visíveis usando a declaração de impressão (pacote) (ver Figura 1).

Figura 1: conteúdo do pacote

Na listagem 7, você coletou todos os tipos de pacotes de rede, independentemente do protocolo ou porta de serviço. PyShark permite que você faça filtragem avançada, usando o chamado filtro BPF [12]. A Listagem 8 demonstra como coletar 5 pacotes TCP vindos da porta 80 e imprimindo o tipo de pacote. A informação é armazenada no atributo de pacote mais alto_camada.

Listagem 8: Coletando pacotes TCP, apenas

importar pyshark
capture = pyshark.LiveCapture (interface = 'wlan0', bpf_filter = 'porta tcp 80')
capturar.sniff (packet_count = 5)
imprimir (capturar)
para pacote em captura:
imprimir (pacote.camada mais alta)

Salve a listagem 8, como o arquivo tcp-sniff.py, e execute o script Python. O resultado é o seguinte:

Listagem 9: A saída da Listagem 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Desempacotar os pacotes capturados

O objeto capturado funciona como uma boneca russa Matroska - camada por camada, ele contém o conteúdo do pacote de rede correspondente. Desembalar parece um pouco com o Natal - você nunca sabe quais informações encontrará lá dentro até abri-las. A Listagem 10 demonstra a captura de 10 pacotes de rede e a revelação de seu tipo de protocolo, tanto a porta de origem quanto de destino e o endereço.

Listagem 10: Mostrando origem e destino do pacote capturado

importar pyshark
tempo de importação
# define interface
networkInterface = "enp0s3"
# define o objeto de captura
capture = pyshark.LiveCapture (interface = networkInterface)
imprimir ("ouvindo em% s"% networkInterface)
para pacote em captura.sniff_continuously (packet_count = 10):
# saída ajustada
tentar:
# get timestamp
localtime = time.asctime (tempo.hora local (hora.Tempo()))
# obter o conteúdo do pacote
protocolo = pacote.transport_layer # protocol type
src_addr = pacote.ip.src # endereço de origem
src_port = pacote [protocolo].srcport # porta de origem
dst_addr = pacote.ip.dst # endereço de destino
dst_port = pacote [protocolo].dstport # porta de destino
# informação do pacote de saída
imprimir ("% s IP% s:% s <-> % s:% s (% s) "% (localtime, src_addr, src_port, dst_addr, dst_port, protocolo))
exceto AttributeError como e:
# ignorar pacotes diferentes de TCP, UDP e IPv4
passar
impressão (" ")

O script gera uma saída, conforme mostrado na Figura 2, uma única linha por pacote recebido. Cada linha começa com um carimbo de data / hora, seguido pelo endereço IP de origem e porta, então o endereço IP de destino e porta e, finalmente, o tipo de protocolo de rede.


Figura 2: Origem e destino dos pacotes capturados

Conclusão

Construir seu próprio scanner de rede nunca foi mais fácil do que isso. Com base nos fundamentos do Wireshark, o PyShark oferece uma estrutura abrangente e estável para monitorar as interfaces de rede do seu sistema da maneira que você precisar.

Links e referências

  • [1] Silver Moon: 18 comandos para monitorar a largura de banda da rede no servidor Linux, https: // www.marés binárias.com / linux-command-monitor-network /
  • [2] Biblioteca de soquetes Python, https: // docs.Pitão.org / 3 / library / socket.html
  • [3] python-nmap, https: // pypi.org / project / python3-nmap /
  • [4] dpkt, https: // pypi.org / project / dpkt /
  • [5] PyShark, https: // pypi.org / projeto / pyshark /
  • [6] scapy, https: // pypi.org / projeto / scapy /
  • [7] Tcpdump e libpcap, http: // www.tcpdump.org /
  • [8] PyShark, site do projeto, http: // kiminewt.github.io / pyshark /
  • [9] Formato de arquivo Libpcap, Wireshark Wiki, https: // gitlab.com / fioshark / fioshark / - / wikis / Development / LibpcapFileFormat
  • [10] Tshark, https: // www.wirehark.org / docs / man-pages / tshark.html
  • [11] Apache Spark, https: // spark.apache.org /
  • [12] Filtro BPF, https: // wiki.wirehark.org / CaptureFilters
Análise do mouse sem fio Microsoft Sculpt Touch
Recentemente li sobre o Microsoft Sculpt Touch mouse sem fio e decidi comprá-lo. Depois de usá-lo por um tempo, decidi compartilhar minha experiência ...
AppyMouse na tela Trackpad e ponteiro do mouse para tablets Windows
Os usuários de tablets costumam perder o ponteiro do mouse, especialmente quando costumam usar laptops. Os smartphones e tablets touchscreen vêm com m...
O botão do meio do mouse não funciona no Windows 10
O botão do meio do mouse ajuda você a percorrer longas páginas da web e telas com muitos dados. Se isso parar, você vai acabar usando o teclado para r...