Розбір завдань конкурсу Hash Runner на PHDays IV

    Цього року конкурс Hash Runner проводився протягом трьох днів перед форумом Positive Hack Days, з семи вечора 16 травня до сьомої вечора 19 травня (час московський, UTC +4). Тим самим ми постаралися врахувати інтереси всіх команд, розкиданих по земній кулі, і дозволити учасникам ефективно використовувати всі 48 годин вихідних днів, в якому б часовому поясі вони не знаходилися. Багато написали нам, що грати на вихідних дійсно було дуже зручно, так що постараємося робити так і надалі.
 
Отже, вітаємо переможців!
 
 
     
  1. InsidePro з результатом 22.81% (write-up: www.phdays.ru / download / Write-up.pdf ) виграли дві відеокарти R290x.
  2.  
  3. Hashcat з результатом 21.23% (write-up: hashcat.net/forum/thread-3397.html ) виграли відеокарту R290x.
  4.  
  5. John-users з результатом 12.78% (write-up: openwall.com/lists/john-users/2014/05/29/2 ) взяли бронзу.
  6.  
Всім призерам ми вручили сувеніри на пам'ять про форум.
 
За трирічну історію проведення конкурсу переможцями ставали команди hashcat (виступали під назвою teardrop в 2012 році), john-users (у 2013) і InsidePro (у 2014). Кожен раз більшу частину розшифрованих паролів учасники завантажували в останні 15 хвилин змагання, тому тільки в самому кінці ставало ясно, хто ж переможе. У минулі два роки команда InsidePro задовольнялася другим місцем: в 2012 їх обійшли hashcat, а в 2013 — john-users. Цього року хлопці з InsidePro нарешті стали першими!
 
 

Типи і вартість хешей

Після довгих обговорень ми вирішили призначати вартість хешей виходячи з ваг, що відображають наші власні професійні інтереси. Наприклад, ми хотіли привернути увагу учасників до певних типів хешей. Однак ми розглядали й інші варіанти. Наприклад, можна було б просто давати одне за кожен розшифрований хеш. Пропонувалася й така ідея: обчислювати вартість хеша виходячи з ентропії відкритого тексту і середнього часу злому хешей даного типу, отриманого на нашому типовому обладнанні. Обидва ці варіанти здалися нам невідповідними для конкурсу: у першому випадку головну роль грали б швидкі хеши, а в другому — повільні.
 
 image
* Коефіцієнт для хешей в бонусних завданнях
 
 

Правила змагань

У першу чергу ми розділили змагання на декілька завдань у відповідності з різними системами та підходами до злому (тобто не тільки за типами хешей). Вийшло схоже на Hash Runner 2013, тільки завдання не були прив'язані до словників, тему яких можна вгадати за підказками або декільком відновленим паролів.
 
Однією з особливостей конкурсу цього року стало те, як саме учасники отримували хеши для злому. Раніше командам просто надавався текстовий файл. Цього року ми організували цілу лабораторію з реальними системами. Щоб зібрати хеши, учасники слідували виданими інструкціями і використовували експлойти як при пентесте. Команди отримали вичерпний опис проходження цих завдань, помилитися було практично неможливо. Зрозуміло, з самим зломом хешей учасникам вже ніхто не допомагав. Таким чином, команди могли працювати з PCAP-файлами, Lotus Domino, різними веб-додатками, файлами проектів SCADA і т.д. Бали за отримання хешей не нараховувалися, але сам процес був покликаний створити атмосферу тестування на проникнення. Зізнатися чесно, найбільше сил ми витратили саме на те, щоб реалізувати цю частину конкурсу.
 
Зазвичай при оцінці рівня захищеності нас не цікавлять непривілейовані користувачі, нам потрібна обліковий запис з підвищеними правами. Тому ми додали в кожне завдання по 23 хеша паролів адміністраторів, що відрізнялися максимальною ентропією (23 — це просто число; 966/42 тут ні при чому). Після злому такого хеша команда отримувала 250 бонусних хешей (Raw-SHA-1, GOST, bcrypt і Raw-MD5), які були недоступні в основному завданні.
 
 

