我刚刚完成了18级的OverTheWire Bandit战争游戏。
那真是令人惊讶。这是此级别的说明。
下一级别的密码存储在主目录中的文件自述文件中。不幸的是,有人修改了.bashrc以使您在使用SSH登录时注销。
我在想让外壳跳过源代码的方法.bashrc
。但是在找到解决方案之前,我很想简单地开始与服务器建立SFTP连接。我没想到它会起作用。但是确实如此。我想知道为什么。我以为SFTP通过SSH运行。
为了清楚起见,当我SSH进入服务器时,被踢出了预期的结果。
我刚刚完成了18级的OverTheWire Bandit战争游戏。
那真是令人惊讶。这是此级别的说明。
下一级别的密码存储在主目录中的文件自述文件中。不幸的是,有人修改了.bashrc以使您在使用SSH登录时注销。
我在想让外壳跳过源代码的方法.bashrc
。但是在找到解决方案之前,我很想简单地开始与服务器建立SFTP连接。我没想到它会起作用。但是确实如此。我想知道为什么。我以为SFTP通过SSH运行。
为了清楚起见,当我SSH进入服务器时,被踢出了预期的结果。
Answers:
Bash在启动文件方面的设计非常独特。Bash .bashrc
在两种不相关的情况下加载:
sh
)。这就是为什么.bash_profile
通常加载.bashrc
。当bash 不是交互式的,也不是登录shell或没有被调用为,sh
而是给出了要执行的命令,-c
并且SHLVL
未设置或小于或等于1时,则满足以下条件之一:
rshd
,即运行时rsh remotehost.example.com somecommand
。如果在编译时被激活(在某些发行版中就是这种情况,例如Debian和衍生产品),则定义了环境变量SSH_CLIENT
或SSH2_CLIENT
。实际上,这意味着bash由调用sshd
,即ssh remotehost.example.com somecommand
。
如果您不知道bash是如何编译的,可以通过检查二进制文件是否包含字符串来找出是否设置了此选项SSH_CLIENT
:
strings /bin/bash | grep SSH_CLIENT
通过SSH协议执行命令时,该命令将作为字符串通过网络传递。该字符串由远程外壳执行。运行时ssh example.com somecommand
,如果远程用户的登录shell是/bin/bash
SSH服务器,则运行/bin/bash -c somecommand
。无法绕过登录Shell。这允许使用受限制的登录外壳,例如,仅允许文件复制而不能执行常规命令。
有一个例外:SSH协议允许客户端请求特定的子系统。如果客户端请求sftp
子系统,则默认情况下,OpenSSH服务器/usr/lib/openssh/sftp-server
通过用户的登录Shell 调用程序(位置可能有所不同)。但也可以将其配置为通过线路运行内部SFTP服务器
Subsystem sftp internal-sftp
在sshd_config
文件中。对于内部SFTP服务器(仅在这种情况下),将绕过用户的登录Shell。
对于OverTheWire Bandit 18,.bashrc
包含
…
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
…
echo 'Byebye !'
exit 0
因此,您可以通过执行任何导致bash不交互式的操作来解决此问题。
如您所见,SFTP可以工作。
但ssh bandit18@bandit.labs.overthewire.org cat readme
也可以。
一样echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org
。
并且在交互式登录期间的正确时间按Ctrl + C也会起作用:它将中断bash,因此.bashrc
不会完全执行。Bash需要宏观的时间来启动,因此虽然不能可靠地运行,但可以在实践中完成。
sshd
运行用户的登录外壳程序run sftp-server
。因此,如果登录外壳程序不将字符串解释/usr/lib/openssh/sftp-server
为“运行命令 /usr/lib/openssh/sftp-server
”,则无法使用SFTP。
在.bashrc
当你启动一个shell时,才会执行。
通过Subsystem internal-sftp
在服务器的sshd_config
文件中提供命令,可以将SSH服务器配置为不启动SFTP协议的外壳 程序。
猜想:这可能是OverTheWire Bandit战争游戏的实际配置方式,而不是对其进行调整,.bashrc
因为否则,相同的限制ssh
也将阻止sftp
服务器命令。
/path/to/shell -c /path/to/sftp-server
所在的位置运行/path/to/shell
。如果用户的登录外壳是bash,则.bashrc
可以根据bash的编译方式执行该命令。它总是在执行bash时执行rshd
(是的,即使对于非交互式shell,bash启动也很奇怪),并且在编译时选项将其扩展为sshd
。
exit
中.bashrc
如果bash是交互时,才会执行。
Subsystem sftp internal-sftp
和echo No.; exit 1
中,我.bashrc
无法ssh
访问服务器,但sftp
仍然可以使用。(然后,当然可以覆盖或删除.bashrc
。权限。)ssh
无论是否交互,连接尝试都会失败。另一方面,如果我有,Subsystem sftp /usr/lib/openssh/sftp-server
则SFTP服务在.bashrc
被破坏时也会失败。
sftp使用相同的凭据,但不会在远程计算机上运行交互式外壳程序。
管理员可以阻止sftp用户运行ssh,例如,如如何限制用户仅使用SFTP而不是SSH中所述