こんにちは、ぎんたです。
今回は、TryHackMeで提供されている「Services」という、比較的最近提供されていたルームの攻略をしていきます。
こちらの「ServicesのURL」でアクセスできます。
- AS-REP Roastingを使ったKerberosへの攻撃手法に興味のある方
- evil-winrm、kerbrute、hashcat、impacketのツールの使用に興味のある方
- CTFに興味のある方
が今回の対象です。
無料でアクセス可能なので、試してみたい方はぜひやってみてください。
スポンサーリンク
ポートスキャンによるサービスの列挙
nmapでポートスキャンを始めます。
以下のコマンドで結果を確認します。
nmap -sV -sC -T4 -p- サーバのIPアドレス
- -sV :サービスのバージョン列挙
- -sC :サービスに対するデフォルトスクリプトの実行
- T4 : 高速モードで実行
- -p- :全ポートを調査対象(ポート指定しないと、デフォルトの1000ポートを探索する)
実行した結果の一部
内容をパッと見たところ、Domain Controller(以後、DCと記載)の可能性が高いことが分かります。
DNS、Kerberos、LDAPのサービスが稼働しているためです。
また、画像が切れてしまいましたが、5985/tcp wsmanが稼働していました。
Windowsリモート管理(WinRM)が有効になっているようです。
有効な認証情報を取得できたら試すことができそうです。
Server Message Block (SMB)の確認
TCPの445番ポートが開いていたので、SMBの列挙をしたいと思います。
現在利用可能な認証情報が無いため、匿名ログインが可能かどうかを確認します。
smbclientというツールを使って試してみます。
smbclient -N -L //10.10.147.132
匿名ログインは成功しているようですが、DC上に利用可能な共有ファイル・フォルダがないことが判明しました。
Web Serverの確認
先の列挙でhttpのサービスが稼働していることが判明しているので、実際にアクセスしてみます。
TOPページの下部に連絡先のメールアドレスが記載されていました。
また別のタブを調査すると、従業員の名前も確認できました。
メールのフォーマットと従業員の名前から攻撃に利用可能なユーザ名のリストを以下のように作成しました。
- j.doe
- j.rock
- w.masters
- j.larusso
このリストを使ってActive Directory(以後、ADと記載)への攻撃を行っていきます。
AS-REP Roastingを使った認証情報の取得
現状、認証情報のセットがないので、RDPへのアクセスが行えません。
この状況下でも実行できるAS-REP Roastingを行います。
ADのリソースにアクセスするためには、ユーザはまずDCに存在するKDC(Key Distribution Center)からTGT(Ticket Granting Ticket)を要求することになります。
TGTを要求(AS-REQと呼ばれる)するために、ユーザは「自身のNTハッシュを利用してタイムスタンプを暗号化したもの」を含めて送信します。
KDCはこの暗号化されたタイムスタンプを受け取ると、あらかじめ保持しているそのユーザのNTハッシュを使ってタイムスタンプの復号をし、比較します。
比較して問題がなければユーザにTGTを発行します(AS-REPと呼ばれる)。
ただし、デフォルトでは有効になっている事前認証(自身のNTハッシュを利用してタイムスタンプを暗号化するステップ)を無効に設定することもできます。
これにより、事前認証が不要なユーザカウントの場合パスワードを知らなくてもTGTをリクエストでき、TGTを受け取ったらオフラインクラックをすることでパスワードを特定することが可能となります。
TGTにはクライアントのパスワードが元になって暗号化されたデータがあるので、そのデータをオフラインクラックするイメージです。
まずは、Kerbruteというツールを使って作成したリスト内(userlist.txt)のユーザが有効であるかどうかを試しました。
services.localはdcのアドレスと同じになるように事前に/etc/hostsに登録してます。
リスト内のユーザは有効なようなので、次にimpacket-GetNPUsersというツールを使用しました。
このツールを使って事前認証が無効のユーザの発見、アカウントハッシュの取得を試みます。
ユーザj.rockは事前認証が無効になっており、アカウントハッシュ値を取得できました。
取得したハッシュ値をクラックします。
hashcatを使っておこなったところ、パスワードを取得できました。
hashcat -m 18200 hash.txt /usr/share/wordlists/rockyou.txt
なお、「-m」でモードを指定しています。
AS-REPをクラックするためのモードは以下のURL掲載の表から18200であることが分かりました。
j.rockの認証情報がそろったので、リモートアクセスを行いたいと思います。
WinRMでのリモートアクセスを実行
先の列挙でSMBのポートが開いていたのでpsexecで実行しようとしましたが失敗しました。
原因は、j.rockが管理者ユーザではなかったためです。
そこで先の列挙で5985ポートが開いていたので、WinRMでのアクセスを試みます。
evil-winrmというツールを使います。
上手くDCのPowerShellセッションを取得でき、そのままユーザフラグも確認できました。
権限昇格
「whoami /all」コマンドを使ってj.rockユーザの権限やグループを調査します。
「Server Oparators」グループに属しているため、稼働しているサービスの開始と停止ができそうです。
サービスで実行されるバイナリパス(実行ファイルまたはコマンド)を悪意のあるコードや権限昇格につながるコマンドに変更できれば権限昇格が可能です。
また、バイナリパスの変更を反映させるためには、サービスの停止や開始を行う必要があります。
では、実行してみます。
evil-winrmにはserviceというコマンドがあり、利用可能なサービスとアクセスに必要な権限を表示できます。
一番上にあるADWSというサービスのバイナリパスを変更し、サービスを再起動します。
ここではサービスのバイナリパスに「ユーザをAdministratorsグループに追加するコマンド」を記載しています。
いったんログアウトし、再度evil-winrmを使ってログインすると、管理者のグループに入っていることを確認できます。
この後rootのフラグを取得しようとしましたが失敗しました。
j.rockにはroot.txtのファイルへのアクセス権が無いようです。
もうrootフラグが取れた気でいたのでびっくりしたよ~。
管理者のパスワードを変更してAdministratorsアカウントでログインしなおす方法もありますが、別の方法を試しました。
j.rockは管理者になっているので、impacket-psexecを使うことでSYSTEM権限のリモートシェルを取得できます。
psexecは認証後、サービス実行ファイルをADMIN$共有にアップロードします。
その後、ランダムな名前の実行ファイルをサービス開始時に実行されるバイナリとして指定し、サービスとして開始されます。
そのときのサービスはローカルのSYSTEMアカウントで実行されるので、SYSTEM権限のリモートシェルを取得できるわけです。
いったんログアウトしてimpacket-psexecを使うことで、このようにrootフラグも獲得できました。
まとめ
今回は、AS-REP Roastingを使ったADの攻撃を体験できるCTFを紹介しました。
- nmapによる列挙でAD環境であることが判明。
- Webサイトの調査でユーザ情報を取得
- AS-REP Roastingで事前認証を無効にしたユーザのアカウントハッシュ値を取得
- ユーザのアカウントハッシュ値をクラックし、パスワードを取得
- 取得した認証情報を使ってWinRM経由でサーバに侵入、ユーザフラグをGET
- ユーザが「Server Oparators」グループに所属していることが判明
- evil-winrmでユーザがアクセスできるサービスを列挙
- サービスのバイナリパスを変更し、ユーザをAdministratorsグループに追加
- psexecを使ってSYSTEM権限のリモートシェルを取得し、rootフラグをGET
今回の記事が参考になれば幸いです。
以上、ぎんたでした。
サイバーセキュリティを学ぶ上で必要な攻撃と解析に関する他の記事は、以下のリンクで確認できます。
学習に関しましては、以下のセキュリティの勉強法、おすすめの学習本・動画の記事が多くの方に読まれています。
資格の記事については以下の記事がおすすめです。
ITエンジニアへの転職については以下の記事がおすすめです。
その他学習・転職関連に関しましては、以下の記事もあわせて読まれています。
ぜひご覧ください!