Выполнение произвольной команды CMD, не используя пробелы
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 18.04.17 07:42
Оценка: 35 (5) +1
Неплохой пример того, как особенности отдельно взятого парсера и окружения приложения могут способствовать успешной атаке на него.

Вчера в одном из чатов всплыла задачка по %subj%. Речь шла о возможности эксплуатации уязвимости к RCE через инъекцию с фильтрацией приложением всех пробельных символов в векторе атаки. Оказалось, что это вполне возможно. У команды echo весьма своеобразный парсер, благодаря которому её аргумент может быть отделён от неё самой не только пробелом. Тупой фаззинг по всем валидным символам от 0 до 0xffff в UTF-8 шаблона `echo{chr}test` даёт следующие варианты, допустимые в качестве возможных разделителей в echo:

0020, ' '
0028, '('
002B, '+'
002C, ','
002E, '.'
002F, '/'
003A, ':'
003B, ';'
003D, '='
005B, '['
005C, '\'
005D, ']'
00A0, ' '
1680, '?'
180E, '?'
2000, ' '
2001, ' '
2002, ' '
2003, ' '
2004, ' '
2005, ' '
2006, ' '
2007, ' '
2008, ' '
2009, ' '
200A, ' '
2028, '?'
2029, '?'
202F, ' '
205F, '?'
3000, '?'

Т.е., к примеру, `echo=calc.exe` выведет на экран `calc.exe` без знака равенства. А всё, что может быть выведено с помощью echo, может быть выполнено с помощью CMD: `echo=calc.exe|cmd`. Остаётся вопрос, что делать с командами, парсеры аргументов которых не позволяют подобные трюки, например ping? И тут тоже нашлось решение: пробел можно брать из переменной окружения, в значении которой он присутствует на всех системах (по крайней мере, в конфигурации по умолчанию). Одной из таких переменных является PROGRAMFILES, содержащая пробел в 10 символе своего значения, а следовательно, получаем: `echo=ping%PROGRAMFILES:~10,-5%8.8.8.8|cmd`

Voila
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Отредактировано 19.04.2017 6:36 kochetkov.vladimir . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.