前言
在做测试的过程中,拿到的shell通常都是低权限的。如果想要进一步得进行操作,不可避免得要进行提权操作,将shell权限提升至root。本篇文章总结了在linux上常见的提权方式以及如何去检测提权。
文章中可能会出现一些错误,欢迎各位大佬指正,感激不尽。如果有什么好的想法也欢迎交流~~
linux提权常用方法
linux提权大致可以分为下面的几种方式,我们最常见的应该就是内核提权。
在进行linux提权时,一般都要先进行信息收集,包括linux的内核版本,运行的应用,文件等信息,然后根据收集到的信息,选择适当的方式进行提权操作。
下面再来看看具体每种方式如何去利用
内核提权
内核漏洞是我们最先想到的提权方法,也是最常用的方式。如果机器的内核存在提权漏洞,那么可以通过内核漏洞进行一键提权。
需要注意的是内核漏洞一般利用的溢出,条件竞争等方式,在使用的过程中,有一定的几率使机器宕机。要选择那种成功率高危害性小的漏洞进行利用。
下面以自己搭建的虚拟机为例,来演示如何利用内核漏洞提权。
1)收集信息
查看内核版本:uname -r
查看发行版本:cat /etc/issue cat /etc/*-release
查看目前权限和用户:whoami id
得到信息:内核版本:2.6.32-431.el6 cpu架构(x86_64) 发行版:rehad 6.5
2)查找内核是否存在提权漏洞
查找内核漏洞可以通过各种公开的漏洞库进行查找,在kail中可以通过searchsploit命令来查找是否存在相关的漏洞。
searchsploit linux 2.6.32-431.el6
本次利用选择的是CVE-2016-5195(脏牛漏洞)
(Linux kernel>2.6.22 (released in 2007))
在网上下载相应的exp下,上传到服务器然后执行即可得到管理员权限。(注意提权以后原来的root用户可能不能正常登陆)
直接添加了一个新的用户。
系统应用漏洞提权
除了利用内核提权以外,还可以利用系统上的应用进行提权,如2021年报出来的polkit漏洞。
查看polkit是否在漏洞影响版本内
执行脚本,提升到root权限
通过获取ssh私钥或者写入ssh公钥提权
如果系统用户配置了ssh免密登录并且该用户的家目录设置为其它用户可访问,那么可以通过获取目标系统的ssh私钥或者写入公钥,达到通过ssh登录系统的目的。
拿到shell后,检查那些用户的家目录是可以被访问的,如果可以被访问,看有没有.ssh的隐藏目录。如果有的话,获取id_rsa文件。还可以将自己公钥写入到这个id_ras的文件中。
ssh秘钥所在的位置:~/.ssh/
如下:
首先检查存在bash的用户:cat /etc/passwd |grep bash
检查这些用户的家目录是否可以访问:cd /home/user1/
如何存在ssh私钥文件,则可以将其复制下来
复制 id_rsa的内容,设置权限:chmod 600 id_rsa。然后尝试登录目标:ssh -i id_rsa user1@ip
明文密码提权
查看当前用户对passwd和shadow文件的权限。一般分为下面的两种:
1)如果这两个文件可写,可以写入一个已经知道的hash值
2)如果两个文件可读,利用hash、john等对其进行爆破
密码复用
如果管理员的安全意识比较低,可能会出现密码复用的情况。可以查看系统上web,数据库等应用的配置文件去查找密码,有可能也就是root的密码。
计划任务提权
非 root 权限的用户是不可以列出 root 用户的计划任务的。但是 /etc/ 内系统的计划任务可以被列出,并且默认这些程序以 root 权限执行。
如果计划任务执行了某个脚本,幸运的是这个脚本,当前用户可写。那么可以通过修改该脚本去创建一个root权限的bash文件。如写入下面的内容:
import os os.system('cp /bin/sh /tmp/sh') os.system('chmod u+s /tmp/sh')
SUID提权
SUID是一种特殊的文件属性,它允许用户执行的文件以该文件的拥有者的身份运行,比如passwd命令,就是以root权限运行来修改shadow的。可以通过这种类型的文件来进行提权。
通过下面的命令查找具有SUID属性的文件
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} ;
具有SUID权限的文件,一般有三种利用方式:程序具有交互功能,劫持环境变量,修改SUID文件内容
1)借助程序功能
nmap就曾出现过提权漏洞。低权用户通过打开nmap交互模式以root执行任意系统命令。
2)劫持环境变量
如果发现带有suid的程序使用了system函数,可以采用劫持环境变量的方式,system函数是继承环境变量的,因此我们通过替换环境变量可以达到执行任意命令的效果。
如下面的文件suid-exp,该代码中使用了system函数cat。
#include<stdlib.h>
#include <unistd.h>
int main()
{
setuid(0);//run as root
system("id");
system("cat /etc/shadow");
}
系统在查找命令的时候,是根据环境变量来查找的
如果我们设置一个同名的cat文件,并把该文件放到路径的最前方,那么程序就会先执行我们设置的命令,这就是劫持环境变量
cat >> /tmp/cat <<EOF
#!/usr/bin/python
print "this is not the true cat"
print "here is a root shell!"
import pty;pty.spawn("/bin/sh")
EOF
将上面我们创建的cat命令放到环境变量的前面
PATH=/tmp:$PATH#设置PATH,优先从/tmp查找程序
./suid-exp#执行suid程序,因为PATH被劫持,system("cat /etc/shadow");会执行我们的假cat
3)修改SUID文件
带有SUID权限的文件如果可写,可以直接修改其文件内容来获取高权限。
sudo提权
sodu 全称 Substitute User and Do,用来临时赋予root权限运行某个程序。在Linux/Unix中,/etc/sudoers文件是sudo权限的配置文件,其中储存了一些用户或组可以以root权限使用的命令。
管理可能为了方便对/etc/sudoers进行编辑成sudo免密码,此时可以直接修改sudoers,赋予用户sudo权限
vim /etc/sudoers;添加:test ALL=(ALL:ALL) NOPASSWD:ALL #test为我们的用户
另外,一些命令可以使用sudo提权到root权限,如果知道当前用户的命令也可以提升到root权限,如find命令提权
sudo find . -exec /bin/sh ; -quit
第三方服务提权
在提权时还可以利用第三方服务进行提权,如NFS,mysql等
提权漏洞的检测方式
上面说了提权的一些方式,那么如何对提权的行为进行检测呢?
可以从下面的几个方面去做
1)监控passwd和shadow文件是否出现了除root以外uid或gid为0的用户
2)监控进程权限的变动。如进程的euid为0,它的父进程euid不等于0并且父进程的pid不为0或者1,这种可以认为为提权进程,但是这种会产生很多误报,还需要根据实际情况排除掉正常的情况。
总结
本篇文件简单总结了一下linux常用的提取方式,上面的只是一部分还有很多的方式没有写出来,欢迎各位师傅来交流。
原文始发于微信公众号(疯猫网络):渗透测试之linux提权技术梳理
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论