¿De qué manera SFTP no se basa en SSH?

¿De qué manera SFTP no se basa en SSH?

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 .bashrcen 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_profilenormalmente cargas.bashrc.
  • cuando bash esnointeractivo ni un shell de inicio de sesión ni invocado como shpero dado un comando para ejecutar -cy SHLVLno 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 porrshd, es decir, cuando se ejecuta rsh 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_CLIENTo SSH2_CLIENTestá definida. En la práctica, esto significa que bash es invocado por sshd, es decir ssh 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 cadena SSH_CLIENT:

      strings /bin/bash | grep 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 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 sftpsubsistema, 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_configarchivo. 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, .bashrccontiene


# 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 .bashrcse 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-sftpdel 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, .bashrcde lo contrario, la misma restricción sshtambién bloquearía el sftpcomando 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

información relacionada