En este artículo voy a explicar cómo implementar un acceso como root (superusuario) a través de SSH cuando el servidor sshd no lo permite (está deshabilitada la opción PermitRootLogin
):
PermitRootLogin no
Por seguridad, es lógico que todo servidor SSH impida el acceso como root. Sin embargo, es posible lograr implementar un acceso como root, lo cual puede simplificar el acceso para tareas administrativas o la copia de archivos a través de SFTP hacia directorios donde un usuario común no tiene acceso (por ejemplo, directorios de aplicaciones y servicios).
Claro está que el mecanismo propuesto en este artículo es una configuración insegura, pero sirve a fines didácticos, para comprender que no basta con un simple PermitRootLogin no
para impedir un acceso como root, sino que es posible evitar esta restrición con una simple configuración de sudo. Un ejemplo de cómo utilizar sudo con fines maliciosos.
Configuración
Para implementar este mecanismo de acceso como root es necesario crear un usuario ("backdoor" a modo de ejemplo) con una configuración específica de bash que le permita pasar inmediatamente a root al momento de iniciar sesión.
Crear el usuario "backdoor" y establecer una contraseña:
# useradd -c "Backdoor" -d /home/backdoor -m -s /bin/bash backdoor && passwd backdoor
Configurar sudo para que "backdoor" sólo (jaja) pueda cambiar a root y utilizar el servidor SFTP:
# echo "backdoor ALL = NOPASSWD: /bin/su - root" > /etc/sudoers.d/backdoor # echo "backdoor ALL = NOPASSWD: /usr/lib/openssh/sftp-server" >> /etc/sudoers.d/backdoor # chmod 0440 /etc/sudoers.d/backdoor
NOTA: en CentOS y derivados el binario del servidor sftp se encuentra en la ruta: /usr/libexec/openssh/sftp-server
.
Luego hay que configurar el perfil de bash del usuario "backdoor" para que pase inmediatamente a ruperusuario.
En Debian y derivados:
# su - backdoor $ echo >> .bashrc $ echo "exec /usr/bin/sudo /bin/su - root" >> .bashrc $ exit
En CentOS:
# su - backdoor $ echo >> .bashrc $ echo "/usr/bin/tty -s && exec /usr/bin/sudo /bin/su - root" >> .bashrc $ exit
Finalmente es necesario crear un pequeño script para que corra el servidor SFTP como root para el usuario "backdoor".
En Debian y derivados:
# cat > /usr/local/bin/sftp-server.sh <<EOT #!/bin/bash SUDO="" if [ "\${USER}" == "backdoor" ] ; then SUDO="/usr/bin/sudo" fi exec \${SUDO} /usr/lib/openssh/sftp-server "\$@" EOT
En CentOS:
cat > /usr/local/bin/sftp-server.sh <<EOT #!/bin/bash SUDO="" if [ "\${USER}" == "backdoor" ] ; then SUDO="/usr/bin/sudo" fi exec \${SUDO} /usr/libexec/openssh/sftp-server "\$@" EOT
Una vez creado el script, otorgar permisos de ejecución:
# chmod +x /usr/local/bin/sftp-server.sh
Finalmente, configurar el subsistema SFTP en la configuración de SSH, para que utilice el script anterior:
# sed -i 's/Subsystem\(.*\)/#Subsystem\1\nSubsystem\tsftp\t\/usr\/local\/bin\/sftp-server.sh/' /etc/ssh/sshd_config
Verificación del acceso
emi@hal9000:~ % ssh -p 2222 backdoor@linuxito.com backdoor@linuxito.com's password: Linux linuxito 3.2.0-4-amd64 #1 SMP Debian 3.2.81-1 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Thu Sep 8 11:37:20 2016 from hal9000 root@linuxito:~# id uid=0(root) gid=0(root) grupos=0(root) root@linuxito:~# exit logout Connection to linuxito.com closed. emi@hal9000:~ %
Al utilizar exec
en la configuración del perfil bash se evita abrir una subshell, por lo que al ejecutar exit
se cierra no sólo la sesión como root sino también la sesión SSH como "backdoor".