Обход антивирусов. Антиэмуляция, обход сигнатур и все все все. Часть II.

Тема в разделе "Этичный хакинг и тестирование на проникновение", создана пользователем PingVinich, 5 июн 2017.

  1. PingVinich

    PingVinich Bug hunter
    Grey Team

    Репутация:
    0
    Регистрация:
    19 мар 2017
    Сообщения:
    66
    Симпатии:
    178
    Все части
    Часть I
    Привет! В этой статье мы продолжим обсуждать насущные проблемы обхода антивирусов. А именно продолжим обсуждать тему, которую мы затронули в этой статье. Статья не была написана мной. Я переводил существующую.

    ВНИМАНИЕ: Автор не призывает к нарушению УК РФ, а предоставляет информацию для общего развития. Автор не несёт ответственности за ваши действия.

    Мне нужен код, который будет считаться вредоносным. Легчайший путь сделать это, это использовать хорошо известную Meterpreter нагрузку из Metasploit Framework. Я написал код на C, который вызывает не зашифрованный meterpreter шеллкод, который описан здесь. Я зашифровал код таким образом, что любой антивирусный статический анализ не удастся (включая анализ загрузчика-расшифровщика).

    Здесь представлена копия главной функции:

    Код (Text):
    int main( void )
    {
        decryptCodeSection(); //Дешифрование кода
        startShellCode(); // Вызвать дешифрованный шеллкод метерпретера.
        return 0;
    }
    Эта версия кода обнаруживается локальными антивирусами и имеет VirusTotal счёт:

    12/55

    Это показывает, что в настоящее время, антивирусы все больше и больше зависят от динамического анализа, но для большинства из них это еще не так.

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

    Сложные методы

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

    1. Метод инъекции кода


    Инъекция кода состоит во внедрении кода в другой процесс. В основном это делается с помощью DLL инъекции, но существуют и другие методы. Сложность этого метода заключается в том, что при инъекции кода мы должны найти способ выполнить нужный нам код, не загружаясь системой нормально (особенно, потому что базовый адрес постоянно меняется). DLL инъекция, работает только если подгружается DLL. При использовании инъекции кода, важно помнить, что код должен быть в состоянии модифицировать указатели памяти основанные на перемещении секций.

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

    2. Метод RunPE

    Термин "RunPE" относится к способу, который состоит из запуска некоторого кода в другом процессе, заменяя код процесса, на код который вы хотите выполнить. Различие между инъекцией кода, это то, что при инъекции кода вы выполняете код в отдалённом процессе; в RunPE методе вы заменяете код удалённого процесса на тот, который вы хотите выполнить.
    Вот краткий пример того, как он может работать, чтобы скрыть вредоносное ПО.

    Представьте, что вредоносная программа упакована/зашифрована и вставлена в другой двоичный файл, предназначенный для загрузки (используя, например, связанные ресурсы). Когда загрузчик будет запущен, он:
    • Создаст действующий системный процесс, используя, например, CreateProcess.
    • Прекратит проецировать память процесса, используя NtUnmapViewOfSection.
    • Заменить память, кодом малвари (используя WriteProcessMemory).
    • После возобновления процесса (используя ResumeThread) вредоносный код выполнится вместо процесса.
    Заметка: Замещение памяти процесса невозможно, если процесс защищён с помощью DEP (Data Execution Prevention).
    В этом случае, вместо того, чтобы использовать метод RunPE, загрузчик может просто вызвать другой экземпляр самого себя и внедрить в него вредоносный код.

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

    Простые, но эффективные методы


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

    Основное ограничение антивирусных сканеров - это время, в течение которого они могут потратить слишком много сил на что-либо. Простейший метод обхода антивируса состоит в том, чтобы забрать у него побольше времени, прежде чем вредоносный код будет расшифрован. Использование простой задержки Sleep, не приведёт к обходу антивируса, так как антивирусный эмулятор адаптирован к этому. Этот тип обхода называется «Предложение, от которого вы должны отказаться», потому что этот тип обхода налагает на антивирусы некоторый код, на который антивирусу потребуется много ресурсов, поэтому я уверен, что антивирус отстанет от нас до запуска зловредного кода.

    Пример 1: Выделение и заполнение 100 миллионов байтов памяти.
    В этом примере, мы просто выделяем и заполняем 100 мегабайт памяти. Этого достаточно, для того, чтобы обескураживания любую антивирусную эмуляцию.

    Код (Text):
    #define TOO_MUCH_MEM 100000000
    int main( void )
    {
      char * memdmp = NULL;
      memdmp = (char *) malloc(TOO_MUCH_MEM);

      if( memdmp != NULL )
      {
        memset(memdmp, 00, TOO_MUCH_MEM);
        free(memdmp);
        decryptCodeSection();
        startShellCode();
      }
      return 0;
    }
    VirusTotal счёт:
    0/55

    Видите как легко избежать обнаружение антивирусом? Этот метод основан на классической и очень частой функции malloc. Ещё плюс в том, что нет никаких строк, на который можно было бы построить сигнатуру. Единственный недостаток, это то, что 100 мегабайт памяти сгорают, а это может быть обнаружено хорошей системой мониторинга.
    Заметка: если вы не запустите часть с memset, то оценка будет 4/55.

    Пример 2: 100 миллионная инкременция
    Этот метод ещё легче. В данном случаем, мы используем for цикл, чтобы инкрементировать переменную счётчик 100 миллионнов раз. Этого достаточно, чтобы обойти антивирус, но это ничто для современного процессора. Человек не заметит никакой разницы между этим кодом и кодом без обхода.

    Код (Text):
    #define MAX_OP 100000000

    int main( void )
    {
      int cpt = 0;
      for(int i = 0; i < MAX_OP; i++)
      {
        cpt++;
      }
      if( cpt == MAX_OP )
      {
        decryptCodeSection();
        startShellCode();
      }
      return 0;
    }
    VirusTotal счёт:
    0/55
    Метод «Предложение, от которого вы должны отказаться» очень мощен. Ну, на этом всё. Спасибо за внимание. Продолжение следует.
     
    #1 PingVinich, 7 июн 2017
    Последнее редактирование: 8 июн 2017
    giloo, _Eliot_, special и 12 другим нравится это.
  2. Oksy

    Oksy Active Member
    Paid Access

    Репутация:
    0
    Регистрация:
    5 май 2017
    Сообщения:
    37
    Симпатии:
    13
    Спасибо, отличная статья.

    Код (Text):
    cpt++;
    if( cpt == MAX_OP )
    Простецкий код на Си. Все гениальное просто!

    только не пойму зачем
    Код (Text):
    for(int i = 0; i < MAX_OP; i++)
     
  3. PingVinich

    PingVinich Bug hunter
    Grey Team

    Репутация:
    0
    Регистрация:
    19 мар 2017
    Сообщения:
    66
    Симпатии:
    178
    Чтобы повторить инкрементацию cpt 100 000 000 раз.
     
  4. Oksy

    Oksy Active Member
    Paid Access

    Репутация:
    0
    Регистрация:
    5 май 2017
    Сообщения:
    37
    Симпатии:
    13
    Всеравно непонятно.
    Этим кусочком мы делаем эдакую задержку, перед дешифровкой содержимого малвари. В количестве 100 миллионов колебаний процессора (по сути доли секунды).
    cpt++;
    if( cpt == MAX_OP )

    Но зачем цикл for, если можно поставить стандартный while ,без каких либо условий.
    Я конечно в Си очень слабенько разбираюсь, если глупость спрашиваю, извините.
     
  5. РЫЦАРЬТАЩИТ

    Репутация:
    0
    Регистрация:
    24 май 2017
    Сообщения:
    7
    Симпатии:
    0
  6. giloo

    giloo New Member

    Репутация:
    0
    Регистрация:
    18 июл 2017
    Сообщения:
    4
    Симпатии:
    0
    Огромнейшее спасибо за статью! Многое прояснило! Но у меня есть вопрос, как называется процесс АВшки который срабатывает при попытке добавления в автозагрузку? Проактивка? Если да, то имеет ли это отношение к песочнице? Просто я попробовала код со счетчиком, и запустила код в памяти своего процесса, но авшка так и запалила(
    Хочу понять каждый сегмент защиты ав. Понимаю что разжевано все в шапке за что отдельное спасибо. Но хотелось бы убедится)
     
  7. PingVinich

    PingVinich Bug hunter
    Grey Team

    Репутация:
    0
    Регистрация:
    19 мар 2017
    Сообщения:
    66
    Симпатии:
    178
    Да, проактивка. Проактивная защита - это технология, которая позволяет анализировать поведение и выявлять потенциально опасные программы. Она запускается не обязательно во время попытки автозагрузки. Об этом ты можешь узнать в других источниках. Также, проактивная защита лежит в основе динамического анализа. Многие методы, описанные в этой статье уже устарели, но некоторые всё ещё работают. Поэтому, неудивительно, что этот способ уже не работает. Попробуй другой. Также, убедись, что код надёжно зашифрован. Это нужно, чтобы обойти статический анализ.
     
    #7 PingVinich, 18 июл 2017
    Последнее редактирование: 18 июл 2017
    giloo нравится это.
  8. giloo

    giloo New Member

    Репутация:
    0
    Регистрация:
    18 июл 2017
    Сообщения:
    4
    Симпатии:
    0
    Спасибо за ответ)
    Как я поняла, мой код не нуждается в шифровании. Я использую рантайм компиляцию из строки(c#). Не думаю что ав проверяют строки на наличии исполняемого кода(хотя кот его знает).
    Значит проактивка работает так: в песочнице эмулирует код, видит что идет запись в реестр, далее разрешает все лигитимные действия в юзер спейсе, но лочит запись в реестр? Я правильно поняла? Если так, то не могли бы вы подсказать рабочий метод определения эмуляции? Спасибо!
    --- Добавлено 20 июл 2017. Первое сообщение размещено 19 июл 2017 ---
    Может я тупая и чего-то не понимаю, но я перепробовала много различных крипторов, обойти палевность автозагрузки так и не получилось. Чую что дело не в эмуляции. Либо полная виртуализация( что мало вероятно) либо авшные хуки на уровне ядра. Оповещение появляется именно в момент записи в реестр.
     
  9. PingVinich

    PingVinich Bug hunter
    Grey Team

    Репутация:
    0
    Регистрация:
    19 мар 2017
    Сообщения:
    66
    Симпатии:
    178
    Нуждается. Всё проверяется. Определить? Весь цикл был посвящен этому. Значит крипторы левые были.
     
  10. giloo

    giloo New Member

    Репутация:
    0
    Регистрация:
    18 июл 2017
    Сообщения:
    4
    Симпатии:
    0
    Хорошо, тогда по другому. Бывают ли малвари которые обходят проактивку 360 Total Security и COMODO? и не могли бы вы мне их скинуть, в крайний случай прореверсила бы
    --- Добавлено 21 июл 2017. Первое сообщение размещено 21 июл 2017 ---
    Ладно, это уже наглость) Просто я в сметении, обычная автозагрузка палится( и не знаю как обойти
     
Загрузка...
Похожие Темы - Обход антивирусов Антиэмуляция
  1. PingVinich
    Ответов:
    4
    Просмотров:
    831
  2. PingVinich
    Ответов:
    3
    Просмотров:
    929
  3. Brib
    Ответов:
    9
    Просмотров:
    361
  4. Vander
    Ответов:
    0
    Просмотров:
    526
  5. _Mr_Romanenko_
    Ответов:
    12
    Просмотров:
    475

Поделиться этой страницей