Linux提权
和Windows一样,Linux拿到的web经常是www-data
权限,需要想办法提到root
权限
内核漏洞
最直接的办法,根据Linux的内核漏洞直接一把梭,可通过 uname -r
查看内核版本
- Dirty COW(CVE-2016-5195):Linux kernel >= 2.6.22(2007年发行,到2016年10月18日才修复),Linux内核的内存子系统在处理写入时复制(copy-on-write, COW)时产生了竞争条件(race condition)。恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。
- Dirty Pipe(CVE-2022-0847):5.8 <= Linux kernel < 5.16.11 / 5.15.25 / 5.10.102,攻击者利用该漏洞可以覆盖任意只读文件中的数据。这样将普通的权限提升至root权限,因为非特权进程可以将代码注入到root进程。
- Dirty Cred(CVE-2022-2588):3.17 <= Linux kernel <= 5.19.1,该漏洞是netlink协议中的CLS_ROUTE4模块中的route4_change函数中的UAF/double free漏洞。使用漏洞作者的dirty cred方法可以完成不依赖内核版本(特定地址)的本地提权。和之前的dirty pipe 系列利用方法一样,实现无地址依赖的本地提权攻击。
- Linux Polkit、pkexec(CVE-2021-4034):2009年5月至今发布的大多数 Polkit 版本,pkexec是一个Linux下的setuid工具,允许授权用户在预定的策略下以其他用户身份执行命令。 由于当前版本的pkexec无法正确处理调用参数计数,并最终会尝试将环境变量作为命令执行。
除了这个常用的,还可以使用searchsploit搜索看看
searchsploit Linux Kernel 2.6.22
密码复用
通过当前权限拿到的一些密码,可能就是root的密码,可以试试碰碰运气。
sudo滥用
可以通过 sudo -l
查看哪些账号有sudo权限,权限范围是哪些,再看能不能拿下这些账号,通过权限范围允许的工具进行提权。
感觉有点鸡肋,如果拿到的账号sudo权限是ALL,那不就和root一样了吗?
部分权限工具如wget
、git
啥的可以参考 Linux提权——SUDO
SUID提权
suid(set uid)是linux中的一种特殊权限,suid可以让调用者以文件拥有者身份运行该文件,所以利用suid提权的核心就是运行root用户所拥有的suid的文件,那么运行该文件的时候就得获得root用户的身份了。
寻找suid权限的文件(具有suid权限的文件在ls -la
时会多一个 s
字段如 -rwsr-xr-x
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -print 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
再根据找到的具有suid权限的文件去网上找怎么提权,不过我测试下来很多有suid权限能进去shell,但权限上不去,可能是我操作不对?
假设我发现 /usr/bin/find
存在suid权限,那么我执行如下操作就直接是以root身份去执行的:
find ./ -exec whoami \;
如在SUID找到对应的应用后,要想确认是否可以提权,以及如何操作,可参考 GTFOBins
扩展: 如何设置suid
chmod u+s filename #设置suid
chmod u-s filename #去除suid
第三方服务提权
这个和windows一样了,看上面运行了哪些服务,如 Redis、Mysql 这类的,再去拿下这个应用的权限执行shell
配置错误提权
这里只是做一个简单的示例,来抛砖引玉。
如果管理员配置存在问题,比如给计划任务、运行脚本等文件权限配置为了 777,那么我们就可以用低权限去编辑
# 2346在最后一位表示有写权限
find ./ -type f -exec stat -c "%a %n" {} + | grep -E "[2367]\s"
find /etc/cron* -type f -exec stat -c "%a %n" {} + | grep -E "[2367]\s"
等下次对应的东西运行的时候就可以提权了