Уязвимости веб-сервисов
TRANSCRIPT
Сергей Щербель, Сергей ДроздовPositive Technologies
Future NowЦарь Горы
Основная задача – удержание сервера
Всего 3 сервера:
Попасть на второй уровень, можно только после
захвата любого сервера первого уровня
Active Directory
Web Services
Level 2
Level 180/8080/22
8% 8%
20%
Future NowЦарь Горы
Что бы получить контроль над сервером нужно:
Найти уязвимости
Получить учетную запись
Ввести учетную запись по адресу IP:8080
Получить учетную запись к SSH и флаг
Future NowЦарь Горы
После того, как над сервером был получен контроль,
состояние сервера изменяется.
Новое состояние – новая цепочка уязвимостей!
Кто не успел - тот опоздал..
Придется искать уязвимости заново!
Но! Новая цепочка уязвимостей может быть
значительно проще!
Future NowЦарь Горы: сюжет
Первый день - кантина
Второй день - медиа-холдинг
Future NowЦарь Горы: Web
За основу был взят форум PunBB
Все лишнее было убрано
Все нужное было добавлено (аттачи, смена стиля и
языка)
Future NowЦарь Горы: Web
Было подготовлено 17 сценариев развития атак!
Состояние – один из 17 сценариев
В каждом сценарии предусмотрена эксплуатация
уязвимости определенного типа (SQLi, LFI и т.д.)
Как правило, уязвимостей одного типа несколько!
Вероятность того, что один и тот же сценарий выпадет два
раза подряд, КРАЙНЕ МАЛА!
Но даже если это так, то сами уязвимости будут
различными.
Future NowЦарь Горы: Web, процесс генерации
Генератор написан на PHP, процесс генерации:
Останавливаются сервисы: веб-сервер, база данных
Удаляется весь контент веб-каталога
Случайным образом выбирается сценарий, а затем
и сама уязвимость (или уязвимости)
Генерируется контент, учетные записи, имена
каталогов и т.д.
Запускаются сервисы
Future NowЦарь Горы: Web, как пройти?
Заветная учетная запись отображается в системе
администрирования форума. Следовательно, нужно
получить доступ к системе администрирования.
В зависимости от выбранного сценария:
Задается имя каталога
Тип аутентификации (веб-форма, basic)
Сложность пароля
Алгоритм хеширования
Future NowЦарь Горы: Web, сценарий № 1
Уязвимость: SQL Injection
1. SQL Injection
2. SHA-1 хеш пароля из БД
3. ???????
4. Profit!!!11
Кстати, некоторые из уязвимостей доступны только
после регистрации на форуме.
Future NowЦарь Горы: Web, SQL Injection
Future NowЦарь Горы: Web, сценарий № 2
Уязвимость: обход аутентификации в системе
администрирования
1. Найти систему администрирования
2. 1' or 1=1-- 1
3. ???????
4. Profit!!!11
Future NowЦарь Горы: Web, сценарий № 3
Уязвимость: Local File Inclusion
1. Найти уязвимость
2. Загрузить файл или изображение, содержащее
PHP-код
3. Используя уязвимость выполнить PHP-код
Future NowЦарь Горы: Web, Local File Inclusion
Future NowЦарь Горы: Web, сценарий № 4
Уязвимость: Загрузка произвольных файлов
Проверка загружаемого файла (изображение или
вложение) осуществляется некорректно – возможна
загрузка веб-шелла.
1. Подделка MIME-типа файла
2. Загрузка файла с расширением .phtml
Future NowЦарь Горы: Web, подделка MIME-типа
Используя плагин Tamper Data находим MIME-тип
файла:
Указываем тип, характерный для изображения:
Future NowЦарь Горы: Web, сценарий № 5
Уязвимость: Classical Blind SQL Injection
1. Classical Blind SQL Injection
2. Учетная запись из БД
3. ???????
4. Profit!!!11
Future NowЦарь Горы: Web, сценарий № 6
Уязвимость: Чтение произвольных файлов
1. Найти уязвимость
2. Получить контент сценария системы
администрирования
3. Найти в коде логин и MD5 хеш пароля
4. ???????
5. Profit!!!11
Future NowЦарь Горы: Web, сценарий № 7
Уязвимость: Чтение произвольных файлов
1. Найти уязвимость
2. Получить контент файла .htpasswd
3. Подобрать пароль к хешу
4. ???????
5. Profit!!!11
Future NowЦарь Горы: Web, сценарий № 8
Уязвимость: SQL Injection в UPDATE-запросе
Лишь немногим сложнее обычной SQL Injection.
Future NowЦарь Горы: Web, сценарий № 9
Уязвимость: Local File Inclusion
1. Доступ к системе администрирования ограничен
basic аутентификацией
2. Учетная запись в .htpasswd, но пароль сложный
(подобрать не получится)
3. Но можно просто подключить admin/index.php
4. ???????
5. Profit!!!11
Future NowЦарь Горы: Web, Local File Inclusion
Future NowЦарь Горы: Web, сценарий № 10
Уязвимости: Local File Inclusion, SQL Injection
1. Получить учетную запись из .htpasswd
2. ½ profit
3. Получить учетную запись из БД
4. ½ profit
5. Profit!!!11
При этом загрузка файлов запрещена.
Future NowЦарь Горы: Web, сценарий № 11
Уязвимость: Remote Code Execution
Некорректная обработка bb-тегов (preg_replace с
модификатором «e») – классика жанра
Future NowЦарь Горы: Web, сценарий № 12 hardcore
Уязвимость: SQL Injection в INSERT запросе
Уязвимые параметры – HTTP-заголовки:
HTTP_X_REAL_IP и HTTP_X_FORWARDER_FOR
Многие веб-приложения предусматривают получение
IP-адреса пользователя из приведенных заголовков
(для случая, когда используются проксирующие веб-
сервера).
И не все веб-приложения проверяют данных из HTTP-
заголовков.
Future NowЦарь Горы: Web, сценарий № 13
Уязвимость: SQL Injection
1. Найти уязвимость
2. Понять, что file_priv = Y
3. Эксплуатируя уязвимость создать веб-шелл
4. ???????
5. Profit!!!11
А вот подобрать пароли к хешам тут будет не просто
Future NowЦарь Горы: Web, сценарий № 14
Уязвимость: SQL Injection
1. Найти уязвимость
2. Понять, что file_priv = Y
3. Понять, что каталогов, доступных на запись нет
4. Эксплуатируя уязвимость получить контент
сценария admin/index.php
5. Найти учетную запись
6. Profit!!!11
Future NowЦарь Горы: Web, SQL Injection
Future NowЦарь Горы: Web, сценарии № 15, 16 и 17
Future NowЦарь Горы: Web, сценарии № 15, 16 и 17
Уязвимости: SQL Injection, Local File Inclusion
Два типа Web Application Firewall:
Очистка опасных данных
Блокирующий
Реализация примитивная – подключение PHP-сценария
с помощью опции auto_prepend_file.
Future NowЦарь Горы: Web, способы обхода WAF
Очистка опасных данных$WAFtoDelete = '#(\.\./)|(union)|(select)|(substr)|(copy)|(eval)#i';
foreach($_GET as $key => $value) {
if(is_string($value)) {
$_GET[$key] = preg_replace($WAFtoDelete, "", $value);
}
}
Удаление не рекурсивное: .php?file=…/./…/./…/./…/./…/./etc/passwd
Блокирующий $signature = '#((union)|(substr))(.*?)select#i';
foreach($array as $key => $value) {
if(preg_match($signature, $value)) {
Используется метасимвол «.» без модификатора /s: .php?id=1 and 1=2 union %0a select ...