sexta-feira, 8 de fevereiro de 2008

Imagens Forenses III

Montando a Imagem para Análise


RAW


A imagem raw é aquela que é a cópia bit a bit do disco, e não possui qualquer compactação ou metadados. Para montá-la, usamos o loopback do linux. Entretanto, não temos como montar uma imagem raw física, pois o loopback só monta uma partição, e não consegue entender a tabela de partições que está logo nos setores iniciais de uma imagem raw.


Montando uma imagem raw lógica


Uma imagem raw lógica é aquela onde foi especificado uma partição específica no momento da aquisição. Vamos supor que um HD listado como /dev/hda possua 3 partições, e que na aquisição você tenha indicado como origem o /dev/hda2. O resultado disso é uma imagem raw da segunda partição desse HD. Veja:

# file imagem.dd

imagem.dd: x86 boot sector, code offset 0x78, OEM-ID "MSDOS5.0", sectors/cluster 32, root entries 512, Media Descriptor 0xf8, (... continua ...), unlabeled, FAT (16 bit)


A tentativa de ver a geometria do dispositivo através do comando sfdisk não gera resultados (os valores são todos confusos).


Para montar uma imagem raw lógica, use o comando mount. A partir do mesmo diretório onde está a imagem, execute:


# mount -o ro,loop,noexec imagem.dd /media/img

onde:

-o ro -> Monta a imagem read-only
loop -> usa o loopback - mecanismo que torna possível montar um arquivo como um dispositivo
noexec -> nenhum código executável contido na imagem pode ser acionado/executado.
imagem.dd -> é a imagem raw de uma partição.
/media/img -> é um diretório existente que serve de mounting point. Isso significa que a raiz da partição que a imagem contém vai aparecer em /media/img.


Montando uma imagem física


Uma imagem física não é montada pelo loopback. O que é feito, na verdade, é montar partições que estão em uma imagem física.
A primeira coisa a ser feita é conhecer a geometria do dispositivo (imagem). Faça isso com o comando sfdisk:


# sfdisk -luS imagem.dd


Esse comando vai informar a estrutura do dispositivo/imagem. Usando a imagem do meu pendrive como exemplo, obtemos:

bla bla bla ...
Units = sectors of 512 bytes, counting from 0


Device boot Start End #sectors Id System
imagem.dd1 * 32 1712127 1712096 6 FAT16
imagem.dd2 0 --- 0 0 Empty
imagem.dd3 0 --- 0 0 Empty
imagem.dd4 0 --- 0 0 Empty



Essa resposta nos mostra que essa imagem é uma imagem raw física de um dispositivo que tem apenas uma partição iniciando no setor 32, e que é uma partição FAT16. Repare que, se a partição inicia no setor 32, então os primeiros 32 setores (de 0 a 31) não fazem parte dessa partição (é onde a tabela de partições fica, nesse caso aqui) e ela não pode ser montada com o loopback. Isso significa 32*512 = 16384 bytes que devem ser "descartados" ou pulados para que consigamos montar a partição.


Método 1:


# dd if=imagem.dd of=imagem.part1.dd bs=512 skip=32


O comando acima pega a imagem física e copia ela para o arquivo imagem.part1.dd, indicando que o bloco tem 512 bytes e que a cópia deve pular os primeiros 32 blocos. Ou seja, o arquivo imagem.part1.dd é uma imagem raw que só tem a partição 1. Para montá-la, basta seguir o método indicado mais acima.

Esse método é fácil, mas não é prático, na medida em que exige espaço extra para ter uma partição inteira sendo disponibilizada (e duplicada, de certa forma).

Método 2



# mount -o ro,loop,noexec,offset=16384 imagem.dd /media/img


Repare que o comando é quase o mesmo. A diferença é que agora especificamos a quantidade de bytes que precisam ser desconsiderados para que a imagem possa ser montada corretamente.


Lembrete importante: O offset indicado é em BYTES. Sempre verifique a saída do comando sfdisk -luS, para saber qual o tamanho em bytes de cada setor e quantos setores tem que ser pulados.


O que fazer se nossa imagem física tem 3 partições e, digamos, queremos montar a partição 2 ???


Muito simples: Ache, através do comando sfdisk -luS qual o setor de início da partição que se deseja montar, e a quantidade de bytes em um setor. Para montar, execute o comando acima, especificando no offset o valor em bytes a ser "pulado".


Offset em bytes = (Setor onde a partição inicia - start) * (tamanho em bytes de cada setor)

Imagens divididas (split)

Por enquanto, não vou comentar sobre como montar imagens divididas (split). Conheço dois métodos de fazê-lo; um deles funciona, mas é ineficiente. O outro tem um pré-requisito do qual ainda não falei. Vamos discutir ambos em breve.

