介绍
在这个实验(Lab)中,你将学习如何使用 Hydra(一款多功能的密码破解工具)对 HTTP 服务进行暴力破解攻击(brute-force attacks)。你将探索如何设置一个带有基本身份验证的 Python HTTP 服务器,并通过系统的凭据攻击来测试其安全性。
这个练习涵盖了创建密码字典(wordlists)、配置 Hydra 参数以及分析攻击结果,从而识别身份验证的弱点。这个实践环节演示了评估 Web 服务安全性以防御暴力破解尝试的关键技术。
在这个实验(Lab)中,你将学习如何使用 Hydra(一款多功能的密码破解工具)对 HTTP 服务进行暴力破解攻击(brute-force attacks)。你将探索如何设置一个带有基本身份验证的 Python HTTP 服务器,并通过系统的凭据攻击来测试其安全性。
这个练习涵盖了创建密码字典(wordlists)、配置 Hydra 参数以及分析攻击结果,从而识别身份验证的弱点。这个实践环节演示了评估 Web 服务安全性以防御暴力破解尝试的关键技术。
在这一步中,你将使用 Python 的内置模块安装一个本地 HTTP 服务器。这个服务器将模拟一个带有基本身份验证的真实 Web 服务器,我们稍后将使用它作为 Hydra 暴力破解攻击的目标。在尝试测试 Web 服务器的安全性之前,了解 Web 服务器的工作原理至关重要。
Python 的 http.server
模块提供了一种快速创建基本 Web 服务器以进行测试的方法。虽然它不适合生产环境,但它非常适合我们的实验(lab),因为它演示了 HTTP 协议的基础知识,而无需复杂的设置。默认情况下,服务器将在 8000 端口上运行。
cd ~/project
mkdir http_server
cd http_server
echo "<h1>Welcome to LabEx HTTP Server</h1>" > index.html
&
符号使其在后台运行,因此你可以继续使用终端:python3 -m http.server 8000 &
如果你想继续使用终端,请按 Enter
键。
netstat
命令显示活动的网络连接和监听端口:netstat -tulnp | grep 8000
你应该看到输出确认 Python 正在监听 8000 端口:
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 1234/python3
curl
命令检索网页以确认一切正常:curl http://localhost:8000
你应该收到你创建的 HTML 内容,证明服务器正在运行:
<h1>Welcome to LabEx HTTP Server</h1>
在基本 Web 服务器运行后,我们准备好在下一步中实现身份验证。这个基础至关重要,因为 Hydra 将与此服务器交互,就像它与使用基本身份验证的任何真实 Web 服务器一样。
在这一步中,你将为你之前安装的 HTTP 服务器配置基本身份验证(basic authentication)。基本身份验证是一种简单的方法,客户端在每个请求中发送用户名和密码。这将创建一个安全层,我们稍后将尝试使用 Hydra 对其进行暴力破解,这表明了弱密码的危险性。
cd ~/project/http_server
htpasswd
实用程序创建密码文件。此工具随 apache2-utils
软件包(已安装在 LabEx VM 中)一起提供,并有助于管理基本身份验证的密码文件:htpasswd -c .htpasswd admin
当提示时,输入 password123
作为密码。我们在这里故意使用弱密码,以演示简单密码是多么容易被破解。
nano auth_server.py
from http.server import HTTPServer, BaseHTTPRequestHandler
import base64
class AuthHandler(BaseHTTPRequestHandler):
def do_GET(self):
auth_header = self.headers.get('Authorization')
if not auth_header or not auth_header.startswith('Basic '):
self.send_response(401)
self.send_header('WWW-Authenticate', 'Basic realm="LabEx"')
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b'Authentication required')
return
auth_decoded = base64.b64decode(auth_header[6:]).decode('utf-8')
username, password = auth_decoded.split(':', 1)
if username == 'admin' and password == 'password123':
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
with open('index.html', 'rb') as f:
self.wfile.write(f.read())
else:
self.send_response(401)
self.send_header('WWW-Authenticate', 'Basic realm="LabEx"')
self.end_headers()
self.wfile.write(b'Authentication failed')
if __name__ == '__main__':
server_address = ('', 8000)
httpd = HTTPServer(server_address, AuthHandler)
print("Server running on port 8000...")
httpd.serve_forever()
pkill -f "python3 -m http.server"
python3 auth_server.py &
curl -v http://localhost:8000
你应该收到 401 Unauthorized 响应,这意味着我们的身份验证正在工作。
curl -v -u admin:password123 http://localhost:8000
你现在应该看到来自你的 index.html 文件的 HTML 内容,证明身份验证工作正常。
该服务器现在已通过基本身份验证得到适当保护,并已准备好在后续步骤中进行暴力破解攻击演示。此设置模仿了 Web 服务器使用基本身份验证的真实场景,展示了它的工作原理及其潜在漏洞。
在这一步中,你将创建 Hydra 将用于测试 HTTP 基本身份验证的可能用户名和密码组合的字典(wordlist)。这些列表构成了字典攻击的基础,在这种攻击中,我们系统地尝试常见的凭据,而不是随机猜测。
cd ~/project
mkdir wordlists
cd wordlists
nano usernames.txt
添加这些常用用户名(每行一个):
admin
root
user
test
guest
administrator
nano passwords.txt
添加这些常用密码(每行一个):
password123
password
123456
admin
letmein
qwerty
cat
命令在终端中显示文件内容:cat usernames.txt
cat passwords.txt
crunch 4 4 0123456789 | head -n 100 > numbers.txt
cat passwords.txt numbers.txt > combined_passwords.txt
head
命令仅显示前 10 行,让你快速检查合并是否有效:head combined_passwords.txt
你应该看到类似以下的输出:
password123
password
123456
admin
letmein
qwerty
0000
0001
0002
0003
这些字典包含我们之前配置的正确凭据(admin/password123)和许多不正确的组合。此设置真实地模拟了攻击者如何通过尝试许多可能的凭据来尝试暴力破解登录。在下一步中,我们将使用 Hydra 自动测试针对我们的 HTTP 服务器的这些组合。
在这一步中,你将使用 Hydra 对你之前配置的 HTTP 基本身份验证服务执行暴力破解攻击。Hydra 是一个强大的密码破解工具,它系统地尝试来自字典的所有用户名/密码组合,以查找有效的凭据。这表明了为什么弱密码容易受到自动攻击。
pgrep -fa "python3 auth_server.py" || cd ~/project/http_server && python3 auth_server.py &
cd ~/project/wordlists
-L
标志指定用户名列表,-P
标志指定密码列表,http-get /
表示我们正在攻击基本的 HTTP GET 请求:hydra -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get /
[DATA] attacking http-get://localhost:8000/
[8000][http-get] host: localhost login: admin password: password123
1 of 1 target successfully completed, 1 valid password found
-v
(verbose,详细)标志:hydra -v -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get /
-o
标志指定输出文件:hydra -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get / -o hydra_results.txt
cat hydra_results.txt
攻击应该成功找到我们之前设置的凭据(admin/password123)。这表明通过自动暴力破解攻击可以多么快速地发现弱凭据,从而强调了强密码的重要性。
在这个实验中,你已经学习了如何使用 Python 设置本地 HTTP 服务器,并为了安全测试目的而实现基本身份验证。该过程包括创建 Web 目录、使用 htpasswd 配置身份验证,以及使用像 curl 这样的常用工具验证服务器功能。
此外,你还获得了准备凭据列表和使用 Hydra 对 HTTP 服务执行暴力破解攻击的实践经验。这个练习证明了强密码的重要性,以及当使用弱凭据时,基本身份验证机制的漏洞。