Recuperando um arquivo no ext3

3

Este é, na verdade, um jogo ctf: a prática do Enigma 2017 no hackcenter.com Temos que recuperar um arquivo deletado no ext3. Estou seguindo este tutorial .

O inode é 1036. istat dá o grupo 0

fsstat undelete.img
Group: 0:
  Inode Range: 1 - 1280
  ...
  Inode Table: 24 - 183
  ...

Daqui a tabela do nó tem um tamanho de 160 blocos, cada bloco tem 8 inodes. O inode 1036 está no bloco 153 e é a quarta entrada.

Isto é confirmado por

debugfs -R 'imap <1036>' undelete.img 
debugfs 1.43.4 (31-Jan-2017)
Inode 1036 is part of block group 0
    located at block 153, offset 0x0180

jls undelete.img | grep 153$
46: Unallocated FS Block 2153
206:    Unallocated FS Block 153
214:    Unallocated FS Block 153
224:    Unallocated FS Block 153
680:    Unallocated FS Block 4153


jcat undelete.img 8 206 | dd bs=128 skip=3 count=1 | xxd
1+0 records in
1+0 records out
00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
128 bytes copied, 0,00719467 s, 17,8 kB/s


jcat undelete.img 8 214 | dd bs=128 skip=3 count=1 | xxd
1+0 records in
1+0 records out
00000000: a481 0000 2000 0000 4d70 8b58 4d70 8b58  .... ...Mp.XMp.X
00000010: 4d70 8b58 0000 0000 0000 0100 0200 0000  Mp.X............
00000020: 0000 0000 0100 0000 ef08 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 17ea 60e7 0000 0000 0000 0000  ......'.........
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
128 bytes copied, 0,00714798 s, 17,9 kB/s


jcat undelete.img 8 224 | dd bs=128 skip=3 count=1 | xxd
1+0 records in
1+0 records out
00000000: a481 0000 0000 0000 4d70 8b58 4d70 8b58  ........Mp.XMp.X
00000010: 4d70 8b58 4d70 8b58 0000 0000 0000 0000  Mp.XMp.X........
00000020: 0000 0000 0100 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 17ea 60e7 0000 0000 0000 0000  ......'.........
128 bytes copied, 0,00556548 s, 23,0 kB/s
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................

O único ponteiro de bloco direto que eu tenho é 0x8ef no deslocamento 40 . O tamanho do bloco foi relatado por fsstat . Mas

dd bs=1024 skip=2287 count=1 if=undelete.img | xxd

fornece apenas zeros.

Eu não sei o que está errado.

    
por robert 17.06.2017 / 14:44

1 resposta

1

Você convenientemente esqueceu de mencionar a URL da imagem do sistema de arquivos, mas depois de se registrar no hackcenter.com não foi tão difícil de encontrar. (Eu não vou repetir a URL aqui).

Em vez de seguir cegamente uma receita, vamos ver a imagem e descobrir o que acontece. fls mostra que há muitos arquivos chamados filler-0 , filler-1 etc. até filler-1023 , depois há um arquivo key e que foi excluído.

Procurando por commits

jls undelete.img | grep Commit
...
228:    Unallocated Commit Block (seq: 9, sec: 1485533263.2387673088)
...

descobre que 9 é o último commit. Vamos ver o que acontece antes desse commit (anotei os números de bloco)

205:    Unallocated FS Block 3112
206:    Unallocated FS Block 153   # our inode
207:    Unallocated FS Block 3113  # data
208:    Unallocated FS Block 3114  # data
209:    Unallocated FS Block 3115  # data
210:    Unallocated Commit Block (seq: 7, sec: 1485533262.1970733056)
211:    Unallocated Descriptor Block (seq: 8)
212:    Unallocated FS Block 23    # inode bitmap
213:    Unallocated FS Block 2     # group desc
214:    Unallocated FS Block 153   # our inode blk
215:    Unallocated FS Block 24    # first inode blk
216:    Unallocated FS Block 5118
217:    Unallocated FS Block 22    # data bitmap
218:    Unallocated FS Block 3116  # data
219:    Unallocated Commit Block (seq: 8, sec: 1485533262.2227109888)
220:    Unallocated Descriptor Block (seq: 9)
221:    Unallocated FS Block 5118
222:    Unallocated FS Block 24    # first inode blk
223:    Unallocated FS Block 1     # super blk
224:    Unallocated FS Block 153   # our inode blk
225:    Unallocated FS Block 22    # data bitmap
226:    Unallocated FS Block 2     # group desc
227:    Unallocated FS Block 23    # inode bitmap
228:    Unallocated Commit Block (seq: 9, sec: 1485533263.2387673088)
229:    Unallocated FS Block Unknown

Então, no commit # 7, nosso bloco de inode e três blocos de dados foram escritos. No commit # 8, alguma alocação e toque de inode está acontecendo e um único bloco de dados é gravado. No commit # 9, é quase o mesmo, mas nenhum bloco de dados está escrito.

Então, o palpite é que no commit # 7, vemos o último dos nossos filler arquivos sendo criados, no commit # 8, key é criado e escrito, e no commit # 9, é deletado novamente. / p>

Agora vamos ver as cópias do bloco de inode 153 no diário. 224 (inode após deleção) e 206 (inode antes da criação) possuem uma lista vazia de apontadores de blocos diretos. Eu não sei o que aconteceu quando você olhou para o 214, mas eu entendo:

$ jcat undelete.img 8 214 | dd bs=128 skip=3 count=1 | xxd
00000000: a481 0000 2000 0000 4e70 8b58 4e70 8b58  .... ...Np.XNp.X
00000010: 4e70 8b58 0000 0000 0000 0100 0200 0000  Np.X............
00000020: 0000 0000 0100 0000 2c0c 0000 0000 0000  ........,.......
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 8682 a674 0000 0000 0000 0000  .......t........
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................

Portanto, na lista de bloqueio direto em 0x28 , temos um bloco em 0x0c2c ou 3116 , conforme adivinhado antes.

Vamos verificar que não estamos fora olhando para alguns conteúdos:

$ fcat filler-1022 undelete.img 
f1755813fae6d0f542f962f50ff37184
$ dd if=undelete.img bs=1024 skip=3114 count=1 2> /dev/null ; echo
f1755813fae6d0f542f962f50ff37184

$ fcat filler-1023 undelete.img 
aa08cba3462555833ffed443474bd133
$ dd if=undelete.img bs=1024 skip=3115 count=1 2> /dev/null ; echo
aa08cba3462555833ffed443474bd133

Sim, são os dados em filler escritos, conforme adivinhado. Então, o que está no bloco 3116 ? Acaba por ser apenas zeros, o que significa que o bloco nunca foi atualizado. Mas nós temos cópias no diário. No caso de nossos dois arquivos filler :

$ jcat undelete.img 208
f1755813fae6d0f542f962f50ff37184

$ jcat undelete.img 209
aa08cba3462555833ffed443474bd133

E agora, encontrar a chave deve ser fácil (não vou fazê-lo publicamente, por razões óbvias).

    
por 19.06.2017 / 23:26