
Un conducto optimizado de comando y control basado en FTP para la interconexión de sistemas remotos.
SharpFtpC2 es un pequeño proyecto experimental cuyo objetivo es explorar la posibilidad de usar FTP(S) para retransmitir comandos y respuestas entre dos computadoras remotas. Emplea el protocolo FTP como un túnel improvisado a través del cual las computadoras, ambas actuando como clientes conectadas a un servidor FTP, pueden comunicarse. Se utiliza un esquema simple de gestión de sesiones para mantener el seguimiento del intercambio de solicitudes y respuestas.
SharpFtpC2 emplea un sistema básico de gestión de sesiones. Aunque es bastante elemental, sirve para mantener las comunicaciones sincronizadas y relacionadas, lo cual es esencial para el ida y vuelta entre los sistemas remotos.
Vale la pena señalar que este proyecto se puede portar fácilmente utilizando sistemas de control de versiones como git, svn o protocolos similares.
Si tienes interés en los detalles más minuciosos de la comunicación en red, o simplemente quieres experimentar con C# y .NET Core, SharpFtpC2 podría ser un punto de partida intrigante. No esperes una joya pulida, pero quizás, solo quizás, puedas aprender algo interesante al trastear con él.
SharpFtpC2 es un proyecto experimental creado para la exploración educativa de cómo utilizar FTP(S) como canal de comunicación entre dos computadoras remotas. Es crucial entender que el proyecto está diseñado como un recurso de aprendizaje para personas interesadas en comunicación en red, C#, Simulación de Adversarios, Equipo Rojo, Malware. Como creador, insto a los usuarios a no solicitar funcionalidades adicionales ni a utilizar este proyecto con fines de armamento o malintencionados. La intención principal es educativa, y se espera que los usuarios interactúen con el contenido de manera responsable y ética.
SharpFtpC2 nació del deseo de contribuir al Proyecto Unprotect, particularmente a su categoría de Evasión de Red.
La idea de usar FTP como "túnel" tiene raíces profundas. De hecho, me trae gratos recuerdos de alrededor de 2005, cuando aún me iniciaba en el mundo de la programación. En aquel entonces, me topé con un francés notablemente creativo que usaba el seudónimo BlasterWar. Él había concebido un proyecto llamado BlasterX, que, aunque perdido en el tiempo, era bastante vanguardista para su época.
La innovación de BlasterWar en su proyecto fue proporcionar una alternativa a la conexión inversa convencional, donde el agente necesitaba establecer una conexión de vuelta al dispositivo de control o hacking.
En su lugar, BlasterWar optó por usar FTP (Protocolo de Transferencia de Archivos) como medio alternativo y construyó una Herramienta de Acceso Remoto completa a su alrededor. La herramienta incluía funciones como Captura de Pantalla, Keylogging y Administración del Sistema, todo transmitido a través del túnel FTP. En ese momento, FTP era muy popular y una gran cantidad de sitios web ofrecían servidores FTP gratuitos al público. Esto lo convertía en una alternativa ideal a las conexiones inversas o directas, que implicaban reenvío de puertos. Además, proporcionaba una capa adicional de ofuscación para el comando y control (C2), ya que la dirección IP de la máquina del hacker no estaba directamente expuesta.
Hoy en día, usar FTP como túnel no es un concepto novedoso, ya que algunos frameworks de Comando y Control (C2) han adoptado este protocolo. Sin embargo, emplear FTP de esta manera conlleva riesgos. En particular, la transmisión de credenciales en texto plano a través de la red por parte de FTP, combinada con la necesidad de que ambas partes posean estas credenciales, lo hace susceptible a una miríada de ataques. Aunque los servidores FTP han avanzado en abordar estos problemas de seguridad adoptando cada vez más FTPS, que integra cifrado SSL/TLS, esta adaptación no ha sido una panacea para todos los riesgos inherentes.
Con un toque de ingenio y tomando inspiración de los protocolos existentes, es factible abordar una cantidad sustancial de los riesgos existentes.
Para compilar este proyecto, necesitas dos componentes: Visual Studio y una dependencia para el controlador llamada CommandLineUtils.
Dado que este proyecto utiliza .NET Core, se puede compilar para varias plataformas con facilidad, sin necesidad de modificar el código. Sin embargo, es posible que necesites implementar funciones específicas adaptadas a la plataforma de destino.
Para comenzar a probar este proyecto rápidamente, recomiendo usar Docker con la imagen stilliard/pure-ftpd. Esta imagen admite una variedad de opciones, lo que te permite configurar tu propio servidor FTP con facilidad.
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
Siéntete libre de ajustar la configuración según tus necesidades. Sin embargo, recomiendo encarecidamente no exponer este servidor FTP de prueba a redes locales o públicas. Sería más prudente limitar la exposición de este contenedor únicamente a tu máquina host.
La opción ADDED_FLAGS te permite ajustar el servidor pure-ftpd. Las explicaciones de todas las banderas se pueden encontrar aquí.
Ciertas banderas pueden requerir modificaciones en el funcionamiento del protocolo C2. Por ejemplo, si empleas la opción -K para conservar todos los archivos, se deshabilitará la capacidad de eliminar archivos a través de FTP. Dado que el protocolo C2 actual utiliza esta función, es posible que debas considerar enfoques alternativos, como renombrar o mover archivos.
Para garantizar la integridad y confidencialidad de todas las comunicaciones entre los agentes y el C2, se ha incorporado el cifrado de manera fluida en el protocolo de comunicación, empleando algoritmos RSA y AES-GCM de 256 bits. El objetivo principal de esta función es frustrar la posibilidad de que un servidor FTP comprometido entregue comandos maliciosos. Al emplear cifrado, la inyección de comandos es imposible sin acceso a la clave pública del agente. Del mismo modo, no es factible inyectar respuestas falsas de agentes sin poseer la clave pública del C2.
Para facilitar el proceso de generación de tus propios pares de claves (un par de claves para el agente y otro para el C2), he incluido una herramienta de terceros llamada RSAKeyHelper. Cada vez que ejecutes la aplicación, te presentará un par de claves pública y privada recién generadas, que se pueden utilizar dentro del programa si optas por emplear el cifrado.

Para verificar que todo funciona como se espera, también he integrado una función dentro de la misma herramienta que te permite probar el cifrado de cadenas.

El lanzamiento de la versión "3.0 Final" marca la culminación de este proyecto. No añadiré más funciones; el objetivo de esta PoC era demostrar la creación de un C2 confiable y seguro utilizando FTP(S). Te animo a desarrollar tu propia versión con funcionalidades adaptadas. Como ejercicio, podrías considerar implementar tareas de subprocesos múltiples para evitar que la aplicación se cuelgue durante tareas de larga duración.
Sin embargo, continuaré brindando soporte al proyecto en cuanto a posibles errores u oportunidades de optimización.
(Lista de agentes)

(Ejecutar comando en el agente activo (contexto))

(Ventana de depuración de la consola del agente con confirmación del usuario para acciones peligrosas)
