![在基于 Busybox 的最小系统上启动功能有限的流程](https://linux22.com/image/218736/%E5%9C%A8%E5%9F%BA%E4%BA%8E%20Busybox%20%E7%9A%84%E6%9C%80%E5%B0%8F%E7%B3%BB%E7%BB%9F%E4%B8%8A%E5%90%AF%E5%8A%A8%E5%8A%9F%E8%83%BD%E6%9C%89%E9%99%90%E7%9A%84%E6%B5%81%E7%A8%8B.png)
在一个基于 Busybox 的 Linux 系统中,如果可以访问 root 用户,如何使用Linux 的特定有限集能力(7)除了 busybox 之外不需要任何工具?
答案1
所以,首先,这确实需要一些libcap
以非默认方式从源代码构建的工具 - 所以我承认这不是您所希望的答案(只是 busybox)...但是,二进制文件很小,这里是一种探索方法:
该libcap
发行版有一个子目录,它使用 busybox 来测试从源代码构建的内核。libcap
多年来我一直用它来分类一些内核错误和修复/功能。您可以在这里探索:
https://git.kernel.org/pub/scm/libs/libcap/libcap.git/tree/kdebug
所做的事情之一就是运行quicktest.sh
libcap
在 busybox 目标内启动时的兼容性测试套件。它假设您在此相对位置有一些内核源代码,kdebug/../../linux/
以便构建要测试的系统。基本思想是解压/git 克隆libcap
源代码并执行以下操作:
$ git clone git://git.kernel.org/pub/scm/libs/libcap/libcap.git
$ cd libcap/kdebug
$ make
第一次尝试这个时,它可能会构建失败,因为它有一大堆依赖项qemu
等来启动这个 busybox 目标(枚举这些应该在自述文件中真正解释)。但安装后的二进制文件busybox
非常少。
qemu
如果您可以使上述工作正常运行,那么您还可以在测试完成后使用此命令行与托管系统进行交互:
$ make shell
[exit 和 Ctrl-d 都会退出 qemu]。
如果您尝试做一些微妙的事情,quicktest.sh
有很多示例演示如何使用自定义构建./capsh
等./setcap
二进制文件在基于总线盒的系统内以特权运行事物。如果您的主机系统上有静态文件glibc
可供链接,capsh
并且setcap
都是完全静态的二进制文件,则从源代码构建。
话虽如此,在该系统中,您可以执行以下操作:
# ./capsh --iab="^cap_net_raw" --secbits=15 == --print
Current: cap_net_raw=eip
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read,cap_perfmon,cap_bpf,cap_checkpoint_restore
Ambient set =cap_net_raw
Current IAB: ^cap_net_raw
Securebits: 017/0xf/4'b1111 (no-new-privs=0)
secure-noroot: yes (locked)
secure-no-suid-fixup: yes (locked)
secure-keep-caps: no (unlocked)
secure-no-ambient-raise: no (unlocked)
uid=0(root) euid=0(root)
gid=0(root)
groups=0(root)
Guessed mode: UNCERTAIN (0)
这演示了如何root
对单一cap_net_raw
功能的权限进行限制。对于您想要运行的任何任务,您有两种选择:
- 将一些文件功能放在二进制文件上并更改用户(从root)来运行它:
# ./setcap cap_net_raw=ep ./yourbinary
# ./capsh --user=nobody -- -c "./yourbinary"
- 或者使用上述
capsh
机制来删除root
特权并使用环境功能来限制特权nobody
用户在运行程序时:
# ./capsh --user=nobody --iab="^cap_net_raw" -- -c "./yourbinary"