68747470733a2f2f7062732e7477696d672e636f6d2f6d656469612f44415a73453256555141415f62705a2e6a7067.jpg

介绍

提权没有通杀漏洞,提权是否能成功很大程度上取决于目标系统的具体配置。内核版本,安装的应用程序,支持的编程语言,用户设置的密码。

什么是提权?

提权意味着什么。?

权限提升通常涉及从较低权限的账户到较高权限的账户。从技术上来讲,他利用程序中的漏洞,设计缺陷,或者配置疏忽来或获得对被限制用户资源的未授权访问。

为什么重要?

在渗透测试过程中能直接获得管理员权限的情况是十分少见的,权限提升至关重要,因为他可以让你获得管理员级别的访问权限,从而可以执行以下操作:

  • 重置密码
  • 绕过访问控制,破坏受保护的数据
  • 修改应用配置
  • 持久化
  • 改变用户(新建or已经存在的用户)权限
  • 以管理员权限执行命令

    枚举

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

  1. cat /etc/passwd | cut -d ":" -f 1

命令会返回所有用户,其中包含系统服务用户(一般没啥用)。另一种方法是用grep 查找带 /home 的用户,因为真实的用户很有可能把他们的文件夹放 /home 目录下

  1. 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 编写的工具,您将无法运行它。这就是为什么最好熟悉一些而不是拥有一个单一的首选工具。

内核提权

概述

权限提升最理想的情况是提升到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

  1. 在 Google、Exploit-db 或 searchsploit 上搜索具体的内核版本漏洞
  2. 确保在运行之前了解漏洞利用代码的工作原理。一些漏洞利用代码可以对操作系统进行更改,使其在进一步使用时不安全,或者对系统进行不可逆转的更改,从而在以后产生隐患。当然,在实验室或 CTF 环境中,这些可能不是什么大问题,但在真正的渗透测试参与中,这些绝对是禁忌。
  3. 一些漏洞一旦运行可能需要进一步的交互。阅读随漏洞利用代码提供的所有注释和说明。
  4. 您可以分别使用 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位来显示他们的特权级别

  1. find / -type f -perm -04000 -ls 2>/dev/null
  2. 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`
image.png

如果我们找到任何设置的功能,GTFObins 有一个很好的二进制文件列表,可以用来提升权限。
image.png
[

](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**

  1. corntab -l
  2. cat /etc/crontab


虽然 CTF 机器可以每分钟或每 5 分钟运行一次 cron 作业,但在渗透测试活动中,您会更经常地看到每天、每周或每月运行的任务

image.png

Crontab 总是值得检查的,因为它有时会导致简单的权限提升向量。在没有一定网络安全成熟度级别的公司中,以下情况并不少见:

  1. 系统管理员需要定期运行脚本。
  2. 他们创建了一个 cron job来执行此操作
  3. 一段时间后,脚本变得无用,他们将其删除
  4. 他们不清理相关的 cron job

这个变更管理问题导致了利用 cron 作业的潜在漏洞

环境变量

如果您的用户具有写入权限的文件夹位于path中,您可以劫持应用程序以运行脚本。 Linux 中的 PATH 是一个环境变量,它告诉操作系统在哪里搜索可执行文件。对于任何未内置于 shell 或未使用绝对路径定义的命令,Linux 将开始在 PATH 下定义的文件夹中进行搜索。 (PATH是这里所说的环境变量,path是文件的位置)

image.png

如果我们在命令行中输入“thm”,Linux 将在这些位置查找名为 thm 的可执行文件。

  1. 哪些文件夹位于 $PATH 下
  2. 您当前的用户是否对这些文件夹中的任何一个具有写入权限?
  3. 你能修改 $PATH 吗?
  4. 是否有可以启动的脚本/应用程序会受此漏洞影响?

搜索可写文件夹 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 服务器安装期间创建的,通常可供用户读取。
image.png

此权限提升向量的关键元素是您可以在上面看到的“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 权限运行。