Windows onsdag:
I dagens inlägg tar jag en stund för att diskutera Windows Prefetch. Men först en snabb plug för lite kommande utbildning:
Jag förbereder mig för närvarande för en kommande FOR508-klass med Chad Tillbury på SANS Security East 2017. Även om det börjar närma sig, ser vi fram emot en fantastisk klass och att hitta nästa team av dödliga kriminaltekniker! Om du ska delta, vänligen skriv till mig i förväg. Om du vill delta tror jag att registreringen fortfarande är öppen! Under evenemanget, onsdagen den 11 januari, kommer jag också att hålla ett SANS@Night-talk med titeln Zero In on the Artifacts That Matter. Förberedelserna inför det föredraget var inspirationen till dagens inlägg, eftersom prefetch säkert kommer att få ett omnämnande.
Jag har sagt det förut och jag säger det igen – många artefakter som vi älskar i DFIR-världen är i själva verket biprodukter av operativsystemet som försöker göra livet enklare och/eller effektivare för användaren eller utvecklarna. Enligt min mening faller prefetch också inom denna kategori.
Prefetch har funnits sedan Windows XP. Det var ursprungligen utformat för att hjälpa till att påskynda uppstarten av systemet och lanseringen av program. Målet med prefetch är att analysera och registrera programmens uppstartsbeteende vid utförandet för att göra framtida uppstarter effektivare. Dessa data registreras i upp till 10 sekunder efter programstarten. Det registrerade programbeteendet sparas i en spårningsfil – det vi kallar prefetch-fil – i sökvägen C:\Windows\Prefetch
.
Prefetch-filer
Som nämnts ovan finns prefetch-filer i den statiska katalogen C:\Windows\Prefetch
. Prefetch-filer har tillägget .pf
och följer en standardiserad namnkonvention:
<APPLICATION NAME IN ALL CAPS>-<EIGHT CHARACTER HASH OF APPLICATION LOCATION>.pf
Prefetch-filer innehåller följande metadata:
- Namnet på motsvarande körbar fil
- Antalet gånger som den körbara filen har körts
- Storleken på prefetchfilen
- Filer och kataloger som hänvisades till under programstarten (det är detta som Windows vill spåra)
- Information om volymen som den körbara filen ligger på, inklusive volymsökväg och serienummer.
Här är ett exempel på några prefetchfiler från min testvärd:
Bemärk att jag har flera program med samma namn, men med olika plats. Detta bevisas av de något liknande hashes, och i många applikationsfall är det sannolikt ett tecken på en programuppdatering eller en ändring av mappstrukturen.
EDIT: Tack till Eric Zimmerman för att han påminde mig om att prefetch-filnamnen också är beroende av kommandoradsargument och att de är skiftlägeskänsliga, trots avsaknaden av skiftlägeskänslighet i spårningsfilen. Hexacorn täcker hashing-algoritmen i detalj här, och jag rekommenderar att du kollar upp den om du behöver göra denna nivå av prefetch-analys.
Parsing the Prefetch File
Strukturen för Prefetch-filer är faktiskt ganska välkänd och det finns flera parsing-alternativ tillgängliga. Här är några alternativ:
- I värsta fall kan vi använda
strings
för att få lite information om prefetch-spårinformation. Här är ett exempel på uppräkning av Unicode-strängar från en misstänkt körbar fil:
- Eric Zimmerman underhåller sitt verktyg PECmd, för närvarande i version 0.7.2.0. Det kan laddas ner här.
- log2timeline/Plaso innehåller en prefetch parser och kan sätta nyckeldata från prefetchfilerna i ett tidslinjeformat.
- TZWorks publicerar också en riktigt hjälpsam och praktisk prefetch parser
pf
. Du kan se mer information om den här. Här är ett exempel på TZWorkspf
verktygsutgång:
Jag kommer att ta upp några av de kriminaltekniska artefakterna i denna utgång i nästa avsnitt, men lägg märke till hur vi nu får kontextuell information, utförda tider och viktiga tidsstämplar.
En annan viktig notering om parsning av prefetch-filer är att nyare prefetch-versioner, nämligen Windows 10, använder ett nytt komprimeringsformat som inte fungerar bra med parsers för tidigare versioner. Se till att ditt verktyg kan hantera Windows 10-artefakter – eller hitta ett nytt skript – innan du antar att filerna kan vara skadade.
Hur man använder i DFIR
DFIR-analytiker måste vara medvetna om prefetch eftersom den innehåller mycket forensiskt värde. Här är några sätt som jag har använt prefetch tidigare:
- Körningsantalet kan vara en viktig information om hur länge skadlig kod kan ha funnits på ett system eller hur ofta den används/användes. Om du bara har sett bevis för två utföranden av skadlig kod, men prefetch visar dussintals, finns det mer att gräva i.
- Tidsstämplarna i prefetch-filen berättar också volymer. Tänk på följande: Vad skapar en prefetch-fil och vad ändrar en prefetch-fil? Omvandla dessa åtgärder till tidsstämplar och vi kan fastställa följande: Skapandetidsstämpeln för en prefetch-fil är den första gången programmet kördes, och den senast ändrade tiden för en prefetch-fil är den sista gången den kördes. Låt oss titta igen på skärmdumpen från ovan:
Närma dig vår senaste körningstid (2012-04-04 00:43:06.137) och den modifierade tiden: (2012-04-04 00:43:07). Nu kan vi hoppas mycket snabbt genom Prefetch-filer, utan att behöva parsa, och hitta våra senaste exekveringstider.
Du kan använda tidsstämplarna på andra sätt också. Tänk till exempel på att visa skapelsetidsstämplarna för alla filer från Prefetch-mappen. Om vi har några tidsramar av intresse, eller prefetch-filer för känd skadlig kod, kan vi leta efter andra filer med tidsstämplar i nära tidsmässig närhet.
- När vi analyserar prefetch-filer, särskilt sådana som är relaterade till känd skadlig kod, kan vi ta en titt på de filer som mappas eller laddas. Du kan hitta ytterligare indikatorer.
- Och undersök dessutom de kataloger som mappas från prefetchfilen. Du kan hitta tecken på en extern enhet eller en tidigare partition.
- Se du flera prefetch-filer med olika hash i slutet av filen? Kom ihåg att hashen härleds från platsen – du kan ha skadlig kod på flera ställen.
- Slutningsvis får du inte glömma att Windows övervakar programstart i upp till 10 sekunder. Så även om vi kan förlita oss på våra tidsstämplar för prefetchfilen som ganska starka indikatorer måste vi ta hänsyn till den maximala fördröjningen på tio sekunder.
Genom att gå bortom prefetch
I Windows Vista och senare har Microsoft fortsatt att utöka prefetch med ytterligare funktioner som SuperFetch, ReadyBoost, ReadyBoot och ReadyDrive. Jag kommer att gräva i dessa funktioner i ett senare inlägg.
Till imorgon, Happy Forensicating!