为什么我不能在 rsh 中使用 strace?

dev*_*sda 2 permissions tcp socket strace rsh

如果我运行 rsh,它可以工作,但会在开头打印一些奇怪的“连接被拒绝”消息:

$ rsh localhost pwd
connect to address 127.0.0.1 port 544: Connection refused
Trying krb4 rsh...
connect to address 127.0.0.1 port 544: Connection refused
trying normal rsh (/usr/bin/rsh)
/home/service
Run Code Online (Sandbox Code Playgroud)

但是如果我在 strace 下运行 rsh,它根本不会连接到服务器:

$ strace -c rsh localhost ulimit -n
connect to address 127.0.0.1 port 544: Connection refused
Trying krb4 rsh...
connect to address 127.0.0.1 port 544: Connection refused
trying normal rsh (/usr/bin/rsh)
rcmd: socket: Permission denied
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 28.39    0.000113           2        58           read
 27.64    0.000110          16         7           write
 16.83    0.000067           1        47           open
 15.33    0.000061           2        27           munmap
 11.81    0.000047           1        80           mmap
  0.00    0.000000           0        58           close
  0.00    0.000000           0         1           stat
  0.00    0.000000           0        45           fstat
   ..........................................
   ..........................................
   ..........................................
Run Code Online (Sandbox Code Playgroud)

以下是摘录strace rsh localhost ulimit -n

connect(3, {sa_family=AF_INET, sin_port=htons(544), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Connection refused)
write(2, "Connection refused\n", 19)    = 19
connect(3, {sa_family=AF_INET, sin_port=htons(544), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Connection refused)
write(2, "Connection refused\n", 19)    = 19
Run Code Online (Sandbox Code Playgroud)

问题

  1. 是什么原因造成的port 544: Connection refused
  2. 为什么会显示错误rcmd: socket: Permission denied?它应该显示一些整数值(ulimit -n远程机器上的输出)。

Gil*_*il' 5

rsh 服务器的正常端口是 514。您的 rsh 客户端支持Kerberos,并且启用 Kerberos 的 rsh 服务器通常侦听端口 544。您的 rsh 客户端首先尝试使用 Kerberos 身份验证登录,可能首先使用 Kerberos 版本 5,然后使用 Kerberos版本 4(简称“krb4”)。错误“连接被拒绝”是由于缺少 Kerberos rsh 服务器(可能还有其他原因,例如防火墙阻止了您,但当服务器位于 localhost 时,这种情况极不可能发生)。除非您打算使用 Kerberos,否则请忽略此错误。

在没有 kerberos 的情况下,rsh 允许两种形式的身份验证:用户必须输入密码,或者用户必须在/etc/rhosts或 中列入白名单~/.rhosts。白名单意味着该文件声明允许机器 M 上的用户 U 以用户 V 身份登录服务器。仅当服务器可以相信请求确实来自机器 M 上的用户 U 时,服务器才允许这样做。如果请求来自机器 M 的 IP 地址,则服务器信任来自机器 M 的请求(根据 1980 年代的标准,这是一个有效的假设) )。它相信请求来自用户 U,因为客户端是这么说的。

但是因为客户这样说并不是信任客户的理由,即使按照 1980 年代的标准也是如此。所以有一个附加条件:rsh 请求必须有一个低于 1024 的源端口。在 Unix 机器上,只有 root 可以绑定低于 1024 的 TCP 或 UDP 端口。因此 rsh 客户端以 root 身份运行。由于任何用户都必须能够运行它,因此 rsh 二进制文件是setuid root:无论哪个用户调用它,它都以 root 权限运行。

当您在 strace 下运行程序时,它不会以任何提升的权限运行,而只是以调用用户的权限运行。这是因为跟踪可能会泄露机密数据(实际上相同的机制允许您完全劫持该过程)。所以,当你运行strace rsh …,在它试图打开低于1024源端口的连接点,它失败:rcmd: socket: Permission denied

如果要跟踪rsh,则必须以straceroot身份运行。要么让它rsh以 root 身份运行,要么传递该-u选项,以便程序以从您的帐户启动时通常拥有的权限运行:

strace -o rsh.strace -s9999 -u jhamb rsh localhost pwd
Run Code Online (Sandbox Code Playgroud)