none
Powershell: NTLM Password History

    Вопрос

  • Добрый день!

    Хотим провести аудит истории паролей (по ntlm-хэшам) пользователей в Active Directory на предмет их уникальности. Т.е. по сути хотим узнать меняют ли пользователи свои пароли в соответствии с политикой безопасности или договариваются с тех.поддержкой о их сбросе на предыдущий по истечении срока  действия.

    Для этого мы выгрузили из базы ntds.dit списки пользователей с их историей и их ntlm-хэши в формате pwdump.

    Записей достаточно много. - Больше 100000.

    В файле идет сначала пользователь, затем последовательно его история. Поля разделены двоеточиями. ntlm-хэш содержится в 4-ом столбце.

    Помогите, пожалуйста, со скриптом на Powershell или MS TSQL-запросом (если обработка будет намного быстрее при выгрузке в базу данных), который бы по каждому пользователю вывел:

    1. со сколькими паролями из истории (включая текущий) совпадает последний пароль (например, вывод 5 совпаданий из 20 паролей).

    2. максимальное количество совпадающих паролей из истории включая текущий (например, вывод 6 совпаданий из 20 паролей).

    Образец выгрузки (исходных данных) прилагаю (все ntlm-хэши изменены):

    --- Cut ---

    Domain\User1:1620:AAD3B435B51404EEAAD3B435B51404EE:679CDEB758F6995CB517F84447718E4B:Disabled=False,Expired=False,PasswordNeverExpires=True,PasswordNotRequired=False,PasswordLastChanged=201710140613,LastLogonTimestamp=201803260400,IsAdministrator=False,IsDomainAdmin=False,IsEnterpriseAdmin=False::
    Domain\User1__history_0:1620:AAD3B435B51404EEAAD3B435B51404EE:202EFD339CAB9B0DEC028DF787C0AF03:::
    Domain\User1__history_1:1620:AAD3B435B51404EEAAD3B435B51404EE:A1E33A2281B8C6DBC2373BFF87E8CB6E:::
    Domain\User1__history_2:1620:AAD3B435B51404EEAAD3B435B51404EE:7618C7BAA87CB8162D379BB9049F6D6F:::
    Domain\User1__history_3:1620:AAD3B435B51404EEAAD3B435B51404EE:679CDEB758F6995CB517F84447718E4B:::
    Domain\User1__history_4:1620:AAD3B435B51404EEAAD3B435B51404EE:202EFD339CAB9B0DEC028DF787C0AF03:::
    Domain\User1__history_5:1620:AAD3B435B51404EEAAD3B435B51404EE:679CDEB758F6995CB517F84447718E4B:::
    Domain\User1__history_6:1620:AAD3B435B51404EEAAD3B435B51404EE:202EFD339CAB9B0DEC028DF787C0AF03:::
    Domain\User1__history_7:1620:AAD3B435B51404EEAAD3B435B51404EE:679CDEB758F6995CB517F84447718E4B:::
    Domain\User1__history_8:1620:AAD3B435B51404EEAAD3B435B51404EE:202EFD339CAB9B0DEC028DF787C0AF03:::
    Domain\User1__history_9:1620:AAD3B435B51404EEAAD3B435B51404EE:3EB043904E1E3B158718F00C7CAFC8AA:::
    Domain\User1__history_10:1620:AAD3B435B51404EEAAD3B435B51404EE:679CDEB758F6995CB517F84447718E4B:::
    Domain\User1__history_11:1620:AAD3B435B51404EEAAD3B435B51404EE:5E1ED167C31AEF96475056BD6458A033:::
    Domain\User1__history_12:1620:AAD3B435B51404EEAAD3B435B51404EE:5E1ED167C31AEF96475056BD6458A033:::
    Domain\User1__history_13:1620:AAD3B435B51404EEAAD3B435B51404EE:679CDEB758F6995CB517F84447718E4B:::
    Domain\User1__history_14:1620:AAD3B435B51404EEAAD3B435B51404EE:679CDEB758F6995CB517F84447718E4B:::
    Domain\User1__history_15:1620:AAD3B435B51404EEAAD3B435B51404EE:202EFD339CAB9B0DEC028DF787C0AF03:::
    Domain\User1__history_16:1620:AAD3B435B51404EEAAD3B435B51404EE:679CDEB758F6995CB517F84447718E4B:::
    Domain\User1__history_17:1620:AAD3B435B51404EEAAD3B435B51404EE:D66B4FA74E66567BF91A776FC09B705E:::
    Domain\User1__history_18:1620:AAD3B435B51404EEAAD3B435B51404EE:679CDEB758F6995CB517F84447718E4B:::
    Domain\User1__history_19:1620:AAD3B435B51404EEAAD3B435B51404EE:0DEF2C665D72FFD4C6CF2E3683D5DF4F:::
    Domain\User1__history_20:1620:AAD3B435B51404EEAAD3B435B51404EE:202EFD339CAB9B0DEC028DF787C0AF03:::
    Domain\User1__history_21:1620:AAD3B435B51404EEAAD3B435B51404EE:D66B4FA74E66567BF91A776FC09B705E:::
    Domain\User1__history_22:1620:AAD3B435B51404EEAAD3B435B51404EE:0DEF2C665D72FFD4C6CF2E3683D5DF4F:::
    Domain\User2:3028834:AAD3B435B51404EEAAD3B435B51404EE:BC9221ABFAA6C9876284EB262C0F58FC:Disabled=False,Expired=False,PasswordNeverExpires=True,PasswordNotRequired=False,PasswordLastChanged=201405210916,LastLogonTimestamp=201803262013,IsAdministrator=False,IsDomainAdmin=False,IsEnterpriseAdmin=False::
    Domain\User2__history_0:3028834:AAD3B435B51404EEAAD3B435B51404EE:BC9221ABFAA6C9876284EB262C0F58FC:::
    Domain\User3:6071:AAD3B435B51404EEAAD3B435B51404EE:24B058CD8DF1256F9CEDC96254D5E032:Disabled=True,Expired=False,PasswordNeverExpires=False,PasswordNotRequired=False,PasswordLastChanged=201803060911,LastLogonTimestamp=201802270017,IsAdministrator=False,IsDomainAdmin=False,IsEnterpriseAdmin=False::
    Domain\User3__history_0:6071:AAD3B435B51404EEAAD3B435B51404EE:24B058CD8DF1256F9CEDC96254D5E032:::
    Domain\User3__history_1:6071:AAD3B435B51404EEAAD3B435B51404EE:7857EF30BB3E502D6AA32179D4D0C5FB:::
    Domain\User3__history_2:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_3:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_4:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_5:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_6:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_7:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_8:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_9:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_10:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_11:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_12:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_13:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_14:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_15:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_16:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_17:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_18:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_19:6071:AAD3B435B51404EEAAD3B435B51404EE:025DF96BFFE78E21B1494D82B8542D8C:::
    Domain\User3__history_20:6071:AAD3B435B51404EEAAD3B435B51404EE:47BF8039A8506CD67C524A03FF84BA4E:::

    --- Cut ---

    14 апреля 2018 г. 8:41

