Capabilities、SUDO、SUID学习

ddddddd9  780天前

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

微信截图_20221106020402.png

SUID

Redhat官网文章

微信截图_20221106020601.png

SUID特殊位,设置了SUID的二进制程序,以当前二进制程序的属主,也就是该二进制程序的所有者的身份权限执行。

如下图:

微信截图_20221106020546.png

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组

微信截图_20221106020523.png

使用find命令查找SUID位的二进制程序可以看到python3.10

david@david-virtual-machine:~$ find / -perm -4000 2>/dev/null

微信截图_20221106020617.png

参考:gtfobins

david@david-virtual-machine:~$ python3.10 -c 'import os; os.execl("/bin/sh", "sh", "-p")'

微信截图_20221106020641.png

进程树,关于EUID为0的解释请直接查看P神链接

微信截图_20221106020655.png

设置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

微信截图_20221106020819.png

如下图,查找SUID位的二进制程序,已经无法找到python,这时候使用getcap可以找到拥有ROOT特权功能的二进制程序,利用该配置可以获取ROOT命令执行。

微信截图_20221106020709.png

进程树

微信截图_20221106020831.png

原本我的理解是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位后

微信截图_20221106020858.png

看一下python的官方文档,在Ubuntu 22.04 LTS中subprocess 没有受到python设置SUID以ROOT运行,os.system()即便设置了/usr/bin/python3.10的SUID,仍需要设置setuid(0)

微信截图_20221106020839.png

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")'

微信截图_20221106020849.png

有趣的问题请直接参考下方链接!!

参考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)

最新评论

ws  :  so water
759天前 回复
昵称
邮箱
提交评论