Svchost เป็นสิ่งจำเป็นในการปรับใช้กระบวนการบริการที่ใช้ร่วมกัน ซึ่งบริการจำนวนหนึ่งสามารถแบ่งปันกระบวนการเพื่อลดการใช้ทรัพยากร การจัดกลุ่มบริการต่างๆ ให้เป็นกระบวนการเดียวจะช่วยรักษาทรัพยากรในการประมวลผล และการพิจารณานี้เป็นเรื่องที่นักออกแบบ NT กังวลเป็นพิเศษ เนื่องจากการสร้างกระบวนการ Windows ใช้เวลามากกว่าและใช้หน่วยความจำมากกว่าในระบบปฏิบัติการอื่นๆ เช่น ในตระกูล Unix 1
หมายความโดยย่อว่า; บนระบบปฏิบัติการ Windows svchost.exe จะจัดการบริการและบริการต่างๆ ที่กำลังทำงานภายใต้ svchost.exe ในรูปแบบเธรด Phant0m กำหนดเป้าหมายบริการบันทึกเหตุการณ์และค้นหากระบวนการที่รับผิดชอบบริการบันทึกเหตุการณ์ โดยจะตรวจจับและปิดเธรดที่รับผิดชอบในบริการบันทึกเหตุการณ์ ดังนั้น แม้ว่าบริการบันทึกเหตุการณ์จะทำงานอยู่ในระบบ (เนื่องจาก Phant0m ไม่ได้ฆ่ากระบวนการ) แต่ก็ไม่ได้ทำงานจริง (เนื่องจาก Phant0m ฆ่าเธรด) และระบบจะไม่รวบรวมบันทึก
Phant0m ใช้สองตัวเลือกที่แตกต่างกันในการตรวจจับรหัสกระบวนการของบริการบันทึกเหตุการณ์ อย่างแรกคือการตรวจจับผ่าน SCM (Service Control Manager) และอย่างที่สองคือการตรวจจับผ่าน WMI (Windows Management Instrumentation) ด้วยวิธีการใดที่คุณต้องการให้ Phant0m ตรวจหารหัสกระบวนการของบริการบันทึกเหตุการณ์ ให้เปลี่ยนบรรทัดต่อไปนี้ในไฟล์ main.cpp
ตัวอย่างเช่น หากคุณต้องการให้ Process ID ตรวจพบผ่าน SCM คุณควรแก้ไขดังนี้ (อย่าตั้งค่าทั้งหมดพร้อมกัน ให้ตั้งค่าเฉพาะเทคนิคที่ต้องการเท่านั้น)
// PID detection techniques configuration section.
# define PID_FROM_SCM 1 // If you set it to 1, the PID of the Event Log service is obtained from the Service Manager.
# define PID_FROM_WMI 0 // If you set it to 1, the PID of the Event Log service is obtained from the WMI.
ตัวอย่างเช่น หากคุณต้องการให้เธรดถูกฆ่าโดยใช้เทคนิคที่ 1 คุณควรแก้ไขดังต่อไปนี้ (อย่าตั้งค่าทั้งหมดพร้อมกัน ให้ตั้งค่าเฉพาะเทคนิคที่ต้องการเท่านั้น)
// TID detection and kill techniques configuration section.
# define KILL_WITH_T1 1 // If you set it to 1, Technique-1 will be use. For more information; https://github.com/hlldz/Phant0m
# define KILL_WITH_T2 0 // If you set it to 1, Technique-2 will be use. For more information; https://github.com/hlldz/Phant0m
Phant0m ใช้สองตัวเลือกที่แตกต่างกันในการตรวจจับและปิดเธรดของบริการบันทึกเหตุการณ์
เมื่อแต่ละบริการได้รับการลงทะเบียนบนเครื่องที่ใช้ Windows Vista หรือใหม่กว่า Service Control Manager (SCM) จะกำหนดแท็กตัวเลขที่ไม่ซ้ำกันให้กับบริการ (ตามลำดับจากน้อยไปหามาก) จากนั้น ในเวลาที่สร้างบริการ แท็กจะถูกกำหนดให้กับ TEB ของเธรดบริการหลัก แท็กนี้จะถูกเผยแพร่ไปยังทุกเธรดที่สร้างโดยเธรดบริการหลัก ตัวอย่างเช่น หากเธรดบริการ Foo สร้างเธรดของผู้ปฏิบัติงาน RPC (หมายเหตุ: เธรดของผู้ปฏิบัติงาน RPC จะไม่ใช้กลไกพูลเธรดเพิ่มเติมในภายหลัง) เธรดนั้นจะมีแท็กบริการของบริการ Foo 2
ดังนั้น ในเทคนิคนี้ Phant0m จะตรวจจับเธรดของบริการบันทึกเหตุการณ์ด้วย NtQueryInformationThread API เพื่อรับที่อยู่ TEB ของเธรด และอ่าน SubProcessTag จาก TEB จากนั้นจะฆ่าเธรดที่เกี่ยวข้องกับบริการบันทึกเหตุการณ์ รหัสสำหรับเทคนิคนี้อยู่ในไฟล์ the technique_1.h
ในเทคนิคนี้ Phant0m จะตรวจจับชื่อของ DLL ที่เกี่ยวข้องกับเธรด บริการบันทึกเหตุการณ์ของ Windows ใช้ wevtsvc.dll
เส้นทางแบบเต็มคือ %WinDir%System32wevtsvc.dll
หากเธรดใช้ DLL นั้น จะเป็นเธรดของ Windows Event Log Service จากนั้น Phant0m จะฆ่าเธรดนั้น รหัสสำหรับเทคนิคนี้อยู่ในไฟล์ the technique_2.h
คุณสามารถใช้ Phant0m ได้ทั้งแบบ EXE แบบสแตนด์อโลนและแบบสะท้อน DLL เปิดโครงการใน Microsoft Visual Studio ทำการตั้งค่า (เลือกเทคนิคการตรวจจับและฆ่า) และคอมไพล์ คุณยังสามารถใช้เวอร์ชันสะท้อน DLL กับ Cobalt Strike ได้เนื่องจากมีไฟล์ Aggressor Script (phant0m.cna) อยู่ในที่เก็บ
วิธี Fork และ Inject ใช้กับ bdllspawn
ในประเภทการดำเนินการของ Aggressor Script (phant0m.cna) สำหรับ Cobalt Strike หากคุณต้องการแทรก Phant0m ลงในกระบวนการที่มีอยู่และเรียกใช้ คุณสามารถตรวจสอบโปรเจ็กต์นี้ได้ (https://github.com/rxwx/cs-rdll-ipc-example) และคุณสามารถดำเนินการได้อย่างง่ายดาย คุณยังสามารถแปลงโค้ดเป็น DLL จากนั้นเป็น Shellcode ด้วย Donut
หมายเหตุ: โครงการรองรับสถาปัตยกรรม x64 เท่านั้น