А АThursday, 24 September 2026

Гомогліфи в Active Directory

Всім привіт.

Бувала у вас ситуація: користувач не може залогінитись, скидання пароля не дає жодного результату, ви дивитесь на логін у Active Directory — все написано ідеально, жодного зайвого символу чи пробілу, копіюєте його для входу — система вперто видає помилку автентифікації?

Після години дебагу, перевірки блокувань і вивчення логів виявляється причина: гомогліфи.

Хтось під час створення облікового запису (або при копіюванні даних із заявки від HR чи з робочого чату) ввів кириличну літеру замість латинської. Наше око бачить звичні літери на кшталт a, c, e, o, p чи x, але для домену та протоколів Kerberos/NTLM латинська a (Unicode U+0061) і кирилична а (Unicode U+0430) — це абсолютно різні речі.

Щоб не перебирати логін посимвольно вручну і не сидіти з лупою біля монітора, можна за пару секунд локалізувати диверсанта за допомогою PowerShell. Нижче два скрипти: перший для швидкої перевірки будь-якого підозрілого рядка (вкаже точний порядковий номер літери), другий — для автоматичної перевірки обліковки прямо з AD.


Варіант 1. Швидка перевірка будь-якого рядка

Цю функцію можна виконати в консолі PowerShell і просто передати їй підозрілий логін:

function Test-Cyrillic {

    param (

        [Parameter(Mandatory = $true)]

        [string]$Text

    )


    $found = @()

    for ($i = 0; $i -lt $Text.Length; $i++) {

        $char = $Text[$i]

          # Перевірка на кирилицю (включно з додатковими блоками Cyrillic Supplement)

        if ($char -match '[\p{IsCyrillic}\p{IsCyrillicSupplement}]') {

            $found += [PSCustomObject]@{

                "Позиція (№)" = $i + 1

                "Символ"      = $char

                "Unicode код" = ('U+{0:X4}' -f [int][char]$char)

            }

        }

    }


    if ($found.Count -gt 0) {

        Write-Host "`nУВАГА! Знайдено кирилицю у рядку: `"$Text`"" -ForegroundColor Red

        $found | Format-Table -AutoSize

    } else {

        Write-Host "`nВсе чисто: у рядку `"$Text`" кирилиці не виявлено." -ForegroundColor Green

    }

}


Приклад виклику:

# У цьому прикладі перша "а" — латинська, а друга "а" — кирилична:

Test-Cyrillic "ivan.petrovа"

Результат буде таким:

Text

УВАГА! Знайдено кирилицю у рядку: "ivan.petrovа"

Позиція (№) Символ Unicode код

12 а      U+0430

(Код U+0430 — це кирилична мала «а», тоді як латинська мала «a» має код U+0061).


Варіант 2. Перевірка користувача напряму з Active Directory

Якщо треба перевірити конкретного користувача в AD за його атрибутами (sAMAccountName, UserPrincipalName, mail тощо):

Import-Module ActiveDirectory

$Identity = "ivan.petrov" # Тут вкажіть SamAccountName або UPN

$user = Get-ADUser -Identity $Identity -Properties sAMAccountName, UserPrincipalName, DisplayName, mail

$attributesToCheck = @('sAMAccountName', 'UserPrincipalName', 'DisplayName', 'mail')

foreach ($attr in $attributesToCheck) {

    $val = $user.$attr

    if ([string]::IsNullOrEmpty($val)) { continue }

    $found = @()

    for ($i = 0; $i -lt $val.Length; $i++) {

        if ($val[$i] -match '[\p{IsCyrillic}\p{IsCyrillicSupplement}]') {

            $found += [PSCustomObject]@{

                "Позиція" = $i + 1

                "Символ"  = $val[$i]

                "Unicode" = ('U+{0:X4}' -f [int][char]$val[$i])

            }

        }

    }


    if ($found.Count -gt 0) {

        Write-Host "`n[!] Кирилиця в атрибуті $attr ($val):" -ForegroundColor Red

        $found | Format-Table -AutoSize

    } else {

        Write-Host "[OK] $attr : чистий" -ForegroundColor Green

    }

}

No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное