NTFS – MFT

Jak wskazałem w poprzednim artykule, Master File Table (MFT) jest podstawową strukturą NTFS, a pozostałe elementy mają charakter może często niezbędny ale  pomocniczy.

MFT to w praktyce jedna duża tabela zawierająca wpis dla każdego pliku (w tym przypadku rozumiemy przez to także foldery) na dysku. Wpis dla każdego pliku ma długość 1 KB czyli 1024 bajtów. We wpisie tym znajdziemy metadane pliku takie jak:

  • nazwę pliku,
  • czasy modyfikacji, utworzenia, dostępu,
  • rozmiar pliku
  • atrybuty (ukryty, tylko do odczytu,  plik systemowy, plik do archiwizacji) – atrybut w tym rozumieniu ma inne znaczenie niż atrybuty rekordu MFT, które omawiam poniżej.

Większość tego co widzimy przeglądając właściwości pliku w Eksploratorze Windows pochodzi z MFT. W przypadku mniejszych plików, o wielkości poniżej około 700 bajtów, nawet zawartość pliku przechowywana jest bezpośrednio w MFT.

Przyjrzyjmy się bliżej strukturze MFT. Rekord dla każdego kolejnego pliku zaczyna się od ciągu ASCII “FILE0”. Łatwo jest więc to wypatrzyć w edytorze binarnym. Zawartość bliku zaczyna się od FILE0 i co 1024 bajty, zobaczymy kolejne FILE0. Jeżeli na woluminie znajduje się 100.000 plików, to w MFT znajdziemy co najmniej 100.000 takich wpisów, a wielkość pliku MFT przekroczy 100 MB.

Przypomnę tutaj, że w przypadku NTFS wszystko jest plikiem i również foldery posiadają swój wpis w MFT. Nie dlatego jednak użyłem wcześniej słów “co najmniej”. Wpisów będzie zwykle więcej niż plików i folderów na dysku głównie z tego względu, że wpisy usuniętych plików nie są usuwane automatycznie. O tym więcej w artykule o odzyskiwaniu danych.

Wracając do MFT, każdy kilobajtowy wpis składa się z nagłówka i z około kilkunastu atrybutów. Każdy atrybut z kolei składa się z nagłówka i zawartości. Rekord MFT wygląda więc tak:

  • Nagłówek MFT
  • Atrybut 1 nagłowek
  • Atrybut 1 zawartość
  • Atrybut 2 nagłówek
  • Atrybut 2 zawartość
  • Atrybut 3 nagłówek
  • Atrybut 3 zawartość
  • Pozostałe atrybuty…
  • Wolna pozostała przestrzeń

Nagłówek atrybutu zawiera jego rozmiar, typ, nazwę oraz czy jest on rezydentny czy nierezydentny:

  • Rezydentny – nagłówek i zawartość znajdują się w rekordzie MFT
  • Nierezydentny – tylko nagłówek znajduję się w rekordzie MFT. Zawartość się nie zmieściła i została umieszczona w klastrach na dysku.

Na przykład zawartość pliku jest również atrybutem. Jeżeli plik jest nie większy od około 700 bajtów, zawartość jest atrybutem rezydentnym. Jeżeli plik jest większy niż 700 bajtów, zawartość jest atrybutem nierezydentnym, przechowywanym w ciągu klastrów na dysku.

Atrybuty, które warto znać:

  • $STANDARD_INFORMATION – w tym atrybucie zawarte są podstawowe informacje o pliku. Spora część właściwości pliku widzianych w Eksploratorze Windows zaczerpniętych jest  właśnie z tego atrybutu – 4 czasy (utworzenia, modyfikacji, dostępu oraz modyfikacji rekordu), właściciel pliku oraz identyfikator bezpieczeństwa.
  • $FILE_NAME – zawiera nazwę pliku oraz ponownie 4 czasy, tym razem nieudokumentowane i niewidoczne z punktu widzenia użytkownika. Czasy są teoretycznie związane ze zmianą nazwy pliku, jednak ich działanie nie zawsze jest przewidywalne.
  • $DATA – zawiera właściwą zawartość pliku, czyli to co w danym pliku się znajduje. W pliku tekstowym będzie to tekst, w pliku exe dane binarne. To ten atrybut jest najczęściej nierezydentny. Alternate Data Stream (ADS) to właśnie sytuacja kiedy dany plik posiada dwa atrybuty $DATA.
  • $INDEX_ROOT – jeżeli dany rekord należy do folderu (katalogu), atrybut ten będzie zawierał indeks tego folderu (czyli “listę” wszystkich plików i folderów  w nim zawartych). Tylko bezpośrednia zawartość, bez obiektów z sub-folderów.
  • $INDEX_ALLOCATION – $INDEX_ROOT ma niedużą pojemność. W przypadku folderów z większą liczbą obiektów, indeks jest kontynuowany w atrybucie $INDEX_ALLOCATION. To drugi najczęściej spotykany atrybut nierezydentny. Jest on również dosyć przydatny przy odzyskiwaniu danych.

Jakich narzędzi użyć aby to wszystko zobaczyć?

Oczywiście kombajny informatyki śledczej – FTK, Encase i Xways.

Przy braku powyższych opcji darmowy FTK imager pozwoli zobaczyć $MFT i wyeksportować go do pliku. Wyeksportowany plik będzie można przetworzyć za pomocą skryptu analyzeMFT napisanego w Pythonie Davida Kovara.

Również Sleuth Kit doskonale rozumie struktury NTFS i pozwala na ich bezpośrednią analizę.