Чи не все пройшло гладко

Помилки, про які учасники дізналися під час змагання:
 
 
     
  1. При завантаженні результатів виникала помилка, якщо розшифрований текст містив двокрапка ":". Не сказати, що ми цього не очікували :)
  2.  
  3. Через те, що при формуванні дампа хешей для завдання № 3 (md4 mt_rand) ми допустили деякі помилки, вміст user.db.php і hashrunner_2014_hashes.zip не збігалося. Вірні дані містилися в архіві hashrunner_2014_hashes.zip, і хеши з нього приймалися як правильні відповіді. Таким чином, завдання стало в два рази простіше. Під час проведення конкурсу ми не могли опублікувати подробиці, тому що одна з команд вже встигла виявити цю помилку самостійно. Іншим учасникам пропонувалося також виявити і використовувати цей збій, щоб завантажити хеши для даного завдання.
  4.  
 
Помилки, які були виправлені під час змагання і про які ми не стали одразу повідомляти учасникам:
 
 
     
  1. Хеши Cisco були випадково сформовані двічі і тому були різними (через застосування різної солі в алгоритмах).
  2.  
  3. База даних містила невірну оцінку для одного з бонусних хешей (1 бал замість 15). На щастя, помилка була виявлена ​​в перший день змагань, коли ці бонусні хеши ще практично ніхто не встиг зламати.
  4.  
  5. Крім того, були виявлені незначні відмінності між файлом з усіма хешамі і власне системами.
  6.  
 
 

Словники та мутації

Ми склали словники виходячи з досвіду реальної роботи і урізноманітнили їх плодами нашої буйної фантазії: випадкові послідовності довжиною 6 і 8 символів, арабські слова в англійській розкладці, слова з арабської форуму, арабські імена, канадські міста, хімічні речовини, китайські імена та прізвища, терміни гри го, слова з грецької міфології, голлівудські зірки, італійські міста, міфічні істоти, персонажі коміксів Marvel, сайти багатокористувацьких рольових ігор, психічні розлади, слово «помідор» на різних мовах, банери веб-додатків, а також випадкові вибірки зі словників packetstorm і xato 10k.
 
Далі ми використовували мутації, які зазвичай зустрічаються спеціалістам під час консалтингу, а також додали кілька незвичайних варіантів:
 
• Переписати все на мові Leet, переписати на Leet лише деякі літери, переписати на Leet випадкові частини слів.
• Прості мутації:,,,,.
• Замінити регістр символів у слові: наприклад, і. Такі мутації використовувалися в основному в словниках психічних розладів і міфічних істот.
• «Злі» мутації і.
• Додати спеціальні символи:, <special2.
• Запис арабських слів латинськими буквами також може вважатися мутацією. Слова зі словника простих арабських слів були набрані тими ж клавішами на клавіатурі, але латинськими літерами в англійській розкладці. Приклад застосування такого алгоритму до кириличним словами: якщо слово «пароль» надрукувати в англійській розкладці, вийде «gfhjkm».
 
Отже, всі отримані після застосування мутацій слова були випадковим чином розподілені між завданнями. В результаті кількість паролів в базі перевищила 40 тисяч. У конкурсах ми використовували лише малу частину цієї множини — сподіваємося, таким чином нам вдалося уникнути атак підбору тематик паролів.
 
 

Розбір деяких завдань

 
TIA Portal
Це був найпростіший конкурс в змаганні. Система SCADA c звичайними хешамі SHA-1, довжина паролів відома — ось, власне, і все. Змінюючи наданий сценарій, можна було отримувати довжину паролів, що істотно спрощувало завдання злому даних хешей (див. малюнок нижче).
 
 image
  
 
Lotus H-хеш
Крім хешей двох добре відомих типів, lotus5 і dominosec (g-hash), були також згенеровані хеши для версій> 8. Хеши перших двох типів користувалися в учасників великою популярністю, а ось хеши для версій> 8 ніхто так і не спробував зламати. Що ж, добре, що на практиці ми поки з такими хешамі не зустрічалися.
 
 image
  
 

