Пароль к NTLM из файла дампа - PullRequest
0 голосов
/ 30 сентября 2019

Я в безопасности и хочу использовать большой файл дампа паролей (3 ГБ) в рамках моих обычных проверок паролей

Файл разделен на две колонки, SHA1 и действительный пароль

Для моих целей, поскольку Windows хранит пароль в виде хешей NTLM в состоянии покоя (Kerberos используется только во время транспортировки), мне нужны пароли в NTLM, а не SHA1. (Вы можете легко доказать это, выполнив дамп пароля, я использую DSInternals)

В настоящее время я конвертирую пароли в виде открытого текста в NTLM с помощью этого сценария

#Install-Module DSInternals
Import-Module DSInternals

$reader = [System.IO.File]::OpenText("C:\...\68_linkedin_found_hash_plain.txt")

try {
    for() {
        $line = $reader.ReadLine()
        if ($line -eq $null) { break }        
        $pwd = ConvertTo-SecureString $line.Split(':')[1] -AsPlainText -Force
        $hash = ConvertTo-NTHash $pwd;
    Add-Content C:\...\68_linkedin_ntlm.txt $hash 
    }
}
finally {
    $reader.Close()
}

Любой очевидный способобрабатывать это быстрее? Я полагаю, что могу войти в БД и обработать ее с помощью небольшого приложения на C #, но может быть что-то быстрое и грязное?

Формат файла (нет, это не мои пароли, это пароли от общего пароляфайл дампа, который является общедоступным)

8c9fcfbf9ead0d63d04b5d3120c42cb885af899e:16piret
8c9fd045ee531744a4fdc1f52e59c3878e742ee0:louie310
8c9fd070274a0eebecf58f8f50e283bf53cec215:kery62
8c9fd08d1c17266f7c1e42a3f16a1161613c7572:sa81nt
8c9fd1093bd8592bbaea195785f8d1c81589073f:cuchilleros
8c9fd1a963bbf44ea9b531e91e5cb1b591c454cc:198962914685590
8c9fd1d8cc6d4fa8164a2fcb3adc7a45f3409547:sculp1011
8c9fd20540d66831f6f65a39ce1bca0e654fd5e6:ume1431965
8c9fd2b4a9571db21c4226bf9ecaea282ecadd5e:534015629819772
8c9fd2f3e63c20314cc962b624178ba82c6674a7:siegenthaler
8c9fd3713fe9600d2bea05b4e8cd33efe12bddb1:mkenrick
8c9fd3a39cca8fb8cdeeb52999aed7e6e9435fd3:billscot
8c9fd3b96ee1485e0fd7d6c71ffe3efd2e8a4614:ndiyehova
8c9fd43aef9804dab6e0aebc58415543175fea00:662566123
8c9fd481cf8f35edb6ebd683fffb0efce0478f21:371874conv
8c9fd4f37632294093fb057eb0168a05d9396e74:h3aww7w
8c9fd53dce9b046f73c5f298e2f694213f8f90f1:squishy23
8c9fd55206e0525d119f4946d3ae75e347cccb4b:NEH3112
8c9fd555303ac08f9103ff8451f8c05cf48cf120:marco22580
8c9fd5c6a94b1171518d0ba264033d779a075e8c:Nowornever2010
8c9fd613fb632b5bc6ae20a671aa40decdb8609a:MKSmks1976##
8c9fd627a48f9971df5bee874501156e9d3c011d:Steripro5

TIA

РЕДАКТИРОВАТЬ: чтение в память и запись в отдельные файлы немного ускоряют процесс. Также использовал предложение от TessellatingHeckler

Import-Module DSInternals
$lines = [System.IO.File]::ReadAllLines('C:\...\68_linkedin_found_hash_plain.txt')

foreach($line in $lines) {
    try {
        $password = $line.Substring($line.IndexOf(':')+1);
        if ($password.Length -lt 128)
            {
            $pwd = ConvertTo-SecureString $line.Substring($line.IndexOf(':')+1) -AsPlainText -Force
            $hash = ConvertTo-NTHash $pwd;
            Set-Content C:\Temp\Hashes\$hash.txt $hash
            }
        }
    finally {

    }
}

После этого я могу объединить файлы с

copy *.txt combined.log

1 Ответ

1 голос
/ 30 сентября 2019

Если это обычная длина строки, а размер файла составляет 3 ГБ, мы говорим о 50-60 млн. Строк.

Измените $line.Split(':')[1] на $line.Substring($line.IndexOf(':')+1), что сэкономит на создании и очистке 50 млн. массивы и 50 миллионов строк, которые вы не хотите. (Это верно? Ваш пример файла формата имеет хеш слева, ваше использование [1] выберет часть имени пользователя?)

PowerShell вызывает статические методы .Net, такие как [system.io.file], достаточно быстро,но эти биты:

    $pwd = ConvertTo-SecureString $line.Split(':')[1] -AsPlainText -Force
    $hash = ConvertTo-NTHash $pwd;
    Add-Content C:\...\68_linkedin_ntlm.txt $hash 

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

# before the loop
$outStream = [System.IO.StreamWriter]::new(
                 [System.IO.FileStream]::new(
                     'c:\path\output.txt',
                      [system.io.filemode]::OpenOrCreate))

# in the loop
$outStream.WriteLine($hash)

# after the loop
$outStream.Close()

Следующий бит будет проверять, сможете ли вы получить код, который выполняет ConvertTo-SecureString и ConvertTo-NTHash и встроенныйЭто. Я не знаю, что такое NTHash, но источник ConvertTo-SecureString находится здесь , это не будет тривиально, чтобы обернуть / вставить это в код PowerShell.

Вот и всекак я вижу для «быстрого и грязного», но это может сбить 20-30% времени выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...