Master File Table

MFT

Nejvýznamnějším zdrojem cenných informací pro analytika ze souborového systému NTFS je hlavní tabulka souborů (MFT). Umístění počátečního sektoru MFT lze nalézt v zaváděcím sektoru disku a každý soubor a adresář ve svazku má v MFT svůj záznam. Každá položka MFT má velikost 1024 bajtů, což umožňuje velmi snadnou analýzu MFT. Každý záznam MFT neboli položka začíná ASCII řetězcem „FILE“ (pokud je v položce chyba, začíná „BAAD“) a skládá se z jednoho nebo více (nejčastěji více) atributů, z nichž každý má vlastní identifikátor a strukturu. Obrázek 4.1 znázorňuje část položky MFT.

Obrázek 4.1. Výňatek ze záznamu MFT neboli položky.

Prvních 42 bajtů každé položky MFT tvoří struktura záhlaví s 12 prvky a zbývajících 982 bajtů závisí z velké části na hodnotách v záhlaví a různých atributech obsažených v položce. Ne všechny prvky v záhlaví záznamu MFT jsou pro forenzního analytika okamžitě užitečné, nicméně obrázek 4.2 ilustruje pět prvků, které jsou okamžitě užitečné.

Obrázek 4.2. Prvky záhlaví záznamu MFT (v malém endiánském pořadí).

Podle obrázku 4.2 (který je částí vyjmutou z obrázku 4.1) vidíme na začátku záznamu signaturu „FILE“. Dále vidíme pořadové číslo nebo hodnotu, která se zvyšuje, když je záznam alokován nebo odalokován. Protože tento konkrétní záznam MFT je ve skutečnosti prvním záznamem v rámci MFT a odkazuje na soubor „$MFT“, je logické, že pořadové číslo je 1. Následuje počet odkazů, který odkazuje na počet adresářů, které mají záznamy pro tento záznam (pevné odkazy způsobují inkrementaci této hodnoty). Dále je to offset se záznamem na první atribut; pokud se podíváte na offset 0x38 v rámci záznamu, uvidíte, že první atribut má identifikátor 0x10, tedy 16. Nakonec vidíme hodnotu flags, která nám říká, zda je záznam alokován (pokud je nastaven bit 0x01) a zda je záznam adresářem (pokud je nastaven bit 0x02). Stručně řečeno, z těchto dvou hodnot můžeme určit, zda je položka alokována nebo smazána a zda se jedná o soubor nebo adresář. Při parsování hlavičky lze pseudokód pro tento účel znázornit takto:

if ($mft{flags} & 0x0001) – alokováno; jinak nealokováno/smazáno

if ($mft{flags} & 0x0002) – složka/adresář; jinak soubor

Hodnota flags viditelná na obrázku 4.2 je „0x01“, což znamená alokovaný soubor. Hodnota 0x00 by označovala smazaný soubor a hodnota 0x03 by označovala přidělený adresář.

Tip

Záznamy MFT

Záznamy MFT se po vytvoření nemažou; nové záznamy se do MFT přidávají podle potřeby a záznamy pro smazané soubory se používají znovu.

Jak již bylo uvedeno, strukturováno je pouze prvních 42 bajtů; poté je zbytek záznamu MFT tvořen jedním nebo více atributovými poli. Neexistuje žádná formální specifikace nebo prohlášení, které by říkalo, že v záznamu MFT musí být konkrétní atributy, ale většinou lze očekávat, že ve většině záznamů MFT najdete atribut $STANDARD_INFORMATION a $FILE_NAME. Tato část se zabývá těmito dvěma atributy, protože poskytují informace o časovém razítku, které jsou cenné pro forenzní analytiky. Krátce se také podíváme na atribut $DATA a zbývající atributy ponecháme jako cvičení pro zainteresované a zvídavé čtenáře.

Záhlaví každého atributu obsahuje 16bajtovou hlavičku, která mimo jiné identifikuje typ atributu, celkovou délku atributu a to, zda je atribut rezidentní pro záznam MFT, či nikoli.

Poznámka

MFT Metadatové soubory

Prvních 16 položek MFT obsahuje informace o metadatových souborech; nemusí však být všechny použity. Ty, které nejsou použity, jsou ponechány v alokovaném stavu a obsahují pouze základní informace.

