Inspired by Insecure

March 6, 2009 at 7:22 pm

Раскалываем MD5-хеши: перебор пароля по словарю.

Информация в данном материале может оказаться полезной для тех, кто планирует использовать авторизацию в своем ПО, работать с хешами алгоритма шифрования MD5, а так же для тех, кому просто интересен принцип работы переборщиков паролей по словарю (брутфорсеров). Акцентирую внимание читателя на том, что программа работает исключительно с базами словарей (в коде осуществляется работа с txt-файлами, но это не столь принципиально), а не генерирует диапазоны символов для перебора.


Составление и кодирование алгоритма.

Условие задачи довольно простое: имея на руках MD5-хеш, подобрать коллизию (проще говоря, найти комбинацию символов, соответствующую этому хешу, то бишь пароль). Принцип и алгоритм работы приведен ниже.

  1. Открыть файл с хешем (input.txt) и открыть файл с паролями (pass.txt).
  2. Перевести все символы хеша в верхний регистр. Данная операция позволит корректно сравнивать его с генерируемыми нами хешами (при генерации все символы в хеше в верхнем регистре).
  3. Прочитать i-ю строчку файла, где i принадлежит отрезку [0; EndOfFile] (это не столь важно, т.к. строка из файла будет считываться до тех пор, пока не окажется пустой).
  4. Сгенерировать хеш прочитанной строчки.
  5. Сравнить с целевым хешем. Если равны – вывести строку, соответствующую сгенерированному хешу. Если не равны – продолжить шаги 3-5.
  6. Если достигнут конец файла, то уведомить пользователя о том, что пароль не найден. 

Если по какой-либо причине непонятны те или иные шаги, то, возможно, все вопросы отпадут после анализа кода (и соответствующих ему комментариев) получившейся программы.


Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace MD5Brute
{
class Programm
{
static void Main(string[] args)
{
//убедиться, что в командной строке указано имя файла
if ((args[0].Length == 0) || (args[1].Length == 0))
{
Console.WriteLine("Error: Missing Input file or Pass file");
Console.ReadKey();
}
else
{
//открыть файл с хешем
StreamReader reader = new StreamReader(args[0]);
string EnemyHash = reader.ReadLine(); //прочитать хэш
reader.Close();
EnemyHash = EnemyHash.ToUpper(); //перевести все символы в верхний регистр
//открыть файл с паролями
reader = new StreamReader(args[1]);
//перебрать каждую строку
for (string line = reader.ReadLine(); line != null; line = reader.ReadLine())
{
string CurrentHash = string.Empty;
//сгенерировать MD5-хеш
foreach (byte b in new MD5CryptoServiceProvider().ComputeHash(Encoding.De fault.GetBytes(line)))
{
CurrentHash += b.ToString("X2");
}
//сравнить хеши
if (CurrentHash == EnemyHash)
{
Console.WriteLine("Password: "+line);
Console.ReadKey();
return;
}
}
Console.ReadKey();
Console.WriteLine("No Password");
return;
}
}
}
}



Формат запуска программы: md5brute.exe <%DIRECTORY%/input.txt> <%DIRECTORY%/pass.txt>

 

Итоги.

Конечно до полноценного брутфорсера этой программе далеко, но данные исходные коды вполне могут лечь в основу системы авторизации, продвинутого переборщика паролей, системы распределенных вычислений и чего-либо другого. По крайней мере, читатель теперь сумеет сгенерировать MD5-хеш.

0 likes Blog # , , ,
Share: / / /

Leave a Reply

Your email address will not be published. Required fields are marked *

Be aware of the first

Материалы, опубликованные в этом блоге, отражают исключительно точку зрения автора и могут не совпадать с мнением и позицией его текущего работодателя.