Lazyadminfinder: легко обнаружить общие пароли и повысить безопасность Active Directory

Lazyadminfinder: легко обнаружить общие пароли и повысить безопасность Active Directory

19 июня 2025 г.

Управление безопасностью Active Directory (AD) может быть сложным, особенно при выявлении паролей обмена учетными записями или использованием слабой практики аутентификации. ВходитьLazyadminfinder, мощный, легкий инструмент PowerShell, который быстро раскрывает использование общего пароля и улучшает осанку вашей организации в области безопасности рекламы.

Что такое Lazyadminfinder?

Lazyadminfinder - это сценарий PowerShell, использующий модуль Dsinternals для:

  • Обнаружение и отчет общего хэша паролей NTLM.
  • Архивируйте и сравните исторические хэш -данные для определения повторного использования паролей.
  • Предоставьте комплексные отчеты, которые точно определяют рискованное поведение.

Разработанный специально для администраторов Active Directory, Lazyadminfinder предоставляет быстрое, действенное представление о безопасности паролей.

Зачем использовать Lazyadminfinder?

  • Улучшение безопасности:Определите слабые или скомпрометированные пароли.

  • Согласие:Поддерживать честность AD в целях аудита и соответствия.

  • Эффективность:Быстрое аудиторское учетные записи без вручного просмотра данных.

Как работает Lazadminfinder?

Привлечь и фильтровать учетные записи пользователей

Сценарий собирает учетные записи пользователей рекламы, фильтрация отключенных, машинных и услуг, чтобы сосредоточиться только на активных пользователях.

Хеш -извлечение NTLM и архивирование

Экстракты Lazadminfinder Hashs из счетов и надежно архивируют их хэши Sha-256 для исторического сравнения.

Обнаружение повторного использования пароля

Сравнивая текущий запуск с предыдущими архивами, инструмент обнаруживает повторное использование пароля, отмечая учетные записи с потенциальными рисками безопасности. Это помогает идентифицировать:

  • Администраторы или привилегированные пользователи синхронизируют пароли между стандартными и административными учетными записями.
  • Пользователи, особенно администраторы, неоднократно сбрасывая свои пароли в ранее используемые значения.

Общая группировка паролей

Скрипт идентифицирует и группирует аккаунт, совместно используя идентичные хэши NTLM, что может указывать либо на преднамеренный обмен паролем, либо несколько пользователей независимо от выбора одного и того же пароля - часто из -за слабых привычек пароля. Например, если несколько пользователей выбирают общий пароль, такой как «Summer2025!», Lazyadminfinder объединит эти учетные записи, что позволит вам быстро обнаружить как потенциальные общие пароли, так и рискованное параллельное мышление при создании пароля.

Рассмотрите возможность запуска LazyAdminfinder регулярно на основе политики сброса пароля вашей организации. Например, если ваша политика требует сброса пароля каждые 90 дней, запланируйте сценарий для работы примерно каждые 100 дней. Это время гарантирует, что вы запечатлели экземпляры, когда администраторы или привилегированные пользователи могут сбросить свои пароли обратно в ранее используемые. Если ваша организация не обеспечивает соблюдение политики повторного использования паролей, периодически запуск Lazadminfinder становится еще более важной для выявления и смягчения потенциальных рисков безопасности.

Установка Lazyadminfinder

Шаг 1: подготовка

  • Убедитесь, что PowerShell установлен в вашей системе.
  • Установите требуемый модуль:
Install-Module DSInternals

Шаг 2: Настройте скрипт

Настройте эти важные параметры в рамках предоставленного сценария:

  • Контроллер домена:
$dc = "your-domain-controller.example.com"
  • Контекст именования:
$nc = "DC=yourdomain,DC=com"
  • Путь отчета вывода:
$outputReport = "C:\Path\To\SharedPasswordsReport.csv"
  • Архивный каталог:
$archiveDir = "C:\Path\To\HashArchives"

Шаг 3: Запустите сценарий

Выполнить скрипт как администратор домена:

powershell.exe -ExecutionPolicy Bypass -File "C:\Path\To\LazyAdminFinder.ps1"

Просмотр результатов

  • Создается подробный отчет о CSV, четко выделяющий пароли обмена учетными записями или независимо выбирая слабые пароли.
  • Исторические архивы надежно хранятся для будущих сравнений, обеспечивая надежное управление паролями.

Варианты использования для Lazyadminfinder

  • Аудиты безопасности:Регулярно идентифицировать и исправлять общие, слабые или скомпрометированные пароли.
  • Ответ инцидента:Быстро обнаружит скомпрометированные счета после инцидентов безопасности.
  • Обычные проверки соответствия:Обеспечить постоянное соответствие, поддерживая надежную практику безопасности счетов.
  • Привилегированное управление учетными записями:В частности, целевые администраторы или привилегированные пользователи, которые могут повторно использовать или синхронизировать пароли во многих учетных записях.

Настройка Lazyadminfinder

Не стесняйтесь корректировать сценарий в соответствии с вашей средой и потребностями:

  • Измените логику фильтрации, чтобы включить/исключить конкретные типы учетных записей.
  • Регулируйте архивные и отчетные пути для ваших предпочтений хранения.
  • Интегрируйте дополнительные возможности отчетности по мере необходимости.

Преимущества использования Lazyadminfinder

  • Быстрая оценка безопасности:Автоматизирует сложные проверки безопасности рекламы.

  • Улучшенная видимость:Четко определяет потенциальные риски безопасности в рамках объявления.

  • Упреждающая защита:Позволяет администраторам быстро решать уязвимости перед эксплуатацией.


