
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 .bashrc
em 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_profile
normalmente carrega.bashrc
. Quando o bash énãointerativo, nem um shell de login, nem invocado como,
sh
mas recebe um comando para executar-c
eSHLVL
nã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 por
rshd
, ou seja, durante a execuçãorsh 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_CLIENT
ouSSH2_CLIENT
estiver definida. Na prática, isso significa que o bash é invocado porsshd
, ou sejassh 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 stringSSH_CLIENT
:strings /bin/bash | grep SSH_CLIENT
- Se a entrada padrão for um soquete. Na prática, isso acontece principalmente quando o bash é invocado por
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 sftp
subsistema, 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_config
arquivo. 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, .bashrc
conté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 .bashrc
só é 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-sftp
no sshd_config
arquivo do servidor.
Conjectura: é provável que seja assim que o jogo de guerra OverTheWire Bandit esteja realmente configurado, em vez de um ajuste, .bashrc
porque caso contrário, a mesma restrição ssh
também bloquearia o sftp
comando 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