Press "Enter" to skip to content

Hacking de Infraestructura: Protocolo SSH Parte II

Esta es la continuación del post de la semana pasada, que puedes encontrar aquí. Te recomiendo que le eches un vistazo antes de continuar si todavía no lo has visto.

En este post continuaré mostrándote diferentes métodos que pueden resultar útiles a la hora de vulnerar un servidor en el que esté corriendo el protocolo SSH. Además también te mostraré formas de utilizar este protocolo a tu favor en pos de descubrir servicios ocultos mediante técnicas como el port forwarding.

Port Forwarding

Con SSH es posible redirigir puertos. Esto es útil para hacer pivoting y llegar a máquinas que no están a nuestro alcance. Pongamos un ejemplo básico:

Desde nuestra máquina local podemos conectarnos a la máquina 172.24.0.253 (a partir de ahora “ezra”) por el puerto 22. Desde esa máquina es posible acceder a la máquina 172.24.0.2 por el puerto 80, porque está en su red local. 

Sin embargo, desde nuestra máquina local no podemos acceder a la máquina 172.24.0.2, puesto que no está en nuestra red.

Supongamos ahora que hemos hackeado la máquina erza, y queremos intentar hackear la máquina 172.24.0.2.

Desde ezra no tenemos todo el conjunto de herramientas que tenemos en nuestra máquina local para intentar hackearla. No está instalado nmap, por ejemplo.

Podríamos instalarlas una vez que consiguieramos acceso como administradores, pero esto no siempre es posible, aparte de que sería muy tedioso. Para eso está la técnica de Port Forwarding, la cual nos permitirá redirigir el tráfico que sale de nuestra máquina local hacia la máquina 172.24.0.2 a través de la máquina ezra.

Veamos los comandos básicos para hacer esto con ssh:

-L (Local)

Con este método escuchamos en un puerto de nuestro localhost, y siempre que mandemos algo por ahi lo redirigirá a donde queramos, sea en local o remoto.

Ejemplo: redirigir el tráfico que mandemos en el puerto 8081 de nuestra máquina local al puerto 80 del servidor 172.24.0.2 via ezra

— (127.0.0.1:8081) => (172.24.0.2:80)

En ezra ejecutamos el siguiente comando: -L 8001:172.24.0.2:80

En la máquina local comprobamos que el puerto 8081 está escuchando:

Ahora si en la máquina local abrimos el navegador y ponemos 127.0.0.1:8001 estaremos accediendo a la página web que hay en el puerto 80 del servidor 172.24.0.2 a través de ezra

Nota: Podríamos ejecutar este mismo comando desde nuestra máquina local mediante el siguiente comando: ssh -i id_rsa -L8081:172.24.0.2:80 172.24.0.253)

 

 

-R (Remoto)

Ezra está escuchando en un puerto, y reenvia lo que reciba al puerto que queramos de nuestra máquina local.

Ejemplo: ezra escuchando en puerto 8002 y reenvia lo que reciba al puerto 8003 de nuestra máquina local

— (SSH.Target:8002) => (127.0.0.1:8003)

En ezra ejecutamos el siguiente comando: -R 8002:127.0.0.1:8003

Si ahora nos ponemos a la escucha en nuestra máquina local:

Y enviamos el tráfico al puerto 8002 de ezra:

Vemos que lo que reciba el puerto 8002 de ezra lo recibe en nuestra máquina local en el puerto 8003:

 

-D (Dinámico)

Con este método conseguiremos realizar el pivoting tanto del trafico que sale como del que entra. Sería como si realizasemos el Local y el Remoto a la vez.

En erza ejecutamos el siguiente comando: -D 1080

 

Podemos configurar el programa proxychains en el puerto dinamico que hemos creado, y de esa forma lanzar herramientas a través del tunel de forma fácil y rápida:

De esa forma conseguimos nuestro objetivo inicial, ejecutar nmap desde nuestra máquina local a la máquina 172.24.0.2.

 

 

Port Forwarding en Windows

Podemos realizar el Port Forwarding en Windows utilizando el programa plink.

Para ello, indicamos con -l el usuario al que queremos conectarnes por ssh, con -pw la contraseña, después indicamos el tipo de port forwarding que queremos con los comandos mostrados anteriormente, y por último la IP de la máquina a la que queremos conectarnos. Al indicar con -P el puerto 2222 estamos indicando que el servicio ssh está corriendo en ese puerto. Si no ponemos nada por defecto asumirá que ssh se ejecuta en el puerto 22.

En este caso, el tráfico del puerto 8888 de la máquina Windows es reenviado al puerto 8888 de nuestra máquina local.

Cabe destacar también que para que la conexión sea posible tenemos que configurar el servidor ssh de nuestra máquina local modificando el archivo /etc/ssh/ sshd_config, puesto que por defecto el usuario root no puede acceder por ssh.

Detectar un servidor SSH oculto

En el nmap de esta máquina podemos ver que el puerto 8888 está filtrado:

Esto es interesante porque significa que cuando nmap envía el paquete a ese puerto, no devuelve nada. Cuando un puerto simplemente está cerrado, lo usual es que devuelva una respuesta que lo indica. Que no devuelva nada quiere decir que hay algún tipo de firewall que está deshechando los paquetes que mandamos.

Una vez que hemos logrado acceder a la máquina, accedemos por ssh y comprobamos qué está pasando en el puerto 8888 mediante la herramienta netstat:

