................... ...::: phearless zine #7 :::... ..................>---[ LDAP Web Injection Techniques ]---<...................... ......................>---[ by h44rP a.k.a. Laufer ]---<......................... haarp[at]phearless[dot]org [0x01] Intro [0x02] LDAP introduction [0x03] Search queries explained [0x04] Attacking LDAP [0x05] Data validation prevention [0x06] Outro /////////////////////////////////////////////////////////////////////////// -----> 0x01 Intro \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ josh pred par godina dok sam bio admin na jednom stroju sam se zainteresirao za sam ldap i njegov rad i ranjivosti i sada nedavno pricajuci sa frendom na icq-u kaze mi da pise fuzzer za ldap i ja se opet sjetim genijalnih starih dana pa tako sam se evo odlucio prisjetiti i malo stogod napisati sto se tice samog ldap-a tocnije u ovom slucaju ldap web injectiona koji nisu nikakva velika nepoznanica u svijetu web security-a.. nadam se da cete shvatiti sve o cemu se govori ovdje u txt-u i znati upotrijebiti ono procitano.. samo predznanje nije neki utjecajni cimbenik na samo shvacanje teksta ali je naravno puno bolje ako ste radili s ldap-om, administrirali te konfigurirali isti ali ako niste valjda ce biti prilike.. nista zato. krenimo mi na posao. /////////////////////////////////////////////////////////////////////////// -----> 0x02 LDAP introduction \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ldap? pretpostavljam da svi znaju dosta o samom ldap-u ali red je da se kao prvo upoznamo s protokolom odnosno tehnologijom o kojem ce se ovdje govoriti. dakle sam ldap stoji za: Lightweight Directory Access Protocol a u biti je protokol koji se koristi za pristupanje informacijskim direktorijima.. pa sta bi to znacilo i kamo ga mozemo sresti u praksi.. pa recimo za primjer carnet za svaki svoj posluzitelj koji vrti ldap ima mogucnost pristupa web ldap sadrzaju putem /ldap dir-a. cemu sluzi? u ovom slucaju svaki korisnik koji koristi cmu odnosno carnet modemske ulaze i obavlja autorizaciju preko radiusa ovdje ima mogucnost koristeci svoj login i password da pristupi svojim ldap podacima i po potrebi ih izmijeni. ldap je u biti imenicki servis i svaki recimo u ovom slucaju pozluzitelj koji drzi svoj neki domen ima za to odgovarajuci imenik korisnika.. ono sto se ovdje nudi korisniku jest promjena lozinke te azuriranje podataka unutar ldap imenickog servisa.. primjer jednog korisnika: ************************************** Ažuriranje podataka Promjena zaporke Odjava ------------------------------------------------------------ Prikaži samo obavezne atribute ------------------------------ Korisnicka oznaka (hrEduPersonUniqueID) pperic@fer.hr * Identifikator korisnika u ustanovi (uid) pperic * Ime i prezime (cn) Pero Peric * Prezime (sn) Peric * Ime (givenName) Pero * Elektronicka adresa (mail) Pero.Peric@fer.hr * Telefonski broj (telephoneNumber) - Dodaj Obriši Lokalni telefonski broj (hrEduPersonExtensionNumber) - Broj mobilnog telefona (mobile) - Dodaj Obriši Fax broj (facsimileTelephoneNumber) Dodaj Obriši Brojcani identifikator osobe (hrEduPersonUniqueNumber) LOCAL_NO: XXX-4624014725/03 * Datum rodenja (hrEduPersonDateOfBirth) - Spol (hrEduPersonGender) - Slika (jpegPhoto) - URI adresa (labeledURI) - Obriši Strucni status (hrEduPersonProfessionalStatus) - Zvanje (hrEduPersonAcademicStatus) - Podruc(je znanosti (hrEduPersonScienceArea) - Povezanost s ustanovom (hrEduPersonAffiliation) student * Temeljna povezanost s ustanovom (hrEduPersonPrimaryAffiliation) student * Vrsta studenta (hrEduPersonStudentCategory) Datum isteka temeljne povezanosti (hrEduPersonExpireDate) NONE * Položaj u ustanovi (hrEduPersonTitle) - Uloga u ustanovi (hrEduPersonRole) - Vrsta posla u ustanovi (hrEduPersonStaffCategory) Pripadnost grupi (hrEduPersonGroupMember) Naziv maticne ustanove (o) Sveuciliste u Zagrebu * Oznaka maticne ustanove (hrEduPersonHomeOrg) fer.hr * Organizacijska jedinica (ou) (none) Broj sobe (roomNumber) - Obriši Poštanska adresa (postalAddress) ************, HR-10000 Zagreb * Mjesto (lokalitet) (l) Zagreb * Poštanski broj (postalCode) - Ulica i kucni broj (street) - Kucna poštanska adresa (homePostalAddress) - Kucni telefonski broj (homeTelephoneNumber) - Desktop uredjaj (hrEduPersonCommURI) - ************************************** ovo sam samo iznio kao primjer sto sve moze biti sadrzaj odredjenog ldap imenickog servisa.. ovdje je sve izmijenjeno.. nikakve informacije nisu korisne tako da je ovo jednostavno samo kao predlozak sto sve sadrzavaju korisnicki unosi u ldap-u. napomenuo sam da bi bilo pozeljno da ste radili sa ldap-om, slapd-om te da ste upuceni u njegove mogucnosti i upotrebu. neda mi se sad ovdje pretjerano pricati o samom ldap-u kao takvom.. bacite oko na rfc pa proucite malo.. oni koje zanima vec jesu pa stoga mozemo dalje.. btw necu niti pricati o ldapsearch i ostalim ldap alatima komandnog sucelja jer ima previse toga.. parametara na bacanje itd. instlirajte si pa malo proucite ako vas zanima lokalno koristenje samog ldap servisa.. jbg. nemam vremena.. :( /////////////////////////////////////////////////////////////////////////// -----> 0x03 Search queries explained \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ dakle dosli smo do dijela kada cu napokon reci o cemu se zapravo radi ovdje i kakve ldap koristi querie za dobavaljanje odredjenih informacija.. ldap injection podrazumijeva naravno ubacivanje dodatnih QUERY ldap komandi u web app input kako bismo dobili podatke koje nebismo smjeli ili cak zaobisli autorizaciju.. naravno stvar je jako slicna sql injectionu i zapravo opasnost po sam ldap je ista kao i za sql. sto je ranjivo? pa svi php, java... kodovi koji pristupaju ldap-u odnosno rade s query-ima bez data validationa etc. osnovni query agument je "user" i zapravo pretrazuje ldap direktorij u potrazi za korisnickim cn (common name)-om, mailom .. ... znaci recimo primjer ***************** http://...ldap-search.asp?user=pperic cn Pero Peric mail: pero.peric@fer.hr ***************** znaci query radi slijedece.. uzima nas input.. koji je u ovo slucaju pperic te s njime pretrazuje znaci parametre koje sadrzava sam ldap.. u ovom slucaju mail i cn.. s time da pretrazuje odredjenu domenu ou,dc itd. pretrage.. prema tome se pretrazuje stablo ou,dc,dc u potrazi za trazenima parametrima.. /////////////////////////////////////////////////////////////////////////// -----> 0x04 Attacking LDAP \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ dakle.. ovi query koji se salju ldap-u naravno uzimaju se od strane web app-a te proslijedjuju dalje.. problem je kada nije filtriran sadrzaj (kao i uvijek) koji se daje na danju obradu odnosno na proslijedjivanje.. string koji se unosi znaci moze nemati limitrane charove te omoguciti unos odredjenih query-a preko kojih lako mozemo dobiti informacije koje nebismo smjeli i sl. unos svakavog smeca u input box naravno gotovo nikad nece biti moguc no umetanje nekih spec charova poput "()|&%" moze biti i te kako zanimljivo.. nacin na koji mozete provjeriti dali je moguce da propusta odredjene stvari sam app jest da dodate symbole odredjene u sam input box.. primjer: ***************** http://...ldap-search.asp?user=pperic| ***************** ***************** http://...ldap-search.asp?user=pperic) ***************** etc. znaci http://...ldap-search.asp?user=pperic| bi bio query koji kada nebi bio vracen error bi znacio da nema limitiranja "|".. znaci kod unosa bio bi kao (parametar=unos&ili|) etc.. dakle ono sto je zanimljivo jest to da mozemo kombinacijom dobiti odredjene informacije.. kako? primjer: (parametar=unos)(|(cn=*)) bi vracao bilo koji common name unos. dakle moramo injectati kod koji izgleda kao pperic)(|(cn=*)) i output ako prodje i vrati cm Pero Peric znaci da smo na dobro putu odnosno da je moguce nesto uraditi. ono sto nam treba jeste objectclass lista tj. moramo znati koje parametre mozemo zatraziti tj. dobiti. primjer: ***************** http://...ldap-search.asp?user=pperic)(|(objectclass=*)) ***************** kada dobijemo listu objeclass mozemo testirati i vidjeti za svaki dali imamo pravo pristupa podacima.. gore na pocetku kada sam vam dao primjer jednog usera vidite da postoje polja poput uid-a, cn-a itd. po pravilu mi mozemo na ovaj nacin vidjeti svaki ovaj atribut.. primjer: ***************** http://...ldap-search.asp?user=pperic)(|(hrEduPersonUniqueID=*)) ***************** trebao bi dobiti output kao: (hrEduPersonUniqueID) pperic@fer.hr isto tako cak je moguce uraditi pregled usera te sveg njihova info-a tako sto za user value stavimo *... znaci ...?user=* /////////////////////////////////////////////////////////////////////////// -----> 0x05 Data validation prevention \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ kako sprijeciti ovakve vrste info leak-a i auth bypass-a.. naravno, odgovor je filtriranjem sadrzaja stringa koji se peuzima iz web app-a.. znaci da se radi validation na incoming i outgoing podatke.. znaci kodgod je moguce koristite samo brojeve, takodjer konvertirajte sve simbole u html.. npr. uvijek treba odraditi validaciju tipa, uzorka te naravno vrijednosti domene: int userinput = Convert.ToInt32(Request.Querystring(“userinput”) string email = Regex.IsMatch(Request.Querystring(“email”),” ^.+@[^\.] .*\.[a-z]{2,}$” ) string country = Request.Querystring(“country”) in {“USA”, “UK”} /////////////////////////////////////////////////////////////////////////// -----> 0x06 Outro \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ to je to.. kratko i nadam se jasno.. kome treba kakva pomoc ili ako netko ima bilo kakva pitanja ili sugestije neka pise na haarp[at]phearless[dot]org. sorry na svim greskama i sranjima jer je sve natipkano u kratkoj pauzi od kodiranja neceg sto bi trebalo da izadje za #7 ako bog da :) do citanja... veliki poz: shatter, h4z4rd, aca, exoduks, ap0x, argv, n00ne, bl00d, SiKe, furia, leech i onima koje sam nenamjerno zaboravio.. sorry :) \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\