Приветствую, тебя %хабраюзер%. Прочитал я тут статью на хабре «Экзамен для будущих «русских хакеров» в Московском Политехе». И мой мозг вошел в бесконечный цикл непонимания происходящего. То ли я сейчас заглянул на школофорум «хакеров», то ли действительно на хабр. Уж извините, с таким подходом текущему поколению вайтов просто некому будет заменить.

В данной статье я хотел бы написать, как по моему скромному мнению (ранее багхантера на стороне блэков) стоило бы действительно начинать путь. И ни к в коем случае не с 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 <stdio.h>
#include <stdlib.h>
#include <string.h>

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.

Что в данном коде плохого и к чему оно может привести?

Ответ:

Скрытый текст
Данная программа может привести к переполнению буфера, если передать строку длиной более 9 ( 10-й символ — нулевой ). Что перезапишет в стеке адрес возврата из функции и позволит выполнить произвольный код в памяти процесса. Если бы такое было в серверном ПО — это могло бы привести к тому, что неавторизованный пользователь мог бы исполнить на сервере любой код

Но этот код из 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 — шеллкод, который исполняется при переполнении буфера.

Как конкретно это находится можно найти в гугле, я лишь дал напутствие.

Вместо заключения


Мой вариант в отличии от приведенной перед катом статьи гораздо обширнее и практичнее. Однако и сложнее.

Следовать каким путем — путем скрипткидди, или путем эксплойтинга — выбирать только вам.
Поделиться с друзьями
-->