Algo interesante está pasando. En la primera línea vemos que la máquina en la que estamos (10.10.10.87) está escuchando en todas las interfaces en el puerto 8888, y en la segunda vemos que nosotros mismos (somos la ip 10.10.14.2) estamos conectados a ese puerto.
Dado que la única conexión que tenemos con esta máquina es por ssh, eso significa que de algún modo al conectarnos por ssh al puerto 22 de la máquina, de forma oculta nos está reconectando al puerto 8888.

Podemos comprobar que esto es cierto creando otra conexión ssh y haciendo de nuevo un netstat:

Hacinedo un ipconfig vemos que esta máquina tiene docker:

Por tanto podemos asumir que el esquema lógico de lo que está pasando sería 10.10.14.2:38734 -> 10.10.10.87:22 -> 172.17.0.1:8888

Si en la máquina 10.10.10.87 probamos a hacer un nc en el puerto 22, aparece este banner:

Sin embargo, el banner que aparece cuando nos conectamos desde nuestra máquina es distinto:

Esto quiere decir que hay un servidor ssh oculto, y que si conocemos la contraseña o tenemos la clave privada necesaria, podremos acceder a ese servidor:

Hacer una copia de un disco físico a la máquina local utilizando SSH y dd:

En este ejemplo copiamos el disco físico /dev/sda de la ip 10.10.10.111 mediante el servicio SSH:

Cabe destacar que este acceso via SSH no ha requerido contraseña porque teníamos la clave privada necesaria para entrar en 10.10.10.111 en la carpeta .ssh del usuario root de nuestra máquina.

Realizar una captura de paquetes por ssh sin tocar el disco

Podemos utilizar ssh para capturar el tráfico de la máquina sin tener siquiera que tocar el disco, para ello basta con ejecutar el siguiente comando:

Destacar que es necesario poner la regla “not port 22” para no capturar el tráfico cifrado de ssh.

Por ejemplo, en este caso conseguimos un usuario y hash de password de LDAP al analizar el tráfico obtenido:

Claves vulnerables SSH en Debian

Se puede predecir la clave OpenSSL PRNG de los Debian entre 2006 y 2008 debido a una modificación en el código.

En este enlace puedes encontrar el repositorio donde se encuentran las claves vulnerables:

https://github.com/g0tmi1k/debian-ssh

Se puede predecir la clave OpenSSL PRNG de los Debian entre 2006 y 2008 debido a una modificación en el código.

En primer lugar, hay que obtener la clave pública SSH:

Mediante el siguiente comando podemos ver el tipo de clave ssh que es y obtener el md5 fingerprint:

Descargamos el github y buscamos el archivo que corresponda con el tipo de clave, en este caso al ser una clave de 4096 bits la encontramos en uncommon_keys/debain_ssh_rsa_4096_x86.tar.bz2

Una vez extraido, simplemente tenemos que buscar en la carpeta el md5 de nuestra clave ssh, y obtendremos dos resultados, la clave pública y la privada:

Salir de una restricted shell con SSH

Si estamos en una restricted shell que nos impide ejecutar la mayoría de comandos, hay que buscar una forma de “romper la jaula”. Una de las formas de hacerlo es con ssh.

Como puedes comprobar, en esta restricted bash no es posible ejecutar la mayoría de comandos. Sin embargo, si al conectarnos por ssh utilizamos el parámetro -t bash es posible que consigamos salir de esta restricted shell, pues iniciamos bash en vez de rbash.

Login via Agente SSH

Los agentes SSH son programas que mantienen un seguimiento de las identity keys de un usuario y su contraseña. Puedes encontrar más información de ellos aquí 

Para activarlos, vamos a /etc/ssh/etc_config y activamos la opción ForwardAgent yes

Entonces si hackeamos una máquina y tenemos un usuario con pocos privilegios, podemos ejecutar un agente ssh, que es una especie de ssh single sign-on, y quizá haya algun agente que tenga acceso root.

En el siguiente caso encontramos una carpeta llamada ssh-zfnclcXPf0 que contiene un “agent.1440”:

Podemos utilizar este agente para acceder por ssh, en este caso a una imagen de docker que había dentro de esta máquina.

Encontrar archivos modificados entre dos fechas

Como curiosidad para cerrar esta sección, te voy a mostrar una forma interesante de descubrir una clave ssh que me encontré en una máquina.

Si observamos el siguiente directorio SSH:

Vemos que la fecha de creacion del id_rsa es 05/05/2019. Puede ser interesante observar los archivos modificados por esa fecha para ver si obtenemos alguna información:

Fíjate que el archivo 01-ssh.sh también fue creado ese día. Veamos que contiene.

Vemos que en este archivo se muestran las instrucciones de un agente ssh, en el que se ve que la contraseña del archivo de clave privada es Gk0cz221Ftb3ugog.

Ahora solo tenemos que conectarnos por ssh con la clave privada e introducir esa contraseña:

Espero que las técnicas que te he mostrado en este post te sean de utilidad. Te recomiendo echarle un vistazo también al post que realicé mostrando técnicas de pentesting con el protocolo FTP.

Además, si te ha gustado y quieres estar al tanto cuando publique los siguientes protocolos, te recomiendo suscribirte a mi canal de telegram.

 

Lethani.

One Comment

Deja una respuesta

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