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

9

Acabei de completar o wargame OverTheWire Bandit, nível 18 .

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

The password for the next level is stored in a file readme in the homedirectory. Unfortunately, someone has modified .bashrc to log you out when you log in with SSH.

Eu estava pensando em uma maneira de fazer com que o shell ignorasse o fornecimento de .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 porque. Eu pensei que SFTP corre sobre SSH.

Para maior clareza, quando eu SSH no servidor, eu sou expulso, como esperado.

    
por Tomasz 30.09.2016 / 22:13

3 respostas

13

Em bash em geral

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

  • Quando é um shell interativo, exceto quando é um login shell (e exceto quando é invocado como sh ). É por isso que .bash_profile normalmente carrega .bashrc
  • Quando o bash não é não interativo, nem um shell de login nem invocado como sh , mas um comando para executar com -c e SHLVL é indefinido ou menor ou igual a 1, e um das seguintes afirmações é verdadeira:

    • Se a entrada padrão for um soquete. Na prática, isso acontece principalmente quando o bash é invocado por rshd , ou seja, ao executar rsh remotehost.example.com somecommand .
    • Se ativado em tempo de compilação (que é o caso de algumas distribuições, como Debian e derivativos), se uma das variáveis de ambiente SSH_CLIENT ou SSH2_CLIENT for definida. Na prática, isso significa que o bash é chamado 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 configurada 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 através do protocolo SSH, o comando é passado pelo fio como uma string. A string é executada pelo shell remoto. Quando você executar ssh example.com somecommand , se o shell de login do usuário remoto for /bin/bash , o servidor SSH executará /bin/bash -c somecommand . Não há como ignorar o shell de login. Isso permite shells de login restrito, por exemplo, para permitir somente a cópia de arquivos e não a execução geral de comandos.

Existe uma exceção: o protocolo SSH permite que o cliente solicite um subsistema específico. Se o cliente solicitar o subsistema sftp , por padrão, o servidor OpenSSH chamará o programa /usr/lib/openssh/sftp-server (o local pode variar) por meio 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 arquivo sshd_config . No caso do servidor SFTP interno, e somente nesse caso, o shell de login do usuário é ignorado.

Para este desafio

No caso do OverTheWire Bandit 18, .bashrc contém

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

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

As you discovered, SFTP works.
But ssh [email protected] cat readme would also work.
As would echo 'cat readme' | ssh [email protected].
And pressing Ctrl+C at the right time during an interactive login would also work: it would interrupt bash, so the .bashrc would not be completely executed. Bash takes macroscopic time to start up, so while this doesn't work reliably, it can be done in practice.

    
por 01.10.2016 / 01:59
5

O .bashrc é executado apenas 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-sftp no arquivo sshd_config do servidor.

Conjectura: é provável que seja assim que o jogo de guerra OverTheWire Bandit é realmente configurado em vez de um ajuste para .bashrc porque senão a mesma restrição para ssh também bloquearia o comando sftp server.

    
por 30.09.2016 / 22:17
4

O 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 em Como restringir usuários a SFTP apenas em vez de SSH

    
por 30.09.2016 / 22:16

Tags