Press "Enter" to skip to content

Hacking de Infraestructura: Protocolo SSH

Last updated on noviembre 9, 2020

Este es el segundo post de la nueva sección de la web en la que explicaré en detalle un protocolo en contreto y mostraré ejemplos de diferentes formas de explotar distintas implementaciones vulnerables. Para realizar estos posts he utilizado como ejemplo implementaciones que se pueden encontrar en la plataforma hackthebox.eu, así como los vídeos de Ippsec.

El protocolo Secure Shell permite el acceso remoto a un servidor mediante un canal seguro en el que toda la información está cifrada. Por defecto corre en el puerto 22.

image: ssh.com

Las dos principales formas de autenticación son autenticación mediante contraseña y autenticación mediante clave pública.

Autenticación mediante contraseña:

Es la autenticación básica, se realiza mediante el comando 

ssh user@server

Autenticación mediante clave pública:

Se genera un par de claves pública (id_rsa.pub) y privada (id_rsa) en el servidor. La clave pública se guarda en el apartado de claves autorizadas (en linux, se guarda en el archivo authorized_keys de la carpeta .ssh del home del usuario).

La clave privada id_rsa se le da al usuario que accederá anonimamente.

De esa forma, basta con dar la clave privada a la hora de acceder por ssh para poder entrar sin introducir la contraseña:

ssh -i id_rsa user@server

Un servidor puede estar configurado para que solo se pueda acceder mediante clave pública, como podemos ver en el siguiente ejemplo:

Esto puede darnos una pista, puesto que los servidores de Amazon EC2 suelen tener esta configuración por defecto.

Crear clave pública y privada para acceder a un servidor

Si tenemos acceso al home de un usuario de una máquina que corra ssh, podemos generar una clave pública y privada, crear una carpeta .ssh en el home del usuario, introducir en ella un archivo llamado authorized_keys con la clave pública, y acceder utilizando la clave privada:

En este caso dali-la es la clave privada y dali-la.pub es la clave pública.

La copiamos y la pegamos en la carpeta .ssh del home del usuario dali (en este caso mediante una php shell limitada que teníamos):

Ahora solo tenemos que dar permisos 600 a la clave privada y acceder utilizandola por ssh:

Crackear clave SSH

Si tenemos una id_rsa cifrada como esta:

Podemos intentar descifrarla con la herramienta JohnTheRipper.

En primer lugar modificamos el formato a uno que entienda JohnTheRipper con el script sshng2john.py que puedes descargar aquí.

Después basta con pasarsela a john con el diccionario que queramos usar:

Después solo tenemos que asignarle el permiso 600 al archivo y hacer login introduciendo la passphrase del id_rsa:

Es importante asignar al archivo el permiso 600 porque si el archivo tiene más permisos de los necesarios, aparecerá un error:

Obtener clave privada a partir de clave pública

Existe una vulnerabilidad en RSA, y es que si utilizas dos primos demasiado pequeños para generar las claves pública y privada, entonces es posible averiguarlos y generar la clave privada a partir de la pública.

Para entender esto en detalle es necesario entender en profundidad el algoritmo de criptografía asimétrica RSA, y comprender cómo se generan las claves públicas y privadas. En un futuro podría realizar un post de criptografía explicándolo en detalle.

Partiremos de tener una clave pública, como la siguiente:

A continuación, ejecutamos la herramienta RsaCtfTool

Ahora solo tenemos que copiar la private key, darle permisos y logearnos:

Fuga de información en el Banner

Es importante fijarse bien en el banner que devuelve ssh cuando nos conectamos. Veamos este ejemplo en el que hemos lanzado nmap:

Podemos observar que el servicio SSH abierto en el puerto 2222 nos revela que el servidor es Ubuntu. Pero también nos revela el último parche de OpenSSH aplicado, 4ubuntu2.2.

Si buscamos esta información en google, podemos averiguar cuando se lanzó este parche:

Esta información puede ser muy valiosa en el futuro por si podemos utilizar algún exploit de kernel.

Fuerza bruta

Podemos tratar de acceder mediante ssh utilizando fuerza bruta para averiguar las credenciales. Para ello podemos emplear la herramienta hydra:

Enumeración de usuarios

Podemos tratar de enumerar usuarios con el siguiente script:

https://github.com/BlackDiverX/ssh-user-enumeration

Añadir Key Exchange Algorithm antiguo

A veces un servidor necesita utilizar algún algoritmo de intercambio de claves antiguo que no se suele ofrecer por defecto. En esos casos, recibiremos un error parecido a este:

En estos casos lo que debemos hacer es añadir alguno de los algoritmos que nos ofrece el servidor, por ejemplo el último, mediante el parámetro -okexAlgorithms=+diffie-hellman-group1-sha1:

SSH via IPv6

A veces un servidor puede tener las iptables configuradas para que no sea posible el acceso mediante ssh. Sin embargo, esto solo sirve para IPv4, por lo que quiza podemos acceder por IPv6.

Para ello solo necesitamos conocer la IPv6 del servidor:

Y conectarnos como usualmente haríamos pero a esa IPv6, con password o con clave privada:

Permitir la conexión por SSH

Un servidor puede tener la conexión ssh deshabilitada por defecto:

Pero si podemos editar de alguna forma el contenido del archivo “/etc/ hosts.allow”, entonces podremos permitir la conexión añadiendo dos líneas:

Y ya podremos conectarnos sin problema:

Espero que toda esta información te haya sido de utilidad. Tengo muchos más vectores de ataque y formas de comprometer la seguridad del protocolo SSH, que puedes encontrar en la segunda parte de este post.

Lethani.

3 Comments

  1. […] De hecho, el protocolo SSH fue creado precisamente para sustituir a Telnet y proporcionar una alternativa segura para el mantenimiento y gestión de servidores. Desde hace décadas telnet ha sido sustituido por Secure Shell. Si quieres descubrir las principales vulnerabilidades SSH y la forma de utilizar este protocolo a tu favor durante un pentesting, te recomiendo que le eches un vistazo a este post. […]

  2. Shela Shela febrero 23, 2021

    Can I simply say what a comfort to find someone who genuinely
    knows what they’re discussing on the web. You actually realize how to bring
    an issue to light and make it important. More people ought to look at this and understand this
    side of the story. It’s surprising you aren’t more
    popular since you surely have the gift.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *