
Acabo de completarJuego 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éameen el directorio de inicio. Desafortunadamente alguien ha modificado.bashrcpara cerrar sesión cuando inicie sesión con SSH.
Estaba pensando en una forma de que el caparazón omita el abastecimiento .bashrc
. Pero antes de encontrar una solución, tuve la tentación de simplemente iniciar una conexión SFTP con el servidor. No esperaba que funcionara. Pero así fue. 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.
Respuesta1
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:
- Cuando es un shell interactivo, excepto cuando es unshell de inicio de sesión(y excepto cuando se invoca como
sh
). Esta es la razón por.bash_profile
normalmente cargas.bashrc
. cuando bash esnointeractivo ni un shell de inicio de sesión ni invocado como
sh
pero dado un comando para ejecutar-c
ySHLVL
no está configurado o es menor o igual a 1, y se cumple una de las siguientes condiciones:- Si la entrada estándar es un enchufe. En la práctica, esto sucede principalmente cuando bash es invocado por
rshd
, es decir, cuando se ejecutarsh remotehost.example.com somecommand
. Si se activa en el momento de la compilación (como 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ó verificando si el binario contiene la cadenaSSH_CLIENT
:strings /bin/bash | grep SSH_CLIENT
- Si la entrada estándar es un enchufe. En la práctica, esto sucede principalmente cuando bash es invocado por
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 omitir el shell de inicio de sesión. Esto permite shells de inicio de sesión restringidos, por ejemplo parapermitir sólo la copia de archivosy no ejecución de comando 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 forma 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ínea
Subsystem sftp internal-sftp
en el sshd_config
archivo. En el caso del servidor SFTP interno, y sólo 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
contiene
…
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
…
echo 'Byebye !'
exit 0
Entonces puedes resolver este nivel haciendo cualquier cosa que haga que bash no sea interactivo.
Como descubrió, SFTP funciona.
Pero también funcionaría. Como lo haría . Y presionar Ctrl+C en el momento adecuado durante un inicio de sesión interactivo también funcionaría: interrumpiría bash, por lo que no se ejecutaría por completo. Bash tarda un tiempo macroscópico en iniciarse, por lo que, si bien esto no funciona de manera confiable, se puede hacer en la práctica.ssh [email protected] cat readme
echo 'cat readme' | ssh [email protected]
.bashrc
Respuesta2
Solo .bashrc
se ejecuta cuando inicias un shell.
El servidor SSH se puede configurar para que no inicie un shell para el protocolo SFTP proporcionando el comando en el archivo Subsystem internal-sftp
del servidor .sshd_config
Conjetura: es probable que así sea como está realmente configurado el juego de guerra OverTheWire Bandit en lugar de un ajuste porque, .bashrc
de lo contrario, la misma restricción ssh
también bloquearía el sftp
comando del servidor.
Respuesta3
sftp utiliza 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 enCómo restringir a los usuarios solo a SFTP en lugar de SSH