How to escalate the privileges through MS16-041 (Post-exploitation due to non-fully patch Windows platform)

วิธีการทำ Post-Exploitation เบื้องต้นบน Windows Platform

บทนำ (Overviews)

ในการทดสอบเจาะระบบ หรือในการเล่น Capture-the-Flag (ขออนุญาตใช้คำย่อที่ติดปากกันว่า CTF) เมื่อ pentester มีการเข้าถึงระดับระบบปฏิบัติการของเครื่องเหยื่อแล้ว มักมีการมองหาวิธีต่างๆในการทำ post-exploitation เพื่อยกระดับสิทธิ์ (privilege escalation) ให้เป็นสิทธิ์สูงสุด ที่เป็น privilege account ซึ่งพบว่าองค์กรส่วนมาก มักจะไม่ได้ทำการ update security patch สำหรับระบบปฏิบัติการของ server หรือ client จนครบถ้วน ทำให้ pentester สามารถโจมตีเพื่อยกระดับสิทธิ์จากการมองหา security patch ที่ไม่ได้ลงไว้ได้ ทางผู้เขียนจึงได้เล็งเห็นวิธีการทำ post-exploitation เบื้องต้น จากการโจมตีไปยัง patch ที่ไม่ได้ลง แล้วยกระดับสิทธิ์เพื่อทำ full-compromise ต่อไป

Scenario ที่ใช้ในการทดสอบ:
1. Pentester สามารถเรียก reverse shell จากเครื่องเหยื่อได้
2. เรียกใช้ Exploit Suggester เพื่อตรวจสอบว่าระบบปฏิบัติการเครื่องเหยื่อ สามารถโจมตีด้วย patch number ใดได้บ้าง
3. โจมตีด้วย patchnumber ที่ไม่ได้ติดตั้ง แล้วยกระดับเป็นสิทธิ์สูงสุด
4. ทำการ dump credential ออกมา และนำไป crack ให้ได้ plain-text password
5. นำ credential ที่ได้มาจากข้อ 4 ไปใช้งาน remote log-in ผ่านวิธี Pass-the-Hash

อุปกรณ์/product ที่ใช้ในการทดสอบ:
1. Windows 7 (64 bits) Service Pack 1 (Assigned IP : 192.168.23.133)
2. Kali-Linux (Assigned IP : 192.168.23.128)

บทความโดย
Vanitas
Cyber Security Researcher


