特权升级是一段旅程。没有灵丹妙药,很大程度上取决于目标系统的具体配置。内核版本、已安装的应用程序、支持的编程语言、其他用户的密码是影响您通往 root shell 之路的几个关键因素

什么是特权升级?

其核心是,特权升级通常涉及从权限较低的帐户到权限较高的帐户。从技术上讲,它是利用操作系统或应用程序中的漏洞、设计缺陷或配置疏忽来获得对通常限制用户访问的资源的未授权访问。

它为什么如此重要?

在执行真实世界的渗透测试时,很少能够获得立足点(初始访问权限),从而为您提供直接的管理访问权限。特权升级至关重要,因为它可以让您获得系统管理员级别的访问权限,从而允许您执行以下操作:

  • 重置密码
  • 绕过访问控制以破坏受保护的数据
  • 编辑软件配置
  • 启用持久性
  • 更改现有(或新)用户的权限
  • 执行任何管理命令

枚举

一旦您获得对任何系统的访问权限,枚举是您必须采取的第一步。您可能已经通过利用导致根级别访问的严重漏洞访问了系统,或者只是找到了一种使用低特权帐户发送命令的方法。与 CTF 机器不同,渗透测试活动不会在您获得对特定系统或用户权限级别的访问权限后结束。正如您将看到的,枚举在妥协后阶段和之前一样重要

hostname
hostname命令将返回目标机器的主机名。尽管此值可以很容易地更改或具有相对无意义的字符串(例如 Ubuntu-3487340239),但在某些情况下,它可以提供有关目标系统在公司网络中的角色的信息(例如用于生产 SQL 服务器的 SQL-PROD-01)

uname -a
将打印系统信息,为我们提供有关系统使用的内核的更多详细信息。这在搜索任何可能导致特权升级的潜在内核漏洞时非常有用

/proc/version
proc 文件系统(procfs)提供有关目标系统进程的信息。您会在许多不同的 Linux 风格上找到 proc,这使它成为您武器库中必不可少的工具。

查看/proc/version可能会为您提供有关内核版本和其他数据的信息,例如是否安装了编译器(例如 GCC)

/etc/issue
也可以通过查看/etc/issue文件来识别系统。该文件通常包含有关操作系统的一些信息,但可以很容易地进行自定义或更改。在主题上,可以自定义或更改任何包含系统信息的文件。为了更清楚地了解系统,查看所有这些总是好的

ps
ps 命令是查看 Linux 系统上正在运行的进程的有效方法。在您的终端上键入ps 将显示当前 shell 的进程

(进程状态)的输出ps 将显示以下内容:

  • PID:进程ID(进程唯一)
  • TTY:用户使用的终端类型
  • TIME:进程使用的 CPU 时间量(这不是该进程运行的时间)
  • CMD:正在运行的命令或可执行文件(不会显示任何命令行参数)

“ps”命令提供了一些有用的选项。

  • ps -A: 查看所有正在运行的进程
  • ps axjf:查看进程树(见下面的树形成直到ps axjf运行)
  • ps aux:该aux 选项将显示所有用户的进程 (a),显示启动进程的用户 (u),并显示未附加到终端的进程 (x)。查看 ps aux 命令输出,我们可以更好地了解系统和潜在漏洞

env 和 export
env 命令将显示环境变量

PATH 变量可能具有编译器或脚本语言(例如 Python),可用于在目标系统上运行代码或用于特权升级

sudo -l
目标系统可以配置为允许用户以 root 权限运行一些(或所有)命令。该sudo -l 命令可用于列出您的用户可以使用运行的所有命令sudo

ls
Linux 中使用的常用命令之一可能是ls

在寻找潜在的特权升级向量时,请记住始终使用ls 带有参数的命令-la 。下面使用ls -l遗漏了隐藏文件“secret.txt”

id
该id 命令将提供用户权限级别和组成员身份的总体概览。

值得记住的是,该id 命令也可以获取其他用户的信息:

/etc/passwd
读取/etc/passwd文件是发现系统用户的一种简单方法

虽然输出可能很长而且有点吓人,但它可以很容易地被剪切并转换成一个有用的列表以用于暴力攻击

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

请记住,这将返回所有用户,其中一些是不是很有用的系统或服务用户。另一种方法可能是 grep 查找“home”,因为真实用户很可能将他们的文件夹放在“home”目录下

cat /etc/passwd | grep home

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”更活跃

netstat 您可能会在博客文章、文章和课程中最常看到的用法可以 细分netstat -ano 如下:

  • -a: 显示所有
  • -n: 不解析名称
  • -o:显示定时器

建议使用:

netstat -anpt

netstat -anpte

netstat -tunple

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 天内修改过的文件
  • find / -atime 10:查找最近 10 天内访问过的文件
  • find / -cmin -60:查找最近一小时(60 分钟)内更改的文件
  • find / -amin -60:查找最近一小时(60 分钟)内的文件访问
  • find / -size 50M:查找大小为 50 MB 的文件

此命令还可以与 (+)(-) 符号一起使用,以指定大于或小于给定大小的文件

上面的示例返回大于 100 MB 的文件。重要的是要注意“find”命令往往会产生错误,有时会使输出难以阅读。这就是为什么明智的做法是使用带有“-type f 2>/dev/null”的“find”命令将错误重定向到“/dev/null”并获得更清晰的输出(如下)

可以写入或执行的文件夹和文件:

  • find / -writable -type d 2>/dev/null:查找可写文件夹
  • find / -perm -222 -type d 2>/dev/null:查找可写文件夹
  • find / -perm -o w -type d 2>/dev/null:查找可写文件夹
  • find / -perm -o x -type d 2>/dev/null :查找可执行文件夹

查找开发工具和支持的语言:

  • find / -name perl*
  • find / -name python*
  • find / -name gcc*

查找特定文件权限:

下面是一个简短的示例,用于查找设置了 SUID 位的文件。SUID 位允许文件以拥有它的帐户的特权级别运行,而不是运行它的帐户。这允许一个有趣的权限升级路径:

  • find / -perm -u=s -type f 2>/dev/null:查找带有SUID位的文件,这样我们就可以运行比当前用户更高权限级别的文件
  • find / -perm -04000 -print 2>/dev/null: 也是查找SUID文件
  • find / -perm -04000 -print 2>/dev/null:也是查找SUID文件

通用 Linux 命令
由于我们在 Linux 领域,熟悉 Linux 命令通常会非常有用。请花一些时间熟悉find, locate, grep, cut,sort等命令

自动枚举工具

有几种工具可以帮助您在枚举过程中节省时间。这些工具应该只用于节省时间,因为它们可能会错过一些特权升级向量。下面是一个流行的 Linux 枚举工具列表,带有指向它们各自 Github 存储库的链接

目标系统的环境将影响您将能够使用的工具。例如,如果目标系统上没有安装用 Python 编写的工具,您将无法运行它。这就是为什么最好熟悉一些工具而不是拥有一个单一的首选工具