Правильний шлях становлення безпечника: від ламера до практичного эксплойтинга

Вітаю, тебе %хабраюзер%
Прочитав я тут статтю на хабре Іспит для майбутніх російських хакерів» у Московському Політесі

І мій мозок увійшов в нескінченний цикл нерозуміння того, що відбувається. То я зараз заглянув на школофорум «хакерів», то дійсно на хабр. Вже вибачте, з таким підходом поточного покоління вайтов просто не буде кому замінити.

У даній статті я хотів би написати, як на мою скромну думку ( раніше багхантера на стороні блэков ) варто було б дійсно починати шлях. І у жодному випадку не з Kali linux ( як виявляються викладають в політесі столиці )

Якщо вам цікавий почасти і мій шлях, ласкаво просимо під кат.



Багато кроки у користувачів хабра вже виконані, тому можете сміливо пропускати до свого рівня.

В основному пост буде стосуватися Windows, так як саме ця ОС є моєю спеціалізацією, як найбільш поширена.

Я розгляну тут код на прикладі уразливості переповнення буфера, але до готового експлойта не дійду, це окрема і дуже широка тема.

Крок 0. Від ламера до нуба

В першу чергу слід було б вивчити операційну систему в якій ви працюєте. Як би банально це не звучало, але знання ОС дійсно іноді підносять такі речі, які не пріподносіт реверс.

Наприклад, обхід UAC'а в Windows 10 був виявлений завдяки одному procmon, який працював під час використання eventvwr. Забавно, але сам факт підвищення прав полягав у тому, що спочатку eventvwr шукав ключ реєстру в одній гілці, не знаходячи її шукав в інший. За фактом першому місці звичайно ніколи нічого не виявлялося, в результаті досить було лише записати туди шлях до свого файлу і запустити eventvwr як відразу виконувати цю програму з підвищеними правами.

Тут не було отревершено ні байта, однак дослідники виявили обхід UAC'а.

Так що перше — вивчіть операційну систему. Досконально. Почитайте різні книжки з її пристрою. Конкретно по Windows можу порадити Марка Руссиновича «Внутрішнє пристрій Windows». Книга від автора таких популярних утиліт, як autoruns і procmon

Для Windows: поиграйтесь з такими програмами, як RegMon і FileMon. Вони дозволяють робити зліпки ОС «до» і «після» і порівнювати. Подивіться, які зміни вносять різні параметри начебто зміни налаштувань ОС і подібних.

Поставте віртуальну машину і спробуйте «вбити» ОС самими збоченими способами, а потім це полагодити.

Після цього можна знову повернутися до RegMon і FileMon і позапускать різні семпли малварі. Після цього ви вже будете здатні знаходити майже будь-яку малварь просто за симптомами.

Малварь можна дістати звідси

Прихований текстУвага! Сайти, які містять посилання на шкідливі файли
Переходьте на свій страх і ризик
Многая малварь написана нашими не запускається на РУ машинах, ставте на віртуалку ENG-машини без російської розкладки
malwareblacklist.com
malwr.com ( потрібна реєстрація )
kernelmode.info ( зазвичай відома досить малварь )


Після того, як ви вивчіть операційну систему, в якій працюєте — можна приступати далі.

Крок 1. Від нуба до розробника

На даному етапі вивчіть якусь мову програмування. Наприклад, python — він досить хороший для новачка і в майбутньому стане в нагоді вам в написанні експлойтів і фаззинга ( що це розглянемо далі ).

Після чого вивчіть сі, він дасть розуміння роботи з пам'яттю, навчить думати про продуктивності, а також корисний як нативний мову.

Далі мова асемблера, хоча б у загальних принципах. Що таке регістри, що таке стек, основні інструкції. Корисно при реверсі, для читання не потрібно особливо ніяких особливих знаннях.

У такому порядку:

python, C/C++, assembler

Крок 2. Від розробника до хорошого розробника

На даному етапі ви повинні навчитися відрізняти поганий код від хорошого. Навчитися бачити помилки, а також знати асемблер.

Як перевірити чи ви пройшли цей крок? Просто скажіть до чого може привести наступний код:

#define _CRT_SECURE_NO_WARNINGS

#include < stdio.h>
#include <stdlib.h>
#include < string.h>

void Encr(char *in, char *out, int key)
{
for (int i = 0; i < strlen(in); i++)
out[i] = in[i] + key;
}

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

char EncryptedStr[10] = { 0 };
if (argc > 1)
{
Encr(argv[1], EncryptedStr, 5);
printf("Encrypted: %s\n", EncryptedStr);
}

return 0;
}


Дана програма отримує в аргументах рядок і шифрує її алгоритмом цезаря з ключем 5, зберігаючи результат в EncryptedStr.

Що в даному коді поганого і до чого воно може призвести?

Відповідь:
Прихований текстДана програма може призвести до переповнення буфера, якщо передати рядок довжиною понад 9 ( 10-й символ — нульовий ). Що перепишуть в стеку адресу повернення з функції і дає змогу виконати довільний код у пам'яті процесу. Якщо б таке було в серверному — це могло б призвести до того, що неавторизований користувач міг би виконати на сервері код


Але цей код з 2000х. У даний момент дірку експлуатувати складно, бо з'явилися такі техніки, як DEP, ASLR, Security-Cookies. Однак це теж обходиться. Можна почитати для прикладу, наприклад, ret2libc

Крок 3. Від хорошого розробника до реверсеру

Подивимося попередній приклад в ассемблерном лістингу за допомогою IDA Pro

Прихований текст


Як би ви добре не шарили, але знайти тут RCE складно навіть мені. А адже приклади з життя набагато складніше. Тому існують спеціальні інструменти — фаззеры.

Що таке фаззер? Це лазер з фільмів типу мазера спеціальний софт, який флудит додаток невірними даними, щоб знайти нестандартне поведінку. Тобто ми можемо написати такий сценарій, який у всіх місцях, де приймаються вхідні дані буде відправляти рандомные дані і дивитися результат. Якщо результат призвів до падіння, то ми знайшли уразливість.

Наприклад, для нашого додатка найпростіший фаззер виглядає так:

#/usr/bin/python

import subprocess

i = 0;
while True:
i += 1
if subprocess.call('test1.exe {0}'.format("A" * i), shell=True) != 0:
print 'Crashed with arguments: {0}'.format("A" * i)
break
print "Finished"



І ось результат:

Прихований текст


Більш детально про фазерах можна читнуть тут

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

Від реверсера до эксплойтеру

Після цього можна починати писати експлойти.

Наприклад, для нашого додатка найпростіший експлойт буде виглядати в псевдокоде як-то так

#/usr/bin/python

import subprocess

subprocess.call('test1.exe '.format("A" * 10 + address + there_shellcode), shell=True);


Де address — адреса перезаписуемого буфера пам'яті, а there_shellcode — шеллкод, який виконується при переповненні буфера.

Як конкретно це можна знайти в гуглі, я лише дав напуття.

Замість висновку

Мій варіант на відміну від наведеної перед катом статті набагато ширший і практичніше. Однак і складніше.

Слідувати яким шляхом — шляхом скрипткидди, або шляхом эксплойтинга — вибирати тільки вам.
Джерело: Хабрахабр

0 коментарів

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