Recuperando arquivos apagados no Linux – Ext3

Este tutorial não é de minha, foi incorporado na integra da url de fonte.

Primeiramente, criamos uma imagem :

# dd if=/dev/zero of=linux.iso bs=1024 count=100000

Depois disso, formatamos ela como ext3:

# mkfs.ext3 linux.iso

Responda y, a pergunta, caso seja feita alguma.
Agora, criaremos um lugar para montarmos a imagem :

# mkdir /media/forense

Agora montaremos a imagem nesse diretórios que acabamos de criar.

# mount -o loop linux.iso /media/forense

Com isso a imagem deverá estar montada, e ao acessar esse diretório, veremos uma pasta chamada lost+found

# cd /media/forense && ls -la

Se você está vendo lost+found, é sinal que está no caminho certo.
Agora criaremos alguns arquivos. Você pode usar por exemplo o nano ( editor de textos ). Crie os arquivos : naoapagar.txt, seraapagado.txt, cobaia.txt, etc… Coloque algum texto nos arquivos, para que você possa identificá-lo mais tarde.
Apague o arquivo : seraapagado.txt

# rm seraapagado.txt

Feito isso, volte para onde estava e desmonte o /media/forense. Por exemplo :

# cd /root && umount /media/forense

Feito isso, teremos um “sistema” pronto para ser explorado.
Façamos o seguinte :

# debugfs -w linux.iso

Com isso entraremos no modo de debug do filesystem. No prompt irá aparecer algo semelhante a isto:

# debugfs -w linux.iso

debugfs 1.41.12 (17-May-2010)
debugfs :

Para sabermos qual arquivo foi deletado faça :

# ls -d

Nos meus testes, os arquivos apareceram dessa forma :

11 (12) . 2 (12) .. 12 (52) naoseraapagado.txt
<13> (24) seraapagado.txt 14 (948) cobaia.txt

Veja que o arquivo que foi apagado é justamente o arquivo que está diferente, começando pelo inode <13>, o número entre <> significa nesse caso que ele foi apagado. Podemos obter mais detalhes sobre esse arquivo fazendo o seguinte :

# stat <13>

A saída desse comando vai resultar em :

Inode: 13 Type: regular Mode: 0644 Flags: 0×0
Generation: 3864096146 Version: 0×00000000
User: 0 Group: 0 Size: 0
File ACL: 0 Directory ACL: 0
Links: 0 Blockcount: 0
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x4cdb2a17 — Wed Nov 10 21:26:15 2010
atime: 0x4cdb2a04 — Wed Nov 10 21:25:56 2010
mtime: 0x4cdb2a17 — Wed Nov 10 21:26:15 2010
dtime: 0x4cdb2a17 — Wed Nov 10 21:26:15 2010

BLOCKS:

Ótimo, agora temos bastante informações sobre o arquivo. Faremos agora o seguinte :

# dump_unused

Esse comando vai mostrar os blocos não utilizados, nos meus testes ficaram assim :
Unused block 6145 contains non-zero data:

Sera apagado
Bem, agora sabemos qual o bloco em que o arquivo apagado se encontra. E aí que entra a mágica. Faremos o seguinte comando :

# mi <14>

O mi <14>, vai modificar o inode do arquivo 14, então continuando com o comando acima teremos :

debugfs: mi <14>
Mode [0100644]
User ID [0]
Group ID [0]
Size [15]
Creation time [1289431571]
Modification time [1289431571]
Access time [1289431571]
Deletion time [0]
Link count [1]
Block count high [0]
Block count [2]
File flags [0x0]
Generation [0xe6516d93]
File acl [0]
High 32bits of size [0]
Fragment address [0]
Direct Block #0 [6657] 6145
Direct Block #1 [0] 6146
Direct Block #2 [0]
Direct Block #3 [0]
Direct Block #4 [0]
Direct Block #5 [0]
Direct Block #6 [0]
Direct Block #7 [0]
Direct Block #8 [0]
Direct Block #9 [0]
Direct Block #10 [0]
Direct Block #11 [0]
Indirect Block [0]
Double Indirect Block [0]
Triple Indirect Block [0]

O que fizemos acima ? Explico.

Pegamos o arquivo cobaia.txt emprestado, e usamos o mi para modifica-lo. Sabíamos que o número do bloco seria o 6145, porque pegamos esse número no dump_unused, e como o arquivo era pequeno, “chutamos” o próximo bloco, com isso obteremos o seguinte

resultado:

debugfs: cat <14>

Sera apagado
Veja que conseguimos voltar com o conteúdo do arquivo apagado, simplesmente modificando os Direct Blocks #0 e #1

Agora que sabemos que o arquivo está legível via cat, podemos providenciar a gravação em alguma parte do disco, com por exemplo no /tmp. Então fazemos :
debugfs: dump <14> /tmp/recuperado.txt

debugfs: q

Pronto, com isso você deve ter saido do debugfs, e retornado ao shell. Agora basta proceder da seguinte forma :

# cat /tmp/recuperado.txt

Sendo assim você verá o conteúdo do arquivo.
Bem, não me aprofundarei muito na parte técnica da coisa.
Espero que tenham gostado. E qualquer dúvida ou se acharem algum erro, basta comentar no blog do autor, link da fonte.

Fonte: http://www.gustavoroberto.blog.br/2010/11/10/recuperando-arquivos-apagados-no-linux-ext3/

Comentários