https://www.cnblogs.com/Hekeats-L/p/16867299.html
题目描述
难度:
描述:
前置条件:
权限提升是一个旅程。没有灵丹妙药,很大程度上取决于目标系统的具体配置。内核版本、安装的应用程序、支持的编程语言、其他用户的密码是影响您通往 root shell 之路的几个关键因素。
此房间旨在涵盖主要的权限提升向量,并让您更好地了解该过程。无论您是参加 CTF、参加认证考试还是担任渗透测试人员,这项新技能都将成为您武器库的重要组成部分。
“权限提升”是什么意思?
从本质上讲,权限提升通常涉及从较低权限的帐户转到较高权限的帐户。从技术上讲,它是利用操作系统或应用程序中的漏洞、设计缺陷或配置疏忽,以未经授权访问通常限制用户访问的资源。
为什么它很重要?
在执行实际渗透测试时,很少能够获得提供直接管理访问权限的立足点 (初始访问权限)。权限提升至关重要,因为它允许您获得系统管理员级别的访问权限,从而允许您执行以下操作:
重置密码
绕过访问控制以破坏受保护的数据
编辑软件配置
启用持久性
更改现有(或新)用户的权限
枚举是访问任何系统后必须采取的第一步。您可能通过利用导致 root 级访问的关键漏洞访问了系统,或者只是找到了一种使用低权限帐户发送命令的方法。与 CTF 计算机不同,渗透测试活动不会在您获得特定系统或用户权限级别的访问权限后结束。正如您将看到的,枚举在妥协后阶段与以前一样重要。
1 | hostname |
该 命令将返回目标计算机的主机名。尽管此值可以很容易地更改或具有相对无意义的字符串(例如 Ubuntu-3487340239),但在某些情况下,它可以提供有关目标系统在公司网络中的角色的信息(例如,SQL-PROD-01 用于生产 SQL Server)。
uname -a
将打印系统信息,为我们提供有关系统使用的内核的更多详细信息。这在搜索任何可能导致权限提升的潜在内核漏洞时非常有用。
cat /etc/os-release
/proc/version
proc 文件系统 (procfs) 提供有关目标系统进程的信息。您会在许多不同的 Linux 版本上找到 proc,使其成为您武器库中必不可少的工具。
查看 可能会为您提供有关内核版本和其他数据的信息,例如是否安装了编译器(例如 GCC)。
/etc/issue
还可以通过查看文件来识别系统 。此文件通常包含有关操作系统的一些信息,但可以很容易地进行自定义或更改。在主题上,可以自定义或更改任何包含系统信息的文件。为了更清楚地了解该系统,查看所有这些总是好的ps
命令 是查看 Linux 系统上正在运行的进程的有效方法。 在终端上键入将显示当前 壳
(Process Status) 的输出将显示以下内容;ps
- PID:进程 ID(对进程唯一)
- TTY:用户使用的终端类型
- 时间:进程使用的 CPU 时间量(这不是此进程的运行时间)
- CMD:正在运行的命令或可执行文件(不会显示任何命令行参数)
“ps” 命令提供了一些有用的选项。
ps -A
:查看所有正在运行的进程ps axjf
:查看进程树(请参阅下面的树形成,直到运行)ps axjf
ps aux
:该选项将显示所有用户的进程 (a),显示启动进程的用户 (u),并显示未附加到终端的进程 (x)。查看 ps aux 命令输出,我们可以更好地了解系统和潜在漏洞。aux
env
PATH 变量可能具有编译器或脚本语言(例如 Python),可用于在目标系统上运行代码或用于权限提升
sudo -l
目标系统可以配置为允许用户使用 root 权限运行某些(或全部)命令。该 命令可用于列出您的用户可以使用 运行的所有命令。
ifconfig
history
netstat
netstat -a
:显示 所有侦听端口和已建立的连接。netstat -at
或者也可以用来列出 TCP 或 UDP 协议 分别。netstat -au
netstat -l
:列表 端口处于 “侦听” 模式。这些端口已打开并准备好 接受传入连接。这可以与 “t” 选项一起使用 仅列出正在使用 TCP 协议侦听的端口(如下)
find 命令
在目标系统中搜索重要信息,以及 潜在的权限提升向量可能是有益的。内置的 “find” 命令很有用,值得保存在您的武器库中。
以下是 “find” 命令的一些有用示例。
查找文件:
find . -name flag1.txt
:flag1.txt在 当前目录find /home -name flag1.txt
:flag1.txt在 /home 目录find / -type d -name config
:在 “/” 下找到名为 config 的目录find / -type f -perm 0777
:查找具有 777 权限的文件 (所有用户都可以读取、可写和执行文件)find / -perm a=x
:查找可执行文件find /home -user frank
:在 “/home”find / -mtime 10
:查找最近 10 个中修改的文件 日find / -atime 10
:查找最近 10 个中访问的文件 日find / -cmin -60
:查找过去一小时内更改的文件 (60 分钟)find / -amin -60
:查找过去一小时内的文件访问 (60 分钟)find / -size 50M
:查找大小为 50 MB 的文件
此命令还可以与 (+) 和 (-) 符号一起使用,以指定 大于或小于给定大小的文件。
自动枚举
有几种工具可以帮助您在枚举过程中节省时间 过程。这些工具仅用于节省时间,因为它们知道 可能会错过一些权限提升向量。以下是 流行的 Linux 枚举工具及其各自 Github 的链接 存储 库。
目标系统的环境将影响您将要创建的工具 能够使用。例如,您将无法运行工具 如果目标系统上未安装 Python 编写。这 这就是为什么最好熟悉一些而不是 拥有单一的必备工具。
- 林豌豆: 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 智能枚举:https://github.com/diego-treitos/linux-smart-enumeration
- Linux Priv Checker: https://github.com/linted/linuxprivchecker
理想情况下,权限提升会导致 root 权限。这可以 有时只需利用现有漏洞即可实现, 或者在某些情况下,通过访问另一个具有更多 权限、信息或访问权限。
除非单个 漏洞会导致 root shell,即权限提升过程 将依赖于错误的配置和松散的权限。
Linux 系统上的内核管理组件之间的通信,例如 系统和应用程序上的内存。这个关键功能 要求内核具有特定权限;因此,成功的 利用漏洞可能会导致 root 权限。
内核漏洞 方法很简单;
- 确定 内核版本
- 搜索和查找 目标系统内核版本的漏洞利用代码
- 运行漏洞利用
虽然看起来 很简单,请记住,失败的内核漏洞利用可能会导致 系统崩溃。确保此潜在结果是可以接受的 在尝试 内核漏洞。
研究来源:
- 根据您的发现,您可以使用 Google 搜索现有的漏洞利用代码。
- https://www.cvedetails.com/ 等来源也很有用。
- 另一种选择是使用 LES (Linux Exploit Suggester) 之类的脚本,但请记住,这些工具可能会产生误报(报告不影响目标系统的内核漏洞)或漏报(尽管内核易受攻击,但不报告任何内核漏洞)。
提示/注释:
- 在 Google、Exploit-db 或 searchsploit 上搜索漏洞时,内核版本过于具体
- 在启动漏洞利用代码之前,请确保您了解它的工作原理。一些漏洞利用代码可以在操作系统上进行更改,使它们在进一步使用时不安全,或者对系统进行不可逆的更改,从而在以后产生问题。当然,在实验室或 CTF 环境中,这些可能不是很大的问题,但在真正的渗透测试参与中,这些绝对是禁忌。
- 某些漏洞利用程序在运行后可能需要进一步的交互。阅读漏洞利用代码提供的所有注释和说明。
- 您可以使用 Python 模块将漏洞利用代码从您的计算机传输到目标系统。
SimpleHTTPServer``wget
sudo
默认情况下,sudo 命令允许您使用 root 权限运行程序。在某些情况下,系统管理员可能需要为普通用户提供一些权限灵活性。例如,初级 SOC 分析师可能需要定期使用 Nmap,但无法获得完全 root 访问权限。在这种情况下,系统管理员可以允许该用户仅以 root 权限运行 Nmap,同时在系统的其余部分保持其常规权限级别。
任何用户都可以使用该命令检查其与 root 权限相关的当前情况。sudo -l
https://gtfobins.github.io/ 是一个有价值的资源,它提供了有关如何使用您可能拥有 sudo 权限的任何程序的信息。
利用应用程序功能
在此上下文中,某些应用程序不会有已知的漏洞利用。您可能会看到这样的应用程序是 Apache2 服务器。
在这种情况下,我们可以使用 “hack” 来利用应用程序的功能来泄露信息。正如你在下面看到的,Apache2 有一个支持加载备用配置文件的选项( : 指定一个备用的 ServerConfigFile)。-f
使用此选项加载文件将导致包含文件第一行的错误消息。/etc/shadow``/etc/shadow
杆LD_PRELOAD
在某些系统上,您可能会看到 LD_PRELOAD environment (环境) 选项。
D_PRELOAD 是一个允许任何程序使用共享库的函数。这篇博文将让您了解 LD_PRELOAD 的功能。如果启用了 “env_keep” 选项,我们可以生成一个共享库,该库将在程序运行之前加载和执行。请注意,如果真实用户 ID 与有效用户 ID 不同,LD_PRELOAD选项将被忽略。
此权限提升向量的步骤可以总结如下;
- 检查LD_PRELOAD(使用 env_keep 选项)
- 编写编译为共享对象(.so 扩展名)文件的简单 C 代码
- 使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD 选项运行程序
C 代码将简单地生成一个根 shell,并且可以按如下方式编写;
1 | #include <stdio.h> |
我们可以将此代码保存为 shell.c,并使用以下参数使用 gcc 将其编译成共享对象文件;
1 | gcc -fPIC -shared -o shell.so shell.c -nostartfiles |
现在,我们可以在启动用户可以使用 sudo 运行的任何程序时使用此共享对象文件。在我们的例子中,可以使用 Apache2、find 或几乎所有我们可以使用 sudo 运行的程序。
我们需要通过指定 LD_PRELOAD 选项来运行程序,如下所示;
1 | sudo LD_PRELOAD=/home/user/ldpreload/shell.so find |
这将导致生成具有 root 权限的 shell。