
Construir um botnet básico de Command & Control em C
Este hackpack irá guiá-lo na implementação de uma estrutura básica que caracteriza fundamentalmente um botnet. Pode ajudar se você já trabalhou com C. Se você gostou deste tutorial, não se esqueça de dar uma estrela neste repositório!
Nota: Não use nada que aprender aqui para fins malévolos. Este hackpack é exclusivamente um estudo de caso de botnets para fins educacionais. Os conceitos aprendidos neste hackpack têm casos de uso de longo alcance (basicamente tudo relacionado a redes). Mais importante, este hackpack deve ser testado e implantado localmente (então, por favor, não compartilhe nada que você construir relacionado a este hackpack com outros hackers). A privacidade é importante, então respeite-a.
Antes de construir um botnet, é importante entender o que é um botnet. Um botnet é uma rede de computadores capazes de receber comandos remotamente e implantá-los localmente. Opcionalmente, eles podem optar por retransmitir informações de volta para outros nós na rede. Eles têm sido usados para tudo, desde ataques de Negação de Serviço Distribuída até a implantação generalizada de spyware. Você pode ter ouvido falar de muitos botnets no passado. Os mais proeminentes são talvez o Mirai e o Gameover Zeus, que controlavam respectivamente 3,8 mil e 3,6 milhões de dispositivos IoT. Há muita variação entre como os botnets implementam certas tarefas. Mas, para construir nosso botnet com sucesso, precisamos garantir as seguintes funcionalidades em nossa rede de trabalho.
Nosso botnet deve:
Esta estrutura é característica do que é conhecido como botnets de Comando & Controle. Esses botnets têm um servidor mestre e muitos servidores escravos. No entanto, este estilo de botnets é antiquado e pode ser facilmente derrubado cortando o acesso ao domínio mestre. Botnets mais recentes e sofisticados seguem uma arquitetura peer-to-peer, onde os direitos de administrador são distribuídos entre todos ou um subconjunto de nós na rede. Esses botnets causam uma grande dor de cabeça para especialistas em segurança porque não há um ponto central de controle e podem crescer para milhões de nós. Derrubar esses botnets é uma leitura interessante por si só. No entanto, para os fins deste hackpack, vamos manter as coisas simples. Vamos implementar um nó escravo simples para um botnet de C&C.

Este hackpack tratará principalmente da implementação do malware cliente. Para o servidor mestre, podemos usar um servidor TCP de código aberto chamado Netcat. O Netcat não tem nada a ver com botnets. É apenas uma ferramenta conveniente e estabelecida que podemos reaproveitar para enviar pacotes de texto de e para clientes (que é tudo que um mestre realmente é). Eu ajustei ligeiramente o servidor netcat e o compilei em um binário chamado "master". Nenhum trabalho extra necessário aqui! Nosso mestre está pronto para uso.
Vamos passar para a parte mais interessante: receber e executar comandos remotos (nos preocuparemos em disfarçar nosso malware mais tarde). O objetivo aqui é tornar nosso nó escravo o mais simples possível e atender aos requisitos detalhados acima. Note que muitas constantes foram definidas em lib/macros.h, então sinta-se à vontade para usá-las. Todas as assinaturas de funções implementadas podem ser encontradas em lib/connect.h ou lib/utils.h.
Abra o arquivo bot.c. Ao iniciar um novo nó em nosso servidor, devemos provavelmente nomeá-lo para que o mestre saiba para quais clientes implantar comandos. Existem muitas convenções de nomenclatura que podem ser usadas. Usar um endereço IP é provavelmente a melhor porque é um identificador único para cada cliente. No entanto, para tornar mais legível para humanos comuns, vamos usar o nome de usuário do computador. Usando a função C getenv() com o argumento "USER" retorna o que o computador armazenou na variável de ambiente USER. Este é um lugar onde o nome de usuário do usuário é armazenado, então vamos usar isso. Além disso, agora que seu escravo está em execução, vamos encontrar o mestre. Para fazer isso, devemos saber o endereço IP do nosso mestre. Todo dispositivo de rede tem um endereço IP. Ele é responsável por identificar outros nós e endereçamento de localização. Além disso, o mestre pode ter muitos servidores rodando em portas diferentes. Então, não só temos que nos conectar ao mestre, mas também devemos especificar a porta correta. Esta porta é escolhida pelo mestre, mas pode ser alterada. Neste hackpack, queremos testar localmente. Então, usaremos seu computador como nossa rede. O endereço IP local de todo computador (para o qual "localhost" também resolve) é "127.0.0.1". No mestre, especifiquei que ele seja executado na porta 9999. Com essas três coisas (endereço IP do mestre, porta do mestre e nome do escravo), podemos iniciar um pipeline de comunicação entre o servidor e o cliente chamado socket. Passe esses três argumentos para a função init_socket() para criar um socket. init_function() não é um comando C embutido. Em vez disso, precisamos implementá-lo. Em seguida, precisamos alocar algum espaço na pilha para armazenar mensagens recebidas. Vamos ser bastante generosos aqui e usar cerca de 10KB de espaço na pilha. Chame este ponteiro de pilha de msg. Por último, há uma declaração printf para indicar que tudo está indo bem.
char* name = //Obter o nome de usuário do cliente e armazená-lo em name
int channel = //iniciar um canal dado SERVER, PORT e name;
//Alocar espaço na pilha de tamanho CMD_LENGTH para armazenar dados do tipo char. Chame o ponteiro de pilha de msg
printf("%s entrando no botnet\n", name);