Capabilities、SUDO、SUID学习
Water Paper ... Water Words...
为了凑字数!为了XX!
这是一篇水文…
作者:dn9ie@零妖攻防实验室
OS Version : Ubuntu 22.04 LTS Kernel 5.15
david@david-virtual-machine:~$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04 (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
david@david-virtual-machine:~$ uname -ra
'Linux david-virtual-machine 5.15.0-52-generic #58-Ubuntu SMP Thu Oct 13 08:03:55 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux'
SUDO
以ROOT特权身份执行某个命令、二进制文件;主要配置文件在/etc/sudoers
,该文默认情况下在Ubuntu 22.04 LTS中只有文件的所有者ROOT和ROOT组成员拥有读的权限;david用户属于sudo组成员,sudo组成员默认可以使用sudo执行任何ALL
命令,但是执行时需要输入当前用户密码,如果配置文件中是NOPASSWD
,则可以免密使用sudo执行。
david@david-virtual-machine:~$ ls -lah /etc/sudoers
-r--r----- 1 root root 1.7K 2月 8 2022 /etc/sudoers
david@david-virtual-machine:~$ sudo -l
Matching Defaults entries for david on david-virtual-machine:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User david may run the following commands on david-virtual-machine:
(ALL : ALL) ALL
david@david-virtual-machine:~$ id
uid=1000(david) gid=1000(david) groups=1000(david),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),122(lpadmin),134(lxd),135(sambashare)
Capabilities
将ROOT特权用户的权限以更细颗粒度(划分的更细了),个人理解是将ROOT特权划分成了不同的功能可以赋予不同的二进制程序。
Wiki中关于Capabilities的解释:
能力(capability) (POSIX 1003.1e, capabilities(7)) 用更小的粒度控制超级管理员权限,可以避免使用 root 权限。软件开发者应该为二进制文件赋予最小权限,而不是使用强大的setuid。很多软件包用了能力,比如 iputils 提供的ping 使用了 CAP_NET_RAW (能力的一种) ,因此 ping 可以被普通用户执行(效果和使用 setuid 相似),同时减少了ping的潜在安全隐患。
在Ubuntu中默认情况下非特权用户是没有权限的,在二进制程序ping中设置了cap_net_raw+ep
使用原始套接字,通俗的说ping二进制程序拥有了UID为0的ROOT特权的cap_net_raw=ep
部分特权功能,使用原始套接字。
david@david-virtual-machine:~$ getcap -r / 2>/dev/null
/snap/core20/1405/usr/bin/ping cap_net_raw=ep
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper cap_net_bind_service,cap_net_admin=ep
/usr/bin/mtr-packet cap_net_raw=ep
/usr/bin/ping cap_net_raw=ep
SUID
SUID特殊位,设置了SUID的二进制程序,以当前二进制程序的属主,也就是该二进制程序的所有者的身份权限执行。
如下图:
Linux中的属主属组,拿python3举例这个程序的所有者是root,详细的权限设置为
-rwxr-xr-x 1 root root 5.7M 6月 29 20:14 /usr/bin/python3.10
r 代表读
w 代表写
x 代表执行
root 代表拥有者属主root用户
root 代表拥有者属组root组
使用find
命令查找SUID位的二进制程序可以看到python3.10
david@david-virtual-machine:~$ find / -perm -4000 2>/dev/null
参考:gtfobins
david@david-virtual-machine:~$ python3.10 -c 'import os; os.execl("/bin/sh", "sh", "-p")'
进程树,关于EUID为0的解释请直接查看P神链接。
设置SUID后可以使用find查找搜索,Capabilities 使用getcap命令进行查找搜索。
david@david-virtual-machine:~$ find / chmod-perm -4000 2>/dev/null | grep python
david@david-virtual-machine:~$ sudo u+s /usr/bin/python3.10
david@david-virtual-machine:~$ find / -perm -4000 2>/dev/null | grep python
/usr/bin/python3.10
david@david-virtual-machine:~$ sudo chmod u-s /usr/bin/python3.10
david@david-virtual-machine:~$ find / -perm -4000 2>/dev/null | grep python
david@david-virtual-machine:~$
增加python3.10特权功能CAP_SETUID:允许改变进程的用户ID
setcap 'cap_setuid+ep' /usr/bin/python3.10
如下图,查找SUID位的二进制程序,已经无法找到python,这时候使用getcap可以找到拥有ROOT特权功能的二进制程序,利用该配置可以获取ROOT命令执行。
进程树
原本我的理解是SUID设置之后运行的程序以属主ROOT身份运行,但并没有想象的那样,在测试的时候发现子进程运行没有以属主的身份运行了。在设置SUID之后,用户david运行python中的http模块可以监听0.0.0.0:80,但是在取消SUID之后无法监听。
david@david-virtual-machine:~$ ls -lah /usr/bin/python3.10
-rwsr-xr-x 1 root root 5.7M 6月 29 20:14 /usr/bin/python3.10
david@david-virtual-machine:~$ /usr/bin/python3.10 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
david@david-virtual-machine:~$ sudo chmod u-s /usr/bin/python3.10
david@david-virtual-machine:~$ ls -lah /usr/bin/python3.10
-rwxr-xr-x 1 root root 5.7M 6月 29 20:14 /usr/bin/python3.10
david@david-virtual-machine:~$ /usr/bin/python3.10 -m http.server 80
Traceback (most recent call last):
File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
exec(code, run_globals)
File "/usr/lib/python3.10/http/server.py", line 1290, in <module>
test(
File "/usr/lib/python3.10/http/server.py", line 1241, in test
with ServerClass(addr, HandlerClass) as httpd:
File "/usr/lib/python3.10/socketserver.py", line 452, in __init__
self.server_bind()
File "/usr/lib/python3.10/http/server.py", line 1284, in server_bind
return super().server_bind()
File "/usr/lib/python3.10/http/server.py", line 136, in server_bind
socketserver.TCPServer.server_bind(self)
File "/usr/lib/python3.10/socketserver.py", line 466, in server_bind
self.socket.bind(self.server_address)
Permission error: [Errno 13] Permission denied
david@david-virtual-machine:~$
设置SUID位后
看一下python的官方文档,在Ubuntu 22.04 LTS中subprocess 没有受到python设置SUID以ROOT运行,os.system()
即便设置了/usr/bin/python3.10
的SUID,仍需要设置setuid(0)
david@david-virtual-machine:~$ sudo chmod u+s /usr/bin/python3.10
david@david-virtual-machine:~$ ls -lah /usr/bin/python3.10
-rwsr-xr-x 1 root root 5.7M 6月 29 20:14 /usr/bin/python3.10
david@david-virtual-machine:~$ /usr/bin/python3.10 -c 'import os;os.system("whoami")'
david
david@david-virtual-machine:~$ /usr/bin/python3.10 -c 'import os;os.setuid(0);os.system("whoami")'
root
david@david-virtual-machine:~$
david@david-virtual-machine:~$ /usr/bin/python3.10 -c 'import os;os.setuid(0);os.system("ls -la")'
有趣的问题请直接参考下方链接!!
参考P神链接:https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html
膜拜!!!
膜拜!!!
膜拜!!!
参考链接:
https://www.cnblogs.com/nf01/articles/10418141.html
https://www.hackingarticles.in/linux-privilege-escalation-using-capabilities/
https://www.redhat.com/sysadmin/suid-sgid-sticky-bit
https://wiki.archlinux.org/title/Capabilities_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
最新评论