Pomocí těchto informací v záhlaví můžeme rozebrat položku MFT a získat cenné informace z jednotlivých atributů. Například atribut $STANDARD_INFORMATION (který je vždy rezidentní) existuje pro každou položku souboru a adresáře a má identifikátor 0x10 (tj. 16). Tento atribut obsahuje časy souboru pro položku MFT (tedy alespoň tři z nich), které vidíme, když na příkazový řádek zadáme „dir“; čas změny, čas posledního přístupu a datum vytvoření (narození) souboru nebo adresáře, označované také jako časy „MAC“. Atribut obsahuje čtvrtou časovou hodnotu, která udává, kdy byl záznam MFT naposledy změněn. Všechny tyto časy dohromady se označují jako časy „MACE“ (s písmenem „E“ označujícím čas změny položky MFT) nebo „MACB“ (s písmenem „C“ označujícím čas změny položky MFT).

Upozornění

Časy souborů

Časy souborů NTFS se zaznamenávají ve formátu UTC (Universal Coordinated Time), který je obdobou greenwichského času. To platí pro všechny časy; v každém záznamu MFT bude mít záznam souboru pravděpodobně přiřazeno alespoň 8 časů; mnohokrát 12 nebo více. V souborovém systému FAT jsou časy souborů udržovány ve formátu místního systémového času.

Atribut $FILE_NAME (identifikátor 0x30 nebo 48) se také nachází u většiny záznamů MFT o souborech a adresářích; ve skutečnosti bude mít mnoho záznamů MFT více než jeden atribut $FILE_NAME. Stejně jako atribut $STANDARD_INFORMATION je tento atribut vždy rezidentní a obsahuje také čtyři časové hodnoty; tyto časové hodnoty se však obvykle nastavují při vytváření souboru v systému. Na rozdíl od časů souborů v atributu $STANDARD_INFORMATION nejsou tyto časy souborů ovlivněny běžnou činností systému ani škodlivými zásahy, a proto je lze použít k určení indikátorů škodlivé činnosti a lze podniknout kroky k zastření času, kdy byl systém infikován. Následující ukázka kódu (funkce parseSIAttr()) poskytuje příklad, jak lze analyzovat atribut $STANDARD_INFORMATION:

sub parseSIAttr {

my $si = shift;

my %si;

my ($type,$len,$res,$name_len,$name_ofs,$flags,$id,$sz_content,$ofs_content)

= unpack(„VVCCvvvVv“,substr($si,0,22));

my $content = substr($si,$ofs_content,$sz_content);

my ($t0,$t1) = unpack(„VV“,substr($content,0,8));

$si{c_time} = getTime($t0,$t1);

my ($t0,$t1) = unpack(„VV“,substr($content,8,8));

$si{m_time} = getTime($t0,$t1);

my ($t0,$t1) = unpack(„VV“,substr($content,16,8));

$si{mft_m_time} = getTime($t0,$t1);

my ($t0,$t1) = unpack(„VV“,substr($content,24,8));

$si{a_time} = getTime($t0,$t1);

$si{flags} = unpack(„V“,substr($content,32,4));

return %si;

}

Tip

GetTime

Funkce getTime(), kterou vidíme ve výpisu kódu pro právě uvedený atribut parseSIAttr(), se skládá z kódu vypůjčeného od Andrease Schustera, který převádí 64bitová časová razítka objektu FILETIME na 32bitový unixový čas, který lze dále převést na lidsky čitelný čas pomocí funkce gmtime() zabudované v Perlu. Tento kód vypadá následovně:

sub getTime($$) {

my $lo = shift;

my $hi = shift;

my $t;

if ($lo == 0 && $hi == 0) {

$t = 0;

} else {

$lo -= 0xd53e8000;

$hi -= 0x019db1de;

$t = int($hi*429.4967296 + $lo/1e7);

};

$t = 0 if ($t < 0);

return $t;

}

Tento kód je velmi užitečný pro analýzu a překlad libovolného objektu FILETIME, bez ohledu na to, odkud byl získán.

V běžném systému může mít mnoho záznamů MFT dva atributy $FILE_NAME: jeden pro uložení plného názvu souboru (nebo adresáře) a druhý pro uložení názvu souboru v systému DOS, 8.3 . Pokud se například soubor jmenuje „myreallylongfile.txt“, název souboru 8.3 se zobrazí jako „myreal~1.txt“. To je zachováno kvůli kompatibilitě se staršími souborovými systémy a systémy, které nepodporují dlouhé názvy souborů. V běžném systému Windows tedy není neobvyklé, že existuje řada záznamů MFT se dvěma atributy $FILE_NAME s téměř totožným obsahem. Následující ukázka kódu (funkce parseFNAttr()) uvádí příklad, jak lze analyzovat atribut $FILE_NAME ze záznamu MFT a extrahovat dostupná data:

sub parseFNAttr {

my $fn = shift;

my %fn;

my ($type,$len,$res,$name_len,$name_ofs,$flags,$id,$sz_content,$ofs_content)

= unpack(„VVCCvvvVv“,substr($fn,0,22));

my $content = substr($fn,$ofs_content,$sz_content);

$fn{parent_ref} = unpack(„V“,substr($content,0,4));

$fn{parent_seq} = unpack(„v“,substr($content,6,2));

my ($t0,$t1) = unpack(„VV“,substr($content,8,8));

$fn{c_time} = getTime($t0,$t1);

my ($t0,$t1) = unpack(„VV“,substr($content,16,8));

$fn{m_time} = getTime($t0,$t1);

my ($t0,$t1) = unpack(„VV“,substr($content,24,8));

$fn{mft_m_time} = getTime($t0,$t1);

my ($t0,$t1) = unpack(„VV“,substr($content,32,8));

$fn{a_time} = getTime($t0,$t1);

$fn{flags} = unpack(„V“,substr($content,56,4));

$fn{len_name} = unpack(„C“,substr($content,64,1));

$fn{název} = unpack(„C“,substr($content,65,1));

$fn{len_name} = $fn{len_name} * 2 if ($fn{namespace} > 0);

$fn{name} = substr($content,66,$fn{len_name});

$fn{name} = cleanStr($fn{name}) if ($fn{namespace} > 0);

$fn{jméno} =~ s/\x0c/\x2e/g;

$fn{jméno} =~ s///g;

return %fn;

}

Posledním atributem, který probereme, je atribut $DATA (identifikátor 0x80, neboli 128). Tento atribut obsahuje skutečný obsah souboru nebo na něj odkazuje. Pokud není v hlavičce atributu nastaven příznak nerezidentní, pak je obsah souboru rezidentní v atributu $DATA záznamu MFT, který následuje za hlavičkou a dvěma dalšími strukturami. To obecně platí například pro krátké textové soubory nebo jiné soubory menší než 700 bajtů. Pokud data nejsou rezidentní, je třeba přeložit „běhy dat“ neboli místa, kde se data na disku nacházejí.

Příklad kódu pro analýzu běhů dat atributu $DATA je velmi složitý a není zde uveden. Podobně kód pro extrakci informací z rezidentních atributů $DATA je triviální a spočívá v parsování některých dodatečných informací (velikost obsahu a offset k obsahu) za hlavičkou atributu.

Některé open source nástroje jsou k dispozici pro parsování MFT (konkrétně atributů $STANDARD_INFORMATION a $FILE_NAME) a zpřístupnění časových razítek analytikovi. Jedním z nich je skript analyzemft.py v jazyce Python od Davida Kováře, který lze nalézt na webu na adrese http://www.integriography.com/projects/analyzeMFT. Dalším je skript mft.pl v jazyce Perl, z něhož byly extrahovány funkce parseSIAttr() a parseFNAttr(), který je k dispozici v projektu WinForensicAnalysis Google Code, který se nachází na webu na adrese http://code.google.com/p/winforensicaanalysis.

Nástroje „The SleuthKit“ (TSK) Briana Carriera jsou pravděpodobně nejznámějšími nástroji pro shromažďování široké škály informací o souborovém systému a metadatech souborového systému ze získaných obrazů a dokonce i z živých systémů. Například pro shromáždění výpisu časů souborů s atributy souborového systému $STANDARD_INFORMATION ze získaného obrazu může analytik použít příkaz podobný následujícímu:

C:\tsk>fls -f ntfs -m C:/ -p -r G:\case\xp.img > G:\case\files\bodyfile.txt

Tento příkaz vytvoří takzvaný „bodyfile“, což je přechodný formát souboru používaný k uložení těchto informací před jejich převedením na časovou osu činnosti souborového systému. V některých případech může analytik potřebovat přidat přepínač „-o“, aby zjistil offset oddílu, který se v živém systému objevil jako jednotka „C:\“; tuto informaci o offsetu lze zjistit ručně pomocí hexadecimálního editoru nebo pomocí mmls.exe.

Analytik může tytéž informace shromáždit také z živého, vzdáleného systému pomocí F-Response. Pokud se analytik řádně připojil ke vzdálenému systému a připojil systémovou jednotku C:\ jako F:\ ve svém vlastním systému, může pak použít příkaz podobný následujícímu, aby shromáždil časy souborů s atributem $STANDARD_INFORMATION pro soubory v oddílu C:\:

C:\tsk>fls -f ntfs -m C:/ -p -r \\.\F: > g:\case\files\bodyfile.txt

Kompletní sadu nástrojů TSK spolu s dokumentací a informacemi o použití naleznete na webu SleuthKit, http://www.sleuthkit.org.

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.