Полезные заметки/Хакерство
Слово хакерство будем понимать в традиционном его значении: взлом сетевых служб, несанкционированный доступ к сетям, модификацию программ на уровне скомпилированных файлов.
Почему 1980-е были раем хакеров?
Да потому, что безопасностью тогда не заморачивались. Вот смотрите: в 2020-е всюду суют ИИ (интересно, как статья будет стареть?) А в 1980-е всюду суют компьютеры, причём на крайне примитивном уровне:
- Сетевой трафик передавался открытым текстом.
- О шифровании тогда не думали — компьютеры были слабы, а реально действующие методы компьютерного шифрования были засекречены. Алгоритмы шифрования прочнее 40 битов в США считались… боеприпасами, и автора PGP, первой из более-менее открытых таких программ, хотели прижать — да, за экспорт боеприпасов. И тогда он придумал такое: в 1995 написал исходный код своей программы в виде книги. Перепечатав или отсканировав его, можно было получить PGP в любой стране мира.
- Главной сетевой ОС был Unix, а он написан на Си. Стандартная библиотека языка Си старалась быть «поближе к железу» — и некоторые функции было сложно или невозможно использовать корректно. Не удивительно, что через сеть можно было спровоцировать отказ службы.
- Не было понятно, как всё это можно атаковать — а значит, одни и те же методы атаки работали снова и снова.
- Непонятно, как распространять патчи (закачка видеодрайверов была около 2000 той ещё задачей) — так что надо было делать сразу хорошо.
Подобную огульную компьютеризацию одёрнули человеческими смертями. Около 1985 одна канадская компания AECL подумала: а почему мы защищаем аппараты лучевой терапии от некорректной работы логическими схемами? А нельзя это поручить компьютеру? Результат предсказуем: от пяти до семи переоблучённых на 11 работавших машин.
Примитивный взлом программ
Взлом одиночной игры на деньги
Условный пример. Есть одиночная игра с сохранением. Дать побольше денег. Считаем, что процессор — Intel.
Инструментарий: файловый менеджер (Проводник, Total Commander…), шестнадцатеричный редактор (HxD…), калькулятор с поддержкой шестнадцатеричной системы (годится стандартный Windows 7+).
Запускаем игру, убеждаемся, что денег, например, 1234. Сохраняемся, выходим, находим файл сохранения. Делаем резервную копию.
Переводим калькулятором 1234 в шестнадцатеричную систему, получаем 4D2.
Открываем файл сохранения шестнадцатеричным редактором и ищем D2 04 (процессоры Intel хранят числа, начиная с младшего байта). Если за этими байтами идёт 00 00 (деньги, вероятно, четырёхбайтовые) — это тем более кандидат на нашу ячейку. Вводим вместо этих цифр, например, FF 7F — и наслаждаемся 30 тысячами тугриков.
Если же таких мест нашлось много — приходится думать. Можно испытывать по одному. Можно потратить деньги, скажем, до 986, перевести новую цифру (будет 3DA), искать DA 03 и смотреть: какая из позиций напоминает ситуацию «было D2 04, стало DA 03»?
Действующие сейчас методы сетевого взлома
Подбор пароля (брутфорс)
Перебор или по всем возможным комбинациям, или по словарям наиболее распространённых паролей. Вы удивитесь, насколько много людей используют пароли типа password, 1234 или qwerty, если парольная политика им это позволяет. К словарю можно добавить перебор цифр на случай, если шибко умный юзер дописал 1-3 цифры к распространенному паролю. Брутфорс-атака занимает много времени: возможных паролей могут быть десятки тысяч.
Реализуется брутфорс-атака обычно с помощью программы, которая берёт список возможных паролей либо перебором по алфавиту, либо из файла со словарём. Есть три возможных способа защититься от брутфорс-атаки. Первый — это заставить пользователей запоминать сложные пароли, которых нет ни в одном словаре, так как они представляют собой бессмысленные наборы букв и цифр. Второй — это придушить возможную частоту подбора разных паролей, например, принимать пароль не чаще, чем раз в секунду или две, что делает брутфорс-атаку невозможно долгой. Третий — это применить капчу, то есть заставить при вводе пароля проходить простой тест на разумность, который выполнит человек, но не выполнит скрипт.
Анализ баз паролей
Утечкой базы данных (или её части) уже никого не удивишь. Важным вопросом стало: а как сделать, чтобы из утёкшей базы нельзя было извлечь пароль?
- Уровень 0. Пароли открытым текстом. Если кто-то так делает в 2026-м — вон из профессии!
- Уровень 0,1. Пароли зашифрованы симметричным шифром. Эталонный пароль расшифровывается и сравнивается с пришедшим. Отличается лишь тем, что ключ расшифровки может быть где-то в другом месте (не в базе). В остальном это тот же открытый текст.
- Уровень 1. Хэш пароля. Эталонные пароли зашифрованы специальным шифром, который нельзя расшифровать,— хэш-функцией. Пароль подходит, если совпадают шифровки. Это уже лучше, но существует несколько уязвимостей. Если у двух пользователей шифровки одинаковы, то одинаковы и пароли — и, вероятно, они простые и можно раскочегаривать перебор. Кроме того, существует структура данных «радужная таблица», представляющая собой консервированный перебор — другими словами, перебор можно сделать ещё до утечки базы!
- Уровень 2. Солёный пароль с постоянной солью. Аналогично, но шифруем не пароль, а строку «префикс + пароль» — исключаем «консервированный перебор» (до таких длин он, скорее всего, не добрался). Если стащить постоянный префикс, можно сделать перебор наперёд, но он будет годиться только для одной системы. Кроме того, при определённой программистской смекалке одним махом можно перебрать всех пользователей.
- Уровень 3. Солёный пароль с переменной солью. Аналогично, но у каждого пользователя префикс свой. Каждый пользователь перебирается по отдельности — наработки по нему не переносятся на остальных. В частности, больше нет эвристики «если шифровки одинаковы, то одинаковы и пароли». Это единственный действующий метод хранения паролей, действующий против утечки баз. Единственное что — желательно этот префикс получать хорошим источником случайности.
До 3-го уровня в 2000-е годы быстро добрались, но возник вопрос шифрованного трафика — ведь пароль во всех этих методах всё рано передаётся открытым текстом (каждая система придумывала по-своему). Сейчас это уже неактуально: уже в 2000-е зашифровали Wi-Fi, а вот переход на постоянный HTTPS был той ещё головной болью и был закончен к концу 2010-х.