Lập trình, Windows

Hướng dẫn kiểm tra mật khẩu của Windows Active Directory Users bằng công cụ DSInternals

Bảo mật mật khẩu cho các users của bạn trong Active Directory là ưu tiên hàng đầu, đặc biệt khi doanh nghiệp vừa cập nhật Password Policy mới. Làm thế nào để kiểm tra xem tài khoản (users) nào chưa tuân thủ chính sách mật khẩu mới (ví dụ mật khẩu quá yếu hoặc không đúng chuẩn)? Bài viết này hướng dẫn cách sử dụng công cụ DSInternals (một module PowerShell dành cho AD) để audit password policy – giúp system admin nhanh chóng phát hiện mật khẩu yếu, vi phạm chính sách và yêu cầu người dùng thay đổi password kịp thời. Bài viết này sẽ hướng dẫn cách làm để giúp bạn áp dụng ngay việc này.

DSInternals là gì và vì sao nên dùng?

DSInternals là bộ công cụ PowerShell mạnh mẽ dành cho Active Directory system admin (gọi tắt: DSInternals PowerShell AD). Nó cho phép kiểm tra chất lượng mật khẩu của tất cả các tài khoản AD một cách tự động. Thay vì kiểm tra thủ công từng users, DSInternals giúp bạn quét toàn bộ hệ thống để tìm:

  • Mật khẩu yếu hoặc phổ biến (có trong danh sách mật khẩu bị rò rỉ hoặc từ điển mật khẩu đơn giản).

  • Mật khẩu trùng lặp giữa các tài khoản (nhiều người dùng chung một mật khẩu).

  • Mật khẩu trống hoặc mặc định (tài khoản chưa đặt mật khẩu hoặc dùng mật khẩu mặc định ban đầu).

  • Vi phạm chính sách bảo mật khác: Tài khoản đã được cấu hình là “Password never expires” (mật khẩu không bao giờ hết hạn), mật khẩu được lưu có thể đảo ngược, v.v.

Với DSInternals, system admin dễ dàng audit password policy hiện tại: phát hiện người dùng nào cần đặt lại mật khẩu để đáp ứng chính sách mới. Dưới đây là các bước đơn giản để thực hiện.

Các bước kiểm tra mật khẩu Active Directory bằng DSInternals

  1. Cài đặt DSInternals: Mở PowerShell với quyền Domain Admin trên Server quản lý AD. Cài module DSInternals bằng lệnh:

    Install-Module DSInternals
    Import-Module DSInternals

    Nếu chưa có NuGet: Install-PackageProvider -Name NuGet -Force

    (Nếu PowerShell yêu cầu xác nhận từ PSGallery, chọn Yes để tiếp tục cài đặt).

    Kiểm tra module đã cài:

    Get-Command -Module DSInternals

  2. Kết nối tới AD và trích xuất thông tin: Sử dụng cmdlet Get-ADReplAccount của DSInternals để lấy danh sách tài khoản và thông tin mật khẩu (hash) từ Active Directory. Ví dụ (Lưu ý: Cần thay đổi lệnh dưới với tên domain của bạn, ví dụ: Tên domain của bạn là “abc.local“, hãy thay đổi thành “DC=abc,DC=local“.):

    Get-ADReplAccount -All -Server "DC_Server_Name" -NamingContext "DC=company,DC=local" |
    Out-File "C:\AD_Repl_Accounts.txt" -Encoding UTF8
    • Out-File ghi kết quả hiển thị ra file.

    • -Encoding UTF8 để tránh lỗi ký tự.

    Tham số -Server là tên Domain Controller của bạn, và -NamingContext là tên miền (Domain DN). Lệnh trên sẽ truy xuất tất cả tài khoản trong domain company.local. (Lưu ý: Bạn cần quyền quản trị domain để chạy thành công lệnh.)

  3.  Lấy thông tin của Password Policy để kiểm tra

    $policy = Get-ADDefaultDomainPasswordPolicy

    Bạn có thể xem policy hiện tại:

    $policy

    Ví dụ kết quả:

  4.  Kiểm tra một user cụ thể

    Get-ADReplAccount -SamAccountName "user_name" -Server "DC_Server_Name" |
    Test-PasswordQuality

    Kết quả ví dụ:

    Rủi ro: Mật khẩu cũ không thay đổi theo thời gian → dễ bị lộ mà không phát hiện.

    Khuyến nghị: Bỏ tùy chọn “Password Never Expires” cho user này.

  5.   Quét toàn bộ domain:
    Lưu ý: Cần thay đổi lệnh dưới với tên domain của bạn, ví dụ: Tên domain của bạn là “abc.local“, hãy thay đổi thành “DC=abc,DC=local“.
    Get-ADReplAccount -All -Server "DC_Server_Name" -NamingContext "DC=company,DC=com" |
    Test-PasswordQuality |
    Out-File "C:\AD_Password_Audit.txt" -Encoding UTF8
    • Lệnh này sẽ kiểm tra tất cả users trong domain với policy hiện tại.

    • Out-File xuất báo cáo ra file  (C:\AD_Password_Audit.txt) để xem ai vi phạm.

    • -Encoding UTF8 để tránh lỗi ký tự