Комментарии (37)


  1. zeroflag
    24.01.2017 04:02
    -9

    А я не так начинал. С начало Си+Асм, потом Python. Да и вообще я думаю, надо начинать с IRC протокола. Какой ты в попу хакер, если ты не нюхал irc…


  1. Psychosynthesis
    24.01.2017 05:32
    -1

    «Для Windows: поиграйтесь с такими программами, как RegMon и FileMon. Они позволяют делать слепки ОС «до» и «после» и сравнивать. Посмотрите, какие изменения вносят разные параметры вроде изменения настроек ОС и подобных.»

    Это вы в каком году статью писать начинали? RegMon при запуске, например, сразу пишет что его на ProcMon заменили уже, и даже не запускается…


    1. jehy
      24.01.2017 08:37
      +2

      Автор писал, что он бывший black — так что вполне объяснимо. Но версии и названия ПО ничего принципиально не меняют — кто ищет, тот найдёт.


  1. jehy
    24.01.2017 08:24
    +2

    В комментариях к своему посту указал, что моя программа обусловлена тем, что я обучал веб разработчиков. Мой косяк — нужно было упомянуть об этом в теле поста. Да и по заголовку можно понять, что это были безопасники… В общем, неправ я. А курс по вашей программе был бы полезен именно безопасникам. Кстати… Вы никогда не задумывались о работе преподавателем? ;)


  1. R1phone
    24.01.2017 14:56

    Спасибо за статью!


  1. Mizari
    24.01.2017 14:56
    +1

    В статье ни слова не сказано о CTF'ах, что является преогромнейшим допущением при описании используемого путя «от ламера до практического эксплойтинга». Именно в этих соревнованиях можно найти огромное количество заданий по ревёрсу и эксплуатированию. Причём эти задания заранее разделены по сложностям, иногда имеют подсказки, часто отключают некоторые механизмы защиты. Всё это делает их идеальным местом для старта.


  1. modulator
    24.01.2017 14:56
    +6

    Безопасник != Реверсер. По моему скромному представлению реверсер — это определенное направление в безопасности, как пентестер, аудитор, сотрудник SoC и т.д. И в зависимости от этого самого направления и строится «правильный путь становления». Но даже для реверсера в статье мало информации. Языки программирования, как мне кажется, нужно изучать в обратном порядке и помимо Руссиновича, как минимум, прочесть Shellcoder's Handbook: Discovering and Exploiting и Reverse Engineering for Beginners, про работу компиляторов, архитектуру процессоров. Все это необходимо для того, что бы найдя то самое переполнение буфера специалист смог раскрутить эту уязвимость, а не тупить в питоновский код и ждать когда инструменты фаззинга совершат чудо и выдадут рабочий PoC.


    1. FancyMalware
      25.01.2017 18:03

      Таки в качестве PoC достаточно вырвать данные из фаззера и запихнуть в отдельный эксплойт, который покрешит приложение. Такие поцы достаточно успешно принимают в довольно групных BugBounty.

      Все же если эксплуатирование, то это уже эксплойт, а не PoC и прибыльнее не в багбаунти сдать, а на форумах продать


  1. NLO
    24.01.2017 14:57

    НЛО прилетело и опубликовало эту надпись здесь


    1. FancyMalware
      24.01.2017 14:58
      +1

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


      1. user343
        28.01.2017 19:44
        -1

        Тогда вот тут 15 плохих безопасников "detected"?


        https://geektimes.ru/search/?target_type=comments&order_by=relevance&q=%D0%BF%D1%80%D0%BE%D1%81%D0%BB%D1%8B%D1%82%D1%8C+%D0%BD%D0%B5%D0%B2%D0%B5%D0%B6%D0%B4%D0%B0%D0%BC%D0%B8+%D0%BC%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0%D0%BC%D0%B8+%D1%81%D1%83%D0%B5%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D0%BC%D0%B8+%D0%B4%D1%83%D1%80%D0%B0%D0%BA%D0%B0%D0%BC%D0%B8


        И это после того, как я написал своим начальникам в гос. учреждении 2 кандидатских диссертации по экологии (в основном лицензионным файнридером в доинтернетную эпоху). :)


        1. FancyMalware
          28.01.2017 19:46

          Хватит вещества упарывать, я ни слова не понял


  1. OnelaW
    24.01.2017 14:58

    Логично,
    Первый шаг к просветлению научись ломать,
    Второй шаг. Научись чинить что сломал.
    Третий шаг. Понять что сломал и как починить))


  1. disakov
    24.01.2017 15:27
    +2

    Согласен с высказываниями выше. Реверс тема специфичная, безопасность включает много чего еще. Про CTF уже писали — они прям обязательны, на мой взгляд. Что касается пути становления эксплойт дев, я бы добавил первым пунктом выучить английский. Все последние разработки на нем публикуются.

    По списку я бы добавил ресурсы типа corelan, fuzzysecurity, бесплатную книгу по более свежим техникам от Massimiliano Tomassoli. Про книгу шеллкодов уже упоминали, можно еще Амини про фаззинг почитать, благо есть на русском.

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

    Здорово, что практический аспект волнует не только индустрию, но и универы.


  1. BalinTomsk
    24.01.2017 20:49

    Этот список курсов рекомендую для прослушивания

    https://app.pluralsight.com/library/courses/fuzzing-security-hackers-developers
    https://app.pluralsight.com/library/courses/breaking-down-cloud-security
    https://app.pluralsight.com/library/courses/code-auditing-security-hackers-developers
    https://app.pluralsight.com/library/courses/owasp-top10-aspdotnet-application-security-risks
    https://app.pluralsight.com/library/courses/social-engineering-cyber-security-awareness
    https://app.pluralsight.com/library/courses/phishing-whaling-cyber-security-awareness
    https://app.pluralsight.com/library/courses/ethical-hacking-sql-injection


    1. FancyMalware
      24.01.2017 20:58

      403 Forbidden
      Request forbidden by administrative rules.

      Даже на индексовой странице


      1. BalinTomsk
        25.01.2017 04:16

        Возможно у вас заблокирован этот сайт. Это довольно известный ресурс.


  1. andd3dfx
    24.01.2017 21:51
    -3

    Так и представляю, как вьюноша с взором горящим, начитавшись вашей статьи, — учит питон, с, c++ и ассемблер один за одним, чтобы стать «правильным хакером»


    1. sanrega
      25.01.2017 03:51

      Нужен другой порядок? Научите как, я тоже хочу стать «правильным хакером». Надоело чистить пыльные системники, переустанавливать Windows, да и попросту — эникеить. Познания в программировании ограничены:

      10 LET c=a+b
      20 INPUT a
      30 INPUT b
      40 PRINT c
      50 GOTO 10

      С чего мне начать? Или уже поздно начинать в возрасте за 30?


      1. intrud3r
        25.01.2017 14:23

        Никогда не поздно начать, все зависит от желания, и только от него!


      1. FancyMalware
        25.01.2017 18:11

        Почитай этот топик тут

        anykenanyken не слушай, он тролль и наркоша. Хотя читни, пару дельных советов есть от него :D


  1. teecat
    25.01.2017 11:41

    В комментариях к прошлой, ныне удаленной, статье я обещал узнать у юристов о применении 273 УК в случае, если вредоносное ПО создается в иной стране. Выполняю обещание
    Не имеет значения в какой стране автор создал вредоносное ПО. Имеет значение сам факт его создания. Соответственно если автор выехал за рубеж, там написал троян, вернулся — он может быть привлечен к ответственности за создание вредоносного ПО, даже если оно нигде не было использовано (точнее доказательств этого не нашли).


    1. hChr0me
      29.01.2017 11:40
      +1

      > он может быть привлечен к ответственности

      > точнее доказательств этого не нашли

      Глупости какие-то. Ощущение будто либо вы троллите, либо у вас юристы не те. Ничего личного, но эти две фразы как-то противоречивы. Как можно привлечь к ответственности если не нашли доказательств?


      1. NLO
        29.01.2017 13:23

        НЛО прилетело и опубликовало эту надпись здесь


        1. HatsuneAkeno
          29.01.2017 19:31

          Тогда надо привлекать к ст.273 УК РФ Всех исследователей уязвимостей, всех ученых в этой области и т.д. Они же написали его, значит должны нести ответственность, за то что написали. Так по-вашему получается?


          1. NLO
            29.01.2017 20:36

            НЛО прилетело и опубликовало эту надпись здесь


            1. HatsuneAkeno
              29.01.2017 20:53

              Прошу прощения, не обратил внимание, кто зачинщик.


          1. teecat
            30.01.2017 09:56

            По букве закона именно так. «закон суров, но это закон»


      1. teecat
        30.01.2017 10:02

        Юристы у антивирусной компании не те? (смайлик).

        В случае написания вредоносного кода с одной стороны будут личный ноутбук/компьютер обвиняемого или какой сетевой ресурс, куда имел доступ только обвиняемый, с другой стороны адвокат, пытающийся доказать, что на время написания кода ноутбук у обвиняемого сперли. Как вы думаете — кому поверит судья?

        Без доказательств конечно не посадят, вопрос в том, можно ли публикацию со словами «я тут написал» считать доказательством. Во всяком случае наши юристы очень не советовали светиться в обсуждениях таких публикаций


        1. HatsuneAkeno
          30.01.2017 12:59

          Я не говорю о коммерческих исследователях, там давно все акты с ФСБ, ФСТЕК и т.д подписаны и их не трогают, а я GitHub и других опен-сорсных исследователях-любителях их не трогают почему-то. не задумывались об этом? м?


          1. teecat
            30.01.2017 13:04

            Сведений не имею, но предположу, что просто никому не надо. Есть куча куда более актуальных задач, в том числе не решенных на законодательном уровне.
            А надо — за репост можно привлечь. А уж за статью или предложение на сайте вредоносного ПО…


  1. shanker
    25.01.2017 13:24

    Тема непростая. От того и мозолит глаз такой простой подход к ней в этой статье. Театр начинается с вешалки, а простота подхода сквозит в названии статьи. Что значит «правильно»? Обозначены какие-то критерии правильности, на основании которых можно оценивать что лучше, а что хуже? Я не вижу. На мой взгляд, статья с названием: «Мой путь становления безопасника: от ламера до практического эксплоитинга» была бы куда ближе сути описанного в тексте.
    Теперь мой взгляд относительно проблемы. Я закончил радиофизический факультет, кафедра защищённых систем связи. Когда я поступал, то думал, что защита будет от хакеров. Потом узнал, что от помех… Начал работать на 2-м курсе программистом. Не сильно мне это удовольствие доставляло. На последних курсах универа выяснилось, что программист из меня не ахти (т.е. могу, но лучше не надо). Но в фирме появился спрос на безопасника широкого профиля. За неимением других вариантов за исследовательские работы взялся я. Тут-то и пригодились знания построения телекоммуникационных сетей (проводных и беспроводных), которые я получил в универе. А анализ безопасности — нас этому не учили. Я сам по-тихоньку образовывался. Дальше я стал замом нач. отдела. Сейчас уже начальник отдела. В отделе есть программисты, реверсеры, пентестеры. Каждый занят тем, что доставляет ему удовольствие. Но решаем мы одну задачу. Задачу, которую ставят отделу, и я уже потрошу её на подзадачи каждому сотруднику, учитывая сильные стороны каждого из них. И в отделе не мало, закончивших кафедру «Информационная безопасность компьютерных систем». А возглавляю их я: без профильного образования безопасника
    Моё мнение: институт — не фабрика по производству готовых специалистов. Скорее, это фабрика для выпуска неких штамповок. И эту штамповку нужно ещё довести до конечной детали (в первую очередь, силами самой штамповки). Детали могут получаться разные из одинаковых штамповок. И какая получится деталь и получится ли вообще — это зависит от качеств самой штамповки. Поэтому поддерживаю начинания автора статьи Экзамен для будущих «русских хакеров» в Московском Политехе


  1. saipr
    25.01.2017 14:47
    -1

    В первую очередь следовало бы изучить операционную систему в которой вы работаете.

    1. Операционные системы: зачем они инженеру
    2. 30-летие учебного пособия ОС Minix


  1. SmartVolk
    27.01.2017 14:33

    Извиняюсь за глупый вопрос, но зачем использовать функцию printf, когда удобнее использовать объект cout<<? Разве это не устаревший способ программирования?


    1. hChr0me
      27.01.2017 18:38
      +1

      printf сишный вывод, cout плюшный.


    1. Rinnve
      30.01.2017 00:15

      У printf есть свои плюсы. Запись существенно компактнее и нагляднее (особенно если нужно управлять форматированием), работает существенно (в разы) быстрее.


      1. FancyMalware
        30.01.2017 17:54

        И свои минусы, особенно если нужно управлять форматированием.