我刚刚完成了OverTheWire Bandit 兵棋推演,等级 18。
那是一个惊喜。以下是此级别的说明。
下一级的密码存储在主目录的自述文件中。不幸的是,当您使用 SSH 登录时,有人修改了.bashrc以将您注销。
我在想一种让 shell 跳过 sourcing 的方法.bashrc。但在我找到解决方案之前,我很想简单地启动与服务器的 SFTP 连接。我没想到它会起作用。但它做到了。我想知道为什么。我认为 SFTP 通过 SSH 运行。
为清楚起见,当我通过 SSH 连接到服务器时,正如预期的那样,我被踢了出去。
Gil*_*il' 13
Bash 在启动文件方面的设计相当奇特。.bashrc在两种不相关的情况下加载 Bash :
sh)。这就是为什么.bash_profile通常加载.bashrc.当 bash不是交互式的,也不是登录 shell,也不是作为调用,sh而是给出了一个命令来执行,-c并且bash未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
Run Code Online (Sandbox Code Playgroud)当您通过 SSH 协议执行命令时,该命令将作为字符串通过网络传递。该字符串由远程 shell 执行。运行时ssh example.com somecommand,如果远程用户的登录shell是/bin/bash,则SSH服务器运行/bin/bash -c somecommand。没有办法绕过登录shell。这允许限制登录 shell,例如只允许文件复制而不是一般命令执行。
有一个例外:SSH 协议允许客户端请求特定的子系统。如果客户端请求sftp子系统,则默认情况下 OpenSSH 服务器/usr/lib/openssh/sftp-server通过用户的登录 shell调用程序(位置可能会有所不同)。但也可以通过线路配置运行内部SFTP服务器
Subsystem sftp internal-sftp
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
因此,您可以通过执行任何导致 bash 不具有交互性的操作来解决此级别。
正如您所发现的,SFTP 有效。
但ssh bandit18@bandit.labs.overthewire.org cat readme也会起作用。
一样echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org。
在交互式登录期间在正确的时间按 Ctrl+C 也可以:它会中断 bash,因此.bashrc不会完全执行。Bash 需要宏观的时间来启动,所以虽然这不能可靠地工作,但可以在实践中完成。
在.bashrc当你启动一个shell时,才会执行。
通过Subsystem internal-sftp在服务器sshd_config文件中提供命令,可以将 SSH 服务器配置为不为 SFTP 协议启动 shell 。
猜想:这很可能是 OverTheWire Bandit 兵棋推演的实际配置方式,而不是对其进行调整,.bashrc否则相同的限制ssh也会阻止sftp服务器命令。