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 existem há algum tempo. Sob Linux, por exemplo, estes são Wireshark, TCPDUMP, NOLL, IFTOP, IPTRAF, NETHOGS, BMON, TCPTRACK, bem como Speedometer 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 a sua, em vez disso, em vez disso? Os motivos que vejo são uma melhor compreensão dos protocolos de rede TCP/IP, aprendendo a codificar corretamente ou implementar apenas o recurso específico necessário para o seu caso de uso, porque as ferramentas existentes não dão 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.

Na natureza, existem várias bibliotecas Python para processamento e análise de rede. Para programação de baixo nível, a biblioteca do soquete [2] é a chave. As bibliotecas baseadas em protocolo de alto nível são httplib, ftplib, iMaplib e smtplib. Para monitorar as portas de rede e os candidatos competitivos do fluxo de pacotes, são Python-Nmap [3], DPKT [4] e Pyshark [5] são usados. Para monitoramento e alteração do fluxo de pacotes, a biblioteca SCapy [6] está amplamente em uso.

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

Pyshark pode fazer muito mais do que parece à primeira vista e, infelizmente, no momento da redação deste artigo, a documentação existente não cobre isso na íntegra. Isso torna desnecessariamente difícil e fornece um bom motivo para parecer mais profundo sob o capô.

Sobre Pyshark

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

Para evitar uma possível confusão, existe uma ferramenta de sonda semelhante, o Apache Spark [11], que é um mecanismo de análise unificado para processamento de dados em larga escala. O nome Pyspark é usado para a interface Python para Apache Spark, que não discutimos aqui.

Instalando Pyshark

Pyshark exige que a biblioteca PCAP e o TShark sejam instalados. Os pacotes correspondentes para Debian GNU/Linux 10 e Ubuntu são nomeados libpcap0.8 e tshark e pode ser configurado o seguinte usando apt-get:

Listagem 1: Instalando a Biblioteca PCAP e Tshark

# pip3 instalar python-pyshark

Se ainda não estiver instalado, Python3 e Pip também precisam ser adicionados. Os pacotes correspondentes para o Debian GNU/Linux 10 e o Ubuntu são nomeados Python3 e Python3-PIP e podem ser instalados da seguinte maneira usando o APT-GET:

Listagem 2: Instale o Python 3 e o PIP para Python 3

# instalação apt-get python3 python3-pip

Agora é hora de adicionar pyshark. Com base em nossa pesquisa, o Pyshark ainda não está embalado para nenhuma distribuição do Linux. A instalação é feita usando o instalador do pacote Python PIP3 (PIP para Python 3) como um pacote em todo o sistema da seguinte forma:

Listagem 3: Instale Pyshark usando PIP

# pip3 instalar python-pyshark

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

A declaração a seguir adiciona o conteúdo do módulo Pyshark ao espaço para nome do seu script python:

Listagem 4: importar o módulo Pyshark

Importar Pyshark

Métodos de captura de pacotes

Fora da caixa, Pyshark vem com dois modos diferentes com os quais se oferece para coletar pacotes da interface de rede observada. Para coleção 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 Python Iterator) que permite que você passe pelo pacote de dados capturados por pacote. As listagens abaixo demonstram como usar os dois métodos.

Listagem 5: Use 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 do arquivo PCAP [9]. Isso permite que você processe e interprete os dados capturados por outras ferramentas que estão vinculadas à biblioteca PCAP também.

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

Importar Pyshark
Capture = Pyshark.FileCapture ('/TMP/NetworkPackages.boné')

Listagens 5 e 6 em execução, você ainda não terá nenhuma saída. O próximo passo é restringir os pacotes a serem coletados com mais precisão com base nos critérios desejados.

Selecionando pacotes

O objeto de captura anteriormente introduzido estabelece uma conexão com a interface desejada. Em seguida, os dois métodos Sniff () e Sniff_Continuously () do objeto Capture Colete os pacotes de rede. Sniff () retorna ao chamador assim que todos os pacotes solicitados forem coletados. Por outro. Isso permite uma transmissão ao vivo do tráfego de rede.

