Prefetch¶
Prefetch คืออะไร¶
ไฟล์ Windows Prefetch บันทึกข้อมูลที่ใช้เพื่อเพิ่มประสิทธิภาพการเริ่มต้นแอปพลิเคชัน ไฟล์ .pf เฉพาะของแต่ละโปรแกรม
โดยทั่วไปจะเก็บชื่อและแฮชของไฟล์ปฏิบัติการ จำนวนครั้งที่ทำงาน เวลาที่ทำงานล่าสุด ข้อมูลวอลุ่ม ไดเรกทอรี และไฟล์ที่ถูกอ้างอิง
ระหว่างการเริ่มต้น
สำหรับ Windows เวอร์ชันที่รองรับ เรคคอร์ด Prefetch ของแอปพลิเคชันที่ถูกต้องมักเป็นหลักฐานที่หนักแน่นว่า ไฟล์ปฏิบัติการนั้นได้ทำงานแล้ว และเป็นหนึ่งในอาร์ติแฟกต์การทำงานที่ไม่ใช่ event log ที่มีประโยชน์ที่สุด
ข้อสรุปที่ดีที่สุด: ไฟล์ปฏิบัติการที่ระบุชื่อถูกเรียกใช้ ณ เวลาที่ทำงานล่าสุดที่บันทึกไว้ ทั้งนี้ขึ้นอยู่กับพฤติกรรมของระบบปฏิบัติการและความถูกต้องของพาร์เซอร์
ตำแหน่งและการเก็บรวบรวม¶
Juntei รองรับรูปแบบเวอร์ชัน 17 ถึง 31 (Windows XP ถึง Windows 11) รวมถึงไฟล์ที่บีบอัดของ Windows 8 ขึ้นไป ให้เก็บรวบรวมทั้งไดเรกทอรีเพื่อให้สามารถเปรียบเทียบแฮชของชื่อไฟล์ปฏิบัติการและเรคคอร์ดข้างเคียงได้
ข้อควรระวังสำหรับนักวิเคราะห์¶
- Windows เวอร์ชันเก่าเก็บเวลาที่ทำงานในอดีตไว้เพียงค่าเดียว และเวอร์ชันใหม่เก็บได้สูงสุดแปดค่า
RunCountอาจมากกว่าจำนวน timestamp ที่มีอยู่ - Prefetch อาจถูกปิดใช้งาน ล้าง ยกเว้น หรือไม่มีอยู่ในบางระบบ/บทบาท การไม่มีอยู่ไม่ได้ พิสูจน์ว่าโปรแกรมไม่ได้ทำงาน
- รายการไฟล์ที่โหลดอธิบาย dependency และการเข้าถึงระหว่างการเริ่มต้น ไม่ได้พิสูจน์ว่าทุกไฟล์ในรายการ เป็นอันตราย ถูกเปิดโดยเจตนา หรือถูกอ่านทั้งหมด
- ชื่อไฟล์ปฏิบัติการในส่วนหัว Prefetch ถูกจำกัดความยาว Juntei จะหาพาธจากไฟล์ที่โหลด เมื่อสามารถระบุได้อย่างไม่กำกวม
- timestamp ในระบบไฟล์ของไฟล์ต้นทาง
.pfแยกจากเวลาที่ทำงานซึ่งฝังอยู่ในไฟล์ Findingsเป็นข้อสังเกตสำหรับการล่าภัยคุกคาม (hunting) ตัวติดตั้งและงานดูแลระบบที่ถูกต้องตามกฎหมายมักใช้พาธสำหรับพักไฟล์ (staging path)
วิเคราะห์ด้วย Juntei¶
Usage: juntei parse-file prefetch <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find *.pf files
-f, --file <FILE> Parse one Prefetch file
Records:
-T, --timeline Write one row per retained execution time, sorted by time
Output:
-o, --output <FILE> Save every record
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-file prefetch -d Prefetch/ -o prefetch.csv
juntei parse-file prefetch -d Prefetch/ -T -o prefetch-timeline.csv
juntei parse-file prefetch -d Prefetch/ -t jsonl \
| jq 'select(.ExecutableName? | test("powershell|rundll32"; "i"))'
ฟิลด์ CSV มาตรฐาน¶
| ฟิลด์ | การตีความ |
|---|---|
SourceFile |
ไฟล์ .pf อินพุต ให้เก็บไว้เพื่อแยกแยะโฮสต์และชื่อไฟล์ปฏิบัติการที่ซ้ำกัน |
ExecutableName |
ชื่อไฟล์ปฏิบัติการในส่วนหัว สำหรับการล่าภัยคุกคามส่วนใหญ่ไม่ต้องสนใจตัวพิมพ์เล็ก/ใหญ่ แต่ให้เก็บตัวสะกดเดิมไว้ |
ExecutablePath |
พาธที่โหลดซึ่ง Juntei หาได้ (ถ้าทำได้) ให้ยืนยันกับ Files และอาร์ติแฟกต์อื่น |
PathValidated |
พาธที่เลือกตรงกับแฮชพาธ SCCA เป็นการยืนยันพาธ ไม่ใช่เนื้อหาหรือความน่าเชื่อถือของไฟล์ |
PathAmbiguous |
ยังแยกพาธที่โหลดหลายตัวเลือกไม่ได้ จึงเก็บชื่อจากส่วนหัวใน ExecutablePath โปรดตรวจสอบ Files และหลักฐานอื่น |
PrefetchHash |
แฮชที่ Windows ใช้ในชื่อไฟล์ .pf ไม่ใช่แฮชเชิงวิทยาการเข้ารหัสของเนื้อหาไฟล์ |
FormatVersion |
เวอร์ชันโครงสร้าง Prefetch เป็นตัวกำหนดฟิลด์ที่มีและจำนวน timestamp |
RunCount |
ตัวนับสะสมที่ Windows บันทึกไว้ มีประโยชน์สำหรับความถี่ ไม่ใช่ประวัติที่แม่นยำ |
LastRun |
เวลาที่ทำงานล่าสุดที่เก็บไว้ |
PreviousRun1 … PreviousRun7 |
เวลาที่ทำงานก่อนหน้าที่เก็บไว้ เรียงจากใหม่ไปเก่า จะว่างหากรูปแบบ/ประวัติไม่มีค่าเหล่านี้ |
VolumeCount |
จำนวนวอลุ่มต้นทางที่บันทึกไว้ |
VolumeDevicePaths |
พาธอุปกรณ์ NT ของวอลุ่มที่ใช้ระหว่างการเริ่มต้น ให้เชื่อมโยงกับ serial |
VolumeSerialNumbers |
ตัวระบุวอลุ่ม มีประโยชน์สำหรับเชื่อมโยงหลักฐานของไดรฟ์แบบถอดได้หรือไดรฟ์ที่ถูกฟอร์แมตใหม่ |
VolumeCreated |
เวลาสร้างวอลุ่มที่บันทึกไว้ ไม่ใช่เวลาสร้างไฟล์ปฏิบัติการ |
DirectoryCount |
จำนวนสตริงไดเรกทอรีที่บันทึกไว้ |
FileCount |
จำนวนการอ้างอิงไฟล์ที่โหลดที่บันทึกไว้ |
Findings |
ข้อสังเกตของ Juntei เช่น ไบนารีระบบที่ถูกย้ายตำแหน่งหรือพาธการทำงานที่น่าสงสัย ให้ตรวจทานด้วยตนเอง |
Files |
ไฟล์ที่โหลด/ถูกอ้างอิงพร้อม NTFS reference (ถ้ามี) เป็นจุดเชื่อมโยง (pivot) ที่ยอดเยี่ยมสำหรับ DLL/พาธ แต่ไม่ใช่หลักฐานของเจตนาต่อไฟล์ |
Dir |
สตริงไดเรกทอรีที่เกี่ยวข้องกับการเริ่มต้น มีประโยชน์เมื่อพาธของไฟล์ที่โหลดแต่ละรายการไม่สมบูรณ์ |
ฟิลด์ CSV ของไทม์ไลน์ (-T)¶
| ฟิลด์ | การตีความ |
|---|---|
RunTime |
เวลาที่ทำงานหนึ่งค่าที่ Prefetch เก็บไว้ |
ExecutableName, ExecutablePath |
บริบทของตัวตน/พาธของโปรแกรม |
PathValidated |
พาธที่เลือกตรงกับแฮชพาธ SCCA เป็นการยืนยันพาธ ไม่ใช่เนื้อหาหรือความน่าเชื่อถือของไฟล์ |
PathAmbiguous |
ยังแยกพาธที่โหลดหลายตัวเลือกไม่ได้ จึงเก็บชื่อจากส่วนหัวใน ExecutablePath โปรดตรวจสอบ Files และหลักฐานอื่น |
PrefetchHash |
ใช้แยกแยะรูปแบบ/พาธที่ใช้ชื่อไฟล์ปฏิบัติการเดียวกัน |
RunCount |
ตัวนับจากไฟล์ Prefetch ซึ่งจะซ้ำอยู่ในทุกแถวของไทม์ไลน์ |
SourceFile |
ไฟล์ .pf ต้นทางสำหรับการตรวจสอบความถูกต้อง |
JSON/JSONL จะเก็บรักษาวอลุ่ม ไดเรกทอรี ไฟล์ที่โหลด และ NTFS file reference เป็นอาร์เรย์ที่มีโครงสร้าง แทนที่จะเป็นเซลล์ CSV ที่เชื่อมด้วยเครื่องหมายจุลภาค
กลยุทธ์การตรวจสอบ¶
- ใช้
-Tเพื่อเพิ่มการทำงานที่เก็บไว้ลงในไทม์ไลน์ - จัดกลุ่มตามชื่อไฟล์ปฏิบัติการร่วมกับแฮช Prefetch เพราะชื่อเดียวกันอาจมีพาธ/แฮชต่างกันได้
- ตรวจทาน
ExecutablePath, staging path, ข้อสังเกตเกี่ยวกับไบนารีระบบที่ถูกย้ายตำแหน่ง และ DLL ที่โหลด - จับคู่ MFT reference ของเป้าหมายและพาธไฟล์กับเรคคอร์ด
$MFT/USN - เชื่อมโยงเวลาที่ทำงานกับ event log, SRUM, ข้อมูล telemetry เครือข่าย, บริการ, งานตามกำหนดเวลา และอาร์ติแฟกต์ของผู้ใช้