SFTP不以哪种方式基于SSH?


9

我刚刚完成了18级的OverTheWire Bandit战争游戏

那真是令人惊讶。这是此级别的说明。

下一级别的密码存储在主目录中的文件自述文件中。不幸的是,有人修改了.bashrc以使您在使用SSH登录时注销。

我在想让外壳跳过源代码的方法.bashrc。但是在找到解决方案之前,我很想简单地开始与服务器建立SFTP连接。我没想到它会起作用。但是确实如此。我想知道为什么。我以为SFTP通过SSH运行。

为了清楚起见,当我SSH进入服务器时,被踢出了预期的结果。

ssh  sftp 

1
SFTP确实可以通过SSH运行。bash也可以通过SSH运行。但是SFTP不能通过bash运行。(请注意,我在这里宽松地使用“运行”)
user253751 '16

Answers:


13

在bash上一般

Bash在启动文件方面的设计非常独特。Bash .bashrc在两种不相关的情况下加载:

  • 当它是一个交互式shell时,除非它是一个登录shell(并且当它作为调用时除外sh)。这就是为什么.bash_profile通常加载.bashrc
  • 当bash 不是交互式的,也不是登录shell或没有被调用为,sh而是给出了要执行的命令,-c并且SHLVL未设置或小于或等于1时,则满足以下条件之一:

    • 如果标准输入是插座。实际上,这多数发生在bash被调用时rshd,即运行时rsh remotehost.example.com somecommand
    • 如果在编译时被激活(在某些发行版中就是这种情况,例如Debian和衍生产品),则定义了环境变量SSH_CLIENTSSH2_CLIENT。实际上,这意味着bash由调用sshd,即ssh remotehost.example.com somecommand
      如果您不知道bash是如何编译的,可以通过检查二进制文件是否包含字符串来找出是否设置了此选项SSH_CLIENT

      strings /bin/bash | grep SSH_CLIENT
      

一般在SSH上

通过SSH协议执行命令时,该命令将作为字符串通过网络传递。该字符串由远程外壳执行。运行时ssh example.com somecommand,如果远程用户的登录shell是/bin/bashSSH服务器,则运行/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需要宏观的时间来启动,因此虽然不能可靠地运行,但可以在实践中完成。


2
我不认为SFTP来砸运行在所有的,不只是非交互。
user253751 '16

@immibis我相信你对此是正确的。我已经使用SFTP在用户帐户上交换文件,该用户帐户已使用某些应用程序配置为登录外壳程序,而不是“真实”外壳程序。
卡巴斯德(Kasperd)

@immibis SFTP不运行bash。但是,除非SFTP服务器是内部服务器,否则将sshd运行用户的登录外壳程序run sftp-server。因此,如果登录外壳程序不将字符串解释/usr/lib/openssh/sftp-server为“运行命令 /usr/lib/openssh/sftp-server”,则无法使用SFTP。
吉尔(Gilles)'所以

5

.bashrc当你启动一个shell时,才会执行。

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

猜想:这可能是OverTheWire Bandit战争游戏的实际配置方式,而不是对其进行调整,.bashrc因为否则,相同的限制ssh也将阻止sftp服务器命令。


2
运行SFTP 确实会启动外壳程序。SSH守护程序在用户的登录shell /path/to/shell -c /path/to/sftp-server所在的位置运行/path/to/shell。如果用户的登录外壳是bash,则.bashrc可以根据bash的编译方式执行该命令。它总是在执行bash时执行rshd(是的,即使对于非交互式shell,bash启动也很奇怪),并且在编译时选项将其扩展为sshd
吉尔斯(Gilles)'“ SO-别再邪恶了”

我去检查了 很好的猜测,但实际上并不那么微妙。该exit.bashrc如果bash是交互时,才会执行。
吉尔斯

@Gilles,在Subsystem sftp internal-sftpecho No.; exit 1中,我.bashrc无法ssh访问服务器,但sftp仍然可以使用。(然后,当然可以覆盖或删除.bashrc。权限。)ssh无论是否交互,连接尝试都会失败。另一方面,如果我有,Subsystem sftp /usr/lib/openssh/sftp-server则SFTP服务在.bashrc被破坏时也会失败。
roaima

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.