6. Kiểm tra chất lượng mật khẩu: Tiếp theo, kết hợp với cmdlet Test-PasswordQuality để phân tích chất lượng mật khẩu của các tài khoản vừa lấy. Thông thường chúng ta sẽ dùng pipeline để nối tiếp kết quả.

Lệnh này sẽ kiểm tra mọi tài khoản (kể cả tài khoản đã vô hiệu hóa Disabled) và so sánh mật khẩu với danh sách mật khẩu yếu đã được cung cấp trong file weak-passwords.txt . Bạn có thể download danh sách hash có 10 nghìn mật khẩu phổ biến dễ bị lộ từ github của mình qua Link: https://raw.githubusercontent.com/phuongluuho/newcode/refs/heads/main/weak-passwords.txt.

Get-ADReplAccount -All -Server "DC_Server_Name" -NamingContext "DC=company,DC=com" |
Test-PasswordQuality -WeakPasswordHashesFile "C:\weak-passwords.txt" -IncludeDisabledAccounts |
Out-File "C:\AD_Password_Audit.txt" -Encoding UTF8
  • Kết quả sẽ được lưu vào file C:\AD_Password_Audit.txt giữ nguyên định dạng giống như hiển thị trên console.

  • Tham số -WeakPasswordHashesFile giúp DSInternals nhận diện mật khẩu nào thuộc dạng yếu/phổ biến. (Bạn có thể bỏ qua tham số này nếu không có sẵn danh sách; DSInternals vẫn sẽ báo cáo các vấn đề khác như mật khẩu trùng lặp, trống…)

7. Xem báo cáo kết quả: Sau khi chạy, DSInternals sẽ hiển thị Password Quality Report – bản báo cáo chất lượng mật khẩu. Trong đó, các users được liệt kê theo vấn đề của từng mục , ví dụ:

    • Tài khoản có mật khẩu trùng nhau (nhóm các users dùng cùng một mật khẩu sẽ được gom nhóm).

    • Tài khoản có mật khẩu quá yếu hoặc nằm trong từ điển (nếu dùng danh sách mật khẩu yếu).

    • Tài khoản không có mật khẩu hoặc đang dùng mật khẩu mặc định.

    • Tài khoản được đặt “Password never expires” (mật khẩu không tự hết hạn, vi phạm chính sách bảo mật mới).

  Hãy chú ý danh sách tài khoản cụ thể dưới mỗi mục. Đây chính là những người dùng mà mật khẩu của họ không tuân thủ chính sách      mới hoặc tiêu chuẩn bảo mật.