Арабська форум

Це завдання був присвячено цільовим атакам. Не можна просто так взяти і підібрати хеш, отриманий ітераційним проходженням MD5, не знаючи нічого про відкрите тексті. Так, в нашому завданні були «прості» хеши паролів, що складалися менше ніж з п'яти латинських букв, але такі паролі були сформовані перемиканням арабської розкладки на англійську. Більшість словників (якщо не всі) стають даремні при переході на інший національний алфавіт. Єдиний спосіб вирішити завдання — створити свій словник шляхом розбору інших словників або цільових сайтів. Форум в даному випадку відмінно підходить, на ньому можна знайти величезну кількість слів, які люди використовують у реальному житті, і скласти на основі зібраної інформації базу можливих паролів. Однак іноді простого автоматичного розбору текстів з сайту виявляється недостатньо. Завжди буває корисно подумати про незвичайний використанні звичайних речей. Наприклад, існує щонайменше чотири типи Unicode-символів тільки для кодування арабських чисел, і в якості однієї з масок мутацій ми вибрали якраз Крім пароля арабських цифр в кодуванні Unicode. Насправді, ми використовували тільки три мутації:
 
 
     
  1. Додавання трьох арабських цифр не в кодуванні Unicode в початок слова.
  2.  
  3. Додавання двох арабських цифр в кодуванні Unicode в кінець слова.
  4.  
  5. Переклад арабських букв в латинські шляхом зміни розкладки клавіатури.
  6.  
 
mtrand ()
Це завдання було присвячено поганим «випадковим» числам, які люблять використовувати недосвідчені розробники. Припустимо, у нас є форум, блог або якийсь інший веб-сайт. Нам необхідно безпечний засіб для формування токенов, які будуть використовуватися для зміни користувача паролів. Можна було б використовувати лінійний конгруентний генератор, але для завдання ми вибрали Вихор Мерсенна. На папері цей метод генерації псевдовипадкових чисел виглядає вельми непогано: він дає період 219937. Початкове число має довжину 32 біта і є слабким місцем з точки зору безпеки. Знаючи його, зловмисник може повністю відтворити послідовність псевдовипадкових чисел. Однак ця проблема частково вирішується в стандартній реалізації алгоритму: як тільки генератор отримує початкове значення, він починає формувати всевдослучайние числа, відмінні від тих, які були б отримані з іншого початкового значення. Таким чином, зловмиснику доведеться повністю реалізувати Вихор Мерсенна і підібрати не тільки початкове (відносно короткий) значення, а й положення цільового випадкового числа в потоці псевдовипадкових чисел.
 
Такий підхід повинен однаково працювати і для хешей h-типу, і для хешей l-типу, але ми спеціально сформували хеши обох типів. Розробник може нашкодити собі не тільки використовуючи криптографічно небезпечний генератор псевдовипадкових чисел, але і некоректно обробляючи отриманий потік чисел. Працюючи з цілими числами або з числами з плаваючою комою в обраною мовою програмування, завжди потрібно пам'ятати про те, яка максимальна точність представлення чисел обраного типу і яким буде текстове представлення цих чисел. Наприклад, при зведенні в куб числа 123456789 ми повинні отримати +1881676371789154860897069 (якщо мова йде про класичну десяткового арифметиці) і ~ 79 бітів ентропії в текстовому поданні цього результату. Однак якщо в вашій мові програмування для роботи з такими великими числами використовується представлення з плаваючою комою, то результатом операції буде щось на зразок 1.8816763717892E +24, і ентропія знизиться всього до ~ 45 біт. Такий пароль може бути легко підібраний для будь-якого швидкого алгоритму хешування.
 
На жаль, це завдання переслідував злий рок. По-перше, хеши в базі даних були закодовані тільки одноразовим проходженням алгоритму MD4; по-друге, вихідний код формування h-хешей трохи відрізнявся від коду на веб-сторінці.
 
Давайте поглянемо на код формування відкритих текстів.
 
Формування простих відкритих текстів (для l-хешей)
 
 
function generate_password($length)
{
    $result = 1;
    for($i=0; $i<$length; ++$i) $result *= mt_rand();
    return $result;
}

