Enjaulando un usuario SSH

Hace unos días se me planteó una situación interesante que puede llegar hasta a ser habitual a algunos de los lectores de nuestro blog.

Debía facilitar una cuenta SSH a un número X de personas para que probaran desde su localización si podían acceder a un SSH y a su vez si podían lanzar ataques de bruteforce, como “concepto” para que pudieran experimentar como es eso de sacar contraseñas utilizando Fuerza Bruta y como mitigar este ataque.

Solo tenía una máquina en ese momento con IP pública dinámica (vamos una VM en mi casa) pero daba la casualidad que el tiempo (¿qué es eso?) que disponía era escaso como para crear una nueva máquina o limpiar la que tenía de pruebas anteriores, datos y demás información “clasificada” por lo que el riesgo de que alguno que fuera más listo de la cuenta o el simple hecho de tenerla publicada en Internet podía causar una termoimplosión nuclear.

El tiempo es oro y por ello la solución temporal más efectiva que pude plantear en ese momento fue: Enjaular un usuario SSH. Podría haber alternativas, pero el SSH en cuestión iba a estar habilitado durante 6 horas.

Sobre cómo hacer esto, es de lo que va a tratar el artículo que hoy publico tras bastante tiempo de vacaciones en las Bahamas con cerveza Hack&Beers y pescando en las aguas cristalinas (Oh shit!! It’s not real).

En primera instancia vamos a dejar muy claro determinados conceptos, haciendo especial hincapié en las fases que algunos/as las consideraréis muy sencillas de comprender pero otros quizás no.

ssh1

Instalando JAILKIT

Sí, hay alternativas más o menos bonitas, o más o menos ortodoxas o del gusto del “chef” pero conocía jailkit desde tiempos de los Sarracenos, mínimo y me ha ido siempre de perlas por lo que mi experiencia con JailKit la traslado aquí.

La instalación se realizará sobre una máquina Kali Linux que está basada en Debian.

Lo primero es descargar el paquete desde aquí:

http://olivier.sessink.nl/jailkit/index.html#download

Lo extraemos tar –xvf jailXXXX.tar (si no lo cambian a .tgz u otro formato, este es el comando)

Entramos en el directorio elegido para su descomprensión y hacemos lo siguiente:

./configure

make

make install

1_enjaula

Con esto debería quedar instalado correctamente.

Aquí podemos observar las opciones que tiene JailKit. De las cuales, para esto solo usaremos dos de ellas.

2_enjaula

Son opciones muy interesantes. Por ejemplo lanzar algún servicio que necesita privilegios, como Apache, dentro de la jaula ya que necesita acceder o abrir el puerto 80.

jk_chrootlaunch -j /opt/jailhackingetico -x /opt/jailhackingetico/usr/sbin/apachectl — start

Hay que aclarar que para Apache por ejemplo, se necesita de /bin/sh y /usr/bin/kill. Lo cual debemos copiar con jk_cp dentro de la jaula con el mismo procedimiento que se usa jk_init.

No obstante este artículo no vamos a tratar como ejecutar aplicaciones con privilegios dentro de la jaula aunque es un tema muy interesante.

Creando la Jaula.

El siguiente paso es elegir la carpeta dónde alojaremos la Jaula. Un buen lugar es el directorio /opt por lo que crearemos una carpeta ahí, con el siguiente procedimiento básico, de Linux.

mkdir /opt/jailhackingetico

Instalación de programas que estarán dentro de la Jaula.

Vamos a llamar bien, comando por comando, o bien “del tirón” a los “packs” de utilidades que estarán dentro de la jaula. Esto significa que cada paquete, instalará ssh, ls, cd, vi, etc…y todas las acciones básicas que debería tener una consola de comandos. Esto podemos ir ampliándolo con packs tipo OpenVPN (imaginad, una VPN dentro de una cuenta enjaulada dentro de un servidor para otra cosa :P)

Paso por paso:

jk_init -v /jail ssh

jk_init -v /jail basicshell

jk_init -v /jail editors

jk_init -v /jail extendedshell

jk_init -v /jail netutils

jk_init -v /jail jk_lsh

O paso todo a la vez:

jk_init -v /opt/jail netutils basicshell jk_lsh extendedshell editors ssh

¿Por qué pongo una de las líneas anteriores en negrita? Pues porque este paquete es imprescindible para que pueda funcionar debidamente el enjaulamiento de un usuario.

Esperamos a que acabe el proceso que dura unos 10-20 segundos y seguimos con el paso siguiente.

Creando un usuario en el servidor

Vamos a crear un usuario en el servidor y lo vamos a configurar como usuario enjaulado. Para ello, usamos lo siguiente:

adduser hackingetico

Seleccionamos la password que queramos y procedemos a darle a continuar. Los siguientes campos los dejamos en blanco ya que no son totalmente necesarios.

3_enjaula

Si hacéis un cat /etc/passwd podréis ver al final de la línea lo siguiente:

4_enjaula

Con esto nos aseguramos de que tenemos un usuario que podría entrar al sistema de cualquier forma remota, teniendo el SSH habilitado, pero para ello vamos a enjaularlo.

Ahora vamos a “enchironar”(tenía que soltarlo por algún lado :P) al usuario creado.

Enjaulando al usuario

Lo siguiente es el proceso de enjaular al usuario.

Hemos creado una carpeta que será la jaula, hemos instalado la aplicación que nos ayudará a ello e instalado algunos paquetes básicos que irán dentro de la jaula, que el usuario que entre con las credenciales, pueda usar al menos algunos de ellos.

Tecleamos lo siguiente:

jk_jailuser -m -j /opt/jailhackingetico hackingetico

Con esto vamos a decirle que el directorio sea la jaula del usuario ‘hackingetico’ En un abrir y cerrar de ojos creará la relación jaula-usuario y realizamos unas cuestiones más porque a primera instancia, no vamos a poder conectarnos por ssh, ya que nos tirará la conexión pese a que conozcamos la password. Para ver qué sucede, vamos a hacer una primera prueba.

5_enjaula

Efectivamente, nos rechaza la conexión. Solucionemos esto.

Vamos a editar el passwd de la jaula para indicarle la ruta /bin/bash

nano /opt/jailhackingetico/etc/passwd

Sustituimos:

6_enjaula

Por:

7_enjaula

Guardamos y probamos de nuevo la conexión ssh.

8_enjaula

Ya tenemos acceso por ssh al usuario que hemos enjaulado, aislado, de nuestra máquina.

Si queremos que tenga más “libertad de movimientos” debemos instalarle más paquetes o los correspondientes que necesitemos con la orden jk_init

Con esto conseguimos aislar un usuario, aplicando una configuración de seguridad bastante aceptable ya que en apariencia, el usuario no distingue si está o no dentro de una jaula.

Podemos demonizarlo con jk_socketd para nuestra comodida.

Espero que os haya gustado y que alguna vez os sirva para configurar servidores o hacer pruebas de concepto propias.

Muchas gracias.

@ManoloGaritmo