介绍
提权没有通杀漏洞,提权是否能成功很大程度上取决于目标系统的具体配置。内核版本,安装的应用程序,支持的编程语言,用户设置的密码。
什么是提权?
提权意味着什么。?
权限提升通常涉及从较低权限的账户到较高权限的账户。从技术上来讲,他利用程序中的漏洞,设计缺陷,或者配置疏忽来或获得对被限制用户资源的未授权访问。
为什么重要?
在渗透测试过程中能直接获得管理员权限的情况是十分少见的,权限提升至关重要,因为他可以让你获得管理员级别的访问权限,从而可以执行以下操作:
hostname
**hostname**
命令会返回主机名,虽然hostname可以被轻易修改,而且大部分时候是没什么意义(比如:Ubuntu-3487340239),但是有些时候 hostname 可以提供一些主机的角色信息(比如:SQL-PROD-01 for a production SQL server)
uname -a
uname -a
会打印系统信息,为我们提供有关系统使用的内核的详细信息。这在搜索内核提权漏洞时非常有用
/proc/version
进程文件系统提供了系统目标进程的信息,查看/proc/version 可以提供内核版本和一些其他信息(比如是否安装gcc)
/etc/issue
系统也可以通过查看/etc/issue文件来识别,虽然该文件可以被轻松更改。
ps
ps 命令用来查看Linux系统上正在运行的进程,在终端输入 ps(Process Status) 将显示当前shell的进程
ps命令会显示以下内容:
- PID:进程ID(进程的唯一编号)
- TTY:用户使用的终端类型
- Time:进程使用CPU的时间量(不是运行时间)
- CMD:正在运行的命令或可执行文件(不会显示任何命令行参数)
ps 提供了一些有用的参数:
ps -A
:查看所有运行的进程ps axjf
查看所有进程树ps aux
:aux 选项将显示所有用户的进程 (a),显示启动进程的用户 (u),并显示未连接到终端的进程 (x)。查看 ps aux 命令输出,我们可以更好地了解系统和潜在的漏洞
env
env 命令会显示环境变量
PATH变量可能包含一些编译器或者脚本解释器(比如python),我们可以用来运行代码,或者用于权限提升
sudo -l
目标系统可能会配置一些允许用户以root权限运行的命令,sudo -l 命令可以列出用户可以使用sudo 运行的所有命令
ls -la
ls是linux上最常用的命令之一,当我们在寻找潜在的提权向量时,请始终使用带有 -la 参数的ls命令,以防止遗漏一些隐藏文件
id
id 命令会列出当前用户的权限和用户组 信息。
id 同样也可以查看其他用户的权限和用户组: id [username]
/etc/passwd
读取 /etc/passwd 可以发现系统用户
下列命令可以单独列出用户名,以便生成用于暴力破解的user.txt
cat /etc/passwd | cut -d ":" -f 1
命令会返回所有用户,其中包含系统服务用户(一般没啥用)。另一种方法是用grep 查找带 /home 的用户,因为真实的用户很有可能把他们的文件夹放 /home 目录下
cat /etc/passwd | grep home
history
使用 history 查看较早的命令可以让我们对目标系统有所了解,并且虽然很少,但有可能已经存储了密码或用户名等信息。
ifconfig
目标系统可能是另一个网络的枢纽点。 ifconfig 命令将为我们提供有关系统网络接口的信息。
这可以使用ip route
命令来确认,以查看存在哪些网络路由。
netstat
在查看完 网卡和路由以后,我们可以查看存在的网络连接,netstat 可以和几个参数一起使用,以收集现有的网络连接信息
- netstat -a:显示所有监听端口和已建立的连接。
- netstat -at 或 netstat -au 也可用于分别列出 TCP 或 UDP 协议。
netstat -l:以“监听”模式列出端口。这些端口已打开并准备好接受传入连接。这可以与“t”选项一起使用,以仅列出使用 TCP 协议侦听的端口
netstat -s:按协议列出网络使用统计信息(如下)这也可以与 -t 或 -u 选项一起使用,以将输出限制为特定协议。
- netstat -tp:用服务名和PID信息列出连接。
- netstat -i:显示接口统计信息。
在一些博客或课程里最常看到的用法可能是netstat -ano
- -a:显示所有socket
- -n:不解析名称
- -o:显示计时器
find
在目标系统中搜索重要信息和潜在的权限提升向量可能会很有成效。内置的“find”命令很有用。
- find . -name flag1.txt: 当前目录下查找 flag1.txt
- find /home -name flag1.txt: 在/home 目录下查找名为flag1.txt 的文件
- find / -type d -name config: /目录下名字为 config 的目录
- find / -type f -perm 0777: 查找权限为777 的文件(所有用户,可读,可写,可执行)
- find / -perm a=x:查找可执行文件
- find /home -user frank: 在/home 目录下查找属于frank 用户的文件
- find / -mtime 10: 在/ 下查找过去十天内修改过的文件
- find / -atime 10: 查找过去 10 天内访问过的文件
- find / -cmin -60: 查找在过去一小时(60 分钟)内更改的文件
find / -amin -60: 查找最近一小时(60 分钟)内的文件访问
find / -size 50M: 文件大小为50M 的文件
此命令还可以与 (+) 和 (-) 符号一起使用,以指定大于或小于给定大小的文件。比如 find / -size +100M
重要的是要注意“查找”命令往往会产生错误,这有时会使输出难以阅读。这就是为什么明智的做法是使用带有“-type f 2>/dev/null
”的“find”命令将错误重定向到“/dev/null
”并获得更清晰的输出
查找 可以写入或执行的文件
- find / -writable -type d 2>/dev/null : 查找全局可写目录
- find / -perm -222 -type d 2>/dev/null: Find world-writeable folder
- find / -perm -o w -type d 2>/dev/null: Find world-writeable folders
- find / -perm -o x -type d 2>/dev/null : 查找可执行的目录
查找开发工具和支持的语言
- find / -name perl*
- find / -name python*
- find / -name gcc
查找特定权限文件
SUID 位文件可以让文件以账户权限级别运行,而不是账户运行文件**find / -perm -u=s -type f 2>/dev/null**
:查找带有SUID位的文件,可以让我们以高于当前用户的权限运行文件
其他linux命令
其他一些很有用的命令 比如,find,locate,grep,cut,sort 等等。
自动枚举工具
有几个工具可以帮助您在枚举过程中节省时间。这些工具应该只用于节省时间,因为它们可能会错过一些特权升级向量。以下是流行的 Linux 枚举工具列表,其中包含指向其各自 Github 存储库的链接
目标系统的环境将影响您将能够使用的工具。例如,如果目标系统上未安装用 Python 编写的工具,您将无法运行它。这就是为什么最好熟悉一些而不是拥有一个单一的首选工具。
- LinPeas: https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
- LinEnum: https://github.com/rebootuser/LinEnum
- LES (Linux Exploit Suggester): https://github.com/mzet-/linux-exploit-suggester
- Linux Smart Enumeration: https://github.com/diego-treitos/linux-smart-enumeration
- Linux Priv Checker: https://github.com/linted/linuxprivchecker
内核提权
概述
权限提升最理想的情况是提升到root权限,有时候可以通过利用简单的现有漏洞来实现,或者在某些情况下访问另一个有更高权限,更多信息的用户,来获得其他的提权向量来实现最终目的
除了是像内核漏洞这样单个漏洞导致root shell,其他的权限提升过程都依赖于错误配置和宽松的权限
Linux 系统上的内核管理各个组件之间的通信,例如系统上的内存和应用程序。这个关键功能需要内核有特定的权限;因此,成功的漏洞利用可能会导致获得 root 权限。
内核漏洞利用方法很简单:
- 识别内核版本
- 查找目标系统内核版本存在的漏洞利用exp
- 运行EXP
虽然看起来很简单,但是失败的内核漏洞利用可能会导致系统奔溃,在尝试内核漏洞利用以前,请确保在您的渗透测试协议中,系统奔溃是否可以接受。
EXP 查找:
- 根据你搜集到的信息使用google 搜索现有漏洞 exploit code(eg. xxx kernel privilege escalation)
- https://www.linuxkernelcves.com/cves 也很有用。
- 另一种选择是使用像 LES(Linux Exploit Suggester)这样的脚本,但请记住,这些工具可能会生成错误的积极(报告的漏洞并不对目标系统造成影响)或错误的消极(系统内核存在漏洞,但是并没有报告)。
hints
- 在 Google、Exploit-db 或 searchsploit 上搜索具体的内核版本漏洞
- 确保在运行之前了解漏洞利用代码的工作原理。一些漏洞利用代码可以对操作系统进行更改,使其在进一步使用时不安全,或者对系统进行不可逆转的更改,从而在以后产生隐患。当然,在实验室或 CTF 环境中,这些可能不是什么大问题,但在真正的渗透测试参与中,这些绝对是禁忌。
- 一些漏洞一旦运行可能需要进一步的交互。阅读随漏洞利用代码提供的所有注释和说明。
- 您可以分别使用
python2 -m SimpleHTTPServer
/python3 -m httpserver
模块和wget /curl
将漏洞利用代码从您的机器传输到目标系统。SUDO 提权
概述
sudo 命令允许用户以root权限运行程序,某些情况下,系统管理员可能需要在用户的权限上给予一定灵活性。
比如soc 分析人员需要以root权限使用namp,但是不能给他root权限账户,这种情况下系统管理员可以允许该用户仅以root权限运行namp,但是其他部分保持其常规权限级别。
任何用户都能用sudo -l 命令来检查当前与root权限相关的程序
https://gtfobins.github.io/ :gtfobins 可以查看拥有sudo 权限的程序的信息。
SUID 提权
Linux权限控制依赖于控制用户与文件的交互。文件可以具有读取,写入,执行的权限,这些是在用户权限内分配的,这些改变会随着SUID和SGID的改变,suid和sgid 允许文件分别以文件所有者或组所有者的权限级别执行
SUID 的概念比较晦涩难懂,举个例子就明白了,以常用的 passwd 命令为例,修改用户密码是需要 root 权限的,但普通用户却可以通过这个命令来修改密码,这就是因为 /bin/passwd 被设置了 SUID 标识,所以普通用户执行 passwd 命令时,进程的 owner 就是 passwd 的所有者,也就是 root 用户。
[
](https://blog.csdn.net/alex_yangchuansheng/article/details/102830246)
这些文件设置了一个s位来显示他们的特权级别
find / -type f -perm -04000 -ls 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
列出设置了SUID 或SGID 位的文件
一个好的做法是将此列表中的可执行文件与 GTFOBins (https://gtfobins.github.io)) 进行比较。https://gtfobins.github.io/#+suid
Capabilities
为了对 root 权限进行更细粒度的控制,实现按需授权,Linux 引入了另一种机制叫 capabilities
Capabilities 机制是在 Linux 内核 2.2 之后引入的,原理很简单,就是将之前与超级用户 root(UID=0)关联的特权细分为不同的功能组,Capabilites 作为线程(Linux 并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。
这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是 root,就去检查其是否具有该特权操作所对应的 capabilities,并以此为依据,决定是否可以执行特权操作。
Capabilities 可以在进程执行时赋予,也可以直接从父进程继承。
如果 SOC 分析师需要使用需要启动socket连接的工具,普通用户没有这种权限。如果系统管理员不想给这个用户更高的权限,他们可以改变二进制文件的Capabilities。结果,二进制文件无需更高权限的用户即可完成其任务。
我们可以使用 getcap 工具列出启用的Capabilities。<br />
getcap -r / 2>/dev/null`
如果我们找到任何设置的功能,GTFObins 有一个很好的二进制文件列表,可以用来提升权限。
[
](https://blog.csdn.net/alex_yangchuansheng/article/details/102830246)
计划任务
cron jobs用于在特定时间运行脚本或二进制文件。默认情况下,它们以其所有者而不是当前用户的权限运行。虽然正确配置的 cron 作业本身并不容易受到攻击,但它们可以在某些情况下提供权限提升向量
如果有一个以 root 权限运行的计划任务,我们可以更改将要运行的脚本,那么我们的脚本将以 root 权限运行.
Cron job配置存储为 crontab(cron 表),可以看到下一次运行时间和日期
系统上的每个用户都有他们的 crontab 文件,并且无论他们是否登录都可以运行特定的任务。
我们的目标是找到一个由 root 账户设置的 cron job并让它运行我们的脚本,最好是一个 shell
任何用户都可以读取 **/etc/crontab**
corntab -l
cat /etc/crontab
虽然 CTF 机器可以每分钟或每 5 分钟运行一次 cron 作业,但在渗透测试活动中,您会更经常地看到每天、每周或每月运行的任务
Crontab 总是值得检查的,因为它有时会导致简单的权限提升向量。在没有一定网络安全成熟度级别的公司中,以下情况并不少见:
- 系统管理员需要定期运行脚本。
- 他们创建了一个 cron job来执行此操作
- 一段时间后,脚本变得无用,他们将其删除
- 他们不清理相关的 cron job
环境变量
如果您的用户具有写入权限的文件夹位于path中,您可以劫持应用程序以运行脚本。 Linux 中的 PATH 是一个环境变量,它告诉操作系统在哪里搜索可执行文件。对于任何未内置于 shell 或未使用绝对路径定义的命令,Linux 将开始在 PATH 下定义的文件夹中进行搜索。 (PATH是这里所说的环境变量,path是文件的位置)
如果我们在命令行中输入“thm”,Linux 将在这些位置查找名为 thm 的可执行文件。
- 哪些文件夹位于 $PATH 下
- 您当前的用户是否对这些文件夹中的任何一个具有写入权限?
- 你能修改 $PATH 吗?
- 是否有可以启动的脚本/应用程序会受此漏洞影响?
搜索可写文件夹 find / -writable 2>/dev/null
去掉
在path中添加tmp目录 export PATH=/tmp:$PATH
NFS
特权升级向量并不局限于内部访问。共享文件夹和远程管理界面(如 SSH 和 Telnet)也可以帮助您获得目标系统的 root 访问权限。某些情况还需要同时使用这两个向量,例如在目标系统上找到一个 root SSH 私钥并通过 SSH 以 root 权限进行连接,而不是尝试提高当前用户的权限级别。
另一个与 CTF 和考试更相关的向量是配置错误的网络shell。当存在网络备份系统时,有时可以在渗透测试期间看到此向量。
NFS(网络文件共享)配置保存在 /etc/exports 文件中。此文件是在 NFS 服务器安装期间创建的,通常可供用户读取。
此权限提升向量的关键元素是您可以在上面看到的“no_root_squash”选项。默认情况下,NFS 会将 root 用户更改为 nfsnobody 并剥夺任何文件以 root 权限操作。如果可写共享上存在“no_root_squash”选项,我们可以创建一个设置了 SUID 位的可执行文件并在目标系统上运行它。
此权限提升向量的关键元素是您可以在上面看到的“no_root_squash”选项。默认情况下,NFS 会将 root 用户更改为 nfsnobody 并剥夺任何文件以 root 权限操作。如果可写共享上存在“no_root_squash”选项,我们可以创建一个设置了 SUID 位的可执行文件并在目标系统上运行它。
我们将从枚举攻击机器的可挂载共享开始。
请注意,nfs 可执行文件在目标系统上设置了 SUID 位,并以 root 权限运行。