环境枚举

枚举是提升权限的关键。存在一些辅助脚本(如 LinPEAS 和 LinEnum)来协助进行枚举。然而,理解要查找哪些信息以及能够手动执行枚举也同样重要。当你获得对主机的初始 shell 访问权限时,检查几个关键细节非常重要。

OS Version : 了解发行版(Ubuntu、Debian、FreeBSD、Fedora、SUSE、Red Hat、CentOS 等)将让你知道可能可用的工具类型。这也会识别操作系统版本,可能存在公开的漏洞。

Kernel Version : 与操作系统版本类似,可能存在针对特定内核版本漏洞的公开利用。内核漏洞可能导致系统不稳定甚至完全崩溃。在运行这些利用程序时,请务必小心,并在运行前充分理解该利用程序及其可能产生的后果。

Running Services : 了解主机上运行的服务非常重要,尤其是以 root 身份运行的服务。一个配置错误或易受攻击的服务以 root 身份运行,可能会成为权限提升的轻松目标。在许多常见服务(如 Nagios、Exim、Samba、ProFTPd 等)中发现了漏洞。其中许多服务都有公开的利用 PoC,例如 CVE-2016-9566,这是 Nagios Core < 4.2.4 中的一个本地权限提升漏洞。

获取基本信息

假设我们在一次外部渗透测试中通过利用一个无限制文件上传漏洞刚刚获得了一个 Linux 主机的访问权限。在建立反向 shell(理想情况下还有一些持久化措施)之后,我们应该首先收集一些关于我们所工作的系统的基本信息。

  • whoami - 我们以哪个用户身份运行
  • id - 我们的用户属于哪些组?
  • hostname - 服务器名称是什么,从命名规则中能收集到什么信息?
  • ifconfigip a - 我们进入了哪个子网,主机是否在其他子网中有额外的网卡?
  • sudo -l - 我们的用户是否可以无密码使用 sudo 运行任何命令(以另一个用户身份作为 root)?这有时可能是最简单的突破口,我们可以做类似 sudo su 的事情,直接进入 root shell。

检查操作系统

1
cat /etc/os-release

我们可以看到目标正在运行 Ubuntu 20.04.4 LTS (“Focal Fossa”)。无论我们遇到哪个版本,都重要的是要看看我们是否在处理一个过时或未维护的系统。Ubuntu 发布其发布周期,从这我们可以看到 “Focal Fossa” 不会在 2030 年 4 月之前达到生命周期结束。根据这些信息,我们可以假设我们不会遇到一个众所周知的内核漏洞,因为客户一直在修补他们的面向互联网的资产,但我们仍然会检查。

查看环境变量

我们还可以查看当前用户设置的所有环境变量,我们可能会幸运地发现其中包含敏感信息,例如密码。我们会记录下来然后继续。

1
env

PATH

接下来我们将检查当前用户的 PATH 环境变量,这是 Linux 系统在每次执行命令时查找可执行文件的地方,以匹配我们输入的名称,即 id ,在这个系统中它位于 /usr/bin/id 。正如我们稍后在模块中看到的,如果目标用户的 PATH 变量配置错误,我们可能会利用它来提升权限。

1
echo $PATH

在 PATH 变量中指定的目录中创建脚本或程序,将使其在系统的任何目录中都可执行。

向用户的 PATH 中添加 . 会将他们的当前工作目录添加到列表中。例如,如果我们可以修改用户的路径,我们可以用恶意脚本(如反向 shell)替换常见的二进制文件 ls 。如果我们通过执行命令 PATH=.:$PATHexport PATH. 添加到路径中,我们就可以通过仅输入文件名来运行位于我们当前工作目录中的二进制文件(即仅输入 ls 将调用当前工作目录中的名为 ls 的恶意脚本,而不是位于 /bin/ls 的二进制文件)。

1
2
3
PATH=.:${PATH}
export PATH
echo $PATH

检查内核

1
uname -a

我们可以接下来收集有关主机本身的更多信息,例如 CPU 类型/版本:

1
lscpu 

检查shell

1
2
3
4
5
6
7
8
9
10
11
12
cat /etc/shells

# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen

检查硬件

接下来我们可以查看系统中的驱动器和任何共享。首先,我们可以使用 lsblk 命令来枚举系统上块设备的信息(硬盘、USB 驱动器、光盘等)。如果我们发现并可以挂载额外的驱动器或未挂载的文件系统,我们可能会找到敏感文件、密码或备份,这些可以用来提升权限

1
lsblk

命令 lpstat 可以用来查找系统上连接的任何打印机的信息。

我们也应该检查挂载的驱动器和未挂载的驱动器。我们能否挂载一个未挂载的驱动器并访问敏感数据

1
2
3
4
5
6
7
8
9
10
11
12
13
cat /etc/fstab

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-BdLsBLE4CvzJUgtkugkof4S0dZG7gWR8HCNOlRdLWoXVOba2tYUMzHfFQAP9ajul / ext4 defaults 0 0
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/20b1770d-a233-4780-900e-7c99bc974346 /boot ext4 defaults 0 0

检查路由

1
route

在一个域环境中,我们肯定会想要检查 /etc/resolv.conf ,如果主机配置为使用内部 DNS,我们可能能够将其作为查询 Active Directory 环境的起点。

我们还需要检查 ARP 表,看看目标主机与其他哪些主机进行了通信。

1
arp -a

检查用户与密码

1
cat /etc/passwd | cut -f1 -d:

使用 Linux,可以采用多种不同的哈希算法来使密码无法识别。通过从第一个哈希块中识别它们,可以在需要时帮助我们使用和操作它们。以下是使用最频繁的一些算法列表:

Algorithm 算法 Hash 哈希
Salted MD5 加盐 MD5
SHA-256
SHA-512
BCrypt
Scrypt
Argon2 氩 2

我们还需要检查哪些用户有登录外壳。一旦我们了解系统上的外壳,我们就可以检查每个版本是否存在漏洞。因为过时的版本,例如 Bash 版本 4.1,容易受到 shellshock 攻击。

1
grep "sh$" /etc/passwd

/etc/group 文件列出了系统上的所有组。然后我们可以使用 getent 命令列出任何有趣组的成员。

1
getent group sudo

查看组

每个 Linux 系统中的用户都被分配到一个或多个特定的组,从而获得特殊权限。例如,如果我们有一个名为 dev 仅限开发人员使用的文件夹,用户必须被分配到相应的组才能访问该文件夹。有关可用组的信息可以在 /etc/group 文件中找到,该文件显示组名和分配的用户名。

检查/home

1
ls /home

我们也可以检查 /home 目录下哪些用户有文件夹。我们需要枚举这些用户,看看是否有系统用户存储任何敏感数据、包含密码的文件。我们应该检查 .bash_history 文件等文件是否可读,是否包含任何有趣的命令,并查找配置文件。发现包含凭证的文件以访问其他系统或甚至进入 Active Directory 环境的情况并不少见。同样重要的是检查所有用户的 SSH 密钥,因为这些可能被用于在系统上实现持久化,可能用于提升权限,或协助进行越权操作和端口转发,进一步深入内部网络。至少,检查 ARP 缓存,看看正在访问哪些其他主机,并将这些与任何可用的 SSH 私钥进行交叉引用。

挂载文件系统

当文件系统被卸载时,系统将无法再访问它。这可以出于多种原因,例如磁盘被移除,或者文件系统不再需要。另一个原因可能是文件、脚本、文档和其他重要信息不能被标准用户挂载和查看。因此,如果我们能够将权限扩展到 root 用户,我们就可以自己挂载和读取这些文件系统。卸载的文件系统可以按以下方式查看:

未挂载的文件系统

1
cat /etc/fstab | grep -v "#" | column -t

隐藏文件

许多文件夹和文件在 Linux 系统中保持隐藏,这样它们就不那么显眼,并且可以防止意外编辑。至于为什么这些文件和文件夹被保持隐藏,原因比之前提到的要多得多。尽管如此,我们需要能够找到所有隐藏的文件和文件夹,因为即使我们只有只读权限,它们也经常包含敏感信息。

1
find / -type f -name ".*" -exec ls -l {} \; 2>/dev/null | grep htb-student