8. Yêu cầu thay đổi mật khẩu: Dựa vào kết quả báo cáo của trên, bạn có thể xác định rõ người dùng nào cần đổi mật khẩu. Ví dụ: những tài khoản có mật khẩu yếu, trùng lặp hoặc không đáp ứng độ phức tạp tối thiểu theo chính sách mới nên được yêu cầu cập nhật mật khẩu ngay.  Hãy thông báo cho các người dùng này đặt mật khẩu mới thỏa mãn Password Policy của công ty ( VD Như:  Độ dài ký tự tối thiểu, bao gồm chữ hoa, chữ thường, số, ký tự đặc biệt,…). Sau khi các mật khẩu được cập nhật, chạy lại công cụ DSInternals để đảm bảo không còn tài khoản nào vi phạm.

– Ví dụ sau khi chúng ta chạy lệnh trên kết quả từ file báo cáo AD_Password_Audit.txt trả về là:

Active Directory Password Quality Report
—————————————-

Passwords of these accounts are stored using reversible encryption:

LM hashes of passwords of these accounts are present:

These accounts have no password set:
COMPANY\Guest

Passwords of these accounts have been found in the dictionary:
COMPANY\ftpuser1
COMPANY\test01

These groups of accounts have the same passwords:
Group 1:
COMPANY\Administrator
COMPANY\ftpuser2
COMPANY\sqladmin
COMPANY\user1

These user accounts have the SamAccountName as password:

These computer accounts have default passwords:

Kerberos AES keys are missing from these accounts:

Kerberos pre-authentication is not required for these accounts:

Only DES encryption is allowed to be used with these accounts:

These accounts are susceptible to the Kerberoasting attack:
COMPANY\krbtgt
COMPANY\sqladmin

These administrative accounts (current or former ones) are allowed to be delegated:
COMPANY\Administrator
COMPANY\krbtgt
COMPANY\sqladmin

Passwords of these accounts will never expire:
COMPANY\Administrator
COMPANY\ftpuser1
COMPANY\ftpuser2
COMPANY\Guest
COMPANY\sqladmin
COMPANY\test01
COMPANY\user1

These accounts are not required to have a password:
COMPANY\Guest

These accounts that require smart card authentication have a password:

– Phân tích kết quả của báo cáo trên:

  • COMPANY\Guest:

    • No password set: Tài khoản Guest không có mật khẩu.

    • Password not required: AD không bắt buộc Guest phải có mật khẩu.

  • COMPANY\ftpuser1COMPANY\test01:

    • Found in the dictionary: Mật khẩu của 2 tài khoản này nằm trong danh sách mật khẩu yếu (trong file weak-passwords.txt, VD User test01 đã được set password là “abc@123“, do đó đã bị phát hiện là mật khẩu yếu).

  • Group 1 (Administrator, ftpuser2, sqladmin, user1):

    • Same passwords: Các tài khoản này đang dùng cùng một mật khẩu → rủi ro cao.

  • COMPANY\krbtgtCOMPANY\sqladmin:

    • Kerberoasting: Mật khẩu yếu hoặc cấu hình khiến tài khoản có thể bị tấn công Kerberoast.

  • Administrator, krbtgt, sqladmin:

    • Delegatable Admins: Các tài khoản admin này có thể bị ủy quyền (delegation) → cần kiểm tra.

  • Administrator, ftpuser1, ftpuser2, Guest, sqladmin, test01, user1:

    • Passwords never expire: Mật khẩu không bao giờ hết hạn → không tuân thủ policy an toàn.

Tóm tắt nhanh:

  • Có 2 tài khoản dùng mật khẩu yếu (ftpuser1, test01).

  • Nhiều tài khoản dùng chung một mật khẩu (Admin, ftpuser2, sqladmin, user1).

  • Guest không có mật khẩu và không bị bắt buộc đặt.

  • Một số tài khoản admin có thể bị tấn công Kerberoast và delegation.

  • Hầu hết các tài khoản quan trọng không bị buộc thay mật khẩu định kỳ.

