Esteganografia

Conceitos Básicos Sobre Imagens

  • Uma imagem é composta de X linhas e Y colunas;

  • O ponto das coordenadas [a, b] com 0⩽a <X e 0⩽b <Y, é chamado de Pixel;

  • Pixel representa o menor elemento endereçável de uma imagem;

  • Cada Pixel é associado a uma cor, geralmente composta em 3 cores principais (vermelho, verde e azul), que chamamos de RGB (Red, Green e Blue). As intensidades dessas cores, podem variar de 0 a 255, sendo o Branco representado por 255,2555,255 e o Preto por 0,0,0.

  • Cada Pìxel, ocupa 3 bytes de memória, 1 para cada componente principal (daí o valor máximo de 255)

  • Um byte consiste em 8 bits, representando um número binário, como 1010 0101. O valor mais alto que um byte pode receber é 1111 1111, que equivale a 255 em decimal

Magic Numbers

Os Magic Numbers (Números Mágicos) são os 8 primeiros bytes do arquivos (como um cabeçalho), que define o tipo do arquivo. O Magic Number de um arquivo ELF é 0x7F 0x45 0x4C 0x46, que pode ser convertido no Python com o seguinte comando:

python -c 'print "\x7F\x45\x4C\x46"' > <output>

Para gerar um arquivo GIF, podemos utilizar o comando:

echo 'GIF8;sdcsd' > <output.gif>

Chunk (Arquivos PNG)

São esses alguns chunks críticos: IHDR = Image Header. Este é o primeiro pedaço PLTE = Palette Table. Este é um pedaço opcional IDAT = Chunk de dados da imagem. As informações de pixels está contida aqui IEND = Trailer. Marca o final do fluxo de dados PNG

DICA: Um método comum de ocultar flags, é colocar mensagens após o bloco IEND. Os dados adicionados após este bloco não mudarão nada além do tamanho do arquivo

Podemos criar um arquivo com o cabeçalho PNG utilizando o comando:

echo '89 50 4E 47 0D 0A 1A 0A' | xxd -p -r > <image.png>

LSB

gem install zsteg
zsteg -E b1,rgb,lsb,xy <file.png> | xxd | less

Hexdump

hexdump -C -n 8 <file.png>

Strings

Pegando todas as strings de uma imagem

strings -n 7 -t x <file.jpg>

PARÂMETRO

DESCRIÇÃO

-n

Quantidade mínima de caracteres por linha

-t

Posição da string retornada

Encodando strings

strings -e l <file>

Exiftool

# Limpando todos os metadados
exiftool -all=* <img.png>

# Inserindo metadados no comentário de uma imagem (útil para esconder informações ou fazer injections)
exiftool -Comment="<comentario>" <img.png>

Também podemos uma thumb diferente da imagem que vimos quando abrimos em seu tamanho real. Então pdoe ser útil fazer da imagem thumb, uma imagem maior.

exiftool -b -Thumbnailimage <image> > <new_image>

StegSolve

Ferramenta GUI desenvolvida em JAVA com diversos recurso para esteganografia em imagens

BinWalk

Removendo arquivos ocultos incorporados em um arquivo (trabalha com outros tipos de arquivo). Assim que extração for concluída, será criado um diretório chamado _<filename>.

binwalk -Me <file.jpg>

PngCheck

Procura por partes quebradas opcionais/corretas. Isso é útil se a imagem parecer corrompida

# -v = Verbose
# t / 7 = Para exibir pedaços de textos
# p = Exibe conteúdo de mais pedaços adicionais 
# f = Força a continuação mesmo após retornar alguns erros
pngcheck -vtp7f <file.png>

PARÂMETRO

DESCRIÇÃO

-v

Verbose

t / 7

Para exibir pedaços de textos

p

Exibe conteúdo de mais pedaços adicionais

f

Força a continuação mesmo após retornar alguns erros

Steghide

# Mostra informações do arquivo
steghide info <file>

# Caso o arquivo de imagem peça uma senha para mostrar arquivos que estão embutidos (ocultos)
steghide extract -sf <file>
steghide extract -sf <file> -p n30

zbarimg

Realiza scan e decode de código de barras e QR Code.

zbarimg <qrcode.png>

Stegbrute

# Python2
python stegbrute.py --image <image.jpg> --output <output.txt> --wordlist <wordlist.txt>

# Python3
python3 stegbrute.py --image <image.jpg> --output <output.txt> --wordlist <wordlist.txt>

steg_brute

python steg_brute.py -b -d <wordlist.txt> -f <file.wav> > <output.txt>

Change_Pallet.py

Gerando várias imagens alterando sua paleta de cores

for i in {0..255}; do ./change_palette.py <file.png> "single-color-${i}.png" "${i}"; done

Zsteg

Extraindo dados ocultos (utilize somente em imagens PNG e BMP)

zsteg <file>

OBS: Para instalar, basta baixar e executar o comando sudo gem install zsteg.

Steganography

# Inserindo arquivo de texto em um arquivo de áudio
stegolsb wavsteg -h -i <file.wav> -s <arquivo_que_sera_ocultado.txt> -o <output_file.wav> -n 1

# Extraindo arquivo de texto de um arquivo de áudio
stegolsb wavsteg -r -i <file.wav> -o <output_result.txt> -n 1 -b 1000

Exploração de Planos de Cores e Bits

As imagens podem ser ocultadas dentro dos planos de cores/bits. Na seção de sites (no fim da desta página) temos o site georgeom, que nos permites alterar os Bits/Cores

Sites

# Realiza diversos tipos de conversões e quebra de ofuscações de mensagens
https://dcode.fr

# Explicação sobre recontrução de QR Code (Broken QRCode)
https://www.datagenetics.com/blog/november12013/index.html

# Converte QR Code em Text
https://zxing.org/w/decode.jspx

# Extrai metadados de imagens
https://georgeom.net/StegOnline/upload
https://incoherency.co.uk/image-steganography/#unhide
https://29a.ch/photo-forensics/#forensic-magnifier
http://exif.regex.info/exif.cgi

# Tutorial em Português do BinWalk
https://brunoizidorio.com.br/forense-analisando-arquivos-com-binwalk/ 

# Tutorial sobre Stego
https://media.blackhat.com/bh-ad-11/Ortiz/bh-ad-11-Ortiz-Steganography-Slides.pdf

# Tutorial a sobre estrutura do PNG
http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html

# Magic Numbers
https://blog.netspi.com/magic-bytes-identifying-common-file-formats-at-a-glance/

# Headers de arquivos e seus respectivos tipos
https://zenhax.com/viewtopic.php?t=27/

# Extrai de dados de imagens com Piet (monte de quadrados coloridos)
https://www.bertnase.de/npiet/npiet-execute.php

# Colours Palette
https://www.w3.org/TR/PNG-Chunks.html

# Chuks
https://www.w3.org/TR/PNG/#5Chunk-layout

# Bandeiras (útil para CTF)
https://jrgraphix.net/r/Unicode/2700-27BF

# Converte texto em áudio (MP3 ou WAV)
https://www.text2speech.org/

Last updated