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"
Host *
ForwardAgent yes
Este usuario tan solo debe conectar al servidor compartido:
Ahora un segundo usuario que conecte al servidor compartido podrá ver el socket del ForwardAgent del primer usuario:
Buscamos el fichero de socket:
/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:
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:
#!/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:
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:
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:
Host SHARED_SERVER
Hostname SHARED_SERVER_IP
Host EXTERNAL_SERVER
ProxyJump SHARED_SERVER
O por cli: