如果我运行 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
问题
- 是什么原因造成的
port 544: Connection refused
? - 为什么会显示错误
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