Windows Privilege Escalation

Datafarm
4 min readNov 15, 2023

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

ถัดมาเครื่องมือที่เราจะใช้ ได้แก่

  1. winPEAS คือ เครื่องมือที่ใช้ในการรวบรวมข้อมูลต่าง ๆ ไม่ว่าจะเป็นไฟล์ โฟลเดอร์ service หรืออะไรก็ตามที่มีการตั้งค่าผิดพลาดและอาจจะสามารถใช้ในการยกระดับสิทธิ์ได้
  2. accesschk.exe คือ เครื่องมือที่ใช้เพื่อตรวจสอบสิทธิ์การเข้าถึง (Access Control List) ของ user

เอาล่ะครับหลังจากที่เกริ่นกันมานานพอสมควรเรากลับมาดูวิธีการยกระดับสิทธิ์ของ Windows Operating System กันดีกว่า โดยในบทความนี้ทางผมจะนำวิธีมาเสนอ 4 วิธีด้วยกันได้แก่

  1. Insecure Service Properties
  2. Unquoted Service Paths
  3. Weak Registry Permissions
  4. 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” ระบบจะทำงานตามขั้นตอนดังนี้

  1. C:\Program.exe
  2. C:\Program Files\A.exe
  3. C:\Program Files\A Subfolder\B.exe
  4. C:\Program Files\A Subfolder\B Subfolder\C.exe
  5. 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!” นั่นเองงงงง ก่อนจากกันไปผมก็ขอขอบคุณผู้อ่านทุกคนที่เข้ามาอ่านบทความนี้กันจนจบด้วยนะครับ

ขอบคุณครับ

--

--

No responses yet