我正在尝试使用 capsh 授予自己一个对某个用户没有任何功能的 shell。这样我就可以测试与非 root 相关但仅具有某些功能的安全内容。
基本上我想让一个 shell 运行与此类似的东西。这将模拟测试程序运行的状态。
capsh --print
Current: =
Bounding set =
Securebits: 00/0x0/1'b0
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
uid=10101(u0_a101)
gid=10101(u0_a101)
groups=9997(everybody),50101(all_a101)
然后我希望能够再次运行 capsh 来授予用户一些功能和/或更改 uid/gid(如果可能的话)。
如果有人有好的参考,我还没有找到任何关于 capsh 的好的教程。
列出当前功能
capsh --print
Current: =
Bounding set=cap_chown,cap_dac_override,[...]
Securebits: 00/0x0/1'b0
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
uid=1000(user)
gid=1000(user)
groups=4(adm),10101(u0_a101)
从
1.
Bounding 部分删除所有功能:
capsh --drop=cap_chown,cap_dac_override,[...]
+切换用户和组:
capsh --gid=10101 --drop=cap_chown,cap_dac_override,[...] --uid=10101
+加入群组
capsh --gid=10101 --drop=cap_chown,cap_dac_override,[...] \
--uid=10101 --groups=9997,50101
+ 执行应用程序
capsh --gid=10101 --drop=cap_chown,cap_dac_override,[...] \
--uid=10101 --groups=9997,50101 -- -c 'ping 127.0.0.1'
我想从我对这个问题的评论中还不清楚,但尽管人们普遍认为,
capsh --drop=all
确实不会阻止用户使用功能。你想要的是:
$ sudo capsh --user=$(whoami) --mode=NOPRIV --
$ capsh --current
Current: =
Current IAB: !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
这是一个可以通过
--drop=all
操作保留个人能力的序列(这个和其他陷阱记录在libcap
,capsh
,...分发站点):
$ sudo capsh --inh=cap_setuid --
$ capsh --drop=all --
$ capsh --current
Current: cap_setuid=eip
Current IAB: !cap_chown,...,!%cap_setuid,...,!cap_checkpoint_restore
$ exit
$ exit
$ exit
即,Inheritable能力标志不受Bounding集的抑制,
--drop=
命令标志仅影响Bounding向量,并且仅抑制允许的文件标志值。