所有隐藏目录

1
find / -type d -name ".*" -ls 2>/dev/null

检查临时文件

三个默认文件夹用于临时文件。这些文件夹对所有用户可见并可读取。此外,临时日志或脚本输出可以存放在那里。 /tmp/var/tmp 都用于临时存储数据。然而,关键区别在于数据在这些文件系统中存储的时间长度。 /var/tmp 的数据保留时间远长于 /tmp 目录。默认情况下,存储在/var/tmp中的所有文件和数据保留时间最长可达 30 天。另一方面,在/tmp中,数据会在 10 天后自动删除。

此外,当系统重启时,存储在 /tmp 目录中的所有临时文件都会立即被删除。因此,程序使用 /var/tmp 目录来临时存储必须在重启之间保留的数据。

1
ls -l /tmp /var/tmp /dev/shm

服务与内部枚举

现在我们已经深入研究了环境,了解了基本情况,并尽可能揭示了用户和组权限与文件、脚本、二进制文件、目录等相关的信息,我们将进一步深入主机操作系统的内部。

  • 安装了哪些服务和应用程序?
  • 哪些服务正在运行?
  • 哪些套接字正在使用?
  • 系统上有哪些用户、管理员和组?
  • 当前登录的用户是谁?哪些用户最近登录了?
  • 主机上强制执行了哪些密码策略(如果有)?
  • 主机是否加入了 Active Directory 域?
  • 历史、日志和备份文件中能找到哪些有趣的信息
  • 哪些文件最近被修改过以及频率如何?文件修改中是否存在有趣的模式,可能表明使用了 cron 作业,而我们可以利用它?
  • 当前的 IP 地址信息
  • /etc/hosts 文件中有趣的东西吗?
  • 是否有任何有趣的内部网络或其他系统网络连接?
  • 系统上安装了哪些工具,我们可能能够利用它们?(Netcat, Perl, Python, Ruby, Nmap, tcpdump, gcc 等)
  • 我们能否访问 bash_history 文件,并能否从他们的记录的命令行历史中发现任何有趣的东西,比如密码?
  • 系统上是否运行着任何 Cron 任务,我们可能能够劫持?

    服务

    已安装软件包

1
apt list --installed | tr "/" " " | cut -d" " -f1,3 | sed 's/[0-9]://g' | tee -a installed_pkgs.list

Sudo版本

检查系统上安装的 sudo 版本是否容易受到任何旧版或新版漏洞的攻击也是一个好主意。

1
sudo -V

可执行文件

1
ls -l /bin /usr/bin/ /usr/sbin/

凭证搜寻

在枚举系统时,重要的是记录任何凭证。这些凭证可能存在于配置文件( .conf.config.xml 等)、shell 脚本、用户的 bash 历史文件、备份( .bak )文件、数据库文件中,甚至可能存在于文本文件中。凭证可用于提升到其他用户甚至 root 权限,访问环境中的数据库和其他系统。

/var 目录通常包含主机上运行的任何 Web 服务器的 Web 根目录。Web 根目录可能包含数据库凭证或其他类型的凭证,这些凭证可用于进一步访问。一个常见的例子是在 WordPress 配置文件中包含的 MySQL 数据库凭证:

1
2
3
4
grep 'DB_USER\|DB_PASSWORD' wp-config.php

define( 'DB_USER', 'wordpressuser' );
define( 'DB_PASSWORD', 'WPadmin123!' );

如果可访问,spool 或邮件目录也可能包含有价值的信息甚至凭证。通常会在 Web 根目录中的文件中找到凭证(即 MySQL 连接字符串、WordPress 配置文件)。

1
find / ! -path "*/proc/*" -iname "*config*" -type f 2>/dev/null

SSH 密钥

1
ls ~/.ssh

文件检查

可以使用find查找可以利用的文件

  • 常见参数
    • -type d 2>/dev/null:取消输出错误信息
    • -writable:查找有可写属性的文件
    • readable # 查找可读文件
    • executable # 查找可执行文件
    • user root # 属于root用户
    • group root # 属于root组
    • perm # 按权限查找