Về Test-PasswordQuality để giúp bạn kiểm tra mật khẩu yếu cho các AD Users.

Trong trường hợp nếu bạn nghi ngờ trong công ty của bạn có nhiều người dùng đang sử dụng mật khẩu yếu, dễ đoán ví dụ như “cuchuoi”, “deobiet” hay “mebim” (kể cả trường hợp chúng ta đã cấu hình Domain Policy & Password Policy là: ” password must meet complexity requirements”. Nhưng AD users vẫn có thể set password yếu – dễ đoán VD là: “abc@1234” ) , và bạn muốn kiểm tra các mật khẩu yếu này. Vậy bạn cần download file “10k-most-common.txt” chứa 10 nghìn mật khẩu phổ biến nhất  , sau đó bạn thêm vào danh sách các mật khẩu mà bạn cho là yếu, và dùng file này để chuyển đổi sang NTLM hash, cách làm như sau:

✅ 1. Cài Python trên Windows 11

Cách cài nhanh nhất là sử dụng winget:

Mở PowerShell ( với quyền Administrator).

Chạy lệnh:

winget install Python

Kiểm tra cài đặt:

python --version

→ Kết quả ví dụ: Python 3.12.10

Nếu không có winget, có thể cài từ python.org hoặc Microsoft Store.

✅ 2. Cài pip và thư viện passlib

  • Kiểm tra pip:

    python -m ensurepip --upgrade
  • Cài passlib:

    pip install passlib

✅ 3. Tạo file Python để convert:

Bạn cần mở file 10k-most-common.txt, và thêm vào các mật khẩu mà bạn nghi ngờ và cho là yếu, sau đó download file Python ConvertTo-NTLM.py  (Hãy nhớ là file python này cần nằm cùng thư mục với file 10k-most-common.txt ) về máy tính của bạn và chạy lệnh sau để convert file 10k-most-common.txt sang file NTLM hash đặt tên là “weak-passwords.txt”, mở PowerShell và sử dụng lệnh sau:

cd D:\path\to\script
python ConvertTo-NTLM.py C:\weak-plaintext.txt C:\weak-passwords.txt

✅ 4. Kết quả:

  • File weak-passwords.txt sẽ chứa:

32ed87bdb5fdc5e9cba88547376818d4
8846f7eaee8fb117ad06bdd830b7586c
5f1b5bcdae6303255b39a6722344ebf5
44f6d9b63c335e7cbd8fbfd6d6f8c8c0

Mỗi dòng tương ứng với NTLM hash của từng mật khẩu trong file plaintext weak-passwords.txt.

Kết luận: Như vậy Chỉ với vài bước đơn giản, DSInternals PowerShell AD giúp system admin chủ động kiểm tra và nâng cao bảo mật mật khẩu trong Active Directory. Việc audit định kỳ chất lượng mật khẩu sẽ ngăn chặn rủi ro từ mật khẩu yếu, đảm bảo toàn bộ hệ thống tuân thủ chính sách mới. Hãy áp dụng ngay trong hệ thống nội bộ của bạn ngay để kịp thời phát hiện lỗ hổng trước khi sự cố xảy ra.

Mẹo: Bạn có thể lên lịch (schedule) script DSInternals này để chạy định kỳ (vd: hàng quý) và xuất kết quả ra file. Điều này giúp theo dõi liên tục tình trạng mật khẩu và nhắc nhở người dùng đổi mật khẩu đúng hạn.

Công cụ mạnh đã có, vấn đề bảo mật mật khẩu giờ đây nằm trong tầm tay bạn. Hãy bắt đầu kiểm tra Active Directory của bạn ngay hôm nay!

Nếu thấy hữu ích, đừng quên chia sẻ bài viết, lưu lại (bookmark) hoặc áp dụng ngay cho công ty của bạn nhé. Chúc bạn thành công trong việc bảo vệ hệ thống Windows Domain của bạn!

#ActiveDirectory #Security #DSInternals #PowerShell

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *