为什么我不能将 strace 与 rsh 一起使用?

为什么我不能将 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

但是如果我在 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
   ..........................................
   ..........................................
   ..........................................

这是摘录自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

问题

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

答案1

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

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

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

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

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

strace -o rsh.strace -s9999 -u jhamb rsh localhost pwd

相关内容