Além disso, os dois métodos permitem especificar várias limitações e mecanismo 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 tempo limite do parâmetro. A Listagem 7 demonstra como coletar 50 pacotes de rede, apenas como uma transmissão ao vivo, usando o método sniff_continuouly ().

Listagem 7: Colete 50 pacotes de rede da WLAN0

Importar Pyshark
Capture = Pyshark.LiveCapture (interface = 'wlan0')
para pacote em captura.sniff_continuouly (packet_count = 5):
Imprimir (pacote)

Vários detalhes do pacote são visíveis usando a instrução PRINT (pacote) (consulte a Figura 1).

Figura 1: Conteúdo do pacote

Na Listagem 7, você coletou todos os tipos de pacotes de rede, independentemente de qual 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 chegando na porta 80 e imprimindo o tipo de pacote. A informação é armazenada no atributo de pacote Highest_layer.

Listagem 8: Coletando pacotes TCP, apenas

Importar Pyshark
Capture = Pyshark.LiveCapture (interface = 'wlan0', bpf_filter = 'porta tcp 80')
capturar.Sniff (packet_count = 5)
Imprimir (captura)
para pacote em captura:
Imprimir (pacote.mais alto_layer)

Salvar a Listagem 8, como o arquivo TCP-Sniff.py e execute o script python. A saída é a seguinte:

Listagem 9: a saída da Listagem 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Unboxing os pacotes capturados

O objeto capturado funciona como uma boneca russa Matroska - camada por camada, contém o conteúdo do pacote de rede correspondente. Unboxing parece um pouco com o Natal - você nunca sabe que informação encontra dentro até abrir. A Listagem 10 demonstra captura de 10 pacotes de rede e revelando seu tipo de protocolo, tanto a porta de origem quanto de destino e endereço.

Listagem 10: Mostrando fonte e destino do pacote capturado

Importar Pyshark
tempo de importação
# Defina interface
networkInterface = "ENP0S3"
# Definir objeto de captura
Capture = Pyshark.LiveCapture (interface = NetworkInterface)
print ("ouvindo em % s" % NetworkInterface)
para pacote em captura.sniff_continuouly (packet_count = 10):
# saída ajustada
tentar:
# Obtenha registro de data e hora
LocalTime = Time.asctime (tempo.LocalTime (tempo.tempo()))
# Obtenha conteúdo de pacotes
protocolo = pacote.Transport_layer # Tipo de protocolo
src_addr = pacote.IP.endereço de origem SRC #
src_port = pacote [protocolo].porta de origem srcport #
dst_addr = pacote.IP.DST # Endereço de destino
dst_port = pacote [protocolo].porta de destino dstport #
# Informações do pacote de saída
print ("%s IP%s:%s%s:%s (%s)"%(LocalTime, src_addr, src_port, dst_addr, dst_port, protocolo)))
Exceto AttributeError como e:
# ignore pacotes diferentes do TCP, UDP e IPv4
passar
imprimir (" ")

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


Figura 2: Fonte e destino para pacotes capturados

Conclusão

Construir seu próprio scanner de rede nunca foi tão 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ê precisa.

Links e referências

  • [1] Silver Moon: 18 comandos para monitorar a largura de banda de rede no servidor Linux, https: // www.binários.com/linux-commands-monitor-network/
  • [2] Biblioteca de soquete Python, https: // docs.Pitão.org/3/biblioteca/soquete.html
  • [3] Python-Nmap, https: // Pypi.org/project/python3-nmap/
  • [4] DPKT, https: // Pypi.org/projeto/dpkt/
  • [5] Pyshark, https: // Pypi.org/project/pyshark/
  • [6] SCAPY, https: // Pypi.org/project/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/wireshark/wireshark/-/wikis/desenvolvimento/libpcapfileformat
  • [10] Tshark, https: // www.Wireshark.org/docs/man-páginas/tshark.html
  • [11] Apache Spark, https: // Spark.apache.org/
  • [12] Filtro BPF, https: // wiki.Wireshark.Org/CaptureFilters