17 años en Internet

20 enero 2010

Creando un troyano casero

Hoy me apetecía explicar cómo podéis crear vuestro propio troyano casero. Este primer post irá destinado sólo a explicar los conceptos básicos.

Ante todo quiero aclarar que un uso indebido de los troyanos puede provar la violación de varias leyes (como la revelación de secretos o la intrusión en sistemas ajenos). No obstante a nivel doméstico permite una amplia gama de beneficios: un completo uso del ordenador desde remoto sin necesidad de instalar ni configurar software como ssh o telnet. Todo lo que vais a leer a continuación va destinado a ilustraros, pero en ningún caso se pretende realizar apología delictiva.
Troyano: programa malicioso capaz de alojarse en computadoras y permitir el acceso a usuarios externos. La diferencia entre virus y troyano es que el segundo, a priori, no propaga una infección y que requiere de la recepción de comandos del usuario externo para realizar un uso malicioso.
¿Cómo funciona un troyano? Básicamente consta de dos programas: Un "programa maestro" que será el que ejecutarás en tu PC, y un "programa esclavo" que se ejecutará en el ordenador a controlar.


El programa esclavo:
Su funcionamiento y elaboración es sencilla. Básicamente es un bucle infinito que comprueba si se ha recibido alguna conexión en un puerto predefinido (por ejemplo el 2012). Cuando recibimos un mensaje, lo primero que haremos será traducirlo (para saber qué debemos de ejecutar). Por último comunicaremos al remitente los resultados de la acción.

Un ejemplo de funcionamiento sería este:
-> Escucho el puerto 2012
-> He recibido el siguiente texto en el puerto 2012: "[captura]800x600@192.168.1.123:2333[/captura]"
-> Descifro el mensaje:
Tengo que hacer una captura de pantalla.
Convierto la imagen a 800x600
Tengo que enviar esta imagen a la ip 192.168.123 usando su puerto 2333
Envío la imagen.
-> Escucho el puerto 2012 (...)
Cuyo esquema, a nivel de código fuente, sería el siguiente:
char trama [100], tramaRespuesta[100], ipRespuesta[12];
int puertoRespuesta;
while(true)
{
if (listen_socket(2012)= null) //Detectamos conexión
{
captura_mensaje(trama, ipRespuesta, &puertoRespuesta);
ejecuta_mensaje(trama, tramaRespuesta);
envia_respuesta(tramaRespuesta, ipRespuesta, puertoRespuesta);
}
}
Como veis el bucle principal en si no sería muy laborioso. Lo realmente laborioso es implementar todas las funciones que habrá que invocar cuando tengamos que hacer un screenshot, ejecutar un comando, ect... pero eso ya lo veréis más adelante en otro post.


El programa maestro:
Aquí ya se complica la cosa, hay que utilizar dos hilos de ejecución para el mismo programa. El primer hilo será una interfaz gráfica donde definiremos todas las órdenes que podemos ejecutar (ver captura de pantalla). Siempre que apretemos un botón, se disparará un evento que tratará las acciones oportunas: traducción de la acción a nuestro protocolo + enviar información a la IP y al puerto de la máquina esclava.

Ejemplo casero de interfaz para un programa cliente

El segundo hilo será sólo un socket, puesto que podemos recibir información de los programas esclavos en cualquier momento. Lo ideal es que cuando este socket reciba una trama, nos lo notifique con un Dialog. Por ejemplo, abriendo una ventana con el texto: "Screenshot almacenado en c:/tmp/".


El protocolo:
Cuando elaboramos un programa que requiere comunicación por red, hay que pensar que en ocasiones deseamos que la información del remitente que aparece en el datagrama (como es el caso de la ip) no sea la que utilice el destinatario para responder. Por ejemplo nos puede interesar que el puerto de escucha y el de envío de información no sea el mismo. Por eso sería recomendable que cuando se envía un mensaje a un programa esclavo, este reciba dentro del texto la ip del programa "Maestro" y el puerto donde espera recibir la contestación.

Aclarado esto, el protocolo que propongo (y con el que voy a trabajar en sucesivos posts) es el siguiente:
Capturar pantalla:
[captura]TamañoAnchoxTamañoalto@ipRespuesta:puertoRespuesta[/captura]
Enviar dialogo:
[dialog]Texto@ipRespuesta:puertoRespuesta[/dialog]

Enviar comando:
[cmc]comando@ipRespuesta:puertoRespuesta[/cmc]

Iniciar chat:
[chatInit]NickSlave@NickMaster@ipRespuesta:puertoRespuesta[/chatInit]

Enviar mensaje chat:
[chatSMS]Nick@Text@ipRespuesta:puertoRespuesta[/chatSMS]

Cerrar chat:
[chatClose]Texto de despedida@ipRespuesta:puertoRespuesta[/chatClose]

Expulsar CD:
[eject]ipRespuesta:puertoRespuesta[/eject]

En los próximos días profundizaré más a nivel de código fuente para que veais lo fácil que resulta implementarlo.

4 comentarios:

  1. [...]un completo uso del ordenador desde remoto sin necesidad de instalar ni configurar software como ssh o telnet.[...]

    Me parece más sencillo, más seguro y más útil instalar SSH que crearme una especie consola remota (o troyano como te gusta llamarla).

    ResponderEliminar
  2. Gracias por el comentario, pero la gente que utiliza troyanos le importa un bledo la seguridad :)

    Además, los troyanos vienen con una interfaz gráfica mientras que los clientes de ssh o telnet (este último no es tan seguro puesto que envia información sin cifrar) requieren de un interprete de comandos.

    Este post solo pretende enseñar como se puede crear un troyano, en ningún caso pretendo defender la calidad de estos. Si quieres otro día escribiré un post sobre las formas más seguras y útiles de acceso remoto.

    ResponderEliminar
  3. Un post muy "educativo " jeje

    ResponderEliminar
  4. Eu não entendi quase nada do que está escrito!
    XDDD

    ResponderEliminar

Si te ha gustado la entrada o consideras que algún dato es erróneo o símplemente deseas dar algún consejo, no dudes en dejar un comentario. Todo feedback es bienvenido siempre que sea respetuoso. También puedes contactarme vía Twitter @Hamster_ruso si lo consideras necesario.