Esta pagina se ve mejor con JavaScript habilitado

Peligros del ForwardAgent SSH

 ·  🎃 kr0m

El ForwardAgent de SSH puede resultar muy útil pero también comporta ciertos problemas de seguridad ya que este realiza desde el servidor intermedio una segunda conexión al servidor final, al hacer esto genera un socket Unix que puede ser utilizado por usuarios que tengan acceso como root a este servidor compartido.

En este artículo explicaremos paso a paso como explotar dicha vulnerabilidad y como evitarlo utilizando ProxyJump en vez de ForwardAgent.

El problema del ForwardAgent se dá si tenemos una configuración Ssh como esta o si habilitamos el ForwardAgent por cli: ssh -A, ssh -o "ForwardAgent yes"

vi .ssh/config

Host *
    ForwardAgent yes

Este usuario tan solo debe conectar al servidor compartido:

ssh SHARED_SERVER

Ahora un segundo usuario que conecte al servidor compartido podrá ver el socket del ForwardAgent del primer usuario:

ssh SHARED_SERVER

Buscamos el fichero de socket:

find /tmp -path ‘ssh’ -type s

/tmp/ssh-YOoGk79Zy5/agent.3681

NOTA: El fichero de socket se creará con propietario el usuario que haya realizado la conexión SSH.

Conectamos con un tercer servidor al que user2 no tiene acceso directo pero utilizando el socket del ForwardAgent si que lo consigue:

SSH_AUTH_SOCK=/tmp/ssh-YOoGk79Zy5/agent.3681 ssh EXTERNAL_SERVER

user2 ha conseguido acceso a EXTERNAL_SERVER utilizando el agent de user1, en realidad tendrá acceso a todos los servidores, repositorios Git y demás servicios que dependan de la key ssh de user1.

Una forma sencilla de comprobar si existen sockets ForwardAgent es crear un pequeño script que ejecutaremos para conectar a los servidores, de este modo ejecutaremos primero el find y finalmente conectaremos de forma normal:

vi sshForwardAgent

#!/usr/bin/env bash
if [ $# -ne 1 ]; then
    echo "++ ERROR: Incorrect number of arguments"
    exit
fi

echo "---------------------------"
ssh $1 "find /tmp -path '*ssh*' -type s"
echo "---------------------------"
ssh $1

Asignamos los permisos necesarios:

chmod 700 sshForwardAgent

NOTA: Tendremos que asegurarnos de que el script está en nuestro path para poder ejecutarlo de forma cómoda y rápida sin tener que indicar el path completo.

Ahora tan solo deberemos conectar a los servidores mediante:

sshForwardAgent SERVER_IP


Si estamos utilizando ForwardAgent porque tenemos que acceder a un servidor utilizando uno intermedio porque el servidor final se encuentra en una red restringida mediante firewalls, NATs, etc podemos utilizar ProxyJump, mediante ProxyJump se utilizarán también nuestras keys para acceder al servidor final pero no se generará el fichero de socket.

Este método tiene algunas limitaciones ya que no nos permite realizar operaciones como un git clone, para estos casos seguimos necesitando el ForwardAgent clásico.

La configuración ssh quedaría del siguiente modo:

vi .ssh/config

Host SHARED_SERVER
        Hostname SHARED_SERVER_IP
Host EXTERNAL_SERVER
        ProxyJump SHARED_SERVER

O por cli:

ssh -J SHARED_SERVER EXTERNAL_SERVER

Si te ha gustado el artículo puedes invitarme a un RedBull aquí