hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings
2024-03-29 20:56:56 +00:00
..
format-strings-template.md Translated ['README.md', 'backdoors/salseo.md', 'cryptography/certificat 2024-03-29 20:56:56 +00:00
README.md Translated ['README.md', 'backdoors/salseo.md', 'cryptography/certificat 2024-03-29 20:56:56 +00:00

Strings de Formato

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Informação Básica

Em C printf é uma função que pode ser usada para imprimir uma string. O primeiro parâmetro que essa função espera é o texto bruto com os formatadores. Os parâmetros seguintes esperados são os valores para substituir os formatadores do texto bruto.

A vulnerabilidade ocorre quando um texto do atacante é colocado como o primeiro argumento para esta função. O atacante será capaz de criar uma entrada especial abusando das capacidades de string de formato printf para escrever qualquer dado em qualquer endereço. Sendo capaz, desta forma, de executar código arbitrário.

Formatadores:

%08x —> 8 hex bytes
%d —> Entire
%u —> Unsigned
%s —> String
%n —> Number of written bytes
%hn —> Occupies 2 bytes instead of 4
<n>$X —> Direct access, Example: ("%3$d", var1, var2, var3) —> Access to var3

%n escreve o número de bytes escritos no endereço indicado. Escrever a quantidade de bytes correspondente ao número hexadecimal que precisamos escrever é como você pode escrever qualquer dado.

AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
AAAA.%500\$08x —> Param at offset 500

Fluxo de Exploração

Como explicado anteriormente, essa vulnerabilidade permite escrever qualquer coisa em qualquer endereço (escrita arbitrária).

O objetivo será sobrescrever o endereço de uma função na tabela GOT que será chamada posteriormente. Idealmente, poderíamos definir o endereço para um shellcode localizado em uma seção executável, mas é altamente provável que você não consiga escrever um shellcode em uma seção executável.
Portanto, uma opção diferente é sobrescrever uma função que recebe seus argumentos do usuário e apontá-la para a função system.

Para escrever o endereço, geralmente são feitos 2 passos: Você primeiro escreve 2Bytes do endereço e depois os outros 2. Para fazer isso, é usado $hn.

HOB é chamado para os 2 bytes mais altos do endereço
LOB é chamado para os 2 bytes mais baixos do endereço

Portanto, devido à forma como a string de formato funciona, você precisa escrever primeiro o menor de [HOB, LOB] e depois o outro.

Se HOB < LOB
[endereço+2][endereço]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]

Se HOB > LOB
[endereço+2][endereço]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]

HOB LOB HOB_shellcode-8 NºParam_dir_HOB LOB_shell-HOB_shell NºParam_dir_LOB

`python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "%.15408x" + "%5$hn"'`

Modelo Pwntools

Você pode encontrar um modelo para preparar uma exploração para esse tipo de vulnerabilidade em:

{% content-ref url="format-strings-template.md" %} format-strings-template.md {% endcontent-ref %}

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!