Space pirate: Going Deeper
Descrição do Desafio:
Autor: w3th4nds Plataforma: Hack The Box Categoria: Pwn Dificuldade: Muito fácil Data: 2022 Descrição:
We are inside D12! We bypassed the scanning system, and now we are right in front of the Admin Panel. The problem is that there are some safety mechanisms enabled so that not everyone can access the admin panel and become the user right below Draeger. Only a few of his intergalactic team members have access there, and they are the mutants that Draeger trusts. Can you disable the mechanisms and take control of the Admin Panel?
Passo a Passo da Solução
1. Análise do executável fornecido
Este desafio não fornece o código-fonte, dessa forma, a análise deve ser feita diretamente pelo executável, analisando sua execução e assembly.
Rodando o executável temos uma leve noção do que está acontecendo. Nele é imprimido uma interface que nos mostra o histórico de comandos, e em seguida mostra 3 escolhas:
Desabilitar mecanismos.
Entrar.
Sair.
Após selecionar uma das opções, excluindo a terceira, podemos inserir algum texto. Mas em ambos os casos a saída é:
Neste ponto, sobra analisar o assembly, no caso pelo Ghidra, para entender mais sobre o que está acontecendo.
Logo de início já podemos identificar a função main()
, que define algumas variáveis de execução chamando a função setup()
, e depois imprime a interface chamando a função banner()
. Por fim é chamada a função admin_panel(1,2,3)
que realiza toda a lógica da entrada do usuário.
Analisando a função admin_panel()
, vemos muitas coisas interessantes:
Não importa se foi selecionado 1 ou 2 no início, o código que continua é o mesmo nas duas opções. A terceira opção encerra a execução.
No input que fazemos após inserir a opção, é possível realizar um
buffer overflow
de 17 caracteres.A flag é impressa caso os parâmetros sejam iguais a
0xdeadbeef
,0x1337c0de
, e0x1337beef
. E o input contenhaDRAEGER15th30n34nd0nly4dm1n15tr4t0R0fth15sp4c3cr4ft
.
O que este código deixa a entender é que devemos causar um estouro no buffer, colocando o valor DRAEGER15th30n34nd0nly4dm1n15tr4t0R0fth15sp4c3cr4ft
nele, e depois sobrescrevendo o valor dos parâmetros passados. Porém, este executável está na arquitetura 64-bits, então os parâmetros são passados por meio dos registradores, e 17 caracteres a mais não seria o suficiente para escrever a string e sobrescrever os parâmetros.
Nota: É possível observar que mesmo sendo arquitetura 64-bits, os parâmetros são colocados na pilha no início do assembly da função. Porém, eles são colocados antes do buffer, dessa forma é impossível sobrescrever eles estourando o buffer.
2. Solução
Após descobrir que não era possível sobrescrever os parâmetros, eu estourei o buffer com os 57 caracteres sendo "A", para ver se algo interessante acontecia. Nisso, eu reparei algo interessante pelo pwndbg, o endereço de retorno mudou um pouco.
Antes do input:
Após o input:
O endereço de retorno é sobrescrevido por 1 byte, como podemos ver antes era 0x400b94
e depois passou a ser 0x400b41
, sendo que 0x41
é o hexadecimal para o caractere "A".
Dessa forma, a solução é sobrescrever esse 1 byte de forma que a função admin_panel()
retorne para a instrução dela que imprime a flag. Isso só é possível caso essa instrução comece com 0x400b
e por sorte ela começa.
Então, a solução nada mais é do que inserir 56 caracteres quaisquers, e depois inserir o hexadecimal 0x12
.
Flag
HTB{d1g_1n51d3..u_Cry_cry_cry}
Autor da WriteUp
Atualizado