No próximo artigo, veremos como montar imagens no formato Expert Witness (ewf ou E01).

Até o próximo post !

4 comentários:

Unknown disse...

Caro Tony Rodrigues,

gostaria mais uma vez, dentro possível, uma ajudinha.
Estou tentando fazer a imagem de uma partição de um computador que está instalado o WinXP(NTFS) e restaurá-la em um notebook, que tem o ubuntu instalado, com partição FAT32;
vou explicar melhor:
para fazer a imagem da partição estou fazendo uso do netcat:

No notebook eu faço o comando:
$ netcat -l -p 7000 > /medi/disk/midia.dd
Obs: neste notebook eu tenho instalado o Ubuntu 8.04; tenho 2 partições = 1 ext3(do ubuntu) e outra de 10GB(FAT32), essa de 10GB que é o /media/disk.

No computador que estou capturando a imagem eu faço o seguinte comando:
sudo dd if/dev/sda5 | nc 192.168.10.10 7000
Obs: essa partição sda5 está formatada com NTFS(onde está instalada o WINxp).

Acredito que a cópia é feita de forma correta, eu visualizo o arquivo midia.dd, a falha está justamente na hora de restaurar. eu faço o seguinte comando para tentar restaurar:
mount -o ro,loop,noexec midia.dd /media/disk
ou
mount -o ro,loop,noexec midia.dd /mnt/teste
Obs: no segundo caso mudei apenas o local para ver se era por que no primeiro caso eu tenho uma partição do tipo FAT32, no segundo caso, como é no local onde está instalado meu Ubuntu, eu tenho uma partição tipo Ext3, mas mesmo assim deu esse erro, que está aqui em baixo:(isso nos dois casos).


Failed to read last sector (20482811): Argumento inválido
Perhaps the volume is a RAID/LDM but it wasn't setup yet, or the
wrong device was used, or the partition table is incorrect.
Failed to mount '/dev/loop1': Argumento inválido
The device '/dev/loop1' doesn't have a valid NTFS.
Maybe you selected the wrong device? Or the whole disk instead of a
partition (e.g. /dev/hda, not /dev/hda1)? Or the other way around?

Gostaria de saber de você que tipo de erro eu possa está cometendo.

Desde já agradeço,

Sarto Jr.

Tony Rodrigues disse...

Sato,

O seu problema acontece quando vc vai montar a sua imagem. Pelo que entendi, vc tem um arquivo-imagem que foi capturado de um sistema NTFS. para fazer a montagem desse cara, vc precisa:
- criar um diretorio (vc já criou o /mnt/teste)
- Eu costumo, para ficar mais claro, fazer um cd /media/disk, para estar no exato local do arquivo de imagem (.dd)
- monte-o read-only usando: mount midia.dd /mnt/teste -o ro,loop

Para isso não funcionar, algumas hipóteses:

- O seu arquivo .dd não está com uma partição NTFS válida. Teste isso com alguns comandos Linux ou do Sleuthkit
- Você não tem instalado no seu Ubunto corretamente o loop device ou o módulo que permite montar o NTFS. Eu testaria essa hipótese dando boot no notebook pelo CD com o Helix, e montando os devices a partir dele. Se funcionar, é isso. Senão, a primeira opção precisa ser checada.

Esse é o mesmo HD que estava dando aqueles erros ? Uma terceira opção, caso seja esse, seria o erro estar exatamente em um ponto onde a informação original definia alguma estrutura fundamental para a partição.

Veja se alguma dessas hipóteses procedem.

[]s

Unknown disse...

Rapaz estou com o mesmo problema, tinha 2 HD de 80G parado em casa aí comprei um case, qnd coloquei um de cada vez o primeiro blz, se conectou automaticamente e deu para recuperar o backup(neste tinha o xp e uns arquivos) agora o segundo hd nada de conectar, ficava aparecendo este mesmo aviso e pronto daí não saia, vc solucionou seu problema?

Failed to read last sector (20482811): Argumento inválido
Perhaps the volume is a RAID/LDM but it wasn't setup yet, or the
wrong device was used, or the partition table is incorrect.
Failed to mount '/dev/loop1': Argumento inválido
The device '/dev/loop1' doesn't have a valid NTFS.
Maybe you selected the wrong device? Or the whole disk instead of a
partition (e.g. /dev/hda, not /dev/hda1)? Or the other way around?

Tony Rodrigues disse...

Muito bom voltarmos a esse ponto. E aí, Sato, vc chegou a alguma conclusão ?

[]s

Tony