
Um canal de comando e controle simplificado, baseado em FTP, para interconectar sistemas remotos.
SharpFtpC2 é um pequeno projeto experimental que visa explorar a possibilidade de usar FTP(S) para retransmitir comandos e respostas entre dois computadores remotos. Ele utiliza o protocolo FTP como um túnel improvisado através do qual os computadores, ambos atuando como clientes conectados a um servidor FTP, podem se comunicar. Um esquema simples de gerenciamento de sessão é usado para rastrear a troca de requisições e respostas.
SharpFtpC2 emprega um sistema básico de gerenciamento de sessão. Embora bastante elementar, ele serve para manter as comunicações sincronizadas e relacionadas, o que é essencial para a troca de mensagens entre os sistemas remotos.
Vale notar que este projeto pode ser facilmente portado utilizando sistemas de controle de versão como git, svn ou protocolos similares.
Se você tem interesse nos detalhes técnicos da comunicação em rede, ou apenas quer brincar com C# e .NET Core, SharpFtpC2 pode ser um ponto de partida intrigante. Não espere uma joia polida, mas talvez, apenas talvez, você possa aprender algo interessante ao mexer com ele.
SharpFtpC2 é um projeto experimental criado para exploração educacional sobre a utilização de FTP(S) como canal de comunicação entre dois computadores remotos. É crucial entender que o projeto foi concebido como um recurso de aprendizado para indivíduos interessados em comunicação de rede, C#, Simulação de Adversários, Red Team e Malware. Como criador, peço que os usuários não solicitem funcionalidades adicionais nem usem este projeto para qualquer forma de armamento ou intenção maliciosa. A intenção principal é educacional, e espera-se que os usuários interajam com o conteúdo de forma responsável e ética.
SharpFtpC2 nasceu do desejo de contribuir para o Unprotect Project, particularmente na categoria Network Evasion.
Essa ideia de usar FTP como um "túnel" tem raízes profundas. Na verdade, ela traz boas lembranças de cerca de 2005, quando eu ainda estava começando no mundo da programação. Naquela época, cruzei com um indivíduo francês notavelmente criativo que usava o codinome BlasterWar. Ele havia concebido um projeto chamado BlasterX, que, apesar de perdido no tempo, era bastante vanguardista para a sua época.
A engenhosidade de BlasterWar em seu projeto era fornecer uma alternativa à conexão reversa convencional, onde o agente precisava estabelecer uma conexão de volta ao dispositivo de controle ou hacking.
Em vez disso, BlasterWar optou por usar FTP (File Transfer Protocol) como meio alternativo e construiu uma Ferramenta de Acesso Remoto completa em torno dele. A ferramenta incluía recursos como Captura de Tela, Keylogging e Gerenciamento de Sistema, todos transmitidos através do túnel FTP. Na época, o FTP era amplamente popular e uma infinidade de sites oferecia servidores FTP gratuitos ao público. Isso o tornava uma alternativa ideal para conexões reversas ou diretas, que envolviam redirecionamento de portas. Além disso, fornecia uma camada adicional de ofuscação para o comando e controle (C2), já que o endereço IP da máquina do hacker não era exposto diretamente.
Hoje, utilizar FTP como túnel não é um conceito novo, pois algumas estruturas de Comando e Controle (C2) já adotaram esse protocolo. No entanto, empregar FTP dessa forma é repleto de riscos. Notavelmente, a transmissão de credenciais em texto puro pela rede, combinada com a necessidade de ambas as partes possuírem essas credenciais, torna o sistema suscetível a uma miríade de ataques. Embora os servidores FTP tenham feito progressos para resolver esses problemas de segurança, adotando cada vez mais FTPS, que integra criptografia SSL/TLS, essa adaptação não foi uma panaceia para todos os riscos inerentes.
Com um toque de engenhosidade e inspirando-se em protocolos existentes, é possível lidar com um número substancial dos riscos existentes.
Para compilar este projeto, você precisa de dois componentes: Visual Studio e uma dependência para o controlador chamada CommandLineUtils.
Como este projeto utiliza .NET Core, ele pode ser compilado para várias plataformas com facilidade, sem necessidade de modificações no código. No entanto, talvez seja necessário implementar recursos específicos direcionados à plataforma de destino.
Para começar a testar este projeto rapidamente, recomendo usar Docker com a imagem stilliard/pure-ftpd. Esta imagem suporta uma variedade de opções, permitindo configurar rapidamente seu próprio servidor FTP com facilidade.
docker pull stilliard/pure-ftpd
docker run -d --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e "PUBLICHOST: 127.0.0.1" -e "ADDED_FLAGS=-E -A -X -x" -e FTP_USER_NAME=dark -e FTP_USER_PASS=toor -e FTP_USER_HOME=/home/dark stilliard/pure-ftpd
docker run -d --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e "PUBLICHOST: 127.0.0.1" -e "ADDED_FLAGS=-E -A -X -x --tls=2" -e FTP_USER_NAME=dark -e FTP_USER_PASS=toor -e FTP_USER_HOME=/home/dark -e "TLS_CN=localhost" -e "TLS_ORG=maislaf" -e "TLS_C=FR" stilliard/pure-ftpd
Sinta-se à vontade para ajustar as configurações conforme suas necessidades. No entanto, recomendo fortemente não expor este servidor FTP de teste a redes locais ou públicas. Seria mais prudente limitar a exposição deste contêiner apenas à sua máquina host.
A opção ADDED_FLAGS permite ajustar o servidor pure-ftpd. Explicações para todas as flags podem ser encontradas aqui.
Certas flags podem exigir modificações no funcionamento do protocolo C2. Por exemplo, se você usar a opção -K para manter todos os arquivos, a capacidade de excluir arquivos via FTP será desabilitada. Como o protocolo C2 atual utiliza esse recurso, você pode precisar considerar abordagens alternativas, como renomear ou mover arquivos.
Para garantir a integridade e confidencialidade de todas as comunicações entre os agentes e o C2, a criptografia foi incorporada de forma integrada ao protocolo de comunicação, empregando algoritmos RSA e AES-GCM de 256 bits. O objetivo principal desse recurso é impedir a possibilidade de um servidor FTP comprometido entregar comandos maliciosos. Ao usar criptografia, a injeção de comandos se torna impossível sem acesso à chave pública do agente. Da mesma forma, não é viável injetar respostas falsas de agentes sem possuir a chave pública do C2.
Para facilitar o processo de geração de seus próprios pares de chaves (um par de chaves para o agente e um para o C2), incluí uma ferramenta de terceiros chamada RSAKeyHelper. Cada vez que você executa o aplicativo, ele apresentará um par de chaves pública e privada recém-gerado, que pode ser utilizado no programa se você optar por empregar criptografia.

Para verificar se tudo funciona conforme o esperado, também integrei um recurso na mesma ferramenta que permite testar a criptografia de strings.

O lançamento da versão "3.0 Final" marca o ponto culminante deste projeto. Não adicionarei mais funcionalidades; o objetivo desta Prova de Conceito (PoC) foi demonstrar a criação de um C2 confiável e seguro utilizando FTP(S). Você é encorajado a desenvolver sua própria versão com funcionalidades personalizadas. Como exercício, você pode considerar implementar tarefas em múltiplas threads para evitar que a aplicação congele durante tarefas de longa duração.
Continuarei, no entanto, a oferecer suporte ao projeto no que diz respeito a possíveis bugs ou oportunidades de otimização.
(Lista de agentes)

(Executar comando no agente ativo (contexto))

(Janela de depuração do console do agente com confirmação de ação perigosa pelo usuário)
