ความซับซ้อนของรหัสผ่านผู้ใช้ในโดเมน 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 ที่อนุญาตให้ตรวจพบผู้ใช้ที่มีรหัสผ่านที่อ่อนแอ คล้ายคลึง มาตรฐาน ว่างเปล่า (ไม่จำเป็นต้องใช้รหัสผ่าน) หรือรหัสผ่านไม่มีวันหมดอายุ
หมายเหตุ โดยปกติ รหัสผ่านของผู้ใช้ไม่สามารถรับจากฐานข้อมูล AD เป็นข้อความธรรมดาได้ รหัสผ่านที่เก็บไว้ใน Active Directory จะถูกแฮช อย่างไรก็ตาม คุณสามารถเปรียบเทียบแฮชรหัสผ่านของผู้ใช้ AD กับแฮชของคำจากไฟล์พจนานุกรมและค้นหารหัสผ่านที่ไม่รัดกุมใน PowerShell เวอร์ชัน 5 (และใหม่กว่า) คุณสามารถติดตั้งโมดูล DSInternals ทางออนไลน์จากแกลเลอรีสคริปต์ PowerShell อย่างเป็นทางการได้ดังนี้:
ติดตั้งโมดูล 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 ปัจจุบันของคุณโดยใช้คำสั่งนี้:
นำเข้า-โมดูล C:\distr\PS\DSInternals\DSInternals.psd1
ไม่สามารถโหลดได้เนื่องจากสคริปต์การรันถูกปิดการใช้งานในระบบนี้
” ปรากฏขึ้นเมื่อนำเข้าโมดูล คุณต้องเปลี่ยนนโยบายการดำเนินการ PowerShell ปัจจุบัน และอนุญาตให้สคริปต์ PS ภายนอกทำงานอย่างน้อยในเซสชันปัจจุบัน:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force
รายการ cmdlet ของโมดูลที่พร้อมใช้งานสามารถรับได้ดังนี้:
รับคำสั่ง -Module DSInternals
ค้นหารหัสผ่าน Active Directory ที่อ่อนแอด้วย Cmdlet ของ Test-PasswordQuality
ถัดไป คุณต้องสร้างพจนานุกรมรหัสผ่าน มันจะเป็นไฟล์ข้อความธรรมดาที่มีรายการรหัสผ่านที่ใช้กันทั่วไป ไม่รัดกุม และรหัสผ่านที่ไม่ดีอื่นๆ คุณสามารถดาวน์โหลดไฟล์พจนานุกรมรหัสผ่านจากอินเทอร์เน็ตหรือสร้างขึ้นเอง โมดูล DSInternal ช่วยให้คุณสามารถเปรียบเทียบแฮชของรหัสผ่านของผู้ใช้ใน Active Directory กับแฮชของคำจากไฟล์นี้ บันทึกรหัสผ่านลงในไฟล์ข้อความ PasswordDict.txt .
ตอนนี้สร้างสคริปต์ PowerShell ขนาดเล็ก ในตัวแปรต่อไปนี้ ระบุพาธไปยังไฟล์รหัสผ่าน ชื่อโดเมน และชื่อตัวควบคุมโดเมน:
$DictFile ="C:\distr\PS\DSInternals\PasswordDict.txt"
$DC ="lon-dc01"
$Domain ="DC=woshub,DC=loc"รหัส>
จากนั้นใช้ Get-ADReplAccount cmdlet รับรายชื่อผู้ใช้ใน AD (เช่น Get-ADUser) นอกจากนี้ cmdlet นี้ส่งคืนแฮช NT และ LM รวมถึงประวัติแฮช จากนั้น สำหรับผู้ใช้แต่ละราย ให้เปรียบเทียบแฮชของรหัสผ่านกับแฮชจากไฟล์พจนานุกรม (การตรวจสอบจะดำเนินการสำหรับบัญชีผู้ใช้ที่ถูกปิดใช้งานด้วย):
รับ-ADReplAccount -ทั้งหมด -เซิร์ฟเวอร์ $DC -NamingContext $Domain | ทดสอบ-คุณภาพรหัสผ่าน -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:
ในเวอร์ชันก่อนหน้าของโมดูล DSInternal
ShowPlainText
พารามิเตอร์พร้อมให้แสดงรหัสผ่านของผู้ใช้เป็นข้อความที่ชัดเจน หากพบแฮชในพจนานุกรม ไม่มีในเวอร์ชันปัจจุบันของ Test-PasswordQuality หากคุณต้องการใช้โมดูล DSInternals รุ่นเก่ากว่า ให้ติดตั้งโดยใช้คำสั่ง:
ติดตั้ง-โมดูล -ชื่อ DSInternals -RequiredVersion 2.23
ดำเนินการค้นหาแฮชรวมถึงประวัติรหัสผ่านของผู้ใช้ที่เก็บไว้ใน AD อย่างที่คุณเห็น พบผู้ใช้ AD ที่มีรหัสผ่านง่าย ๆ สำเร็จ (รหัสผ่านตรงกับพจนานุกรม) นอกจากนี้ยังพบผู้ใช้หลายคนที่มีรหัสผ่านเหมือนกัน สคริปต์นี้จะช่วยคุณค้นหาบัญชีที่มีรหัสผ่านอย่างง่ายซึ่งอยู่ภายใต้นโยบายรหัสผ่านแบบละเอียดที่กำหนดเอง
สำหรับผู้ใช้ที่มีรหัสผ่านที่ไม่รัดกุม คุณสามารถสร้างรหัสผ่านแบบสุ่มที่รัดกุมและบังคับให้เปลี่ยนใน AD ผ่าน PowerShellคุณยังสามารถทำการสแกนไฟล์ฐานข้อมูล Active Directory (ntds.dit) แบบออฟไลน์ได้ คุณสามารถรับสำเนาของไฟล์ ntds.dit จากสำเนาเงาหรือจากข้อมูลสำรองของตัวควบคุมโดเมน
หากต้องการตรวจสอบแฮชของผู้ใช้แบบออฟไลน์ในไฟล์ ntds.dit ให้ใช้คำสั่งต่อไปนี้:
$keyboot=Get-BootKey -SystemHiveFilePath 'C:\ADBackup\registry\SYSTEM'
Get-ADDBAccount -All -DatabasePath 'C:\ADBackup\ntds.dit -BootKey $keyboot | ทดสอบ-คุณภาพรหัสผ่าน -WeakPasswordsFile $DictFile
คุณยังสามารถส่งออกรายการแฮชทั้งหมดไปยังไฟล์ข้อความ:
รับ-ADDBAccount -ทั้งหมด -DBPath 'C:\ADBackup\ntds.dit' -Bootkey $keyboot | รูปแบบ-กำหนดเอง -ดู HashcatNT | ออกไฟล์ c:\ps\ad_hashes.txt -Encoding ASCII
ดังนั้น เมื่อใช้สถานการณ์นี้ คุณจะสามารถวิเคราะห์คุณภาพของรหัสผ่านผู้ใช้ AD การต่อต้านการโจมตีด้วยกำลังดุร้าย สรุปความซับซ้อนของนโยบายรหัสผ่านของโดเมนในปัจจุบัน และทำการสรุปที่จำเป็น ผู้ดูแลระบบ Active Directory สามารถ (และควร) ดำเนินการตรวจสอบนี้เป็นประจำ