Amcache¶
Amcache คืออะไร¶
Amcache คือบัญชีรายการด้านความเข้ากันได้ของแอปพลิเคชันของ Windows ที่จัดเก็บอยู่ในไฮฟ์รีจิสทรี ระบบรุ่นใหม่
บันทึกไฟล์ปฏิบัติการไว้ใต้ InventoryApplicationFile และอุปกรณ์ Plug-and-Play ไว้ใต้
InventoryDevicePnp ส่วน Windows รุ่นเก่าใช้โครงสร้างแบบเดิม Root\File
สำหรับการตรวจสอบไฟล์ปฏิบัติการ Amcache มีคุณค่าเพราะสามารถเก็บรักษาพาธเต็ม SHA-1 ขนาดไฟล์ เมทาดาทา PE ข้อมูลเวอร์ชัน ข้อความผู้เผยแพร่ (publisher) วันที่ลิงก์ และเวลาของรีจิสทรีไว้ได้ แม้ไฟล์ต้นฉบับจะหายไปแล้ว ระเบียนอุปกรณ์สามารถระบุฮาร์ดแวร์ที่เชื่อมต่อ ไดรเวอร์ วันที่ติดตั้ง และตัวระบุต่าง ๆ ได้
ข้อสรุปที่ดีที่สุด: Windows ได้ทำบัญชีรายการไฟล์หรืออุปกรณ์ที่บันทึกไว้ ระเบียนของไฟล์ปฏิบัติการเป็น หลักฐานการมีอยู่ ไม่ใช่ข้อพิสูจน์การเรียกใช้งาน
ตำแหน่งและการเก็บรวบรวม¶
เก็บไฮฟ์พร้อมไฟล์ที่อยู่ข้างกัน ได้แก่ Amcache.hve.LOG, .LOG1 และ .LOG2 เมื่อไฮฟ์อยู่ในสถานะ dirty คำสั่ง parse-registry amcache จะเล่นซ้ำบันทึกธุรกรรมที่ใช้งานได้ในหน่วยความจำก่อนวิเคราะห์โดยอัตโนมัติ โดยไม่แก้ไขหลักฐาน รายละเอียดการกู้คืนจะแสดงในบันทึกของตัวแยกวิเคราะห์หรือเทอร์มินัล หากส่งระเบียนไปยัง stdout ข้อความวินิจฉัยจะส่งไปยัง stderr บันทึกที่หายไปหรือใช้ไม่ได้อาจทำให้ระเบียนไม่ครบหรืออ่านไฮฟ์ที่ไม่สอดคล้องกันไม่ได้
ข้อควรระวังสำหรับนักวิเคราะห์¶
- รายการไฟล์ปฏิบัติการใน Amcache ไม่ได้พิสูจน์ว่าผู้ใช้เปิดใช้งานไฟล์นั้น
Publisherคือเมทาดาทาจาก PE/version resource ที่ Windows บันทึกไว้ ไม่ได้พิสูจน์ว่าไฟล์มี ลายเซ็น Authenticode ที่ถูกต้อง ณ เวลาที่เก็บรวบรวม- แฮชอาจไม่มีอยู่ และสคีมาแบบเดิม/แบบใหม่ไม่ได้ให้ค่าที่เหมือนกัน
LinkDateมาจากส่วนหัว PE และอาจถูกปลอมแปลง คัดลอกมา หรือเกิดจาก reproducible build- เวลาเขียนล่าสุดของคีย์อธิบายการอัปเดตระเบียนรีจิสทรี ไม่จำเป็นต้องเป็นเวลาดาวน์โหลด การสร้าง การเรียกใช้ครั้งแรก หรือการเรียกใช้ครั้งล่าสุด
- พาธอาจอ้างถึงวอลุ่มแบบถอดได้หรือวอลุ่มที่ไม่มีอยู่แล้ว
วิเคราะห์ด้วย Juntei¶
Usage: juntei parse-registry amcache <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find Amcache hives
-f, --file <FILE> Parse one Amcache.hve
Records:
--files Include every inventoried executable
--devices Include every inventoried PnP device
-a, --all Include both (default for saved structured output)
Output:
-o, --output <PATH> Save text/JSON/JSONL or a directory of CSV tables
-t, --output-type <TYPE> csv, json, jsonl, or text
# Inspect the summary and findings
juntei parse-registry amcache -f Amcache.hve
# Save all record types as CSV tables
juntei parse-registry amcache -f Amcache.hve -a -o amcache-output
# Hunt for one SHA-1 in JSONL
juntei parse-registry amcache -f Amcache.hve -t jsonl \
| jq 'select(.RecordType == "file" and .SHA1 == "0123456789abcdef0123456789abcdef01234567")'
เอาต์พุต CSV ประกอบด้วยตารางสรุป (summary) สิ่งที่พบ (findings) ไฟล์ (files) และอุปกรณ์ (devices) เมื่อใช้ auto-parse ตารางเหล่านี้คือ
Registry-Amcache-Summary.csv, Registry-Amcache-Findings.csv, Registry-Amcache-Files.csv และ
Registry-Amcache-Devices.csv ซึ่งอยู่ใต้ไดเรกทอรี FileExistence/ ของแต่ละคอมพิวเตอร์โดยตรง โดยมี
Registry-Amcache-logs.txt อยู่ข้างตาราง หากมีหลายไฮฟ์จะเพิ่ม -Source1, -Source2 เป็นต้น
ไว้ก่อนนามสกุลไฟล์ และ OutputFiles ใน manifest จะแสดงพาธที่แน่นอน การส่งออก CSV แบบเรียกใช้คำสั่งเดี่ยว
จะคงชื่อตารางเดิมและตำแหน่งเอาต์พุตที่ระบุไว้ ระเบียน JSONL ใช้ค่า RecordType ได้แก่
summary, finding, file และ device
ฟิลด์เอาต์พุตของไฟล์¶
| ฟิลด์ | วิธีที่นักวิเคราะห์ควรใช้ |
|---|---|
KeyName, SourceKeyPath |
ระบุระเบียนรีจิสทรีต้นทางและสาขาของสคีมาที่แน่นอน เก็บรักษาไว้เพื่อให้ทำซ้ำผลได้ |
KeyLastWrittenUTC, KeyLastWrittenFiletime |
เวลาที่ระเบียนรีจิสทรีถูกอัปเดต ทั้งในรูปแบบที่อ่านได้และค่าดิบ อย่าระบุว่าเป็นเวลาการเรียกใช้งาน |
SourceVolumeKeyLastWrittenUTC, SourceVolumeKeyLastWrittenFiletime |
เวลาของคีย์วอลุ่มแม่ในสคีมาแบบเดิม เป็นข้อมูลบริบท ไม่ใช่เวลาที่เกิดการกระทำกับไฟล์ |
FileID |
ตัวระบุไฟล์ที่ Amcache บันทึกไว้ เก็บไว้ตามเดิมทุกประการ อย่าสันนิษฐานว่าเป็น SHA-1 เสมอ |
SHA1, SHA256 |
จุดเชื่อมโยง (pivot) ที่แข็งแกร่งไปยัง Defender, threat intelligence, EDR และคลังไฟล์ ค่า null หมายถึงไม่ได้บันทึกไว้ |
Name, OriginalFileName, Description |
ชื่อจาก PE/version ที่บันทึกไว้ ให้เปรียบเทียบกับพาธจริงเพื่อตรวจจับการปลอมตัว (masquerading) เมทาดาทานี้ผู้โจมตีควบคุมได้ |
FullPath |
จุดเชื่อมโยงด้านตำแหน่งที่มีประโยชน์ที่สุด ให้ปรับรูปแบบตัวพิมพ์อย่างระมัดระวังแต่เก็บสตริงหลักฐานต้นฉบับไว้ |
LongPathHash |
ตัวระบุที่เกี่ยวกับพาธของ Windows ใช้จับคู่ระเบียนได้ ไม่ใช่แฮชของเนื้อหา |
ProgramID |
เชื่อมโยงไฟล์กับระเบียนบัญชีรายการแอปพลิเคชันเมื่อมีข้อมูล |
Publisher |
ข้อความผู้เผยแพร่ที่บันทึกไว้ ให้ถือเป็นเมทาดาทา ไม่ใช่การตรวจสอบลายเซ็น |
Version, BinFileVersion, ProductName, ProductVersion, BinProductVersion |
บริบทจาก version resource ความแตกต่างหรือค่าที่ไม่สมเหตุสมผลช่วยสนับสนุนการวิเคราะห์การปลอมตัวได้ |
BinaryType |
บริบทด้านสถาปัตยกรรม/ชนิดที่บันทึกไว้ ให้เปรียบเทียบกับการวิเคราะห์ PE เมื่อกู้คืนไฟล์ได้ |
LinkDate |
timestamp การคอมไพล์/ลิงก์ของ PE ตามที่บันทึกไว้ มีประโยชน์เฉพาะเมื่อใช้อย่างระมัดระวังและมีหลักฐานสนับสนุน |
Size |
ขนาดที่บันทึกไว้ ให้เปรียบเทียบกับ $MFT เนื้อหาใน Defender หรือไฟล์ที่กู้คืนได้ |
Language |
ตัวระบุภาษาของ PE เป็นเบาะแสเชิงบริบทที่อ่อน ไม่ใช่การระบุตัวผู้กระทำ |
IsPE-File, IsOS-Component |
แฟล็กการจำแนกประเภทที่ Windows บันทึกไว้ ค่า false ไม่ได้พิสูจน์ว่าไม่เป็นอันตราย |
USN |
ค่า update sequence ของ NTFS ที่ Amcache บันทึกไว้ ช่วยเชื่อมโยงไปยังระเบียน USN ที่ยังเหลืออยู่ |
APPX-PackageFullName, APPX-PackageRelativeID |
เชื่อมโยงแอปพลิเคชัน/คอมโพเนนต์แบบแพ็กเกจกับไฟล์ |
RegistryValues |
ค่ารีจิสทรีต้นฉบับทุกค่าพร้อมชนิด ค่าที่ถอดรหัสแล้ว และ hex ดิบ ใช้เมื่อไม่มีฟิลด์แบบมีชนิด หรือสำหรับฟิลด์ในอนาคต/แบบเดิม |
ฟิลด์เอาต์พุตของอุปกรณ์¶
| กลุ่มฟิลด์ | ฟิลด์และการตีความ |
|---|---|
| ต้นทาง | KeyName, SourceKeyPath, KeyLastWrittenUTC, KeyLastWrittenFiletime: ระเบียนอุปกรณ์ที่แน่นอนและเวลาที่รีจิสทรีถูกอัปเดต |
| ตัวตน | Description, BusDescription, Manufacturer, Model: คำอธิบายอุปกรณ์สำหรับผู้ใช้ สตริงของผู้ผลิตอาจเป็นค่าทั่วไป |
| ตัวระบุฮาร์ดแวร์ | HWID, CompID, Class, ClassGUID, ContainerID, DeviceInterfaceClasses: จุดเชื่อมโยงที่แข็งแกร่งที่สุดสำหรับตระกูลอุปกรณ์และอินสแตนซ์ |
| สถานะ | DeviceState, ProblemCode, ParentID, MatchingID, Enumerator: บริบทการแจกแจงอุปกรณ์ (enumeration) และความสัมพันธ์ใน Windows |
| ไดรเวอร์ | DriverID, DriverName, DriverPackageStrongName, DriverVerDate, DriverVerVersion, Provider, Service, INF: ความเชื่อมโยงกับแพ็กเกจไดรเวอร์และบริการ ให้เชื่อมโยงกับไฟล์และบริการที่ติดตั้งไว้ |
| การติดตั้ง | InstallDate, FirstInstallDate, InstallState, ExtendedInfs: วงจรการติดตั้งที่บันทึกไว้ การไม่มีวันที่ไม่ได้พิสูจน์ว่าอุปกรณ์ไม่เคยถูกเชื่อมต่อ |
| ฟิลเตอร์และสแต็ก | LowerClassFilters, UpperClassFilters, LowerFilters, UpperFilters, StackID, LocationPaths: บริบทขั้นสูงของ driver stack ฟิลเตอร์ไดรเวอร์ที่ไม่คาดคิดควรได้รับการตรวจทาน |
| การเก็บรักษาค่าดิบ | RegistryValues: ค่าต้นทางครบถ้วนทั้งแบบมีชนิดและค่าดิบ สำหรับการตรวจสอบความถูกต้องและฟิลด์ที่ยังไม่รองรับ |
คอลัมน์อาร์เรย์และค่าดิบใน CSV ใช้คำต่อท้าย JSON (เช่น HWID-JSON และ
RegistryValuesJSON) เซลล์ของคอลัมน์เหล่านี้มี JSON ขณะที่ JSON/JSONL คงอาร์เรย์ตามรูปแบบเดิมไว้
กลยุทธ์การตรวจสอบ¶
- เชื่อมโยงข้อมูลโดยใช้
FullPath,SHA1,NameและUSN - ค้นหา Prefetch ที่ตรงกันเพื่อสนับสนุนการเรียกใช้งาน
- ใช้
$MFTและบันทึก USN เพื่อยืนยันการสร้าง การเปลี่ยนชื่อ การลบ และขนาดของไฟล์ - เปรียบเทียบเมทาดาทาผู้เผยแพร่/เวอร์ชันกับ PE ที่กู้คืนได้อย่างอิสระและผลการตรวจสอบลายเซ็น
- ตรวจสอบข้อมูลที่ Defender กักกันและ event log เพื่อหาการตรวจจับหรือการลบออก