ความซับซ้อนของรหัสผ่านผู้ใช้ในโดเมน Active Directory เป็นองค์ประกอบความปลอดภัยสำคัญทั้งสำหรับข้อมูลผู้ใช้และโครงสร้างพื้นฐานของโดเมนทั้งหมด ผู้ใช้หลายคนชอบใช้รหัสผ่านที่ง่ายและจดจำง่ายแม้จะมีข้อแนะนำว่าไม่ควรใช้ข้อมูลส่วนตัว คำในพจนานุกรม หรือการผสมผสานที่ง่ายๆ เป็นรหัสผ่าน ในบทความนี้ เราจะแสดงวิธีการตรวจสอบรหัสผ่านผู้ใช้ Active Directory และค้นหารหัสผ่านที่อ่อนแอหรือเรียบง่ายโดยใช้ PowerShell
แม้จะมีนโยบายรหัสผ่านโดเมนที่ซับซ้อน ผู้ใช้ก็ยังสามารถตั้งรหัสผ่านที่อ่อนแอหรือเป็นค่าเริ่มต้นได้ในทางเทคนิค เช่น Pa$$w0rd หรือ P@ssw0rd
วิธีติดตั้งโมดูล PowerShell DSInternals (Directory Services Internals)
เพื่อเปรียบเทียบแฮชของรหัสผ่านผู้ใช้ที่จัดเก็บในฐานข้อมูล Active Directory (ไฟล์ ntds.dit) กับพจนานุกรมของรหัสผ่านที่เรียบง่ายและพบได้บ่อย คุณสามารถใช้โมดูล PowerShell ของบุคคลที่สามคือ DSInternals โมดูลนี้มี cmdlet จำนวนมากที่ช่วยให้ดำเนินการต่างๆ กับฐานข้อมูล AD ได้ทั้งในโหมดออนไลน์และออฟไลน์ (โดยตรงกับ ntds.dit) โดยเฉพาะเราสนใจใน cmdlet Test-PasswordQuality ซึ่งช่วยตรวจจับผู้ใช้ที่มีรหัสผ่านอ่อนแอ คล้ายกัน มาตรฐาน ว่าง (Password Not Required) หรือรหัสผ่านที่ไม่มีวันหมดอายุ
หมายเหตุ ทางธรรมชาติแล้ว ไม่สามารถดึงรหัสผ่านผู้ใช้จากฐานข้อมูล AD เป็นข้อความธรรมดาได้ รหัสผ่านที่จัดเก็บใน Active Directory จะถูกแฮช อย่างไรก็ตาม คุณสามารถเปรียบเทียบแฮชรหัสผ่านของผู้ใช้ AD กับแฮชของคำจากไฟล์พจนานุกรมและค้นหารหัสผ่านที่อ่อนแอได้
ใน PowerShell เวอร์ชัน 5 (และใหม่กว่า) คุณสามารถติดตั้งโมดูล DSInternals ออนไลน์จากแกลเลอรีสคริปต์ PowerShell อย่างเป็นทางการได้ดังนี้:
Install-Module DSInternals
ใน PowerShell เวอร์ชันเก่ากว่าหรือในสภาพแวดล้อมที่ตัดการเชื่อมต่อ คุณต้องดาวน์โหลดไฟล์ .zip ที่มีโมดูลเวอร์ชันล่าสุดจาก GitHub (https://github.com/MichaelGrafnetter/DSInternals/releases) ณ เวลาที่เขียนบทความนี้ เวอร์ชันล่าสุดคือ DSInternals v4.4.1 แตกไฟล์สำรองนี้ไปยังหนึ่งในไดเรกทอรีที่มีโมดูล PowerShell:
- C:\Windows\system32\WindowsPowerShell\v1.0\Modules\DSInternals
- C:\Users\%username%\Documents\WindowsPowerShell\Modules\DSInternals
หรือนำเข้าโมดูล DSInternals เข้าสู่เซสชัน PowerShell ปัจจุบันโดยใช้คำสั่งนี้:
Import-Module C:\distr\PS\DSInternals\DSInternals.psd1
หากเกิดข้อผิดพลาด "cannot be loaded because running scripts is disabled on this system" ขณะนำเข้าโมดูล คุณต้องเปลี่ยน Execution Policy ของ PowerShell ปัจจุบันและอนุญาตให้รันสคริปต์ภายนอกได้อย่างน้อยในเซสชันปัจจุบัน:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force
รายการ cmdlet ที่พร้อมใช้งานของโมดูลสามารถดูได้ดังนี้:
Get-Command -Module DSInternals

ค้นหารหัสผ่าน Active Directory ที่อ่อนแอด้วย Cmdlet Test-PasswordQuality
ต่อไป คุณต้องสร้างพจนานุกรมรหัสผ่าน ซึ่งจะเป็นไฟล์ข้อความง่ายๆ ที่มีรายการรหัสผ่านที่ใช้บ่อย อ่อนแอ และรหัสผ่านที่ไม่ดีอื่นๆ คุณสามารถดาวน์โหลดไฟล์พจนานุกรมรหัสผ่านจากอินเทอร์เน็ตหรือสร้างเอง โมดูล DSInternals ช่วยให้คุณเปรียบเทียบแฮชของรหัสผ่านผู้ใช้ใน Active Directory กับแฮชของคำจากไฟล์นี้ บันทึกรหัสผ่านลงในไฟล์ข้อความ PasswordDict.txt

ตอนนี้สร้างสคริปต์ PowerShell ขนาดเล็ก ในตัวแปรต่อไปนี้ ให้ระบุเส้นทางไปยังไฟล์รหัสผ่าน ชื่อโดเมน และชื่อโดเมนคอนโทรลเลอร์:
$DictFile = "C:\distr\PS\DSInternals\PasswordDict.txt"
$DC = "lon-dc01"
$Domain = "DC=woshub,DC=loc"
จากนั้นใช้ cmdlet Get-ADReplAccount เพื่อดึงรายการผู้ใช้ใน AD (คล้าย Get-ADUser) นอกจากนี้ cmdlet นี้ยังคืนค่า NT และ LM hashes รวมถึงประวัติแฮชด้วย จากนั้นสำหรับแต่ละผู้ใช้ ให้เปรียบเทียบแฮชรหัสผ่านกับแฮชจากไฟล์พจนานุกรม (การตรวจสอบยังดำเนินการกับบัญชีผู้ใช้ที่ปิดใช้งานด้วย):
Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Test-PasswordQuality -WeakPasswordsFile $DictFile -IncludeDisabledAccounts
ผลลัพธ์ของการรันสคริปต์อาจมีลักษณะดังนี้:
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: TEST\DefaultAccount TEST\Guest Passwords of these accounts have been found in the dictionary: TEST\a.adams TEST\jbrion TEST\jsanti These groups of accounts have the same passwords: Group 1: TEST\a.novak TEST\Administrator TEST\amuller TEST\k.brown Group 2: TEST\a.adams TEST\jbrion TEST\jsanti 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 administrative accounts are allowed to be delegated to a service: TEST\a.adams TEST\a.novak TEST\Administrator TEST\jbrion TEST\jsanti TEST\k.brown TEST\krbtgt Passwords of these accounts will never expire: TEST\a.adams TEST\Administrator TEST\DefaultAccount TEST\Guest TEST\k.brown TEST\krbtgt TEST\web These accounts are not required to have a password: TEST\ADFS1$ TEST\DefaultAccount TEST\Guest These accounts that require smart card authentication have a password:

ในเวอร์ชันก่อนหน้าของโมดูล DSInternals พารามิเตอร์ ShowPlainText พร้อมใช้งานเพื่อแสดงรหัสผ่านของผู้ใช้เป็นข้อความธรรมดาหากพบแฮชในพจนานุกรม แต่ไม่มีในเวอร์ชันปัจจุบันของ Test-PasswordQuality หากคุณต้องการใช้เวอร์ชันเก่าของโมดูล DSInternals ให้ติดตั้งด้วยคำสั่ง:
Install-Module -Name DSInternals -RequiredVersion 2.23
การค้นหาแฮชจะดำเนินการรวมถึงประวัติรหัสผ่านของผู้ใช้ที่จัดเก็บใน AD ตามที่เห็น สามารถค้นพบผู้ใช้ AD ที่มีรหัสผ่านเรียบง่ายได้สำเร็จ (รหัสผ่านตรงกับพจนานุกรส) ยังพบผู้ใช้หลายคนที่มีรหัสผ่านเหมือนกันด้วย สคริปต์นี้จะช่วยให้คุณค้นหาบัญชีที่มีรหัสผ่านเรียบง่ายซึ่งอยู่ภายใต้นโยบายรหัสผ่านละเอียด (Fine-Grained Password Policies) ที่กำหนดเอง
สำหรับผู้ใช้ที่มีรหัสผ่านอ่อนแอ คุณสามารถสร้างรหัสผ่านสุ่มที่แข็งแกร่งและบังคับให้เปลี่ยนใน AD ผ่าน PowerShell ได้
คุณยังสามารถดำเนินการสแกนออฟไลน์ของไฟล์ฐานข้อมูล Active Directory (ntds.dit) ได้ คุณสามารถรับสำเนาของไฟล์ ntds.dit จาก Shadow Copy หรือจากการสำรองข้อมูลโดเมนคอนโทรลเลอร์
เพื่อตรวจสอบแฮชผู้ใช้ออฟไลน์ในไฟล์ ntds.dit ให้ใช้คำสั่งต่อไปนี้:
$keyboot= Get-BootKey -SystemHiveFilePath 'C:\ADBackup\registry\SYSTEM'
Get-ADDBAccount -All -DatabasePath 'C:\ADBackup\ntds.dit -BootKey $keyboot | Test-PasswordQuality -WeakPasswordsFile $DictFile
คุณยังสามารถส่งออกรายการแฮชทั้งหมดไปยังไฟล์ข้อความได้:
Get-ADDBAccount -All -DBPath 'C:\ADBackup\ntds.dit' -Bootkey $keyboot | Format-Custom -View HashcatNT | Out-File c:\ps\ad_hashes.txt -Encoding ASCII
ไม่มีเครื่องมือBuilt-in สำหรับกำหนดรายการรหัสผ่านที่ห้ามสำหรับ Active Directory Domain Services อย่างไรก็ตาม ด้วย Azure AD password protection คุณสามารถบล็อกรหัสผ่านบางรายการ (Blacklist) แม้ใน Active Directory On-premises ของคุณ
ดังนั้น การใช้สถานการณ์นี้ คุณสามารถวิเคราะห์คุณภาพของรหัสผ่านผู้ใช้ AD ความทนทานต่อการโจมตี Brute Force สรุปความซับซ้อนของนโยบายรหัสผ่านโดเมนปัจจุบัน และทำข้อสรุปที่จำเป็น ผู้ดูแลระบบ Active Directory ควร (และควรจะ) ดำเนินการตรวจสอบนี้เป็นประจำ