SFTP 在哪方面不是基于 SSH 的?

SFTP 在哪方面不是基于 SSH 的?

我刚刚完成OverTheWire Bandit 战争游戏,第 18 级

这是一个惊喜。以下是该级别的说明。

下一级的密码存储在文件中自述文件在主目录中。可惜有人修改了.bashrc当您使用 SSH 登录时注销您。

我正在考虑一种让 shell 跳过采购的方法.bashrc。但在找到解决方案之前,我很想简单地启动与服务器的 SFTP 连接。我没想到它会起作用。但它确实做到了。我想知道为什么。我以为 SFTP 是通过 SSH 运行的。

为了清楚起见,当我通过 SSH 连接到服务器时,正如预期的那样,我被踢出了服务器。

答案1

关于 bash 的一般情况

Bash 关于启动文件的设计相当奇特。 Bash.bashrc在两种不相关的情况下加载:

  • 当它是交互式 shell 时,除非它是登录外壳(除非它被调用为sh)。这就是为什么.bash_profile通常负载.bashrc
  • 当 bash 是不是Interactive 也不是登录 shell 也不是调用 assh但给定要执行的命令-c并且SHLVL未设置或小于或等于 1,并且以下情况之一为 true:

    • 如果标准输入是套接字。实际上,这主要发生在 bash 被调用时rshd,即跑步时rsh remotehost.example.com somecommand
    • 如果在编译时激活(某些发行版就是这种情况,例如 Debian 及其衍生版本),并且定义了环境变量SSH_CLIENT或之一。SSH2_CLIENT实际上,这意味着 bash 是由sshdie调用的ssh remotehost.example.com somecommand
      如果您不知道 bash 是如何编译的,可以通过检查二进制文件是否包含以下字符串来确定是否设置了此选项SSH_CLIENT

      strings /bin/bash | grep SSH_CLIENT
      

关于 SSH 的一般情况

当您通过 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

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 可以工作。
但也能工作。 正如会的那样。 在交互式登录过程中适时按下 Ctrl+C 也会起作用:它会中断 bash,因此不会完全执行。 Bash 需要宏观的时间来启动,因此虽然这并不可靠,但在实践中是可以完成的。 ssh [email protected] cat readme
echo 'cat readme' | ssh [email protected]
.bashrc

答案2

.bashrc仅当您启动 shell 时才会执行。

Subsystem internal-sftp通过在服务器文件中提供命令,可以将 SSH 服务器配置为不启动 SFTP 协议的 shell sshd_config

推测:很可能这就是 OverTheWire Bandit 战争游戏的实际配置方式,而不是调整,.bashrc因为否则相同的限制ssh也会阻止sftp服务器命令。

答案3

sftp 使用相同的凭据,但不在远程计算机上运行交互式 shell。

管理员可以阻止 sftp 用户运行 ssh,例如,如中所述如何限制用户只能使用 SFTP 而不是 SSH

相关内容