Arbitrary File Write and DiagHub Exploit
เนื้อหาโดยส่วนใหญ่ของบล็อกนี้สรุปและแปลมาจากบล็อก Windows Exploitation Tricks: Exploting Arbitrary File Writes for Local Elevation of Privilege โดย James Forshaw จาก Google Project Zero
- ช่องโหว่ในกลุ่มที่เป็น Arbitrary file write ทำให้ผู้ใช้งานสามารถสร้างหรือแก้ไขไฟล์ซึ่งอยู่ในตำแหน่งที่โดยปกตินั้นไม่สามารถเข้าถึงได้ อย่างไรก็ตามประโยชน์ที่แท้จริงของช่องโหว่ Arbitrary file write นั้นจะมีประโยชน์สูงสุดในมุมของการโจมตีเมื่อไฟล์ที่ถูกแก้ไขหรือเขียนทับเป็นไฟล์ส่งผลให้เกิดการยกระดับสิทธิ์หรือส่งผลกระทบต่อคุณลักษณะด้านความปลอดภัยอื่นๆ ได้
- จากประเด็นด้านบนนั้น วิธีการใช้ช่องโหว่นี้ในลักษณะนี้ให้เป็นประโยชน์วิธีการหนึ่งคือการนำมาใช้เพื่อทำ DLL Hijacking โดยในมุมของผู้โจมตีนั้น ผู้โจมตีจะต้องทำการหาไฟล์ executable ที่รันด้วยสิทธิ์ที่สูงและจะมีการโหลดไฟล์ DLL จากตำแหน่งที่ช่องโหว่ Arbitrary file write สามารถเข้าไปแก้ไขไฟล์ได้ ผลลัพธ์ปลายทางสุดท้ายของการโจมตีในลักษณะนี้คือการยกระดับสิทธิ์
- เงื่อนไขของการทำ DLL Hijacking นั้นส่วนหนึ่งขึ้นอยู่กับวิธีการทำ Loader ทำการค้นหาและโหลด DLL ที่โปรแกรมหนึ่งๆ จำเป็นต้องใช้งาน และจะสำเร็จก็ต่อเมื่อ DLL ที่เราต้องการให้ถูกโหลดเข้าไปนั้นไม่ถูกตรวจพบในตำแหน่งก่อนหน้า โดยทั่วไป Loader จะมีเงื่อนไขในการค้นหาและการโหลด DLL อยู่ตามลำดับของตำแหน่งดังต่อไปนี้
- ใช้ฟีเจอร์ Known DLLs
- ตรวจสอบหาไฟล์ DLL ในตำแหน่งพาธปัจจุบันของโปรแกรม
- ตรวจสอบในพาธของระบบ อาทิ
C:\Windows\System32
และC:\Windows
- ตรวจสอบใน Environment PATH
- อย่างไรก็ตามข้อจำกัดในการทำ DLL Hijacking คือผู้โจมตีจะต้องทำการสร้างโปรเซสที่มีสิทธิ์สูงเพื่อบังคับให้เกิดการโหลด DLL ที่ใช้งานโดยส่วนใหญ่หลังจากที่ทำ Arbitrary file write เสร็จ เพื่อให้การแก้ไขไฟล์ DLL ถูกโหลดไปใช้งานจริง และตำแหน่งของไฟล์ executable/DLL ที่โดยส่วนใหญ่จะอยู่ในตำแหน่ง
C:\Windows\System32
ด้วย (ถ้าไม่มีช่องโหว่ Arbitrary file write ก็ทำอะไรไม่ได้) แม้ว่าจะสามารถหาไฟล์ executable ซึ่งนำไปสู่การสร้างโปรเซสที่มีสิทธิ์สูงที่นอกพาธC:\Windows\System32
กระบวนการแก้ไขไฟล์ DLL เพื่อทำให้กระบวนการ DLL Hijacking เกิดขึ้นอย่างสมบูรณ์ก็นำมาซึ่งปัญหาเพิ่มเติมด้วยเช่นกัน - ทั้งนี้หนึ่งในเซอร์วิสของระบบการชื่อ “Microsoft (R) Diagnostics Hub Standard Collector Service” หรือ DiagHub กลับถูกตรวจพบว่าเป็นเซอร์วิสหนึ่งที่มีคุณสมบัติอย่างเหมาะสมในช่วยให้เราสามารถใช้ความสามารถของช่องโหว่ Arbitrary file Write ร่วมด้วยความสามารถในการโหลดไฟล์ DLL ใดๆ ก็ได้แม้แต่ไฟล์ที่อยู่ใน
C:\Windows\System32
และมีสิทธิ์ที่สูงโดยไม่จำเป็นต้องทำ DLL Hijacking - ความสามารถของ DiagHub ถูกอิมพลีเมนต์และสามารถเรียกใช้งานได้ผ่าน DCOM object ดังนั้นเพื่อควบคุมและใช้งาน DiagHub ให้เกิดประสิทธิภาพ ในบทความต้นฉบับของ Google Project Zero จึงได้มีการอธิบายกระบวนการ Reverse engineer เพื่อทำความเข้าใจการทำงานและนำความเข้าใจดังกล่าวมาใช้ในการสร้าง Exploit ด้วยในหัวข้อ Reverse Engineering a DCOM Object
- ผลลัพธ์จากการ Reverse engineer กระบวนการทำงานของ DiagHub ทำให้เรารู้ว่าในการที่จะใช้ DiagHub เพื่อโหลด DLL ใดๆ นั้น เราจะต้องทำการสร้าง Diagnostics Session ด้วยเมธอด
IStandardCollectorService::CreateSession
และทำการเรียกเมธอดICollectionSession::AddAgent
โดยมีชื่อของไฟล์ DLL เป็นพารามิเตอร์ - ในบทความต้นฉบับนั้น James Forshaw จะมีการสาธิตการใช้ช่องโหว่ Arbitrary file write ใน
SvcMoveFileIntegeritSecurity
ของ Storage service - ข้อจำกัดอย่างหนึ่งที่ถูกพูดถึงในบทความต้นฉบับคือไฟล์ที่จะถูกเขียนทับโดยใช้ช่องโหว่ เนื่องจากไฟล์โดยส่วนใหญ่ใน
C:\Windows\System32\
นั้นมีเจ้าของไฟล์อยู่ในกลุ่มของTrustedInstaller
ซึ่งทำให้ไม่สามารถแก้ไขได้แม้ผู้แก้ไขจะมีสิทธิ์เป็น Local system การหาไฟล์ซึ่งสามารถถูกเขียนทับได้โดยไม่ส่งผลกระทบต่อการทำงานของระบบปฏิบัติการจึงเป็นประเด็นที่ควรต้องให้ความสนใจเป็นอย่างสูง ทั้งนี้เนื่องจากเมธอดICollectionSession::AddAgent
ถูกอิมพลีเมนต์ให้ตรวจสอบเพียงแค่ชื่อของไฟล์ว่าไฟล์มีอยู่จริง จากนั้นจึงมีการใช้ฟังก์ชันLoadLibraryEx
ในการโหลดไฟล์ดังกล่าวโดยทันที นามสกุลของไฟล์ที่จะถูกแก้ไขจึงไม่ถือเป็นข้อจำกัด ในกรณีนี้นั้น James ใช้โมดูลNtObjectManager
ในการค้นหาไฟล์ที่เซอร์วิส Storage service (StorSvc) ซึ่งมีช่องโหว่ Arbitrary file wirte มีสิทธิ์เขียนด้วย (WRITE_DAC
) โดยผลลัพธ์ที่ James เลือกเอามาใช้ในการแก้ไขคือไฟล์license.rtf
ที่ตำแหน่งC:\Windows\System32
- เมื่อนำทุกอย่างมารวมกัน ผลลัพธ์ที่จะได้คือ
- ใช้ช่องโหว่ของ Storage Service ในการแก้ไขการสิทธิ์ของไฟล์
license.rtf
- คัดลอก DLL ที่มีการอิมพลีเมนต์
DllGetClassObject
(โมดูลที่ICollectionSession:AddAgent
จะทำการเรียกจากไฟล์ DLL ที่ DiagHub โหลดเข้าไป ทับไฟล์license.rtf
- ใช้เซอร์วิส DiagHub ในการโหลดไฟล์
license.rtf
ที่เราแก้ไขแล้ว - เพื่อให้ได้สิทธิ์ในการทำ Code execute ในระดับ Local system
- ใช้ช่องโหว่ของ Storage Service ในการแก้ไขการสิทธิ์ของไฟล์
ความสามารถของ DiagHub ยังถูกนำมาใช้ร่วมกันอีกหลายช่องโหว่ เช่น ช่องโหว่ CVE-2019-0836 “Microsoft Windows 10 1809 – LUAFV PostLuafvPostReadWrite SECTION_OBJECT_POINTERS Race Condition Privilege Escalation” โดยสำหรับซอร์สโค้ดของ DiagHub Exploit สามารถดาวโหลดได้ที่นี่
Read other posts