Ответы

  • Import-Csv users.txt -Delimiter ":" -Header Name,ID,U,Hash | Group ID | Foreach {
    	$All = $_.Group | Group Hash -NoElement
    	$User = $_.Group -notmatch "__"
    	$History = $All | Where {$_.Name -eq $User.Hash}
    	$Freq = ($All | Sort Count)[-1]
    	
    	[pscustomobject]@{
    		Name = $User.Name
    		CurrentHash = $User.Hash
    		Count = $History.Count
    		FreqHistoryHash = $Freq.Name
    		FreqCount = $Freq.Count
    	}
    	
    }


    • Изменено KazunEditor 14 апреля 2018 г. 10:24
    • Предложено в качестве ответа Dima RazbornovMVP 14 апреля 2018 г. 13:25
    • Помечено в качестве ответа Evgenii Alekseev 14 апреля 2018 г. 20:13
    14 апреля 2018 г. 10:07
    Отвечающий

Все ответы

  • Добрый день! 

    На скорую руку могу предложить вот это:

    $csv = Import-Csv 'C:\Users\admin\Desktop\11122231\new 1.txt' -Delimiter ":" -Header "1", "2", "3", "4", "5", "6"
    $hash = @{}
    
    foreach ($c in $csv.4) {
        if ($hash.ContainsKey($c)) {
            [int]$hash.$c += 1
        } else {
            $hash.Add($c,"1")
        }
    }
    
    $hash

    Вот только что-то пока в голову не приходит как сопоставить с DomainUser. Видимо, еще не до конца проснулся :D

    14 апреля 2018 г. 10:01
  • Import-Csv users.txt -Delimiter ":" -Header Name,ID,U,Hash | Group ID | Foreach {
    	$All = $_.Group | Group Hash -NoElement
    	$User = $_.Group -notmatch "__"
    	$History = $All | Where {$_.Name -eq $User.Hash}
    	$Freq = ($All | Sort Count)[-1]
    	
    	[pscustomobject]@{
    		Name = $User.Name
    		CurrentHash = $User.Hash
    		Count = $History.Count
    		FreqHistoryHash = $Freq.Name
    		FreqCount = $Freq.Count
    	}
    	
    }


    • Изменено KazunEditor 14 апреля 2018 г. 10:24
    • Предложено в качестве ответа Dima RazbornovMVP 14 апреля 2018 г. 13:25
    • Помечено в качестве ответа Evgenii Alekseev 14 апреля 2018 г. 20:13
    14 апреля 2018 г. 10:07
    Отвечающий
  • Огромное спасибо!
    14 апреля 2018 г. 20:13