Перейти к содержимому

Как провести адудит паролей в windows ad

Задача провести аудит слабых паролей.

PasswordDict

# Получаем дату в формате dd.MM.yyyy(HH.mm)
$datA = Get-Date -Format "dd.MM.yyyy(HH.mm)"
$DC = "ad01"
$Domain = "DC=admin,DC=ru"
$Pth = "C:\tmp\PasswordQuality\"
$Pfile = "$Pth" + "AD_PSSW_$datA.csv"
$DictFile = "$Pth" + "PasswordDictbac.txt"
$OUsss = '*DC=admin,DC=ru'
$strBlankPasswordNThash = '31d6cfe0d16ae931b73c59d7e0c089c0'
$intBadPasswordsFound = 0

# Проверка существования файла словаря
If (Test-Path $DictFile) {
    Write-Output "Файл словаря найден: $DictFile"
} else {
    Write-Error "Файл словаря $DictFile не найден. Проверьте путь."
    exit
}

# Функция для вычисления NTLM-хеша из текста
Function Get-NTHashFromClearText {
    Param ([string]$ClearTextPassword)
    # Замените ConvertTo-NTHash на свой способ получения хеша, если нужно
    Return ConvertTo-NTHash $(ConvertTo-SecureString $ClearTextPassword -AsPlainText -Force)
}

# Проверка подключения к Active Directory
try {
    $arrUsersAndHashes = Get-ADReplAccount -All -Server $DC -NamingContext $Domain | Where-Object {
        $_.Enabled -eq $true -and $_.SamAccountType -eq 'User' -and $_.DistinguishedName -like $OUsss
    } | Select-Object SamAccountName,@{Name="NTHashHex";Expression={ConvertTo-Hex $_.NTHash}}
    Write-Output "Пользователей, полученных из AD: $($arrUsersAndHashes.Count)"
} catch {
    Write-Error "Ошибка при получении данных из Active Directory. Проверьте подключение к домену и наличие модуля Get-ADReplAccount."
    exit
}

# Создание файла для записи
try {
    Add-Content -Path $Pfile -Value "Name,Username,NTLMPassword"
    Write-Output "Файл для вывода хешей создан: $Pfile"
} catch {
    Write-Error "Не удалось создать файл для записи: $Pfile"
    exit
}

# Размер партии для обработки словаря
$BatchSize = 10000  # Укажите количество строк на одну партию
$BadPasswordList = Get-Content -Path $DictFile -ReadCount $BatchSize
$BatchCount = 0

# Обработка словаря партиями
foreach ($Batch in $BadPasswordList) {
    $htBadPasswords = @{}
    $BatchCount++
    Write-Output "Обработка партии $BatchCount..."

    # Заполнение хеш-таблицы текущей партии
    foreach ($BadPassword in $Batch) {
        if ($BadPassword -ne '') {
            $NTHash = $(Get-NTHashFromClearText $BadPassword)
            if (!$htBadPasswords.ContainsKey($NTHash)) {
                $htBadPasswords[$NTHash] = $BadPassword
            }
        }
    }

    # Сравнение пользователей с хешами из текущей партии
    foreach ($hashuser in $arrUsersAndHashes) {
        $strUserSamAccountName = $hashuser.SamAccountName
        $strUserNTHashHex = $hashuser.NTHashHex
        $Nametable = Get-ADUser -LDAPFilter "(sAMAccountName=$strUserSamAccountName)" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Name

        # Проверка наличия хеша пользователя в словаре
        if ($htBadPasswords.ContainsKey($strUserNTHashHex)) {
            $intBadPasswordsFound++
            $strUserBadPasswordClearText = $htBadPasswords[$strUserNTHashHex]

            try {
                Add-Content -Path $Pfile -Value "$Nametable,$strUserSamAccountName,$strUserBadPasswordClearText" -Encoding UTF8
                Write-Output "Добавлен пользователь с плохим паролем: $Nametable, $strUserSamAccountName"
            } catch {
                Write-Error "Ошибка при записи пользователя $Nametable, $strUserSamAccountName в файл."
            }
        }
    }
}

Write-Output "Всего найдено пользователей с плохими паролями: $intBadPasswordsFound"
Write-Output "Скрипт завершен."

 

Similar Posts:

Метки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика