From 9ad721716d6822fc50bb9954470da2bef89b8f9c Mon Sep 17 00:00:00 2001 From: FilatovSerA Date: Wed, 3 May 2023 19:21:49 +0000 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB(?= =?UTF-8?q?=D0=B0)=20=D0=BD=D0=B0=20'labs/lab3/README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- labs/lab3/README.md | 220 ++++++++++++++++++++++++++++++++------------ 1 file changed, 163 insertions(+), 57 deletions(-) diff --git a/labs/lab3/README.md b/labs/lab3/README.md index aa42e4c..b05cc5f 100644 --- a/labs/lab3/README.md +++ b/labs/lab3/README.md @@ -2,65 +2,171 @@ ### Цель работы -получить практические навыки анализа Web-приложений на предмет наличия основных уязвимостей. +Получить практические навыки анализа Web-приложений на предмет наличия основных уязвимостей. ### 1. Теоретическая часть -**Брандмауэр** - это система или группа систем, реализующих правила управления доступом между двумя сетями. Фактические средства, с помощью которых это достигается, весьма различны, но в принципе брандмауэр можно рассматривать как пару механизмов: один для блокирования передачи информации, а другой, - для пропуска информации. Некоторые брандмауэры уделяют больше внимания блокировке передачи информации, другие - ее пропуску. Важно понимать, что конфигурация брандмауэра, как механизма обеспечения выполнения определенных правил, определяет правила для всех систем, которые он защищает. - -### 1.1. Работа *IPTABLES*. Основные понятия - -При описании выполняемых команд приняты следующие обозначения: -- `#` - если перед командой стоит данный знак, это означает, что команда должна выполняться от имени пользователя root (суперпользователь) -- `$` - если перед командой стоит данный знак, это означает, что команда должна выполняться от имени обычного пользователя. - -Обработка пакетов осуществляется согласно определенным правилам. Каждое правило - это строка, содержащая в себе критерии определяющие, подпадает ли пакет под заданное правило, и действие, которое необходимо выполнить в случае выполнения критерия. В общем виде правила задаются в командной строке так: - -```sh -# iptables [-t table] command [match] [target/jump] -``` - -Если в правило не включается спецификатор [-t table], то по умолчанию предполагается использование таблицы filter, если же предполагается использование другой таблицы, то это требуется указать явно. Спецификатор таблицы так же можно указывать в любом месте строки правила, однако более или менее стандартом считается указание таблицы в начале правила. Можно использовать следующие таблицы: -- Таблица **nat** используется главным образом для преобразования сетевых адресов (*Network Address Translation*). Через эту таблицу проходит только первый пакет из потока. Преобразования адресов автоматически применяется ко всем последующим пакетам; -- Таблица **mangle** используется для внесения изменений в заголовки пакетов. Примером может служить изменение поля `TTL`, `TOS` или `MARK`; -- Таблица **filter** используется главным образом для фильтрации пакетов. Для примера, здесь мы можем выполнить `DROP`, `LOG`, `ACCEPT` или `REJECT` без каких либо ограничений, которые имеются в других таблицах; - -Далее, непосредственно за именем таблицы, должна стоять команда. Если спецификатора таблицы нет, то команда всегда должна стоять первой. Команда определяет действие **iptables**, например: вставить правило, или добавить правило в конец цепочки, или удалить правило и т.п. Ниже перечислены команды **iptables**: -- `-A`, `--append` - добавление нового правила в конец заданной цепочки; -- `-D`, `--delete` - удаление правила из цепочки. Команда имеет два формата записи, первый - когда задается критерий сравнения с опцией -D, второй - порядковый номер правила; -- `-R`, `--replace` - замена одного правила другим; -- `-I`, `--insert` - вставка нового правила в цепочку. Число, следующее за именем цепочки, задает номер для вставляемого правила; -- `-L`, `--list` - вывод списка правил в заданной цепочке. Если имя цепочки не указывается, то выводится список правил для всех цепочек; -- `-F`, `--flush` - сброс (удаление) всех правил из заданной цепочки (таблицы). Если имя цепочки и таблицы не указывается, то удаляются все правила, во всех цепочках; -- `-Z`, `--zero` - обнуление всех счетчиков в заданной цепочке. Если имя цепочки не указывается, то подразумеваются все цепочки; -- `-N`, `--new-chain` - создание новой цепочки с заданным именем в заданной таблице; -- `-X`, `--delete-chain` - удаление заданной цепочки из заданной таблицы. Удаляемая цепочка не должна иметь правил, а также ссылок на нее из других цепочек. Если имя цепочки не указано, то будут удалены все цепочки заданной таблицы кроме встроенных; -- `-P`, `--policy` - определение политики «по-умолчанию» для заданной цепочки. Политика «по-умолчанию» определяет действие, применяемое к пакетам, не попавшим под действие ни одного из правил в цепочке; -- `-E`, `--rename-chain` - переименование пользовательской цепочки. - -Раздел **match** задает критерии проверки, по которым определяется подпадает ли пакет под действие этого правила или нет. Здесь мы можем указать самые разные критерии - IP-адрес источника пакета или сети, IP-адрес места назначения, порт, протокол, сетевой интерфейс и т.д. Рассмотрим общие критерии. Общие критерии допустимо употреблять в любых правилах, они не зависят от типа протокола и не требуют подгрузки модулей расширения. -- `-p`, `--protocol` - тип протокола. Примерами протоколов могут быть `TCP`, `UDP` и `ICMP` (список протоколов можно посмотреть в файле */etc/protocols*), а также ключевое слово `ALL`; -- `-s`, `-src`, `--source` - IP-адрес(а) источника пакета. Может указываться как единственный IP-адрес, так и в виде address/mask, например как `192.168.0.0/255.255.255.0`,или `192.168.0.0/24`. Символ `!`, установленный перед адресом, означает логическое отрицание; -- `-d`, `-dst`, `--destination` - IP-адрес(а) получателя. Имеет синтаксис схожий с критерием `-source`; -- `-i`, `--in-interface` - интерфейс, с которого получен пакет. При отсутствии этого критерия предполагается любой интерфейс; -- `-o`, `--out-interface` - имя выходного интерфейса. Критерий допускается использовать только в цепочках OUTPUT, FORWARD и POSTROUTING, в противном случае будет генерироваться сообщение об ошибке; -- `-f`, `--fragment` - правило распространяется на все фрагменты фрагментированного пакета, кроме первого; -- `-m limit` - устанавливает предельное число пакетов в единицу времени, которое способно пропустить правило; -- `--dport`, `¬-destination-port` - порт или диапазон портов, на который адресован пакет; - -Значение **target** указывает, какое действие должно быть выполнено при условии выполнения критериев в правиле. Здесь можно заставить ядро передать пакет в другую цепочку правил, «сбросить» пакет и забыть про него, выдать на источник сообщение об ошибке и т.п. Ниже приведен список действий: -- `ACCEPT` - пакет прекращает движение по цепочке (и всем вызвавшим цепочкам, если текущая цепочка была вложенной) и считается принятым; -- `DNAT` - используется для преобразования адреса места назначения в IP заголовке пакета.Если пакет подпадает под критерий правила, выполняющего `DNAT`, то этот пакет, и все последующие пакеты из этого же потока, будут подвергнуты преобразованию адреса назначения и переданы на требуемое устройство, хост или сеть; -- `DROP` - действие «сбрасывает» пакет. "Сброшенные" пакеты прекращают свое движение полностью; -- `LOG` служит для журналирования отдельных пакетов и событий. В журнал могут заноситься заголовки IP пакетов и другая интересующая информация; -- `MARK` используется для установки меток на определенные пакеты. Действие может выполняться в пределах таблицы **mangle**; -- `QUEUE` - ставит пакет в очередь на обработку пользовательскому процессу. Оно может быть использовано для нужд учета, проксирования или дополнительной фильтрации пакетов; -- `REDIRECT` - выполняет перенаправление пакетов и потоков на другой порт той же ЭВМ; -- `REJECT` - используется, как правило, в тех же самых ситуациях, что и `DROP`, но в отличие от нее, команда 'REJECT` выдает сообщение об ошибке на хост, передавший пакет; -- `RETURN` - прекращает движение пакета по текущей цепочке правил и производит возврат в вызывающую цепочку, если текущая цепочка была вложенной, или, если текущая цепочка лежит на самом верхнем уровне (например, `INPUT`), то к пакету будет применена политика *«по-умолчанию»*; -- `SNAT` - используется для преобразования сетевых адресов, т.е. изменение исходящего IP адреса в IP заголовке пакета; -- `TOS` используется для установки битов в поле *Type of Service* IP заголовка. Поле `TOS` содержит 8 бит, которые используются для маршрутизации пакетов; -- `TTL` используется для изменения содержимого поля *Time To Live* в IP заголовке; -- `ULOG` предоставляет возможность журналирования пакетов в пользовательское пространство. Оно заменяет традиционное действие `LOG`, базирующееся на системном журнале. +На сегодняшний день по данным исследований, около 70% процентов сайтов содержат хотя бы одну уязвимость критического уровня. В компьютерной безопасности термин «уязвимость» (англ. *vulnerability*) используется для обозначения недостатка в системе, используя который можно намеренно нарушить её целостность и вызвать неправильную работу. Уязвимость может быть результатом ошибок программирования, недостатков, допущенных при проектировании системы, ненадежных паролей, вирусов и других вредоносных программ, скриптовых и SQL-инъекций. Некоторые уязвимости известны только теоретически, другие же активно используются и имеют известные эксплойты. + +Обычно уязвимость позволяет атакующему «обмануть» приложение — заставить его совершить действие, на которое у того не должно быть прав. Это делается путём внедрения каким-либо образом в программу данных или кода в такие места, что программа воспримет их как «свои». + + +### 1.1. OWASP + +*Open Web Application Security Project* (OWASP) — это открытый проект обеспечения безопасности веб-приложений. Сообщество OWASP включает в себя корпорации, образовательные организации и частных лиц со всего мира. Сообщество работает над созданием статей, учебных пособий, документации, инструментов и технологий, находящихся в свободном доступе. + +Раз в несколько лет OWASP публикует рейтинг наиболее популярных уязвимостей в Web-приложениях, который называется OWASP Top 10. На данный момент список выглядит следующим образом: +* A1 Внедрение кода +* A2 Некорректная аутентификация и управление сессией +* A3 Межсайтовый скриптинг (XSS) +* A4 Нарушение контроля доступа +* A5 Небезопасная конфигурация +* A6 Утечка чувствительных данных +* A7 Недостаточная защита от атак +* A8 Подделка межсайтовых запросов (CSRF) +* A9 Использование компонентов с известными уязвимостями +* A10 Незащищенный API + +В рамках данной лабораторной работы будут разобраны некоторые из этих уязвимостей. + +### 1.2. Внедрение кода (SQL Injection) + +Все данные, как правило, хранятся в специальных базах, обращения к которым строятся в виде запросов, чаще всего написанных на специальном языке запросов SQL (*Structured Query Language* – структурированный язык запросов). Приложения используют SQL-запросы для того, чтобы получать, добавлять, изменять или удалять данные, например при редактировании пользователем своих личных данных или заполнении анкеты на сайте. При недостаточной проверке данных от пользователя, злоумышленник может внедрить в форму Web-интерфейса приложения специальный код, содержащий кусок SQL-запроса. + +Такой вид атаки называется инъекция, в данном случае самый распространённый — SQL-инъекция. Это опаснейшая уязвимость, позволяющая злоумышленнику получить доступ к базе данных и возможность читать/изменять/удалять информацию, которая для него не предназначена. Например, изменить вместе с именем и фамилией баланс своего счета, посмотреть баланс чужого счета, или же, похитить конфиденциальные личные данные. + +Эта уязвимость является следствием недостаточной проверки данных, поступающих от пользователя. Это позволяет злоумышленнику «подсунуть», например, в веб-формы, специально подготовленные запросы, которые «обманут» приложение и позволят прочитать или записать нелегитимные данные. + +В целом эта разновидность атак имеет общее название «Ошибки валидации», к ней относятся далеко не только SQL-инъекции и мы будем упоминать этот вектор еще не раз. + +1. Пользователь переходит по ссылке, передавая определённые параметры + + + +2. Сервер обрабатывает параметры, формирует SQL-запрос и отправляет его в базу данных + + + +3. База данных возвращает результат и сервер использует \ти данные в формировании страницы + + + +4. Что произойдёт, если в параметре передать строку, содержащую специальные символы, дополняющие SQL-запрос? + + + +5. Сервер обработает эти данные, подставит их в запрос и, если запрос валидный, выполнит запрос + + + +6. Дальше данные обработаются и вернутся на страницу пользователя + + + +Различают несколько видов SQL-инъекций: +1. Внедрение операторов SQL (SQL Injection) +2. Слепое внедрение операторов SQL (Blind SQL Injection) + +### 1.3. Межсайтовый скриптинг (XSS) + +Межсайтовое выполнение сценариев (*Cross site scripting* или XSS) – это возможность вставки HTML\JS – кода в уязвимую страницу. Инъекция кода осуществляется через все доступные способы ввода информации. Успешное завершение атаки может привести к использованию значений различных переменных, доступных в контексте сайта, записи информации, перехвату пользовательских сессий, данных и т.д. Cross-Site Scripting (XSS) – Это уязвимость на стороне клиента. + +Условно Cross-Site Scripting (XSS) делят на: +* Сохраненный вариант (Persistent / Stored) +* Отраженный вариант (non-persistent / reflected) + +Как это работает: +1. Пользователь вводит на Web-сайте в строке поиска слово “secureweb”. + + + +2. Web-сервер отображает введенную поисковую фразу на странице так, как она была введена в поле + + + +3. Обнаружив уязвимость злоумышленник отправляет жертве ссылку с внедренным кодом + + + +4. После перехода по ссылке в браузере пользователя выполняется внедренный код + + + +5. После выполнения кода злоумышленник может похитить авторизационные данные пользователя и выполнять действия от его имени на сайте + + + +### 1.4. Подбор паролей + +Одним из основных механизмов защиты современных веб-приложений является механизм управления доступом. Обычно выделяют следующие этапы управления доступом: +* идентификация – установление идентификационных данных; +* аутентификация – подтвержденное установление идентифика- +ционных данных; +* авторизация – назначение прав идентификационным данным. + +При входе в веб-приложение (sign in, log in) пользователь идентифицируется (сообщает свой идентификатор) и аутентифицируется (доказывает, что он именно тот пользователь, чей идентификатор был сообщен). Большинство веб-приложений используют аутентификацию по паролю. В веб-приложениях с высоким уровнем защищенности (например, в Интернет-банках) также применяются протоколы двухфакторной аутентификации. Очевидным недостатком аутентификации по паролю является возможность использования паролей с плохими статистическими характеристиками. Хранение пароля или его передача по каналам связи в открытом или даже зашифрованном виде потенциально несет угрозу раскрытия пароля. + +Очень большое количество пользователей использует очень простые и предсказуемые пароли для приложений. Очень часто пароль один от различных сервисов (почта, социальные сети, онлайн-банк). + +Самой распространенной атакой является брутфорс или перебор по словарю. Как это работает: + +1. Пользователь задаёт пароль и логин (или использует логин по умолчанию): + + + +2. Злоумышленник с помощью специализированного софта последовательно подбирает пароли пользователя. + + + +### 1.5. Обратный путь в директориях (Path Traversal) + +Атака по обходному пути (также известная как *Path Traversal*) предназначена для доступа к файлам и каталогам, которые хранятся вне корневой папки сервера. Путем манипулирования переменными, которые ссылаются на файлы с чередованием «dot-dot-slash или (../)» и его вариантами или с использованием абсолютных путей к файлу, может быть получен доступ к произвольным файлам и каталогам, хранящимся в файловой системе, включая исходный код приложения или конфигурацию и критические системные файлы. Следует отметить, что доступ к файлам ограничен управлением операционным доступом системы (например, в случае заблокированных или используемых файлов в операционной системе Microsoft Windows) или файлах без права чтения в Linux. + +Как это работает: + +1. Сервер принимает запрос от пользователя, в котором содержится наименование файла, который необходимо открыть. Сервер обрабатывает параметр и возвращает пользователю файл с соответствующим названием. + + + +2. Злоумышленник меняет наименование файла на путь к файлу, который он хочет прочесть, к примеру `../../../../../../../../etc/passwd`. Сервер так же обрабатывает параметр и возвращает пользователю файл с соответствующим названием. + + + +### 1.6. Прямой доступ к объектам + +Данный вид уязвимости является также следствием недостаточной проверки пользовательских данных. Суть ее заключается в том, что при выводе каких-либо конфиденциальных данных, например личных сообщений или учетных карточек клиентов, для доступа к объекту используется идентификатор, который передается в открытом виде в адресной строке браузера или в параметрах запроса и не реализована проверка прав доступа к объектам. Например, есть страница, которая отображает личное сообщение и она имеет адрес вида: + +```ssh +mysite.ru/read_message.jsp?id=123654 +``` + +Перебирая число после `id=` можно будет читать чужие личные сообщения. Эксплуатация данной уязвимости очень проста и не требует вообще никаких специальных навыков – достаточно лишь перебирать число в адресной строке браузера и наслаждаться результатом. Так же возможно перебирать имена файлов или другие идентификаторы. Как ни парадоксально, но этой "детской болезни", порой были подвержены достаточно крупные европейские платежные системы. + +### 1.7. Некорректная настройка механизмов безопасности + +После разработки приложения настаёт время правильно настроить общее окружение и сервера на которых будет эксплуатироваться данный софт. К сожалению, часто администраторы пренебрегают основными механизмами безопасности, что может привести к появлению уязвимостей. Общие ошибки, относящиеся к данной категории можно выделить в следующие типы: + +* доступность интерфейсов управления в т.ч. фактически неиспользуемые: сетевые порты, URI +* разглашение информации в сообщениях об ошибках (фреймворк, ЯП, СУБД, сервер) +* Проблемы на границе сфер ответственности администраторов и разработчиков (workingCopy) +* автодополнение и кэширование +* отсутствие флагов или заголовков безопасности (защита от client-side атак: Clickjacking, XSS) +* файлы, содержащие конф. информацию, доступны всем (*.php.1) + +Несколько примеров того, как это работает: + +* доступность интерфейсов управления + + + +* Разглашение информации в сообщениях об ошибках + + + + +* Проблемы на границе сфер ответственности администраторов и разработчиков (workingCopy) + + +### 1.8. ### 2. Практическая часть **Описание задачи**: требуется защитить web-сервер. Необходимо разрешить доступ к портам 80 и 22 и сделать перенаправление вызова с порта 8080 на 80. При попытке обратится к портам сервера, не описанным в операционной системе (ОС) как сервис, следует отказывать в обслуживании. При попытке обратится к портам, описанным в системе как сервисы, следует отказывать в обслуживании и заносить данные об этом в журнал. Для выполнения задания необходима следующая последовательность действий.