1

我在使用 Hydra 强制使用 HTTP 摘要表单时遇到了一些麻烦。我正在使用以下命令,但是当通过 burp suite hydra 代理时,我可以看到 hydra 使用的是基本身份验证而不是摘要。

如何让 hydra 使用正确的身份验证类型?

命令: hydra -l admin -P /usr/share/wordlists/rockyou.txt 127.0.0.1 -vV http-get /digest

在代理中看到的请求:

GET /digest HTTP/1.1
Host: 127.0.0.1
Connection: close
Authorization: Basic YWRtaW46aWxvdmV5b3U=
User-Agent: Mozilla/4.0 (Hydra)
4

2 回答 2

0

我研究过这种情况,如果在 Nginx 或 apache 服务器级别实现摘要方法,hydra 可能会工作。但是如果认证是在 Flask、Expressjs、Django 等应用服务器上实现的,那它根本就行不通

您可以创建一个用于密码喷洒的 bash 脚本

#!/bin/bash

cat $1 | while read USER; do
        cat $2 | while read PASSWORD; do
                if curl -s $3 -c /tmp/cookie --digest -u $USER:$PASSWORD | grep -qi "unauth"
                then 
                        continue
                else
                        echo [+] Found $USER:$PASSWORD
                        exit 0
                fi
        done
done

将此文件另存为app.sh

$ chmod +x app.sh
$ ./app.sh /path/to/users.txt /path/to/passwords.txt http://example.com/path
于 2021-06-08T20:00:31.927 回答
0

由于没有指定 Hydra 版本,我假设是最新版本:9.2

@tbhaxor 是正确的:

针对像 Apache 或 nginx Hydra 这样的服务器有效。使用标准文档中推荐的摘要身份验证的 Flask不起作用(稍后会详细介绍)。您可以添加使用过的 Web 服务器,以便有人可以验证这一点。

Hydra 不提供显式参数来区分基本身份验证和摘要身份验证。

从技术上讲,它首先发送一个请求,尝试通过基本身份验证来验证自己。之后,它评估相应的响应。

摘要身份验证规范规定,WWW-Authenticate : Digest ...如果请求的文档使用该方案进行保护,则 Web 应用程序必须在响应中发送标头。所以 Hydra 现在可以区分这两种形式的身份验证。如果它收到此响应(参见代码),它会使用摘要身份验证发送第二次尝试。

2 请求摘要 Auth mitmproxy 第一次请求 mitmproxy 第一反应 mitmproxy 第二次请求 mitmproxy

您只能看到基本身份验证而不是摘要请求的原因是由于 Hydra 所谓的“任务”的默认设置。默认情况下设置为16 ,这意味着它最初创建 16 个线程。

因此,如果您转到代理中的第 17 个请求,您将找到使用摘要身份验证的请求。如果使用参数 将任务数设置为 1,您也可以看到差异-t 1

以下 3 个 Docker 设置,您可以根据您的示例使用“管理员/密码”凭据测试基本身份验证 (nginx)、摘要身份验证(nginx) 和摘要身份验证(Flask) 的差异:

基本认证:

cat Dockerfile.http_basic_auth
FROM nginx:1.21.3
 
LABEL maintainer="secf00tprint"
 
RUN apt-get update && apt-get install -y apache2-utils
RUN touch /usr/share/nginx/html/.htpasswd
RUN htpasswd -db /usr/share/nginx/html/.htpasswd admin password
RUN sed -i '/^    location \/ {/a \        auth_basic "Administrator\x27s Area";\n\        auth_basic_user_file /usr/share/nginx/html/.htpasswd;' /etc/nginx/conf.d/default.conf

sudo docker build -f Dockerfile.http_basic_auth -t http-server-basic-auth .
sudo docker run -ti -p 127.0.0.1:8888:80 http-server-basic-auth

hydra -l admin -P /usr/share/wordlists/rockyou.txt 127.0.0.1 -s 8888 http-get /

摘要身份验证(nginx):

cat Dockerfile.http_digest 
FROM ubuntu:20.10

LABEL maintainer="secf00tprint"

RUN apt-get update && \
# For digest module
     DEBIAN_FRONTEND=noninteractive apt-get install -y curl unzip \
# For nginx
     build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev libgd-dev libxml2 libxml2-dev uuid-dev make apache2-utils expect
RUN curl -O https://nginx.org/download/nginx-1.21.3.tar.gz
RUN curl -OL https://github.com/atomx/nginx-http-auth-digest/archive/refs/tags/v1.0.0.zip
RUN tar -xvzf nginx-1.21.3.tar.gz
RUN unzip v1.0.0.zip
RUN cd nginx-1.21.3 && \
     ./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/ nginx.lock --pid-path=/run/nginx.pid --modules-path=/etc/nginx/modules --add-module=../nginx-http-auth-digest-1.0.0/ && \
     make && make install
 
COPY generate.exp /usr/share/nginx/html/
RUN chmod u+x /usr/share/nginx/html/generate.exp && \
     cd /usr/share/nginx/html/ && \
     expect -d generate.exp
 
RUN sed -i '/^        location \/ {/a \            auth_digest "this is not for you";' /etc/nginx/nginx.conf
RUN sed -i '/^        location \/ {/i \        auth_digest_user_file /usr/share/nginx/html/passwd.digest;' /etc/nginx/nginx.conf
 
CMD nginx && tail -f /var/log/nginx/access.log -f /var/log/nginx/error.log

cat generate.exp
#!/usr/bin/expect
set timeout 70
spawn "/usr/bin/htdigest" "-c" "passwd.digest" "this is not for you" "admin"
expect "New password: " {send "password\r"}
expect "Re-type new password: " {send "password\r"}
wait

sudo docker build -f Dockerfile.http_digest -t http_digest .
sudo docker run -ti -p 127.0.0.1:8888:80 http_digest

hydra -l admin -P /usr/share/wordlists/rockyou.txt 127.0.0.1 -s 8888 http-get /

摘要身份验证(Flask):

cat Dockerfile.http_digest_fask
FROM ubuntu:20.10

LABEL maintainer="secf00tprint"
 
RUN apt-get update -y && \
     apt-get install -y python3-pip python3-dev
 
# We copy just the requirements.txt first to leverage Docker cache
COPY ./requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip3 install -r requirements.txt
COPY ./app.py /app/
CMD ["flask", "run", "--host=0.0.0.0"]

cat requirements.txt
Flask==2.0.2
Flask-HTTPAuth==4.5.0

cat app.py
from flask import Flask
from flask_httpauth import HTTPDigestAuth
 
app = Flask(__name__)
app.secret_key = 'super secret key'
auth = HTTPDigestAuth()
 
users = {
    "admin" : "password",
    "john" : "hello",
    "susan" : "bye"
}
 
@auth.get_password
def get_pw(username):
    if username in users:
        return users.get(username)
    return None
 
@app.route("/")
@auth.login_required
def hello_world():
    return "<p>Flask Digest Demo</p>"

sudo docker build -f Dockerfile.http_digest_flask -t digest_flask .
sudo docker run -ti -p 127.0.0.1:5000:5000 digest_flask

hydra -l admin -P /usr/share/wordlists/rockyou.txt 127.0.0.1 -s 5000 http-get /

如果您想查看我在此处更详细地写的更多信息。

于 2021-11-05T23:33:40.440 回答