Acabo de completar el juego de guerra OverTheWire Bandit, nivel 18 .
Eso fue una sorpresa. Aquí están las instrucciones para este nivel.
La contraseña para el siguiente nivel se almacena en un archivo Léame en el directorio principal. Desafortunadamente, alguien ha modificado .bashrc para cerrar sesión cuando inicia sesión con SSH.
Estaba pensando en una manera de hacer que el shell omita el abastecimiento .bashrc
. Pero antes de encontrar una solución, me sentí tentado a simplemente iniciar una conexión SFTP con el servidor. No esperaba que funcionara. Pero lo hizo. Y me gustaría saber por qué. Pensé que SFTP se ejecuta sobre SSH.
Para mayor claridad, cuando ingreso SSH al servidor, me expulsan, como se esperaba.
Respuestas:
En bash en general
El diseño de Bash con respecto a los archivos de inicio es bastante peculiar. Bash se carga
.bashrc
en dos circunstancias no relacionadas:sh
). Es por eso que.bash_profile
generalmente se carga.bashrc
.Cuando bash no es interactivo ni un shell de inicio de sesión ni se invoca como
sh
pero recibe un comando para ejecutar-c
ySHLVL
está desarmado o menor o igual a 1, y uno de los siguientes es verdadero:rshd
, es decir, cuando se ejecutarsh remotehost.example.com somecommand
.Si se activa en tiempo de compilación (que es el caso en algunas distribuciones, como Debian y derivados), si una de las variables de entorno
SSH_CLIENT
oSSH2_CLIENT
está definida. En la práctica, esto significa que bash es invocado porsshd
, es decirssh remotehost.example.com somecommand
.Si no sabe cómo se compiló bash, puede averiguar si esta opción se configuró comprobando si el binario contiene la cadena
SSH_CLIENT
:Sobre SSH en general
Cuando ejecuta un comando a través del protocolo SSH, el comando se pasa por el cable como una cadena. La cadena es ejecutada por el shell remoto. Cuando ejecuta
ssh example.com somecommand
, si el shell de inicio de sesión del usuario remoto es/bin/bash
, se ejecuta el servidor SSH/bin/bash -c somecommand
. No hay forma de evitar el shell de inicio de sesión. Esto permite restringidas shells de entrada, por ejemplo, para permitir solamente la copia de archivos y no la ejecución de comandos en general.Hay una excepción: el protocolo SSH permite al cliente solicitar un subsistema específico. Si el cliente solicita el
sftp
subsistema, entonces, de manera predeterminada, el servidor OpenSSH invoca el programa/usr/lib/openssh/sftp-server
(la ubicación puede variar) a través del shell de inicio de sesión del usuario. Pero también se puede configurar para ejecutar un servidor SFTP interno a través de la líneaen el
sshd_config
archivo En el caso del servidor SFTP interno, y solo en este caso, se omite el shell de inicio de sesión del usuario.Para este desafío
En el caso de OverTheWire Bandit 18,
.bashrc
contieneEntonces puede resolver este nivel haciendo cualquier cosa que haga que bash no sea interactivo.
fuente
sshd
ejecuta el shell de inicio de sesión del usuario que se ejecutasftp-server
. Por lo tanto, si el shell de inicio de sesión no interpreta la cadena/usr/lib/openssh/sftp-server
como "ejecutar el comando/usr/lib/openssh/sftp-server
", no puede usar SFTP.El
.bashrc
solo se ejecuta cuando inicia un shell.El servidor SSH se puede configurar para que no inicie un shell para el protocolo SFTP al proporcionar el comando
Subsystem internal-sftp
en elsshd_config
archivo del servidor .Conjetura: es probable que así es como se configura realmente el juego de guerra OverTheWire Bandit en lugar de un ajuste
.bashrc
porque, de lo contrario, la misma restricción parassh
también bloquearía elsftp
comando del servidor.fuente
/path/to/shell -c /path/to/sftp-server
donde/path/to/shell
está el shell de inicio de sesión del usuario. Si el shell de inicio de sesión del usuario es bash, entonces.bashrc
puede ejecutarse dependiendo de cómo se compiló bash. Siempre se ejecuta cuando bash es ejecutado porrshd
(sí, incluso para un shell no interactivo, el inicio de bash es extraño) y una opción de tiempo de compilación se extiende a estosshd
.exit
en.bashrc
sólo se ejecuta si bash es interactivo.Subsystem sftp internal-sftp
yecho No.; exit 1
en mi no.bashrc
tengossh
acceso al servidor, perosftp
aún funciona. (Y luego, por supuesto, es posible sobrescribir o eliminar.bashrc
. No obstante los permisos). Elssh
intento de conexión falla, ya sea interactivo o no. Por otro lado, si lo tengoSubsystem sftp /usr/lib/openssh/sftp-server
, el servicio SFTP también falla cuando.bashrc
se daña.sftp usa las mismas credenciales, pero no ejecuta un shell interactivo en la máquina remota.
Un administrador puede evitar que un usuario sftp ejecute ssh, por ejemplo, como se describe en Cómo restringir usuarios a SFTP solo en lugar de SSH
fuente