Lazadminfinder упрощает критическую задачу аудита пароля в Active Directory, расширяя возможности администраторов, чтобы поддерживать безопасную, совместимую и эффективную ИТ -среду.

Откройте для себя общие пароли, исправьте риски безопасности и легко укрепите безопасность рекламы с помощью Lazyadminfinder.

#Another        /\_[]_/\
#    fine      |] _||_ [|
#       ___     \/ || \/
#      /___\       ||
#     (|0 0|)      ||
#   __/{\U/}\_ ___/vvv
#  / \  {~}   / _|_P|
#  | /\  ~   /_/   []
#  |_| (____)        
#  \_]/______\  Barberion  
#     _\_||_/_     Production      
#    (_,_||_,_)
#
Import-Module DSInternals

# === Parameters ===
$dc           = "your-domain-controller.example.com"
$nc           = "DC=yourdomain,DC=com"
$outputReport = "C:\Path\To\SharedPasswordsReport.csv"
$archiveDir   = "C:\Path\To\HashArchives"

# Ensure archive directory exists
if (-not (Test-Path $archiveDir)) {
    New-Item -ItemType Directory -Path $archiveDir | Out-Null
}

$timestamp = (Get-Date).ToString("yyyyMMdd_HHmmss")

# === 1. Fetch & filter AD user accounts ===
Write-Host "[+] Fetching AD user accounts (skipping machines, service & disabled)..."
$filteredAccounts = Get-ADReplAccount -All -Server $dc -NamingContext $nc |
    Where-Object { $_.NTHash -and $_.SamAccountName } |
    Where-Object { $_.SamAccountName -notmatch '\$$' } |
    Where-Object { $_.SamAccountName -notmatch '^(?i)(svc|service)' } |
    Where-Object {
        if ($_.PSObject.Properties.Match('IsDisabled').Count -gt 0) {
            -not $_.IsDisabled
        }
        else {
            # bit 2 = disabled
            ( ($_.UserAccountControl -band 2) -eq 0 )
        }
    }

if (-not $filteredAccounts) {
    Write-Host "[-] No matching user accounts found. Exiting."
    exit
}

# === 2. Convert NTLM byte array to hex string ===
$filteredAccounts | ForEach-Object {
    $hex = [BitConverter]::ToString($_.NTHash) -replace '-', ''
    $_ | Add-Member -MemberType NoteProperty -Name NTLMHashString -Value $hex -Force
}

# === 3. Archive SHA-256 of each NTLM hash ===
Write-Host "[+] Archiving SHA-256 of each NTLM hash..."
$sha256 = [System.Security.Cryptography.SHA256]::Create()
$currentArchive = $filteredAccounts | ForEach-Object {
    $shaBytes = $sha256.ComputeHash($_.NTHash)
    $shaHex   = [BitConverter]::ToString($shaBytes) -replace '-', ''
    [PSCustomObject]@{
        SamAccountName = $_.SamAccountName
        HashSha256     = $shaHex
    }
}
$sha256.Dispose()

$archiveFile = Join-Path $archiveDir "UserHashArchive_$timestamp.csv"
$currentArchive | Export-Csv -Path $archiveFile -NoTypeInformation

# === 4. Compare to previous archive ===
$allArchives = Get-ChildItem -Path $archiveDir -Filter "UserHashArchive_*.csv" |
               Sort-Object LastWriteTime -Descending

if ($allArchives.Count -gt 1) {
    $previousFile = $allArchives[1].FullName
    Write-Host "[+] Comparing this run to previous archive: $previousFile"
    $prevData = Import-Csv $previousFile

    $reused = Compare-Object `
        -ReferenceObject $prevData `
        -DifferenceObject $currentArchive `
        -Property SamAccountName, HashSha256 `
        -IncludeEqual |
      Where-Object { $_.SideIndicator -eq '==' } |
      Select-Object SamAccountName, HashSha256

    if ($reused) {
        $reuseReport = Join-Path $archiveDir "PasswordReuse_$timestamp.csv"
        Write-Host "[!] $($reused.Count) accounts reused their old hash; exporting to $reuseReport"
        $reused | Export-Csv -Path $reuseReport -NoTypeInformation
    }
    else {
        Write-Host "[+] No password‑reuse detected this run."
    }
}
else {
    Write-Host "[+] Only one archive present; skipping reuse comparison."
}

# === 5. Shared‑password grouping & report ===
Write-Host "[+] Grouping accounts by shared NTLM hash..."
$sharedGroups = $filteredAccounts |
    Group-Object -Property NTLMHashString |
    Where-Object { $_.Count -gt 1 }

if (-not $sharedGroups) {
    Write-Host "[-] No shared hashes found."
    exit
}

$reportResults = @()
Write-Host "[+] Generating shared‑password report:"
foreach ($g in $sharedGroups) {
    $h     = $g.Name
    $users = $g.Group | ForEach-Object { $_.SamAccountName }
    $reportResults += [PSCustomObject]@{
        SharedHash = $h
        UserCount  = $users.Count
        Users      = $users -join ', '
    }

    Write-Host '----------------------------------------------'
    Write-Host "Shared Hash: $h"
    Write-Host "User Count : $($users.Count)"
    Write-Host "Users      : $($users -join ', ')"
    Write-Host '----------------------------------------------`n'
}

Write-Host "[+] Saving shared‑password report to $outputReport"
$reportResults | Export-Csv -Path $outputReport -NoTypeInformation

Write-Host "[Summary] Shared groups: $($reportResults.Count); Total archives: $($allArchives.Count)"


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE