แคช Task Scheduler¶
TaskCache คืออะไร¶
Windows Task Scheduler เก็บแคชในรีจิสทรีไว้ใต้ SOFTWARE ซึ่งเชื่อมโยงพาธของงาน (task) กับ GUID,
trigger/รายการ principal การดำเนินการ (action) เมทาดาทาขณะทำงาน และ security descriptor Juntei ถอดรหัส
action แบบการเรียกใช้งานและ COM handler รวมถึง action แบบอีเมล/ข้อความแบบเดิม timestamp ของงาน และสัญญาณของ
งานที่ถูกซ่อนจากอินเทอร์เฟซ Task Scheduler ตามปกติ
งานที่ตั้งเวลาไว้เป็นกลไกที่ใช้กันทั่วไปสำหรับการคงอยู่และการเรียกใช้งานระยะไกล แคชในรีจิสทรียังมีคุณค่า เมื่อผู้โจมตีลบหรือดัดแปลงไฟล์ XML ของงานด้วย
ข้อสรุปที่ดีที่สุด: TaskCache ได้กำหนดค่าหรือเก็บรักษา งาน/action นั้นไว้ จำเป็นต้องมีฟิลด์ขณะทำงานและ log อิสระเพื่อพิสูจน์การเรียกใช้งานครั้งใดครั้งหนึ่ง
ตำแหน่ง¶
SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache
C:\Windows\System32\Tasks\... (task XML/files; collect separately)
ให้เก็บรวบรวม SOFTWARE พร้อม transaction log และโครงสร้าง System32\Tasks ทั้งหมด event log
Operational ของ Task Scheduler และ Security ช่วยเพิ่มหลักฐานการสร้าง/การอัปเดต/การทำงาน
ข้อควรระวังสำหรับนักวิเคราะห์¶
- แคชในรีจิสทรีและ XML ของงานอาจไม่ตรงกันหลังการดัดแปลง การลบ การลงทะเบียนที่ไม่สมบูรณ์ หรือความเสียหาย
Hiddenของ Juntei ระบุการซ่อนเชิงโครงสร้าง (ไม่มีการเชื่อมโยงใน Tree/security descriptor ภายใต้ เงื่อนไขที่เกี่ยวข้อง) ไม่ใช่เพียงงานที่ตั้งค่าแฟล็ก “Hidden” ตามปกติของ UI- Windows 7 จัดเก็บ action ของงานไว้ใน XML แทนที่จะเป็นค่า
Actionsของแคช action ที่ว่างเปล่า บนระบบนั้นจึงไม่ได้น่าสงสัยโดยอัตโนมัติ LastRunและLastResultมีประโยชน์ แต่ไม่ใช่ประวัติการเรียกใช้งานที่สมบูรณ์และป้องกันการดัดแปลงได้Contextระบุ principal/context ที่กำหนดค่าไว้ ไม่ใช่ผู้ใช้ที่ลงทะเบียนงาน- CLSID ของ COM handler ต้องแปลงค่าแยกต่างหากผ่านรีจิสทรี/ไฟล์
วิเคราะห์ด้วย Juntei¶
Usage: juntei parse-registry taskcache <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find SOFTWARE hives
-f, --file <FILE> Parse one SOFTWARE hive
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
Filtering:
--task <NAME> Full task path or final task name
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry taskcache -f SOFTWARE -o tasks.csv
juntei parse-registry taskcache -f SOFTWARE -t jsonl \
| jq 'select(.Hidden == true or (.Executable? | test("powershell|cmd|mshta"; "i")))'
ฟิลด์เอาต์พุต¶
| ฟิลด์ | การตีความ |
|---|---|
Host, SourcePath |
บริบทของโฮสต์และไฮฟ์ SOFTWARE ต้นทาง |
TaskName |
พาธเต็มใน scheduler เป็นจุดเชื่อมโยงหลักไปยัง XML และ event log |
TaskGUID |
GUID ที่เชื่อม entry ของแคช Tree และ Tasks เป็นคีย์เชื่อมโยงที่แข็งแกร่ง |
TaskIndex |
เมทาดาทา Tree/index ที่ scheduler ใช้ เป็นข้อมูลบริบท ไม่ใช่จำนวนครั้งที่เรียกใช้ |
TaskLists |
รายการในแคช (Boot, Logon, Plain, Maintenance) ที่จัดหมวดหมู่การทริกเกอร์/การจัดการ |
Hidden |
ตัวบ่งชี้งานที่ถูกซ่อนเชิงโครงสร้าง ให้ตรวจทาน InTree, InTasks และสถานะของ descriptor ก่อนสรุปว่ามีการดัดแปลง |
InTree, InTasks |
มีแคชทั้งสองฝั่งหรือไม่ การเชื่อมโยงที่ขาดหายอาจบ่งชี้การลบ/การดัดแปลง/การลงทะเบียนที่ไม่สมบูรณ์ |
HasSecurityDescriptor |
entry ใน Tree มี SD หรือไม่ การไม่มีอาจมีส่วนทำให้เกิดพฤติกรรมงานที่ถูกซ่อนในเวอร์ชันที่เกี่ยวข้อง |
TreeKeyLastWrittenUTC, TaskKeyLastWrittenUTC |
การเปลี่ยนแปลงระดับคีย์ของแคชแต่ละฝั่ง ไม่ใช่เวลาสร้าง/เวลาทำงานที่แน่นอน |
ActionIndex |
action ภายในงาน นับจากศูนย์ งานหนึ่งอาจสร้างหลายแถว |
ActionType |
exec, com_handler, send_email หรือ show_message |
Executable, Args, WorkingDirectory |
action การเรียกใช้งานที่มีผลจริง ให้ตีความเครื่องหมายคำพูด ตัวแปร พาธสัมพัทธ์ และ LOLBin |
COM-ClassID, ActionData |
CLSID และข้อมูลของ COM handler หรือข้อมูลอีเมล/ข้อความแบบเดิม ให้แปลง CLSID แยกต่างหาก |
Context |
principal context ที่เข้ารหัสไว้กับ action (LocalSystem, Author เป็นต้น) เป็นตัวตนที่กำหนดค่าไว้ ไม่ใช่ผู้ลงทะเบียน |
Author, URI, Description |
เมทาดาทาของงาน ผู้โจมตีควบคุมได้ง่ายและไม่ใช่หลักฐานความน่าเชื่อถือ |
LastRegisteredUTC |
เวลาลงทะเบียน/อัปเดตจาก DynamicInfo เมื่อมีอยู่ |
LastRunUTC, LastSuccessfulRunUTC, LastResult |
เมทาดาทาการทำงาน/ผลลัพธ์ที่แคชไว้ ให้เชื่อมโยงกับ operational log และหลักฐานของโพรเซส |
ActionsRaw |
ไบต์ action ต้นฉบับ หากการถอดรหัสไม่สมบูรณ์หรือจำเป็นต้องตรวจสอบ |
TransactionLogStatus, LogsApplied |
บริบทการกู้คืนรีจิสทรี |
Problems |
พาธ/GUID ไม่ตรงกัน ชนิดของค่าไม่ถูกต้อง โครงสร้าง action ถูกตัดทอน หรือส่วนประกอบที่ขาดหาย |
กลยุทธ์การตรวจสอบ¶
- ตรวจทานงานที่ถูกซ่อน/ไม่สอดคล้องกันและพาธที่ไม่ใช่ของ Microsoft ก่อน
- สร้างคำสั่งที่มีผลจริงขึ้นใหม่ รวมถึงอาร์กิวเมนต์ ไดเรกทอรีทำงาน การขยายตัวแปรสภาพแวดล้อม และการแปลง COM
- เปรียบเทียบระเบียนในรีจิสทรีกับ XML ของงาน และคำนวณแฮช/ตรวจสอบ timestamp ของไฟล์ปฏิบัติการที่อ้างอิงถึง
- เชื่อมโยง
TaskName/GUID/เวลา กับเหตุการณ์ของ Task Scheduler, Security 4698/4702, log ของโพรเซส, Prefetch และ MFT/USN - ค้นหาข้อมูลรีจิสทรีที่ถูกลบ/กู้คืนได้เมื่อผู้โจมตีลบงานออกไป