En muchas ocasiones es necesario conocer que distribución de GNU/Linux y que versión de la misma se encuentran ejecutándose en una máquina específica. Debido a los cambios inducidos por las actualizaciones no siempre se cuenta con la versión que se instaló inicialmente.
Estos son los métodos mas comúnes para determinar esta información.
Determinar la distribución y versión de Linux.
El método genérico.
Aplica a todas las distribuciones de Linux.
$ cat /etc/issue
Linux Mint 9 Isadora n l
Para los RedHat.
Este método aplica también para las distribuciones basadas en RedHat como Fedora, CentOS y Scientific Linux.
$ cat /etc/redhat-release
Scientific Linux SL release 5.5 (Boron)
Para los Fedora.
$ cat /etc/fedora-release
Fedora release 13 (Goddard)
Para los Debian.
Este método aplica también para las distribuciones basadas en Debian como Ubuntu y Mint.
$ cat /etc/debian_version
5.0.5
Para Ubuntu.
$ lsb_release -a
No LSB modules are available. Distributor ID:Ubuntu Description:Ubuntu 10.04.1 LTS Release:10.04 Codename:lucid
En este punto se supone que el servidor se está ejecutando en algún lugar de Internet y que los clientes, incluído el atacante, lo acceden normalmente.
Para realizar cualquier tipo de conexión con el servidor es necesario conocer su dirección IP o en su defecto el nombre FDQN que será traducido por un servidor DNS para obtener finalmente su dirección IP.
Para la práctica se configuró la interfaz de red del Virtualbox en modo puente (bridge) para permitirle al servidor acceder a la red como una máquina independiente y obtener una dirección propia a partir del DHCP.
Es necesario entonces conocer cual es la dirección IP que obtuvo el servidor al cual vamos a acceder, para esto se utiliza el comando ifconfig.
Obtener la dirección IP de un equipo Linux
A partir de este momento nos referiremos al servidor a través de su dirección IP: 192.168.1.6.
Establecer los servicios activos.
Conociendo la dirección IP del servidor, el atacante puede realizar una revisión de puertos para intentar establecer que servicios tiene activos.
$ sudo nmap -sS -sV 192.168.1.6
Starting Nmap 4.76 ( http://nmap.org ) at 2009-10-13 16:27 COT Interesting ports on 192.168.1.6:
Not shown: 995 closed ports
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 3.4p1 (protocol 1.99)
111/tcp open rpcbind 139/tcp open netbios-ssn Samba smbd (workgroup: MYGROUP)
6000/tcp open X11 (access denied)
32768/tcp open rpcbind
MAC Address: 08:00:27:20:DF:B6 (Cadmus Computer Systems)
Service Info: OS: Unix
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 13.12 seconds
Nótese como el servidor expone los puertos de los servicios que se instalaron en el paso anterior: el puerto 22 para SSH (con una versión totalmente obsoleta) y el 139 para Samba (versión 2.x).
Irrumpir en el servidor.
En esta práctica, el atacante utiliza el exploit remoto 0x333hate.c o sambal.c para aprovecharse de una vulnerabilidad conocida en Samba 2.2.x (hasta la 2.2.8).
Como se puede apreciar, el exploit nos ha abierto un shell con privilegios de root en el servidor!
Para verificar que esto sea cierto crearemos un archivo de prueba de la siguiente manera.
cd /tmp
touch hacked!
ls -l
-rw-rw-rw- 1 root root 0 Oct 13 16:48 hacked!
Nótese como el archivo (vacío) creado por los comandos anteriores es propiedad del usuario root, efectivamente tenemos un shell de administrador en el servidor atacado.
El problema.
El problema sucede cuando se copia la información suministrada por el cliente a un buffer estático, el servidor falla al verificar la longitud de esta información permitiéndole a un usuario anónimo corromper posiciones estratégicas de memoria y con esto ejecutar comandos arbitrarios en el servidor con los mismos privilegios con los que se ejecuta el proceso de Samba.
El error sucede en la función call_trans2open() (línea 250) del archivo /source/smbd/trans2.c.
Esta miniserie de artículos está basada en una práctica del curso de Arquitecturas de Sistemas Distribuídos de la Especialización en Ingeniería de Software de la UAM que dicté hace poco. Resultó que el grupo tenía gran interés en los temas de seguridad así que preparé esta práctica que, a pesar de basarse en software obsoleto, es muy interesante y didáctica a mi parecer.
Aclaro que no soy un experto en el tema, sin embargo aprendí un poco al respecto en una experiencia similar que tuve cuando recibí la administración de unos servidores que se encontraban prácticamente desatendidos y por ende desactualizados, dejándolos como una presa fácil para este tipo de ataques. Por obvias razones no se espera que un servidor se encuentre conectado a Internet en tal estado de desprotección y desactualización.
En esta primera parte se va a realizar la instalación del servidor el cual estará basado en RedHat 8.0 y tendrá los servicios de SSH para acceso remoto y Samba para compartir archivos (ambos ampliamente utilizados). Para hechos de la práctica el servidor no tendrá firewall sin embargo esto no es necesario ya que sólo requiere tener acceso de conexión a Samba.
Instalación básica del sistema operativo.
El servidor objetivo para mi caso se ubicará en una máquina virtual basada en Virtualbox a la cual le instalaremos una versión básica de Linux RedHat 8.0 con ambiente gráfico, herramientas de administración y desarrollo, y soporte para el protocolo Samba.
Activar el servicio de Samba al inicio del sistema operativo.
$ /usr/sbin/redhat-config-services
Seleccionar smb y presionar los botones de Save y Quit.