Правильный путь становления безопасника: от ламера до практического эксплойтинга
Прочитал я тут статью на хабре Экзамен для будущих «русских хакеров» в Московском Политехе
И мой мозг вошел в бесконечный цикл непонимания происходящего. То ли я сейчас заглянул на школофорум «хакеров», то ли действительно на хабр. Уж извините, с таким подходом текущему поколению вайтов просто некому будет заменить.
В данной статье я хотел бы написать, как по моему скромному мнению (ранее багхантера на стороне блэков) стоило бы действительно начинать путь. И ни к в коем случае не с Kali linux (как оказываются преподают в политехе столицы)
Если вам интересен отчасти и мой путь, добро пожаловать под кат.
Многие шаги у пользователей хабра уже выполнены, поэтому можете смело пропускать до своего уровня.
В основном пост будет касаться Windows, так как именно эта ОС является моей специализацией, как наиболее распространенная.
Я рассмотрю тут код на примере уязвимости переполнения буфера, но до готового эксплойта не дойду, это отдельная и очень обширная тема.
Шаг 0. От ламера до нуба
В первую очередь следовало бы изучить операционную систему в которой вы работаете. Как бы банально это не звучало, но знания ОС действительно иногда преподносят такие вещи, которые не приподносит реверс.
Например, обход UAC’а в Windows 10 был обнаружен благодаря одному procmon, который работал во время использования eventvwr. Забавно, но сам факт повышения прав заключался в том, что сначала eventvwr искал ключ реестра в одной ветке, не находя ее искал в другой. По факту в первом месте обычно никогда ничего не обнаруживалось, в итоге достаточно было лишь записать туда путь до своего файла и запустить eventvwr как сразу приложение запускалось с повышенными правами.
Тут не было отревершено ни байта, однако исследователи обнаружили обход UAC’а.
Так что первое — изучите операционную систему. Досконально. Почитайте разные книжки по ее устройству. Конкретно по Windows могу посоветовать Марка Руссиновича «Внутреннее устройство Windows». Книга от автора таких популярных утилит, как autoruns и procmon
Для Windows: поиграйтесь с такими программами, как RegMon и FileMon. Они позволяют делать слепки ОС «до» и «после» и сравнивать. Посмотрите, какие изменения вносят разные параметры вроде изменения настроек ОС и подобных.
Поставьте виртуальную машину и попробуйте «убить» ОС самыми извращенными способами, а потом это починить.
После этого можно опять вернуться к RegMon и FileMon и позапускать различные сэмплы малвари. После этого вы уже будете способны находить почти любую малварь просто по симптомам.
Малварь можно достать отсюда
Переходите на свой страх и риск
Многая малварь написанная нашими не запускается на РУ машинах, ставьте на виртуалку ENG-машины без русской раскладки
malwareblacklist.com
malwr.com (требуется регистрация)
kernelmode.info (обычно известная довольно малварь)
После того, как вы изучите операционную систему, в которой работаете — можно приступать дальше.
Шаг 1. От нуба до разработчика
На данном этапе изучите какой-нибудь язык программирования. Например, python — он довольно хорош для новичка и в будущем пригодится вам в написании эксплойтов и фаззинга (что это рассмотрим далее).
После чего изучите си, он даст понимание работы с памятью, научит думать о производительности, а также полезен как нативный язык.
Далее язык ассемблера, хотя бы в общих принципах. Что такое регистры, что такое стек, основные инструкции. Полезно при реверсе, для чтения не требуется особо никаких особых знаниях.
В таком порядке:
python, C/C++, assembler
Шаг 2. От разработчика до хорошего разработчика
На данном этапе вы должны научиться отличать плохой код от хорошего. Научиться видеть ошибки, а также знать ассемблер.
Как проверить прошли ли вы этот шаг? Просто скажите к чему может привести следующий код:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
void Encr(char *in, char *out, int key)
{
for (int i = 0; i < strlen(in); i++)
out[i] = in[i] + key;
}
int main(int argc, char *argv[])
{
char EncryptedStr[10] = { 0 };
if (argc > 1)
{
Encr(argv[1], EncryptedStr, 5);
printf("Encrypted: %s\n", EncryptedStr);
}
return 0;
}
Данная программа получает в аргументах строку и шифрует ее алгоритмом цезаря с ключем 5, сохраняя результат в EncryptedStr.
Что в данном коде плохого и к чему оно может привести?
Ответ:
Но этот код из 2000х. В данный момент дыру эксплуатировать сложно, ибо появились такие техники, как DEP, ASLR, Security-Cookies. Однако это тоже обходится. Можно почитать для примера, например, ret2libc
Шаг 3. От хорошего разработчика к реверсеру
Посмотрим предыдущий пример в ассемблерном листинге при помощи IDA Pro
Как бы вы хорошо не шарили, но найти тут RCE сложно даже мне. А ведь примеры из жизни намного сложнее. Поэтому существуют специальные инструменты — фаззеры.
Что такое фаззер? Это лазер из фильмов типа мазера специальный софт, который флудит приложение неверными данными, чтобы найти нестандартное поведение. То есть мы можем написать такой скрипт, который во всех местах где принимаются входные данные будет отправлять рандомные данные и смотреть результат. Если результат привел к падению, то мы нашли уязвимость.
Например, для нашего приложения простейший фаззер выглядит так:
#/usr/bin/python
import subprocess
i = 0;
while True:
i += 1
if subprocess.call('test1.exe {0}'.format("A" * i), shell=True) != 0:
print 'Crashed with arguments: {0}'.format("A" * i)
break
print "Finished"
И вот результат:
Более подробно о фазерах можно читнуть тут
Таким образом, не имея ни исходного кода, ни навыков дизассемблирования можно найти уязвимость. Можно писать фаззеры, которые генерируют какие угодно входные данные.
От реверсера к эксплойтеру
После можно начинать писать эксплойты.
Например, для нашего приложения простейший эксплойт будет выглядить в псевдокоде как-то так
#/usr/bin/python
import subprocess
subprocess.call('test1.exe '.format("A" * 10 + address + there_shellcode), shell=True);
Где address — адрес перезаписуемого буфера в памяти, а there_shellcode — шеллкод, который исполняется при переполнении буфера.
Как конкретно это находится можно найти в гугле, я лишь дал напутствие.
Вместо заключения
Мой вариант в отличии от приведенной перед катом статьи гораздо обширнее и практичнее. Однако и сложнее.
Следовать каким путем — путем скрипткидди, или путем эксплойтинга — выбирать только вам.
Комментарии (4)
24 января 2017 в 04:02
–3↑
↓
А я не так начинал. С начало Си+Асм, потом Python. Да и вообще я думаю, надо начинать с IRC протокола. Какой ты в попу хакер, если ты не нюхал irc…24 января 2017 в 05:32
0↑
↓
«Для Windows: поиграйтесь с такими программами, как RegMon и FileMon. Они позволяют делать слепки ОС «до» и «после» и сравнивать. Посмотрите, какие изменения вносят разные параметры вроде изменения настроек ОС и подобных.»
Это вы в каком году статью писать начинали? RegMon при запуске, например, сразу пишет что его на ProcMon заменили уже, и даже не запускается…24 января 2017 в 08:37
0↑
↓
Автор писал, что он бывший black — так что вполне объяснимо. Но версии и названия ПО ничего принципиально не меняют — кто ищет, тот найдёт.
24 января 2017 в 08:24
0↑
↓
В комментариях к своему посту указал, что моя программа обусловлена тем, что я обучал веб разработчиков. Мой косяк — нужно было упомянуть об этом в теле поста. Да и по заголовку можно понять, что это были безопасники… В общем, неправ я. А курс по вашей программе был бы полезен именно безопасникам. Кстати… Вы никогда не задумывались о работе преподавателем? ;)