เมื่อช่วงสัปดาห์ที่ผ่านมา René Freingruber (@ReneFreingruber) จาก SEC Consult Vulnerability Lab ได้ออก post เกี่ยวกับ trick การ bypass Windows defend mechanism ต่างๆ ออกมา โดยผมเอามาสรุปให้อีกทีดังนี้ครับ

(ทั้งหมดนี้ได้ถูกแจ้งไปยัง Microsoft และออก patch แก้ไขแล้วครับ)

1. วิธีการสร้าง folder ใน path ที่ user ไม่มีสิทธิ์

บางครั้ง user จะสามารถสร้างไฟล์ไว้ใน path ได้ แต่ไม่สามารถสร้าง folder ได้ เช่นใน C:\Windows\Tasks\ เป็นต้น เราสามารถสร้างได้โดยใช้คำสั่ง

2. Bypass path restrictions ด้วย Alternate Data Streams

ปกติไฟล์ใน NTFS volume จะอยู่ใน format

เมื่อมีการสร้างไฟล์ test.txt ตัวไฟล์จะถูกเก็บไว้ในลักษณะเป็น

ซึ่งในกรณีนี้เพราะว่า stream name ไม่มี และ $DATA เป็น type โดย default นั่นเอง ถ้ามีการเก็บข้อมูลในลักษณะแบบ stream (หรือเรียกว่า Alternate Data Stream – ADS).  โดยปกติเมื่อเรา download ไฟล์จาก internet ตัว Windows จะทำการ adds  Zone Identifier ไปไว้ที่ stream name เช่น download “putty.exe”, Windows จะสร้างเป็น “putty.exe:Zone.Identifier:$DATA”. เราสามารถดู stream name ได้ด้วย “dir /r”

เราสามารถจะ copy content ของไฟล์ไปเป็น ADS แล้วเรียกใช้ผ่าน wmic ได้

ทีนี้โดยปกติ user ธรรมดาไม่สามารถสร้างไฟล์และ folder ได้ใน C:\Windows ซึ่งนั่นบ่งบอกว่า C:\Windows เป็น path ที่เชื่อถือได้ เพราะ admin สร้าง file และ folder ได้เท่านั้น แต่ทีนี้มันมีประเด็นอยู่ที่ว่า โดยปกติแล้วมัน folder ที่อยู่ภายใต้ C:\Windows\Tracing ที่ user ธรรมดาสามารถสร้างไฟล์และ folder ได้ หากเราสร้างไฟล์ใน C:\Windows\Tracing เช่น C:\Windows\Tracing:test.dll ตัว api ของ windows จะมองว่า Tracing::test.dll เป็นว่างเปล่า แล้วมองว่า C:\Windows เป็น base folder ซึ่งทำให้ API มองว่าไฟล์ที่โหลดอยู่ใน path ที่ trust ได้นั่นเอง

อีกทั้ง ADS name สามารถใส่อักขระได้ทำให้เกิดปัญหาได้ ทาง Rene เค้ายกตัวอย่างว่า หากเว็บไซด์ที่รันบน IIS แล้วอนุญาตให้ upload file ขณะทำการ upload file แล้วมีการโชว์ชื่อไฟล์ หาก filename ไม่ได้มีการ sanitize ก็อาจจะทำให้เกิด XSS ได้

3. สร้างไฟล์ไม่ให้เจอได้ด้วย “…”

ปกติเราจะทราบว่าถ้าเราใช้ “.” จะหมายถึง directory ปัจจุบัน, “..” จะหมายถึง folder ที่ก่อนหน้านี้ (parent directory ของ directory ปัจจุบัน) ใน Windows จะมีการห้ามให้สร้าง folder ที่มี “.” เพื่อป้องกันการสับสนนั่นเอง แต่เราสามารถ bypass ได้โดยการใช้ ::$INDEX_ALLOCATION นั่นเอง

หากเราต้องการจะเข้า folder ดังกล่าว เราจะใช้ “cd …\” ไม่ได้ ต้องใช้เป็น “cd …\…\” แทน

อีกทั้งเรายังไม่สามารถเข้า folder นี้ได้ผ่าน GUI (explorer.exe) หากพยายามทำการลบ folder ผ่าน GUI ก็จะทำให้ explorer.exe crash อีกด้วย

หากทำการ search ด้วย GUI, powershell ไฟล์ที่สร้างไว้ใน folder ดังก่อนก็จะกลายเป็นว่า search นั้นจะแฮงค์แล้วหาไฟล์ไปตลอดเลย

ตัว Antivirus สามารถตรวจพบไฟล์ malware ใน folder แบบนี้ได้ แต่ก็จะมี antivirus  บางตัวเหมือนกันที่สับสนกับ path แล้วไม่สามารถลบไฟล์ดังกล่าวได้

4. ซ่อน destination ของ directory junction

Directory junctions เป็น feature ของ NTFS สำหรับการทำ symbolic link ไปยัง folder ปลายทาง โดย AVGater ให้คำอธิบายเรื่องการนำ feature นี้ไปใช้โดย attacker ให้เข้าใจง่ายๆไว้ว่า เมื่อ attacker วางไฟล์ malware ไว้ใน folder x แล้วถูกตรวจพบด้วย AV ก็จะย้ายไฟล์ไปเป็น quarantine หลังจากนั้น attacker ทำการลบ folder x ทิ้งแล้วสร้าง directory junction ไว้ชื่อ x ซึ่งชี้ไปที่ C:\Windows\System32\ หาก attacker สามารถสั่งทำการ restore ไฟล์จาก Antivirus ได้ก็จะกลายเป็นว่าไฟล์จะถูก restore ไปไว้ใน C:\Windows\System32\ โดยใช้สิทธิ์ SYSTEM นั่นเอง อีกทั้ง Directory junctions มักจะถูกนำไปใช้ race condition อีกด้วย

เราสามารถสร้าง directory junction ได้ด้วย mklink พร้อมกับ option /J  หากเราใช้คู่กับ ::$INDEX_ALLOCATION ก็จะกลายเป็นสร้าง directory junction ที่มีชื่อเป็น  “…”​ ได้

จะเห็นว่าเมื่อเราสร้าง directory junction โดยใช้ชื่อเป็น … จะพบว่าเราสามารถซ่อนปลายทางได้ว่าปลายทางคือที่ไหน แถมด้วยความที่ระบบมีความสับสนเรื่อง path ดังกล่าว เมื่อเราใช้ dir . บางครั้งจะแสดงผลเป็น dir ของ path ก่อนหน้าอีกด้วย

5. Hide Alternate Data Streams

ปกติเราสามารถดูข้อมูล ADS ได้โดยใช้ dir /r และหากต้องการ dump ข้อมูลสามารถใช้ streams.exe ซึ่งเป็นหนึ่งในเครื่องมือของ Sysinternals ได้

หากเป็น Windows version เก่า เราสามารถซ่อน ADS ได้โดยใช้ชื่อที่เป็น base name (เช่น CON, NUL, COM1, COM2, LPT1, …). ได้ แต่จะไม่เวิร์คใน Windows 10 แต่ก็ยังใช้ “…” ได้อีก

 

เราสามารถสร้าง file ที่จะทำให้ streams ไม่สามาถอ่านได้โดยใช้เป็น “.<spaces>.”

6. Hiding the process binary

จากการหลบเลี่ยงด้วย “.<space>.” เมื่อข้อที่แล้ว หากเราทำ process มีชื่อว่า “file1. .” ตัว windows ก็จะตัด “. .” ทิ้ง แล้วมองว่าเป็น process ชื่อว่า “file1” แทน

Source:: SEC Consult