De que forma o SFTP não é baseado em SSH?

De que forma o SFTP não é baseado em SSH?

Acabei de completarJogo de guerra OverTheWire Bandit, nível 18.

Isso foi uma surpresa. Aqui estão as instruções para este nível.

A senha para o próximo nível é armazenada em um arquivoLeia-meno diretório inicial. Infelizmente, alguém modificou.bashrcpara desconectar você quando você fizer login com SSH.

Eu estava pensando em uma maneira de fazer com que o shell ignorasse o fornecimento .bashrc. Mas antes de descobrir uma solução, fiquei tentado a simplesmente iniciar uma conexão SFTP com o servidor. Eu não esperava que funcionasse. Mas aconteceu. E eu gostaria de saber por quê. Achei que o SFTP rodava em SSH.

Para maior clareza, quando faço SSH no servidor, sou expulso, conforme esperado.

Responder1

No bash em geral

O design do Bash em relação aos arquivos de inicialização é bastante peculiar. Bash carrega .bashrcem duas circunstâncias não relacionadas:

  • Quando é um shell interativo, exceto quando é umshell de login(e exceto quando é invocado como sh). Isso é por que.bash_profilenormalmente carrega.bashrc.
  • Quando o bash énãointerativo, nem um shell de login, nem invocado como, shmas recebe um comando para executar -ce SHLVLnão está definido ou é menor ou igual a 1 e uma das seguintes opções é verdadeira:

    • Se a entrada padrão for um soquete. Na prática, isso acontece principalmente quando o bash é invocado porrshd, ou seja, durante a execução rsh remotehost.example.com somecommand.
    • Se ativado em tempo de compilação (que é o caso de algumas distribuições, como Debian e derivadas), se uma das variáveis ​​de ambiente SSH_CLIENTou SSH2_CLIENTestiver definida. Na prática, isso significa que o bash é invocado por sshd, ou seja ssh remotehost.example.com somecommand, .
      Se você não sabe como o bash foi compilado, você pode descobrir se esta opção foi definida verificando se o binário contém a string SSH_CLIENT:

      strings /bin/bash | grep SSH_CLIENT
      

No SSH em geral

Quando você executa um comando por meio do protocolo SSH, o comando é transmitido pela rede como uma string. A string é executada pelo shell remoto. Quando você executa ssh example.com somecommand, se o shell de login do usuário remoto for /bin/bash, o servidor SSH será executado /bin/bash -c somecommand. Não há como ignorar o shell de login. Isso permite shells de login restritos, por exemplo, parapermitir apenas cópia de arquivose não a execução geral de comandos.

Há uma exceção: o protocolo SSH permite ao cliente solicitar um subsistema específico. Se o cliente solicitar o sftpsubsistema, então, por padrão, o servidor OpenSSH invoca o programa /usr/lib/openssh/sftp-server(a localização pode variar) através do shell de login do usuário. Mas também pode ser configurado para executar um servidor SFTP interno através da linha

Subsystem sftp internal-sftp

no sshd_configarquivo. No caso do servidor SFTP interno, e somente neste caso, o shell de login do usuário é ignorado.

Para este desafio

No caso do OverTheWire Bandit 18, .bashrccontém


# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
echo 'Byebye !'
exit 0

Portanto, você pode resolver esse nível fazendo qualquer coisa que faça com que o bash não seja interativo.

Como você descobriu, o SFTP funciona.
Mas também funcionaria. Como seria . E pressionar Ctrl+C no momento certo durante um login interativo também funcionaria: interromperia o bash, para que não fosse completamente executado. O Bash leva um tempo macroscópico para iniciar, portanto, embora isso não funcione de maneira confiável, pode ser feito na prática. ssh [email protected] cat readme
echo 'cat readme' | ssh [email protected]
.bashrc

Responder2

O .bashrcsó é executado quando você inicia um shell.

O servidor SSH pode ser configurado para não iniciar um shell para o protocolo SFTP fornecendo o comando Subsystem internal-sftpno sshd_configarquivo do servidor.

Conjectura: é provável que seja assim que o jogo de guerra OverTheWire Bandit esteja realmente configurado, em vez de um ajuste, .bashrcporque caso contrário, a mesma restrição sshtambém bloquearia o sftpcomando do servidor.

Responder3

sftp usa as mesmas credenciais, mas não executa um shell interativo na máquina remota.

Um administrador pode impedir que um usuário sftp execute ssh, por exemplo, conforme descrito emComo restringir usuários apenas a SFTP em vez de SSH

informação relacionada