for ($i=0; $i<$argv[1]; ++$i)
{
    if (($i % 32) == 0){
        mt_srand(get_real_rand());
        $skip = get_real_rand() & 0xFFFF + 8192; // Fix for easy attack
        for ($j=0; $j<$skip; ++$j)
            mt_rand();
    }
    echo generate_password(3)."\n";
    $skip = get_real_rand() & 0xFF; // Fix for easy attack
    for ($j=0; $j<$skip; ++$j)
        mt_rand();
}

 
Формування складних відкритих текстів (для h-хешей)
 
 
function generate_password($length)
{
    $result = 1;
    for($i=0; $i<$length; ++$i) $result .= mt_rand();
    return $result;
}

for ($i=0; $i<$argv[1]; ++$i)
{
    if (($i % 32) == 0){
        mt_srand(get_real_rand());
        $skip = get_real_rand() & 0xFFFF + 128; // Fix for easy attack
        for ($j=0; $j<$skip; ++$j)
            mt_rand();
    }
    echo generate_password(3)."\n";
    $skip = get_real_rand() & 0xFF; // Fix for easy attack
    for ($j=0; $j<$skip; ++$j)
        mt_rand();
}

Як можна помітити, в коді є операція конкатенації з непорожній рядком, що містить цифру 1, тому числа, сформовані таким чином, не могли бути зламані перебором, навіть якщо б учасникам вдалося відтворити генератор MT_rand або скористатися кодом від Solar Designer (http://www .openwall.com / php_mt_seed /).
 
 
Tomato
Ντομάτα, Домата, Парадајз, Помідор, томат, улаанлооль, Լոլիկ, პომიდორი, टमाटर, टोमॅटो, हिण्डीरः, ਟਮਾਟਰ, ಟೊಮೇಟೊ, தக்காளி, තක්කාලි, 番茄, 蕃茄,…
 
Без коментарів.
 
 
Wonderful
Ми отримали дуже питань з приводу цього завдання, всі хочуть дізнатися, як потрібно було його вирішувати. Чесно кажучи, ми і не знаємо. Цей конкурс (як і mt_rand з арабськими словами) був покликаний привернути увагу учасників до деяких недоліків сучасних утиліт підбору паролів. Під час роботи нам іноді трапляються різні старі або непопулярні додатки. У багатьох з них використовується звичайний MD5, але в деяких реалізуються досить хитромудрі схеми, наприклад, SHA1 (base64 (MD5 (base64 (SHA1 ())))). SHA1 широко використовується, base64 взагалі нічого не варто застосувати, але зламати отриманий в результаті хеш виявляється дуже складно. Витрачати сили на створення складного обслуговувати себе модуля для вирішення такого завдання нерозумно, але ось отримати інструмент, який комбінує різні модулі підбору в необхідному порядку, було б непогано. Так, і не забудьте оптимізувати HMAC для ключового файлу розміром 1 МБ, т.к. в цьому випадку сам файл можна замінити його одноразовим хешем :)
 
 

Статистика

Нижче наведені графіки, що відображають результати учасників. Сподіваємося, вони будуть вам цікаві. Наперед просимо вибачення у переможців за можливе розкриття їх стратегії :)
 
Графік за кількістю набраних балів:
 
 image
  
Графік за кількістю зламаних хешей:
 
 image
  
Загальний відсоток хешей, зламаних усіма учасниками:
 
 image
  
Загальний відсоток хешей, зламаних усіма участнкамі, по типу хешей:
 
 image
 
Частина 1
 
 image
  
Частина 2 (зверніть увагу на максимальне значення по осі Y)
  
Хеши, зламані InsidePro, за типами:
 
 image
  
Хеши, зламані hashcat, за типами:
 
 image
  
Хеши, зламані john-users, за типами:
 
 image
  
 

Епілог

Все почалося з кухля пива в гамбурзькому кафе під час проведення конгресу 30C3 і вийшло в результаті не зовсім таким, як замислювалося :)
  
 image
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.