O Binwalk é uma ferramenta criada pelo Craig Heffner e feita para realizar buscas em arquivos de imagens (raw). Ela foi pensada para fazer a análise e extração de códigos e arquivos dentro de firmwares, porém como ela é bastante poderosa, acaba sendo utilizadas para outros fins. O intuito desse post é demonstrar que um desses possíveis cenários de utilização desse software no campo da computação forense, e assim apresentar mais uma ferramenta que possa ser utilizada em uma análise forense. Isso não quer dizer que ela substitui qualquer outra ferramenta! Existem ferramentas específicas para cada tipo situação e de análise. Porém, assim como qualquer outra ferramenta, ela server para ajudar um profissional capacitado a chegar um resultado desejado.
O programa utiliza a biblioteca libmagic, assim reconhece os “Magic Numbers” no bloco de dados de um arquivo, conseguindo identificar o tipo de arquivo dentro de uma imagem. Porém, ele também contém uma lista extra desses números mágicos para ficar ainda mais completo.
“Números Mágicos” ou “Magic Numbers” é o termo utilizado para designar as constantes de um tipo de arquivo, assim definindo as assinaturas desses arquivos e assim criando um padrão para a identificação desses arquivos. Essa assinatura se localiza no início do bloco de informação do arquivo. Por exemplo: Todo arquivo arquivo PNG irá começar com esse dados em HEXADECIMAL 89 50 4E 47 0D 0A 1A 0A.
Para observar esses dados, basta abrir qualquer arquivo em um editor Hexadecimal de sua preferência. Também iremos verificar esses dados usando o binwalk.
Caso queira uma lista de alguns números mágicos, existem várias listas na internet, como esta do Wikepédia: https://en.wikipedia.org/wiki/List_of_file_signatures
Instalação
Para fazer a instalação do binwalk, basta utilizar o gerenciador de repositórios da sua distribuição ou fazer o download no Github oficial da ferramenta: https://github.com/ReFirmLabs/binwalk
Algumas distribuições Linux já possuem essa ferramenta em seu repositório.
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk
sudo python setup.py install
Caso esteja utilizando o Python 2.x, instale a dependência:
sudo apt install python-lzma ou sudo yum install pyliblzma
Utilização
A sintaxe do programa é bem simples
$ binwalk [opções] [arquivo]
Caso não utilize nenhum argumento, o binwalk fará uma varredura no arquivo e exibirá os arquivos correspondentes as suas assinaturas compostas nos cabeçalhos utilizando os números mágicos. Há basicamente 3 colunas: Decimal e Hexadecimal, exibe a posição, nos respectivos nomes, do início do número mágico de um arquivo. A terceira coluna é a descrição do arquivo que foi localizado nas duas primeiras colunas.
Filtros
Como o retorno da pesquisa dos arquivos pode ser muito grande, é possível aplicar “filtros” para você ver apenas o que está buscando especificamente.
Filtro de Inclusão
-y ou –include=<filtro>
A opção -y inclui apenas os resultados correspondentes para o texto (ou string) de pesquisa especificado. Nessa pesquisa, serão retornados apenas arquivos onde os “Magic Numbers” são possíveis de ser identificados. É possível utilizar expressões regulares para a pesquisa.
$ binwalk -y image exemplo.raw
Exibe apenas as imagens encontradas no arquivo
Filtro de Exclusão
-x ou –exclude=<filtro>
A opção -x é o oposto da anterior (-y) e exclui o texto especificado (ou string) que corresponde a regra nos resultados da pesquisa. Assim como a pesquisa, a exclusão também pode usar expressões regulares. Também apresenta os resultados baseado nas assinaturas dos arquivos.
$ binwalk -x image exemplo.raw
Comparação de Arquivos
-W ou –hexdump
O binwalk pode exibir os códigos hexadecimais de arquivos e exibir a diferença e semelhança entre eles. Para fazer essa diferenciação, ele utiliza 3 cores para demonstrar cada uma dessas diferenças e semelhanças.
Verde: Os bytes semelhantes em todos os arquivos;
Vermelho: Os bytes diferentes em todos os arquivos;
Azul: Os bytes diferentes em apenas um arquivos.
$ binwalk -W arquivo01.raw arquivo02.raw arquivo03.raw
Para melhor visualização, podemos aplicar alguns argumentos para limitar a exibição das informações. No nosso exemplo, vamos utilizar:
–block para limitar o tamanho do bloco, em bytes, que será exibido;
–length para exibir apenas a quantidade de bytes selecionados.
$ binwalk -W --block=8 --length=128 *.mp3
No nosso exemplo, podemos identificar nos 3 arquivos que os primeiros bytes são idênticos. Isso acontece pois são 3 arquivos de áudio em MP3 e os “Números Mágicos” nos informa que existe a ID3 Tag nesses arquivos. A assinatura da ID3 tag é “49 44 33”. Como o padrão se repete em todos, esses dados estão em verde.
Seguindo o arquivo, podemos observar que mais uma informação é idêntica nos 3 arquivos. É possível ver o “texto” TALB. Lendo a documentação do ID3tag (http://id3.org/id3v2.3.0), esse campo corresponde ao “Álbum” em que essa MP3 pertence (TALB [#TALB Album/Movie/Show title]). Mas isso não quer dizer que as 3 MP3 são do mesmo Álbum e sim que os 3 arquivos estão com esse campo da ID3 Tag preenchidas. Por esse motivo, podemos observar um bloco bem maior de dados em vermelho, pois são 3 músicas de álbuns diferentes.
Se avançarmos um poucos mais, veremos o “TPE1”, que corresponde ao “Artista” da música. Mesmo essa informação presente nos 3 arquivos, eles não estão na mesma posição, por isso continua em vermelho. Isso acontece por causa dos nomes dos Álbuns, que são diferentes e não tem o mesmo número de caracteres.
Observando essas informações, podemos concluir:
musica01.mp3: Álbum (TALB): “The Rise and Fall of Ziggy Stardust and The Spider From Mars” e Artista (TPE1): “David Bowie”
musica02.mp3: Álbum (TALB): “Scenes From a Memory” e Artista (TPE1): Dream Theater
musica03.mp3: Álbum (TALB): “Just The Two of Us, Me And Then” e Artista (TPE1): MindFlow
Os dados em azul são que estão iguais em 2 arquivos, mas no terceiro. No exemplo abaixo, peguei 2 músicas do mesmo álbum e uma de um terceiro álbum. Usando as informações acima, fica fácil ver a semelhança entre os 2 primeiros e o terceiro arquivo.
Pesquisa RAW
-R ou –raw=<string>
A pesquisa RAW permite que você faça uma busca diretamente no arquivo, podendo conter strings octal, hexadecimal ou texto puro.
No nosso exemplo, vou utilizar uma MP3 da banda MindFlow e ela contém os metadados da ID3 tag preenchida.
Vamos fazer a busca pelo nome da banda dentro da MP3. Como é um nome composto, vamos procurar pelos primeiro nome apenas:
$ binwalk -R "Mind" musica03.mp3
Caso não retorne nenhuma resposta, pode tentar com outros argumento, como o segundo nome, o nome completo, o texto em caixa alta ou baixa, ou até mesmo em Hexadecimal:
$ binwalk -R "\x4D\x69\x6E\x64" musica03.mp3
Observe que o retorno estão exatamente na mesma posição inicial da busca antetior. O binwalk fez uma varredura no hexadecimal da MP3 e encontrou essas informações no metadados ID3 Tag do arquivo.
Extração de Arquivos
Como o binwalk é capaz de reconhecer arquivos dentro de um outro arquivo, também é possível fazer a extração desses desses arquivos para um diretório.
Extraindo manualmente
-D ou -dd=<Tipo:Extensão:Comando>
O formato usado para extrair a regra especificada é:
Tipo:Extensão:Comando
Tipo: string, em “caixa baixa”, para informar o tipo do arquivo que se quer extrair;
Extensão: define qual será a extensão que o arquivo será salvo no diretório. Por padrão, o binwalk não coloca nenhuma extensão;
Comando: é um argumento opcional para ser executado após a extração para o diretório.
$ binwalk --dd='zip archive:zip:unzip %e' exemplo.raw
No exemplo acima:
–dd: informa que será feito uma extração de arquivo;
zip archive: será localizado todos os arquivos que contêm a assinatura de um arquivo ZIP;
zip: todos os arquivos localizados com essa assinatura será salvos com a extensão .zip;
unzip: após os arquivos “zip archive” serem localizados, depois salvos como .zip, esse arquivos serão extraídos com o unzip.
%e: é onde você deve informar onde o diretório para a extração desses “zip archives”
Por padrão, os nomes dos arquivos serão atribuídos às suas posições hexadecimais incluindo a extensão encontrada nos números mágicos. Os “zip archives” extraídos da imagem estarão com os nomes: 6BF9434.zip, 39F3593.zip, 39F3660.zip
Caso queira extrair tudo que o binwalk possa localizar, basta usar a expressão regular com * para fazer a extração:
$ binwalk --dd='.*' file.bin
Extraindo automaticamente
Caso utilize a extração automática, o binwalk irá criar um diretório automaticamente com os arquivos extraídos.
A opção -e é usada para executar a extração automática dos dados. O binwalk só vai conseguir extrair os arquivos que serão identificados pelos números mágicos.
Extração recursiva
-M ou –matryoshka
A opção -M (–matryoshka) fará a extração de forma recursiva, porém ela só pode ser usada se combinada com a opção -e (ou –extract)
$ binwalk -Me exemplo.raw
LOG
-f ou –log=<arquivo.log>
Nos sistemas operacionais modernos, podemos concatenar as informações de saída de fluxo (stdout) para outro fluxo de informações. Geralmente usamos essas saídas de informações concatenadas com ‘>’ para gerarmos um arquivo de “log” escrevendo um arquivo de texto. Porém, o binwalk já tem um argumento para isso, que é o -f (ou –log)
$ binwalk -f saída_dos_dados.log exemplo.raw
Caso queira que esses dados sejam extraídos diretamente para um arquivo no formato CSV, pode se utilizar o argumento –csv já combinado com o -f
$ binwalk -f saída_dos_dados.csv --csv exemplo.raw
Utilizando o comando acima, será exibida a informação na tela e também criado o arquivo csv. Se deseja que apenas o arquivo seja criado com essas informações, sem a exibição no terminal, basta usar o -q (ou –quiet).
$ binwalk -q -f saída_dos_dados.csv --csv exemplo.raw
Exemplo Prático:
Primeiramente, vamos usar o binwalk padrão:
No nosso caso, retornou algumas informações. Na primeira posição foi encontrada a assinatura do “PDF Document, version 1.4”. Verificando o arquivo no nosso editor hexadecimal, podemos ver o “número mágico” do pdf (25 50 44 46).
Seguindo o arquivo, o binwalk encontrou a biblioteca zlib, pois o pdf a utiliza para essa biblioteca para a compressão de dados, além dos metadados dos arquivos. Porém, foi encontrado uma assinatura de JPG (posição 0x90F6) e dois PDF (0x21C3C e 0x2F37D).
Agora, vamos fazer a extração de todos os arquivos para não perder muito tempo e depois da extração, localizar os arquivos.
$ binwalk --dd='.*' Trabalho.pdf
Após os arquivos extraídos, vamos separar os arquivos com os nomes das posições onde foram encontrados, com exceção da posição “0” pois já sabendo que é o arquivo que conseguirmos ver normalmente.
90F6 = Imagem JPG
21C3C = Primeiro PDF
2F37D = Segundo PDF
Utilizando um editor hexadecimal, e olhando essas posições indicadas pela aplicação, podemos extrair os blocos e verificar os arquivos. A extração será feita nas assinaturas seguintes. Assim como o anterior, a primeira assinatura identificada foi depois do PDF visível foi o JPG, vamos selecionar o bloco entre o início do suposto JPG (0x90F6) e o início do segundo PDF (0x21C3C), logo em seguida vamos do início do segundo PDF até o começo do terceiro PDF (0x2F37D) e esse vai até o final do arquivo.
O resultado nos dois casos será o mesmo:
Em um arquivo PDF havia uma imagem e mais 2 PDFs “escondidos” dentro dele. Isso tudo foi possível observando os números mágicos que haviam no arquivo “principal”
Como disse inicialmente, a ideia deste post é apresentar mais uma ferramenta para análises forenses. Em alguns dos exemplos mostrados, existem softwares que nos exibem as informações mais legíveis e mais rápido, como é o caso do ID3 Tag, onde há vários leitores como o PoodleTag. Mas o binwalk também pode ser usado justamente para confirmar esses dados dos outros aplicativos. A combinação “binwalk + editor hexadecimal” podem nos trazer muitos resultados positivos nas mãos de bons peritos forense.
https://tools.kali.org/forensics/binwalk
https://github.com/ReFirmLabs/binwalk/wiki/quick-start-guide
https://securityonline.info/introduction-to-binwalk-firmware-analysis-tool/
Ao Som de: Criolo – Não Existe Amor em SP