Privilege Escalation คือ ?
คือ กระบวนการการยกระดับสิทธิ์ของผู้ใช้งานให้มีระดับที่สูงขึ้นหรือแตกต่างไปจากเดิม ซึ่งจะทำกันหลังจากที่เข้ายึดครองเครื่องเป้าหมายได้สำเร็จ ซึ่งจะมีอยู่ด้วยกัน 2 รูปแบบคือ
1. Horizontal Privilege Escalation คือ การที่ผู้ใช้งานปัจจุบันสามารถเปลี่ยนสิทธิ์ของตัวเองให้กลายเป็นสิทธิ์ของผู้ใช้งานคนอื่นได้ โดยที่ระดับสิทธิ์ไม่มีการเปลี่ยนแปลงไป เช่น พนักงาน A สามารถเปลี่ยนสิทธิ์ตัวเองเป็นพนักงาน B หรือผู้ดูแลระบบ A สามารถเปลี่ยนสิทธิ์ตัวเองเป็น ผู้ดูแลระบบ B เป็นต้น
2. Vertical Privilege Escalation คือ การยกระดับสิทธิ์ของผู้ใช้งานให้สูงขึ้นจากเดิม โดยอาจจะเป็นการเพิ่มระดับสิทธิ์จากผู้ใช้งานเดิมให้มีสิทธิ์สูงขึ้น หรือสามารถเปลี่ยนสิทธิ์เป็นของผู้ใช้งานคนอื่นที่มีระดับสิทธิ์ที่สูงกว่าได้ เช่น พนักงาน A สามารถยกระดับสิทธิ์ตัวเองเป็นผู้ดูแลระบบ A หรือ พนักงาน B สามารถเปลี่ยนสิทธิ์ตัวเองเป็นผู้ดูแลระบบ A เป็นต้น
ก่อนที่เราจะเข้าเรื่องหลักของเรา ผมขอคั่นเวลาด้วยเรื่อง ACL (Access Control List) ว่าคืออะไรแบบคร่าว ๆ กันครับ
ACL หรือ Access Control List ในบริบทนี้ คือ ตัวกำหนดสิทธิ์การเข้าถึงของ user ว่าสามารถทำอะไรได้บ้าง เช่น เข้าถึงโฟล์เดอร์ไหนได้บ้าง หรืออ่านไฟล์ไหนได้บ้าง เป็นต้น
หากสนใจและอยากเรียนรู้เพิ่มเติมเกี่ยวกับ ACL สามารถศึกษาเพิ่มเติมได้ที่นี่เลยครับ https://learn.microsoft.com/en-us/windows/win32/secauthz/access-control-lists
ถัดมาเครื่องมือที่เราจะใช้ ได้แก่
- winPEAS คือ เครื่องมือที่ใช้ในการรวบรวมข้อมูลต่าง ๆ ไม่ว่าจะเป็นไฟล์ โฟลเดอร์ service หรืออะไรก็ตามที่มีการตั้งค่าผิดพลาดและอาจจะสามารถใช้ในการยกระดับสิทธิ์ได้
- accesschk.exe คือ เครื่องมือที่ใช้เพื่อตรวจสอบสิทธิ์การเข้าถึง (Access Control List) ของ user
เอาล่ะครับหลังจากที่เกริ่นกันมานานพอสมควรเรากลับมาดูวิธีการยกระดับสิทธิ์ของ Windows Operating System กันดีกว่า โดยในบทความนี้ทางผมจะนำวิธีมาเสนอ 4 วิธีด้วยกันได้แก่
- Insecure Service Properties
- Unquoted Service Paths
- Weak Registry Permissions
- Insecure Service Executables
โดยวิธีทั้งหมดนี้จะเกี่ยวกับ Service Misconfigurations จนส่งผลให้สามารถทำการยกระดับสิทธิ์ได้ในที่สุด
เอาล่ะเรามาเริ่มกันที่เรื่องแรกกันเลยดีกว่า นั่นคือ
Insecure Service Properties
คือการที่ ACL ให้สิทธิ์กับผู้ใช้งานมากเกินความจำเป็นในการทำสิ่งต่าง ๆ แก่ Services ที่ทำงานด้วยสิทธิ์ของระบบ (SYSTEM Privileges) โดยสิทธิ์ที่มีความเป็นไปได้ในการโจมตีช่องโหว่นี้จะมี
- SERVICE_STOP, SERVICE_START
- SERVICE_CHANGE_CONFIG, SERVICE_ALL_ACCESS
ถ้าผู้ใช้งานมีสิทธิ์ดังกล่าว ก็มีความเป็นไปได้สูงที่จะสามารถยกระดับสิทธิ์ได้
เราสามารถตรวจสอบได้ด้วยเครื่องมือ accesschk.exe ด้วยคำสั่ง
accesschk.exe /accepteula -uwcqv [USERNAME] [SERVICE_NAME]
จะเห็นได้ว่า service ของ “daclsvc” ที่ตัว accesschk.exe หาเจอนั้น เรามีสิทธิ์ “SERVICE_CHANGE_CONFIG” ที่สามารถแก้ไขการตั้งค่าของ service นี้ได้ อีกทั้งยังสามารถสั่งหยุดหรือสั่งเริ่มการทำงานได้อีกด้วย ต่อมาเราจะเช็กต่อว่า “daclsvc” นั้น ทำงานด้วยสิทธิ์อะไรด้วยคำสั่ง
sc qc [SERVICE_NAME]
ซึ่งเป็นคำสั่งเพื่อดูข้อมูลต่าง ๆ ของ service ที่เราต้องการ
จากคำสั่งเราจะเห็นได้ว่าตัว daclsvc นั้นถูกเรียกใช้งานด้วยผู้ใช้งาน “LocalSystem” ซึ่งเป็นสิทธิ์สูงสุดในระบบ
ขั้นตอนต่อมาเราจะหยุดการทำงานของ daclsvc จากนั้นเปลี่ยนปลายทางของ “BINARY_PATH_NAME” ให้มาชี้ที่ไฟล์อันตรายของเราเพื่อให้ระบบมาเรียกใช้งานไฟล์ของเรานั้นเอง สุดท้ายสั่งทำงานใหม่อีกครั้งเราก็จะสามารถยกระดับสิทธิ์ได้สำเร็จ
sc stop daclsvc
sc config daclsvc binpath=”C:\PrivEsc\reverse.exe"
sc start daclsvc
ต่อมาในวิธีที่สองได้แก่
Unquoted Service Paths
คือการที่ Service ที่ทำงานด้วยสิทธิ์ระบบ (SYSTEM Privileges) ถูกสร้างขึ้น โดยที่พาธของ Service มีช่องว่างและพาธไม่ได้อยู่ภายในเครื่องหมายคำพูด (quotes) ตัวอย่างเช่น
Service ตัวนึงถูกสร้างขึ้นที่พาธ C:\Program Files\A Subfolder\B Subfolder\C Subfolder\SomeExecutable.exe โดยที่พาธนี้มีช่องว่างและไม่อยู่ภายในเครื่องหมายคำพูด (quotes) ฉะนั้นเมื่อระบบต้องการที่จะเรียกใช้งาน “SomeExecutable.exe” ระบบจะทำงานตามขั้นตอนดังนี้
- C:\Program.exe
- C:\Program Files\A.exe
- C:\Program Files\A Subfolder\B.exe
- C:\Program Files\A Subfolder\B Subfolder\C.exe
- C:\Program Files\A Subfolder\B Subfolder\C Subfolder\SomeExecutable.exe
จากขั้นตอน หมายความว่าระบบจะทำการเรียกใช้งาน C:\Program.exe เป็นอันดับแรก ถ้าไม่เจอระบบจะไปเรียกใช้งาน C:\Program Files\A.exe เป็นลำดับต่อไปและถ้ายังไม่เจออีกระบบก็จะไปเรียกใช้งาน C:\Program Files\A Subfolder\B.exe เป็นลำดับต่อไปเรื่อย ๆ จนกว่าจะเจอไฟล์ที่ต้องการ
เพราะฉะนั้นแล้วถ้าหนึ่งในพาธนี้เรามีสิทธิ์สามารถเขียนไฟล์เราก็สามารถที่จะยกระดับสิทธิ์ตัวเองได้ในที่สุด
เราสามารถตรวจสอบช่องโหว่นี้ได้ด้วยคำสั่ง สำหรับ Powershell
Get-CimInstance -ClassName win32_service| Where-Object {$_.PathName -NotLike ‘C:\Windows\system32\*’} | Select Name,State,PathName
หรือสำหรับ CMD
wmic service get name,pathname | findstr /i /v “C:\Windows\\” | findstr /i /v """
จากรูปด้านบนที่เราใช้คำสั่งในการตรวจสอบช่องโหว่ พบว่าที่ service ของ “unquotedsvc” นั้นมีช่องโหว่ ต่อมาเราสามารถใช้เครื่องมือ accesschk.exe ในการตรวจสอบว่าโฟลเดอร์ไหนบ้างที่เราสามารถเขียนไฟล์ ได้ด้วยคำสั่ง
accesschk.exe /accepteula -uwdq [PATH]
เราพบว่าที่พาธ “C:\Program Files\Unquoted Path Service\” เรามีสิทธิ์เขียนไฟล์ได้ ต่อมาเราจะใช้ประโยชน์จากช่องโหว่นี้โดนการเราจะเปลี่ยนชื่อไฟล์อันตรายของเราให้เป็นชื่อ “Common.exe” และนำไฟล์นี้ไปวางไว้ที่โฟลเดอร์ “C:\Program Files\Unquoted Path Service\” เพื่อให้ระบบมาเรียกใช้งานไฟล์ของเราแทนที่จะไปเรียกใช้งานไฟล์ “unquotedpathservice.exe” นั่นเอง
sc stop unquotedsvc
copy reverse.exe “C:\Program Files\Unquoted Path Service\Common.exe"
sc start unquotedsvc
มากันถึงครึ่งทางแล้ว เรามาลุยกันต่อเลยดีกว่าครับ โดยวิธีที่สามคือ
Weak Registry Permissions
คือการที่ ACL กำหนดสิทธิ์ผิดพลาดทำให้ผู้ใช้งานสามารถแก้ไขค่า registry key ที่เกี่ยวข้องกับ Services ได้
เราสามารถตรวจสอบได้ด้วยเครื่องมือ accesschk.exe ด้วยคำสั่ง
accesschk.exe /accepteula -kw hklm\System\CurrentControlSet\Services
จะเห็นได้ว่า service ของ “regsvc” จะมีกลุ่มของสิทธิ์ “NT AUTHORITY\INTERACTIVE” ที่สามารถแก้ไขค่า registry ของ service ได้ ต่อมาเราจะทำการเช็กต่อว่าเรานั้นอยู่ในกลุ่มนี้หรือไม่ ด้วยคำสั่ง
whoami /all
พบว่าเราอยู่ในกลุ่ม “NT AUTHORITY\INTERACTIVE” จากทั้งหมดนี้เราสามารถทำการแก้ไขจุดหมายปลายทางของ ImagePath เพื่อให้ระบบมาเรียกใช้งานไฟล์อันตรายของเราได้ด้วยคำสั่ง
net stop regsvc
reg add HKLM\SYSTEM\CurrentControlSet\Services\regsvc /v ImagePath /tREG_EXPAND_SZ /d C:\PrivEsc\reverse.exe /f
net start regsvc
และวิธีสุดท้ายนั่นคือ
Insecure Service Executables
คือการที่ผู้ใช้งานทั่วไปได้รับอนุญาตให้สามารถเขียนทับไฟล์ปฏิบัติการของ Services ที่ทำงานด้วยสิทธิ์ระบบ (SYSTEM Privileges) ได้
เราสามารถตรวจสอบได้ด้วยเครื่องมือ winPEAS ด้วยคำสั่ง
winPEASany.exe quiet servicesinfo
จะเห็นได้ว่าไฟล์ของ “filepermsvc” สามารถเขียนทับได้ด้วยผู้ใช้งานทั่วไป จากนั้นเราจะทำการเช็กว่า service นี้เรียกใช้งานด้วยสิทธิ์อะไรด้วยคำสั่ง
sc qc filepermsvc
ตัวของ service เรียกใช้งานด้วยผู้ใช้งาน “LocalSystem” ซึ่งเป็นสิทธิ์สูงสุดในระบบ ขั้นตอนต่อมาเราจะแทนที่ไฟล์ของ service นี้ด้วยไฟล์อันตรายของเราด้วยคำสั่ง
copy /Y C:\PrivEsc\reverse.exe “C:\Program Files\File Permissions Service\filepermservice.exe”
net start filepermsvc
และแล้วบทความครั้งนี้ก็มาถึงจุดสิ้นสุดกันแล้ว ซึ่งวิธีทั้งหมดที่ผมได้นำเสนอในบทความเป็นเพียงแค่ส่วนหนึ่งในการทำ Privilege Escalation ของ Windows Operating System เท่านั้น ยังมีวิธีอีกมากมายในการทำ Privilege Escalation
สุดท้ายสำหรับใครที่อยากจะเรียน Windows Privilege Escalation เพิ่มเติม ผมก็ไม่ลืมฝากสิ่งดี ๆ ด้วยคอร์สของ Udemy ที่สร้างโดย tib3rius นั่นคือ “Windows Privilege Escalation for OSCP and Beyond!” นั่นเองงงงง ก่อนจากกันไปผมก็ขอขอบคุณผู้อ่านทุกคนที่เข้ามาอ่านบทความนี้กันจนจบด้วยนะครับ
ขอบคุณครับ