В рамках одного доклада мы расскажем, во первых, про наиболее популярные уязвимости веб-приложений. Также мы расскажем про такие классические вещи, как переполнение буфера (на стеке (stack) и на куче (heap), атаки на формат строки и не только. Многие про это слышали, но не многие знают, как этим может воспользоваться злоумышленник. Будет рассмотрена эксплуатация описанных уязвимостей без достаточной информации о приложении, принципы работы и написания шеллкода.
Будут функционировать два стенда, где все желающие могут попробовать свои силы и почувствовать себя настоящими хакерами.
Доклад будет интересен студентам и молодым разработчикам.
2. Кто мы вообще такие?
Мы – команда молодых специалистов по информационной
безопасности CTRL-PNZ. Студенты и выпускники кафедры
«Информационная безопасность систем и технологий» ПГУ
Нас объединяет игра в CTF, уже второй год мы организуем собственные мероприятия IBSTPSU CTF.
Зачем?
Чтобы все желающие повышали свой уровень, чтобы студенты и школьники сталкивались с
практическими аспектами информационной безопасности в прикольной и доступной форме.
Кафедра
«Информационная
безопасность систем
и технологий»
Пензенский
государственный
университет
3.
4. Первый этап – отборочный, в стиле Task-based CTF и
проводится по сети Интернет.
Команды решают задания, разбитые по различным категориям, и
получают за них баллы. Чаще всего это:
Администрирование;
Криптография;
Стеганография;
Раскрытие компьютерных преступлений;
Программирование;
Задачи на веб-технологии;
И многое, многое другое…
CTF - это командные соревнования, целью которых является оценка умения участников атаковать
и защищать компьютерные системы.
В США и Европе в CTF играют давно, в России с 2006 года. Но сейчас CTF набирает обороты и в России. И это круто!
Это законный способ учиться компьютерной безопасности не только в теории, но и на практике, причем делать это
еще и играя!
Финал проводится в ПГУ, в стиле Classic CTF. Это непосредственное
противоборство участников, имеющих одинаковый набор систем
и сервисов.
Задачи участников «классического» CTF:
Поддерживать работоспособность сервисов, которая периодически
проверяется жюри;
Устранять уязвимости на своем сервере;
Эксплуатировать уязвимости, найденные на серверах противника;
Делать описания найденных уязвимостей, способов их эксплуатации и
устранения.
6. Чем мы займемся сейчас?
• «Вкратце о наболевшем»
Переполнение буфера на стеке и на куче, атаки форматной строки и другие
непонятные вещи в доступной форме.
Рубцов Ян, капитан команды Ctrl-PNZ
• «Web в опасности!»
Подробное описание популярных уязвимостей веб-приложений. С примерами!
Гринзовский Илья, специалист по WEB-технологиям
А еще на первом этаже сразу напротив входа стоят наши стенды =)
Их можно и даже нужно потрогать руками!
8. О докладчике
• Участник различных CTF (Capture The Flag), капитан команды
CTRL-PNZ
• Разработчик заданий IBST PSU CTF 2013, 2014
• Разработчик системы проведения IBST PSU CTF 2014
• Занимаюсь «понемногу всем подряд», прямо сейчас отдуваюсь за
одного из членов команды
9. Что вообще такое переполнение
буфера?
Буфер – это некая область памяти.
Переполнение возникает при попытке запихать в
буфер больше данных, чем он может принять.
Индексное переполнение при чтении =>
seq_write(char *p)
{
char buff[8];
...
strcpy(buff, p);
}
idx_write(int i)
{
char buff[]="0123456789";
...
return buff[i];
}
10. Чем оно грозит?
• Запись в произвольные ячейки памяти
• Передача управления по произвольным
адресам
• Раскрытие или навязывание конфиденциальной
информации
• Атака на логику работы программы (отладочные
люки, флаги, индексы и прочие плюшки от
разработчика)
• Атака «отказ в обслуживании»
=>
=>исполнение shell-кода => PROFIT!
=>
14. Какой буфер?
• На стеке (автоматическая память)
• На куче (динамическая память)
• В сегменте данных (WTF?!)
15. О чем НЕ пойдет речь
• Про неисполняемый стек
• Про особенности работы некоторых компиляторов (далеко не
всегда спасают)
• NIX-срачи
VirtualProtect, VirtualAlloc и т.п. + говнокод =
16. Все не так уж и плохо?
• Ограничения на ввод в строковых буферах
• Размер переполняющихся буферов слишком мал
• Все по-разному на разных ОС
• Адреса непостоянны
• Поиск и эксплуатация - сложная штука
17. Все хорошо? Нет.
• Нет методик автоматического обнаружения и ликвидации
• Борьба с возможным переполнением = потеря
производительности
• Системы обнаружения вторжений и межсетевые экраны – не
панацея
20. Немного жесткого 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 а потом начинает «затираться»
25. Brute force
Отправка запросов от имени
легитимного пользователя, получение
дополнительной информации о
приложении, выполнение
неавторизованных действий
31. Exploit example
s = 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