ขั้นตอน (Steps)

  1. Pentester เรียก meterpreter session ผ่าน reverse shell ได้ ซึ่งใน scenario ที่ใช้ทดสอบนี้ เป็น Meterpreter 64 bits สำหรับ Windows 64 bits architecture
  2. ทำการตรวจสอบ privilege ว่าสามารถเรียกสิทธิ์สูงสุด (NT SYSTEM) ได้หรือไม่ ด้วยการใช้ command : getsystem จะพบว่าไม่สามารถยกระดับสิทธิ์ได้
    getsystem
    

  3. ทำการ shell เข้า command prompt แล้วดูเรียกดูว่ามี patch ใดที่มีการ install อยู่บนเครื่องเหยื่อแล้วบ้าง ดัง command ต่อไปนี้
    shell
    systeminfo | more
    

  4. จากรูป จะได้ข้อมูลเบื้องต้นจากเครื่องเหยื่อแล้วว่า มี hostname = WIN7VICTIM โดยเป็น Windows 7 (64 bits) ที่เป็น Service Pack 1โดยมีการติดตั้ง patch ไว้ 2 KB
  5. ให้ออกจาก meterpreter session แรก ให้คงbackground process เดิมไว้ ตาม command ดังนี้
    
    ^Z (Ctrl + Z) แล้ว confirm Y
    background
    session -l
    
    

  6. ใช้ metasploit module ที่ใช้ในการหา local exploit จาก patch ที่ขาดหายไป ซึ่งใน scenario นี้เราจะใช้ Local Exploit Suggester แล้วระบุ session id ที่ได้มาจากข้อ ด้วย command ดังนี้
    use post/multi/recon/local_exploit_suggester
    set SESSION [session_id]
    

  7. ทำการ run ขึ้นมา จะได้ผลลัพธ์ว่าหมายเลข patch exploit ใดที่สามารถยกระดับสิทธิ์ (Privilege Escalation) เป็นสิทธิ์สูงสุดได้
  8. โดยหลักการในการเลือกexplotนั้น ให้พยายามเลือก exploit จาก patchnumber ใหม่สุดเป็นหลัก ใน scenario นี้เราจึงเลือกใช้ MS16-014เป็นตัวเลือกแรกในการทำ Privilege Escalation ซึ่งหากกลับไปดูข้อมูลของ MS16-014 จะพบว่าเครื่องเหยื่อไม่ได้มีการ install patch KB ที่ใช้ป้องกันช่องโหว่นี้อยู่ จึงมีความเป็นไปได้ว่าจะสามารถยกระดับสิทธิ์ได้จาก exploit นี้(สามารถอ่านข้อมูลอ้างอิงเพิ่มเติมได้ที่ https://docs.microsoft.com/en-us/security-updates/securitybulletins/2016/ms16-014)
  9. ใช้ metasploit module ดังกล่าว ซึ่งเป็น exploit module ที่ใช้ในการทำ local exploitเพื่อทำ privilege escalation ให้เป็นระดับสิทธิ์สูงสุดของเครื่อง โดยระบุ session id เป็น session ที่เราได้ meterpresession มาก่อนหน้านี้ สามารถทำได้โดยเรียกผ่าน command ดังนี้
    use exploit/windows/local/ms16_014_wmi_recv_notif
    set SESSION [session_id]
    

  10. หมายเหตุ: กรณีนี้ควรดู target ในการ exploit ให้ดี เนื่องจาก exploit module ที่เลือกนั้น ในบางตัวจะต้องมีการเจาะจง Windows version ให้ตรงกับเป้าหมาย ซึ่งใน scenario นี้ใช้งานเป็น Windows 7 Service Pack 1 ตรงตามเป้าหมาย จึงไม่ต้องเปลี่ยน target id แต่อย่างใด
    ^Z (Ctrl+Z)
    session -l
    
  11. ซึ่งในขั้นตอนนี้เราจะได้ process id (pid) ของ sessionที่ได้รับสิทธิ์สูงมาด้วย (ณ ที่นี้ คือ pid : 2288)
  12. ให้เรากลับไปสู่ meterpreter session เดิม แล้วทำการ migrade จาก session ปัจจุบันไปเป็น pid ที่ระบุสิทธิ์สูงสุด จะพบว่าหลัง migrate นี้ เราจะควบคุมเครื่องได้สมบูรณ์แบบแล้ว ซึ่งทดสอบได้ด้วย command ดังนี้
    ^Z (Ctrl + Z)
    migrate [pid]
    getuid
    

  13. ต่อจากนี้จะเริ่มทำการขโมย credential ต่างๆออกมาได้แล้ว โดยในขั้นตอนนี้ผู้เขียนอนุญาตแบ่งเป็น 2 วิธี ซึ่งแล้วแต่ว่าผู้ใช้จะสะดวกใช้แบบไหน
    1. โดยวิธี hashdump
      • ใช้วิธีการทำ hashdump ผ่าน meterpreter sessionออกมาเป็น NTLM hash
      • ใช้ hashdump ออกมา ด้วย command : hashdump
        hashdump
        

      • ซึ่งจากรูป hashdump จะอยู่ใน formatดังนี้
        [Username]:[RID]:[LM-Hash-Value]:[NTLM-Hash-Value]:::
        
      • นำ hash value ที่ได้ไปใส่ใน text file เป็นชื่ออะไรก็ได้ ตาม format ดังนี้
        $NT$[NTLM-Hash-Value]
        
      • จากรูปจะเป็นการเตรียมhash ของ user : Administrator ที่เป็น local admin ของเครื่องเหยื่อ
      • ใช้ John-the-ripper ซึ่งเป็น toolในการ crack password ที่มากับ Kali-Linuxไป crack NTLM hash ออกมา ดัง command นี้
        john --wordlist=[wordlist file] --format=nt [hashfile]
        john –show [hashfile]
        
      • จะพบว่าได้ password ออกมาเป็น plain-textเรียบร้อยแล้ว
      •  หมายเหตุ: โดยปกติแล้วเราควรใช้ wordlist file ที่มี wordlistในการ crack ให้มากที่สุด เนื่องจากตัว toolจะไปดึง wordlist ในไฟล์นั้นมาไล่เทียบว่าตรงกับ hash ที่จะ crack หรือไม่ ดังนั้น wordlistจึงเป็น keypoint หนึ่งในการทำ password cracking
    2. โดยวิธี Mimikatz tool
      • ใช้ Mimikatz tool ในการดึง credentialออกมาเป็น NTLM hash/plain-text
      • ทำการ load mimikatz extension ขึ้นมาด้วย meterperter session
        load mimikatz
        

      • กรณีที่เครื่องเหยื่อไม่ได้ install patch เพื่อป้องกัน WDigest ไว้ จะสามารถใช้ wdigest module เพื่อดู plain-text password ได้เลย ด้วย command
        wdigest
        

      • กรณที่เครื่องเหยื่อมีการ install patch เพื่อป้องกันWDigest plain-text password ไว้แล้ว สามารถใช้ msv module เพื่อ dump NTLM หรือ LM hash value ได้ ด้วย command
        msv
        

      • จากขั้นตอนนี้ จะเห็นว่า hashing ที่ได้จาก NTLM hash value เป็นตัวเดียวกันกับขั้นตอนที่10จึงทำให้สามารถนำไป crack password ต่อได้ด้วย John-the-ripper
  14. ในกรณีที่ pentester ที่ไม่สามารถ crack password ออกมาเป็น plain-text ได้ ก็ยังมีอีกวิธีที่สามารถทำ replay remote session ได้ โดยการใช้งานผ่านวิธีที่เรียกว่า Pass-the-Hash ซึ่งเป็นวิธีที่ผู้โจมตีสามารถดึงNTLM hash value ที่ได้มา ไปเป็น password  ในการ remote log-in ได้เลย โดย format การใช้งานเป็นดังนี้
    Example : ตัวอย่างการทำ Pass-the-Hash ด้วย User : Administrator ไปยังเครื่องเหยื่อ ด้วย NTLM hash value
    
    pth-winexe –U [User]%[NTLM-Hash-Value] //[IP or hostname] [command]
    

  15. ซึ่งหลังจากนี้ก็จะสามารถเข้าไปเครื่องเหยื่อเพื่อหาข้อมูลอื่นๆต่อไปได้แล้ว ดังนั้น จึงเป็นเรื่องสำคัญมากที่ผู้ดูแลระบบจำเป็นจะต้องติดตั้ง security patch ให้ครบถ้วน ไม่เพียงแต่เพื่อป้องกันการทำ Remote Exploit เท่านั้น แต่เพื่อเป็นการลดความเสี่ยงจากการถูกทำ Privilege Escalation อีกด้วย

References:

  • https://null-byte.wonderhowto.com/how-to/hack-like-pro-metasploit-for-aspiring-hacker-part-11-post-exploitation-with-mimikatz-0168208/
  • https://www.offensive-security.com/metasploit-unleashed/mimikatz/
  • https://blog.rapid7.com/2015/08/11/metasploit-local-exploit-suggester-do-less-get-more/
  • https://www.kali.org/penetration-testing/passing-hash-remote-desktop/

ใส่ความเห็น