我在用Hydra强制使用HTTP摘要表单时遇到了一些麻烦。我使用的是以下命令,但是,当通过burp套件hydra代理时,我可以看到hydra使用的是基本的auth而不是digest。
如何让hydra使用正确的auth类型?
命令: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)发布于 2021-06-09 04:00:32
我研究过这种情况,如果摘要方法是在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-11-05 23:33:40
因为没有指定Hydra版本,所以我假设是最新的版本:9.2。
@tbhaxor是正确的:
在Apache或nginx Hydra这样的服务器上工作。使用标准documentation中推荐的摘要式身份验证的Flask不起作用(稍后会详细介绍)。您可以添加使用过的web服务器,这样别人就可以验证这一点。
Hydra不提供明确的参数来区分基本身份验证和摘要身份验证。
从技术上讲,它首先发送一个请求,试图通过基本身份验证对自己进行身份验证。在此之后,它评估相应的响应。
摘要身份验证的规范规定web应用程序必须发送报头WWW-Authenticate : Digest ... in the response if the requested documented is protected using the scheme。因此,Hydra现在可以区分这两种形式的身份验证。如果它收到此响应(请参阅code),它使用digest authentication发送第二次尝试。




您只能看到基本身份验证而不能看到摘要请求的原因是由于Hydra所称的“任务”的默认设置。它被设置为16 by default,这意味着它最初会创建16个线程。
因此,如果您转到代理中的第17个请求,您将发现一个使用摘要身份验证的请求。如果使用参数-t 1将任务数设置为1,也可以看到差异。
下面是3个Docker设置,您可以根据您的示例使用admin/password凭据测试基本身份验证(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.confsudo 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-authhydra -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.logcat 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"}
waitsudo docker build -f Dockerfile.http_digest -t http_digest .
sudo docker run -ti -p 127.0.0.1:8888:80 http_digesthydra -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.0cat 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_flaskhydra -l admin -P /usr/share/wordlists/rockyou.txt 127.0.0.1 -s 5000 http-get /如果你想了解更多信息,我在更详细的here中写过。
https://stackoverflow.com/questions/66431117
复制相似问题