Это статья об основах программирования на Go. На канале я рассказываю об опыте перехода в IT с нуля, структурирую информацию и делюсь мнением.
Хой, джедаи и амазонки!
Пока разбирался с сетевыми технологиями в предыдущей публикации о модели OSI и Internet, обнаружил проблемы с безопасностью, которые несёт постоянный IP-адрес. Заинтересовался этой темой и решил немного глубже изучить проблемы безопасности для веб-приложений, чтобы научиться эти проблемы выявлять и не допускать в процессе разработки или тестирования ПО.
Кроме предупреждения уязвимостей на этапе разработки ПО (да и аппаратной части), существует профессия пентестер для выявления допущенных проблем в информационной безопасности.
Белый хакер или пентестер (penetration test - испытание на проникновение) - это IT-специалист, выявляющий возможности несанкционированного доступа к цифровым ресурсам с целью укрепить её информационную безопасность и предотвратить такой несанкционированный доступ.
1. Техника безопасности для белого хакера
Я больше 12 лет проработал на опасном производстве, где инструкции по технике безопасности написаны кровью. И перед тем, как допустить человека к работе, проводится несколько инструктажей по технике. По одним должностям инструктаж ТБ попроще, по другим - жёстче:
Есть такие инструктажи, где просто прочтения правил и подписи в журнале ТБ недостаточно - обязательна нужна практика по закреплению озвученных требований. Это в какой-то степени относится и к белому хакингу.
Что я хочу сказать о хакинге, даже о белом. Бывает, что и специалисты с опытом "налипают" на неприятности, связанные со сферой их работы, если верить авторским публикациям практикующих пентестеров. Что уж говорить о неопытных новичках, делающих первые шаги в обучении белому хакингу.
Приведу примеры, которые нашёл в различных источниках, какие могут быть проблемы и опасности при белом хакинге, т.к. кто предупреждён, тот вооружён:
- Это заблуждение, будто если взломать маленький неизвестный сайт даже в учебных целях, вас не найдут. Находят людей очень хорошо, даже если они взломали не банк, а микросайт с посещением два человека в месяц. Это может быть связано в т.ч. с тем, что с помощью чужой сети, не представляющей видимой ценности, настоящие хакеры могут заметать следы при захвате другой более ценной системы.
- Считается, что в даркнете при конспирации 100 lvl невозможно найти человека. Находят. Множество историй, например прочитайте про шёлковый путь.
- Если ты считаешь себя хакером-альтруистом и ищешь уязвимости на чужих сайтах без просьбы владельцев этих сайтов и обещанного вознаграждения; а после обнаружения уязвимости сообщил об этом в техподдержку сайта, ты в лучшем случае не получишь никакого ответа. И даже не вздумай спрашивать о вознаграждении, это может истолковаться, как вымогательство, и хорошо если тебя вежливо предупредят, что если воспользуешься найденной уязвимостью, то ответишь по закону.
- Если ты пользуешься биржей, на которой компании оставляют заявки на поиск уязвимостей своих ресурсов с оплатой работы (bug bounty), будь готов к следующему: ты нашёл уязвимость, направил доказательства компании, а в ответ получил отказ. При этом неважно - пофиксили найденную тобой уязвимость, или нет: возник конфликт. А биржа при этом конфликте встаёт на сторону организации, а не на твою. Такие случаи описаны в публикациях конкретными людьми. Можно разбираться через суды, собрав доказательную базу, но это траты времени, нервов и денег, а результат не гарантирован. Просто знай о существовании таких ситуаций.
- Обучайтесь взлому не на реальных сайтах или чьих-то профилях в соцсетях (даже друзей), а на своём компьютере в виде тестовых сценариях, собственном сервере, специальных сайтах по прокачке навыков взлома в тестовой среде и тому подобном.
Эта информация защитит от проблем и подготовит к возможным сценариям развития событий, если решим идти по этому пути.
2. Red-team vs Blue-team
Есть два типа специалистов информационной безопасности, к одному из которых относятся и пентестеры:
- Те, кто обеспечивают информационную безопасность (ИБ) в компании, развивают ИБ и реагирует на атаку информационной среды.
- Те, кто по запросу компании выявляют уязвимости ИБ этой компании и выполняют комплексную атаку с целью подтвердить реальность опасности и предоставить информацию для закрытия брешей.
Первые - это blue-team. Вторые - red-team. Такая терминология пришла из армии.
Обычно red-team работает, известив blue-team, чтобы в "тепличных" условиях защитники были наготове и могли противопоставить весь инструментарий защиты, следить и адекватно реагировать на сигналы атаки на компьютерную систему.
Blue-team можно сравнить с защитниками крепости, а red-team - ассасины, которых нанял король крепости для проверки надёжности своей стражи:
Цель red-team - это всесторонняя имитация действий очень умных злоумышленников, у которых современное оборудование, ПО, связи и нестандартные подходы к проникновению в информационную среду организации с целью заполучить конфиденциальные данные или навредить другим способом.
Способов навредить масса: от удаления данных без возможности восстановления до вывода из строя инфраструктуры. А если эта инфраструктура - атомный реактор, то последствия будут не только для компании плачевные, но для всего человечества.
Имитация действий злоумышленников, т.е. red-teaming, выполняется именно комплексно:
- Социальная инженерия;
- Физическое вторжение;
- Тестирование на проникновение (пентестинг).
2.1. Социальная инженерия
Социальная инженерия - это софтскилы и хардскилы, направленные на манипуляции над людьми с целью вызвать у них требуемое поведение.
Социальная инженерия не обязательно носит негативный окрас, она может быть направлена на воспитание нравственности и формирования здоровых привычек.
Лучше социальные инженеры как правило работают в госструктурах. Вспомните ситуации с масками, когда некоторые люди готовы были броситься с кулаками на тех, кто появлялся в общественных местах без масок. Цель была - чтобы все носили маски.
Реклама - пример социальной инженерии. Люди, у которых огромные сообщества - хорошие социальные инженеры.
В прошлом году купил и начал читать книгу "Нетворкинг для разведчиков. Как извлечь выгоду из любого знакомства" от бывших разведчиков СССР и РФ под глубоким прикрытием, написанную для улучшения качества жизни всех людей:
В книге доносится идея, что разведчик - это профессиональный нетворкер, для которого поиск контактов и развитие отношений - его основная работа. И разведчиков специально готовят к тому, чтобы изучать людей, а набравшись опыта на практике, они становятся великолепными практикующими психологами.
На мой взгляд, нетворкинг - это социальная инженерия на микроуровне.
Как с помощью социальной инженерии можно нарушить кибербезопасность?
- Получение сведений через личные контакты, в т.ч. при живом общении;
- Фишинг: письма на email с ссылками на поддельные сайты для получения личных данных, по нику в ТГ, телефонные звонки и т.д.
- Поиск контактов в соцсетях, на корпоративных сайтах.
Пример социальной инженерии / нетворкинга на микроуровне в виде получение сведений через установление личного контакта был в советском фильме про Шерлока Холмса и доктора Ватсана "Король шантажа", где Шерлок в великолепном исполнении Василия Ливанова входит в доверие и обручается с гувернанткой, работающей в коттедже богатого злодея, чтобы узнать об охране коттеджа и его планировке:
Когда-то общался с сотрудником blue-team, он рассказал случай во время своей службы во времена СССР. Тогда на промышленное предприятие (не в сфере IT) должна была приехать иностранная делегация. Блю-тимовцев через одного поставили за станки в цехе, где должна была пройти экскурсия, вместо настоящих рабочих, рассказали в двух словах как и что делать за станком, чтобы и не травмироваться и не выдавать себя, будто вы стоите за станком в первый раз. А во время экскурсии один из её делегатов попытался порасспрашивать токаря, но общался с блю-тимовцем и не получил промышленной информации.
2.2. Физическое вторжение
Ситуация: в организации супер-антивирус установлен на каждом компьютере, интернета у рядовых сотрудников нет вовсе - только локальные сети: извне едва ли возможно получить доступ к информационной среде. Злоумышленник проходит в офис под различным предлогом, садиться за компьютер и скачивает нужные данные на флешку. Или даже прихватывает ноутбук сотрудника и уходит с ним через выход или спускается по пожарной лестнице; или аккуратно и скрытно кладёт ноутбук/флешку/съёмный HDD через открытое окно на водоотлив первого этажа, чтобы беспрепятственно пройти проходную с досмотром, зайти с улицы и спокойно забрать устройство.
К физическому вторжению может относиться всё, что связано с физическим воздействием: взлом замков, проход через слепые зоны камер слежения, преодоление заборов. Короче тема вообще не айтишная, а каких-то спецагентов.
Сюда же входят ситуации, при которых подделывают пропуска/бейджи, придумываете законный сценарий входа в закрытую зону - например, занимаются доставкой еды или воды.
2.3. Тестирование на проникновение
Пентестер определяет слабые места системы и пользуется этими слабостями. В сферу ответсвенности пентестера входит определение:
- Места, куда хакеры направят атаку;
- Способы, которыми хакеры будут атаковать;
- Как будет действовать "оборона" - blue-team;
- Масштаба нанесённого ущерба.
Пентестер анализирует прорехи в информационной безопасности приложений, сетей и сетевых устройств: компьютеров, смартфонов и др.
Этапы работы пентестера:
- Планирование - определить цели тестирования: согласование деталей с заказчиком и получение от него разрешения, определение систем и компонентов, которые будут подвергнуты тестированию, выявление юридических/этических ограничений;
- Исследование - сбор данных об IT-инфраструктуре и потенциальных уязвимостях исследуемой компании: сканирование сетей, анализ DNS, сбор данных из открытых источников об IT-инфраструктуре или изучение информации, предоставленной заказчиком (если предусмотрено условиями);
- Атака - испытания на проникновение: попытки несанкционированного доступа к информационной среде заказчика, работа с правами доступа и т.д.;
- Отчётность - написание отчёта о проделанной работе: найденных сведениях, вариантах атак и используемых инструментах, найденных уязвимостях, масштабе потенциального ущерба и рекомендациях к исправлению.
Пентестеры при атаке обнаруживают уязвимость и используют её для более глубокого проникновения, стараясь получить максимальное влияние и доступ на цифровую среду.
Каждый из этих этапов можно разделить на подуровни, но для IT-сферы мне интересны этапы исследования и атаки. Вместе они образуют kill-chain стратегию.
2.4. Kill-chain
Цикл kill-chain - это модель последовательных этапов кибератаки начиная от разведки и заканчивая целевыми действиями хакера. Эта модель помогает понять, как злоумышленники планируют и осуществляют атаки, что, в свою очередь, позволяет организациям разработать стратегии защиты на каждом из этапов.
Этапы модели kill-chain настоящих хакеров включают:
- Разведка (Reconnaissance): cбор информации о цели в виде пассивных и/или активных действий. Пассивные действия снижают вероятность обнаружения, активные - повышают. Под пассивными - сбор данных из открытых источников без запросов к сети, - например, изучение корпоративного сайта, соцсетей работников компании, заметок СМИ; записей DNS, в т.ч. контактных данных владельца доменов; элементы социальной инженерии. Под активными понимается взаимодействие с целевой системой: сканирование сети, проверка уязвимостей, интерактивное изучение - прямое взаимодействие стандартными "пользовательскими способами", отправка "недобросовестных запросов" для оценки реакции целевой системы.
- Вооружение (Weaponization): подготовка инструментария для атаки: написание вирусов, подготовка сети компьютеров для массовой DDoS-атаки, установка специального ПО на компьютеры хакеров и т.д.
- Доставка (Delivery): доставка оружия к цели, например через фишинг, USB-носители или как-то иначе.
- Эксплуатация (Exploitation): использование уязвимостей в системе для несанкционированного доступа.
- Установка (Installation): установка вредоносного ПО для обеспечения постоянного доступа к информационной среде.
- Управление и контроль (Command and Control): установление соединения хакера с информационной средой компании.
- Действия по объектам (Actions on Objectives): реализация целей хакера: кража данных, подмена данных, удаление данных и др.
Пентестеры при выполнении исследования и атаки могут следовать по этой же цепочке, документируя каждый шаг.
2.5. Когда нужна Red-team?
Пентестер может быть как частью команды blue-team, так и red-team. Но его работа - только часть комплексных мероприятий red-team.
Смысл организовывать "ред-тиминг" есть, если в компании налажена базовая информационная безопасность и проведён пентестинг. И компания хочет, чтобы их защита прошла проверку боем в условиях, когда оппонент будет взламывать защиту любым способом.
Red-team действует скрытно, не привлекая внимания, как действовали бы настоящие злоумышленники.
Отдельный пентестер вне red-team не скрывает своих намерений и открыто исследуя уязвимости, не заботясь о том, чтобы остаться в тени; а blue-team может получать тревожные сигналы но игнорировать их, т.к. понимают, кто взламывает их систему.
Red-team ищут лазейки огромным количеством методов в информационной безопасности через несовершенство ПО и аппаратной части, доверчивость людей или недостаточную охрану физических объектов. Как только лазейка найдена, специалисты будут анализировать, как эти небольшие с виду уязвимости могут перерасти в глобальные сбои всей информационной системы.
При получении целевых данных, атака red-team считается выполненной. Целевые данные как правило определяются на этапе согласования, когда компания, которая хочет проверить свою информационную безопасность, ставит задачи red-team.
Для разработчика ПО важно понимать, как его ПО могут тестировать, и не допускать уязвимостей на этапе разработки кода. Чтобы минимизировать риски успешной кибератаки или даже случайных действий добросовестных пользователей при наличии уязвимостей.
3. Инструменты пентестера
Меня интересуют в первую очередь IT-сфера, поэтому разбираю как действует пентестер: что использует, как можно разработчику ПО протестировать свои приложения. Начнём с дистрибутива Linux Kali, который считается хакерским, т.к. имеет большой инструментарий предустановленного ПО для анализа информационной безопасности.
Будем устанавливать Kali не на ОС, а воспользуемся виртуальной машиной, чтобы повысить свою собственную безопасность.
Также рассмотрим консольную утилиту Nmap для анализа сети и ПО BurpSuite для анализа веб-приложений.
А для опытов будем использовать докер-образ веб-приложения с наличием в нём уязвимостей, а именно - интернет-магазин соков.
Также есть старые добрые инструменты разработчика в каждом браузере.
Итого, рассмотренные инструменты в этом разделе:
- Виртуальная машина;
- Linux Kali;
- Nmap;
- BurpSuite;
- Докер-образ интернет-магазина соков;
- Инструменты разработчика в браузере.
3.1. Виртуальная машина
Виртуальная машина (ВМ) - это ПО, которое моделирует поведение аппаратной части компьютера, позволяя запускать разные ОС на одном устройстве.
Виртуальную машину можно установить непосредственно на аппаратную часть компьютера (используя гипервизор 1 уровня), так и установить на существующую ОС (используя гипервизор 2 уровня).
Гипервизор - это низкоуровневое ПО, которое позволяет создавать и управлять ВМ.
Гипервизоры 1 уровня (голые гипервизоры) устанавливают на крупные корпоративные сервера или облачные дата-центры. Это обеспечивает более эффективное управление ресурсами и производительность.
Я выделил две причины, почему белому хакеру виртуальная машина может быть полезна:
- Изолировать тестовую среду для экспериментов с вредоносным ПО с минимизацией рисков повреждения основной ОС.
- Практиковать поиск уязвимостей в разных ОС. Если я работаю только на Windows, то как я смогу искать уязвимости на MacOS, тем более если у меня нет макбука? Только через ВМ.
- Сразу получить набор установленных инструментов для пентестера.
Установил виртуальную машину VirtualBox на своей Linux Manjaro через пакетный менеджер с GUI через поиск по названию программы:
После установки запустил ПО:
Работает, всё в порядке. Поехали устанавливать Kali.
3.2. Linux Kali
3.2.1. Скачиваем Linux Kali
Заходим на сайт Kali. Нас интересует раздел для виртуальной машины с готовыми настройками ОС Kali:
Вот раздел для виртуальных машин, есть образ для VirtualBox и других ВМ.
Образ для VirtualBox весит 3.3 ГБ, скачивался со скоростью ~7 МБ/с.
3.2.2. Распаковываем архив
Создам каталог, в котором будут все мои виртуальные ОС. Действовать будем как настоящие белые хакеры - через терминал:
Флаг -p (parent) в команде mkdir позволяет создавать промежуточный каталог, если его нет.
Командой tree я посмотрел содержимое каталога.
Далее, сюда нужно переместить скачанный архив образа Kali в наш каталог для дальнейшей распаковки. Допустим, полное имя архива образа такое:
/home/ev/Загрузки/kali-linux-2024.4-virtualbox-amd64.7z
Тогда команда в терминале будет такой:
Точка в конце команды mv указывает, что перемещаем в каталог в котором находимся.
Выполняем разархивирование командой 7z:
7z x kali-linux-2024.4-virtualbox-amd64.7z
Разархивирование выполнено. Проверим наличие и размер разархивированного каталога и удалим архив:
3.2.3. Монтируем образ в ВМ
Через кнопку "Добавить" открываем разархивированный образ в ВМ. После добавления кнопка изменилась на "Запустить":
3.3. Запуск образа
При запуске образа у меня возникла ошибка:
Эта ошибка говорит, что драйверы VirtualBox не установлены или не загружены в ОС. Также сообщается, что возможна ошибка при наличии опции безопасной загрузки модулей ядра в BIOS.
Опция Security Boot влияет на предотвращение загрузки программ без цифровой подписи при загрузке ядра ОС.
Существуют программы, в т.ч. старые дистрибутивы Linux, которые не имеют такой подписи, и вот для запуска таких программ нужно отключать эту опцию, что снижает безопасность системы.
Проверил я свой BIOS:
Уже оказывается стояла Disabled, т.е. отключена безопасная загрузка модулей драйверов.
Что делать?
Поискал, для моей ОС есть отдельный раздел документации конкретно для VirtualBox:
Выполним установку по этой документации.
3.4. Установка VirtualBox по документации разработчиков ОС
Первым этапом установки, разработчики документации на ОС предлагают убедиться, что виртуализация включена в BIOS. Чтобы это сделать, в документации Manjaro предлагается ознакомиться с документацией поставщика компьютера.
3.4.1. Виртуализация в BIOS
Проверяю в BIOS виртуализацию. Нашёл опцию SVM Mode, в описании указывает на виртуализацию CPU. Думаю, она:
3.4.2. Пакет virtualbox
Чтобы установить VirtualBox, необходимо установить пакеты virtualbox и linux*-virtualbox-host-modules. Последний должен соответствовать версии ядра, которое загрузил для работы мой компьютер.
Чтобы получить список установленных ядер, можно использовать следующую команду:
mhwd-kernel -l
В документации этого нет, но чтобы получить информацию о версии ядра, используемого в текущей системе, нужна команда:
uname -r
Эта информация нужна, чтобы запустить установку VirtualBox командой:
sudo pacman -Syu virtualbox ВЕРСИЯ_LINUX-virtualbox-host-modules
Как я понял, нужно взять используемое ядро 6.11.11-1-MANJARO но без лишних знаков символов, сопоставив со всеми доступными ядрами. На мой взгляд это может быть linux61, хотя визуально подходят и другие варианты. Устанавливаю 61-й:
sudo pacman -Syu virtualbox linux61-virtualbox-host-modules
Процесс пошёл:
Процесс завершился 10/10, будем считать что всё идёт как нужно:
После завершения установки, нужно добавить загруженную программу в ядро ОС. Это можно сделать перезагрузкой или командой в терминал:
sudo vboxreload
Вновь ошибка. Она может говорить о том, что я установил пакет VirtualBox для другого ядра, а не того, что использую.
Установлю пакет VirtualBox для другого ядра, а именно 611 - возможно нужно ориентироваться на три цифры версии ядра из команды uname при сопоставлении с результатами из команде mgvd:
sudo pacman -Syu virtualbox linux611-virtualbox-host-modules
Вывод уже отличается:
Загружаем пакет VirtualBox:
sudo vboxreload
Команда выполнилась корректно. Проверяю версию VirtualBox:
vboxmanage --version
Версия есть, запустим наше приложение VirtualBox с графическим интерфейсом и запустим образ. Результат:
Отлично, виртуальная машина запустила образ и предлагает ввести имя пользователя и пароль. По-умолчанию, это kali. Пароль лучше поменять, конечно.
Какой я делаю вывод. Вероятно, при установке VirtualBox через пакетный менеджер с GUI, было предложено выбрать одно из ядер, и я выбрал не то, которое используется.
Ввёл данные, у меня появилось в отдельном окне рабочее пространство с ОС Kali:
Запустил терминал и попробовал пингануть тестовый хост для проверки работоспособности сети из Kali:
Всё работает, пинг достигает цели.
На этом пока всё. У меня есть полноценная ОС для тестирования сети на безопасность.
Установим отдельно от Kali Linux небольшую утилиту для сканирования сетей, чтобы можно было ей пользоваться без ВМ при разработке кода в основной ОС.
3.5. Консольная утилита nmap
Утилита nmap (Network Mapper) - инструмент для сканирования сетей. Она часто используется системными администраторами для своих целей, далёких от пентестинга и тем более хакинга.
3.5.1. Установка nmap
На моей Linux Manjaro она не установлена по-умолчанию. С менеджером пакетов pacman установил командой:
sudo pacman -S nmap
Программа незнакомая, почитаем раздел помощи:
Этот раздел не очень большой но и не особенно понятный.
Можем почитать расширенную справку об утилите через другую утилиту man, которая обычно предустановлена во всех bash-оболочках. Вот начало справки, она довольно большая:
Чтобы прочитать и понять эту документацию, потребуется очень много времени. Я разберу несколько сценариев использования nmap.
Для экспериментов нам потребуется IP-адрес какого-либо устройства. Проще всего протестировать сеть своего маршрутизатора, к которому кроме домашнего ПК могут быть подключены смартфоны и ещё что-то. Для этого нужен IP-адрес маршрутизатора.
3.5.2. Определяем IP своего маршрутизатора
Введём в терминал команду для поиска IP-адреса устройства по-умолчанию, к которому мой компьютер направляет запросы для выхода в интернет:
ip route | grep default
- default - ключевое слово, обозначающее маршрут по-умолчанию;
- via 192.168.0.1 - IP-адрес сетевого устройства, которое связывает локальную сеть с интернетом;
- dev wlo1 - обозначение сетевого интерфейса, связывающего маршрутизатор и компьютер-источник запроса. Указывает на беспроводную связь (Wi-Fi);
- proto dhcp - информация сохранена в таблицу маршрутизации маршрутизатора через dhcp-протокол.
- src 192.168.0.13 - IP-адрес устройства источника запроса, т.е. моего компьютера.
- metric 600 - метрика маршрута.
О протоколе DHCP и таблице маршрутизации можно почитать в публикации о сетях: *клик*.
Эти адреса, что я здесь привёл - локальные. По ним не выйдет обратиться к моему компьютеру или маршрутизатору из интернета. У маршрутизатора есть внешний IP-адрес, который регулярно обновляется вышестоящим DHCP-сервером провайдера.
3.5.3. Сканируем TCP-порты сетевого устройства
С помощью Nmap можно обнаружить активные порты сетевого устройства. Т.е. те порты, которые постоянно прослушиваются сетевым устройством и воспринимают информацию, поступающую на них. К этим портам могут быть привязаны какие-то процессы, т.е. работающие программы.
И хотя маршрутизатор работает на сетевом уровне сетевой модели Internet, а порты работают уровнем выше - на транспортном уровне, в маршрутизаторе их также можно просмотреть. Связано это в том числе с тем, что в маршрутизаторах встроена реализация протокола NAT и брандмауэры для фильтрации и управления трафиков на основе портов, для которых предназначен этот трафик.
Воспользуемся командой nmap с IP-адресом маршрутизатора:
nmap 192.168.0.1
- Строка Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-06 20:53 +10 показывает версию утилиты Nmap и начало времени сканирования;
- Nmap scan report for 192.168.0.1 сообщает, что сканируется устройство с IP-адресом 192.168.0.1;
- Host is up (0.0071s latency) - хост доступен по указанному IP-адресу и задержка составляет 0.0071 секунды. Задержка - это время передачи пакета (данных) к целевому устройству и обратно.
- Not shown: 992 closed tcp ports (conn-refused) - не показано состояние 992 TCP-портов, т.к. они закрыты.
- Далее таблица со столбцами PORT, STATE, SERVICE (порт, состояние, служба этого порта). Сами порты, протоколы и предполагаемые службы на них.
- filtered - не удалось определить статус порта. Вероятная причина - настройки или фильтрация пакетов.
- Строка Nmap done: 1 IP address (1 host up) scanned in 1.24 seconds - просканирован 1 IP-адрес за 1,24 секунды.
3.5.4. Сканируем UDP-порты сетевого устройства
Процесс похож, но добавляем флаг -sU. Сканирование требует намного больше времени, т.к. UDP-порты могут не всегда давать ответы. Так, моё сканирование заняло 18 минут.
Флаг s означает "scan/сканирование" и следом ожидает тип протокола.
Флаг U указывает на протокол для сканирования UDP. В предыдущем пункте мы не указывали флагов, т.к. по-умолчанию сканируются TCP-порты.
Собственно, всё похоже. Но появился ещё MAC-адрес с производителем сетевого адаптера.
Из сервисов можно выделить: domain для DNS-запросов, dhcps для протокола DHCP, tftp - протокол TFTP, netbios-ns - для NetBIOS Name Service, netbios-dgm для NetBIOS Datagram Service, isakmp для Internet Security Association and Key Management Protocol, upnp для Simple Service Discovery Protocol и т.д.
3.5.5. Определяем ОС сетевого устройства
Команда определит приблизительную версию ОС, а не гарантированную:
nmap -O 192.168.0.1
- Первая часть аналогична предыдущему разбору.
- Device type: general purpose - сетевое устройство классифицируется как устройство общего назначения.
- Running: Linux 2.6.X - предположительно на целевом хосте установлена Linux 2.6...
- Network Distance: 1 hop - целевой хост находится на расстоянии 1 перехода от моего устройства.
Знание конкретной версии OS может сказать пентестеру, каким она подвержена уязвимостям, т.к. уязвимости для старых ОС считаются общеизвестными.
А ещё интересно поисследовать хопы.
3.5.6. Список хопов
Смотрим хопы командой:
nmap --traceroute 192.168.0.1
Как и ожидалось, один хоп. Попробуем посмотреть, сколько хопов до DNS-сервера гугл с IP 8.8.8.8:
18 хопов. Т.е. до какого-то далёкого сервера от моего компьютера, чтобы прошёл интернет-трафик, потребовалось 18 сетевых устройств. И каждое перенаправляло куда-то трафик.
Посмотрим на IP Nasa:
Уже всего 6 хопов, может потому что между нами всего-то Тихий океан:
3.5.7. Поиск активных сетевых устройств
Поищем активные устройства в локальной сети в диапазоне IP-адресов:
nmap -sn 192.168.0.1/24
Нашлось два активных устройства. Соответственно, одно из них - сам маршрутизатор, а другое - мой ноутбук.
Вообще, локальный (частные) IP-адреса находятся в определённых диапазонах. Для IPv4, это следующие диапазоны:
- 10.0.0.0 – 10.255.255.255 (CIDR 10.0.0.0/8) обеспечивает создание гигантской локальной сети размером до ~16 млн уникальных адресов (устройств);
- 172.16.0.0 – 172.31.255.255 (CIDR 172.16.0.0/12) - обеспечивает создание огромной локальной сети размером до ~1 млн адресов (устройств);
- 192.168.0.0 – 192.168.255.255 (CIDR 192.168.0.0/16) обеспечивает создание локальной сети размером до 65536 адресов (устройств).
Эти адреса не могут использоваться в интернете и предназначены для локальных сетей. Устройства с частными IP-адресами могут взаимодействовать друг с другом в локальной сети, а для доступа к интернету используют протокол NAT через маршрутизатор, у которого есть публичный IP-адрес, предоставленный DHCP-сервером провайдера.
3.5.8. Поиск уязвимостей
Можно воспользоваться встроенными в утилиту сценариями для поиска известных уязвимостей. Запрос к маршрутизатору выполнялся почти 3 минуты:
nmap --script vuln 192.168.0.1
Там ещё полторы страницы продолжения.
Вывод какой: обнаружены две уязвимости:
- CSRF - Cross-Site Request Forgery - на нескольких веб-страницах. Из этого я делаю вывод, что в маршрутизаторе есть небольшой сервер, который может отвечать веб-страницами.
- SMBv2 - CVE-2009-3103 - уязвимость к атаке, позволяющей выполнить непредусмотренный код.
Н-да, неожиданное явление.
3.6. BurpSuite
3.6.1. Установка BurpSuite
BurpSuite - ПО для тестирования веб-приложений автоматически на основе встроенных сценариев или вручную.
Под ручным тестированием я понимаю это ПО, как прокси-сервер, который будет перехватывать мои запросы на пути к целевому хосту и позволять их редактировать перед отправкой по назначенному пути.
BurtSuite есть по-умолчанию в Kali Linux, но в целях экспериментов, установлю её на свою Linux Manjaro. Воспользуюсь пакетным менеджером с GUI:
Если лицензии нет, нужна обычная версия, а не pro.
После установки при запуске появится окно для конфигурирования:
Я использовал настройки по-умолчанию. Далее запустилась сама программа:
Программа готова к работе. Есть бесплатная академия веб-безопасности от разработчиков этого ПО с постоянно пополняющимися материалами: *клик*
Многие интересные модули доступны только в профессиональных и корпоративных версиях, такие как автоматическое сканирование веб-приложений на уязвимости.
Рассмотрим один из множества модулей BurpSuite - Proxy.
3.6.2. Proxy в BurpSuite
Перейдём во вкладку Proxy, нажмём Intersept Off для старта прослушивания данных веб-приложений и нажмём кнопку Open Browser для взаимодействия с веб-приложениями:
В браузере введём сайт и нажмём Enter:
Переходим в BurpSuite, видим что появился запрос:
Добавим этот запрос в модули "Intruder" и "Repeater". Сделать это можно, выбрав запрос через ПКМ (правую кнопку мыши), либо быстрыми клавишами Ctrl+I и Ctrl+R.
Intruder (вторженец) — это инструмент, который позволяет автоматизировать процесс атаки на веб-приложение. Он может использоваться для проведения различных типов атак, таких как атаки перебором и атаки по словарю.
Repeater (повторитель) — это инструмент, который позволяет вручную отправлять и изменять HTTP-запросы.
Вот пример отображения информации Повторителя:
Мы видим HTTP-заголовок, можем внести в него какие-либо правки и отправить. Пока на этом всё.
3.7. Docker и интернет-магазин соков
3.7.1. Введение
Docker - это ещё один инструмент пентестера. В частности, его можно использовать для создания тестовой среды для практики атаки не на реальные приложения, а на свои собственные.
Пример такой тестовой среды - докер-образ веб-приложения. Пример такого сложного веб-приложения со множеством проблем в безопасности - OWASP Juice Shop. У этого репозитория 10к+ звёзд. По легенде это интернет-магазин соков, который позволяет входить в учётную запись и совершать покупки:
Взаимодействие с сайтом выполнено через REST API. Почитать о создании сервиса на REST API: *клик*
Для работы с OWASP Juice Shop можно воспользоваться докером, хотя это не единственная возможность установки веб-приложения:
Команда:
docker pull bkimminich/juice-shop
загружает с Docker Hub образ с именем bkimminich/juice-shop и сохраняет его на локальный компьютер в каталог, управляемый Docker.
Команда:
docker run --rm -p 127.0.0.1:3000:3000 bkimminich/juice-shop
Запускает контейнер. Флаг -rm указывает Docker удалить контейнер после его завершения. Это во-первых позволит избежать накопления неактивных контейнеров в системе, но в данном случае это полезно тем, что наши действия внутри контейнера не будут сохраняться.
Флаг -p связывает IP-адрес хоста с портом (первые 3000), который привязывается к этому процессу, т.е. к конкретному контейнеру. Вторые 3000 - это виртуальный порт докер-контейнера, который не имеет отношения к портам компьютера, по этому порту внутри контейнера веб-приложение Juice Shop слушает входящие запросы. Этот второй порт должен быть неизменным, т.к. при разработке веб-приложения, код ссылается именно на этот порт.
Сам Docker в Linux Kali не установлен, поэтому нужно сделать это самому. В документации Kali об этом есть раздел: *клик*
3.7.2. Устанавливаем Docker на Linux Kali
Запускаем Linux Kali через виртуальную машину, запускаем терминал. Далее руководствуемся документацией. Фрагмент документации:
Результат работы:
3.8. Инструменты разработчика в браузере
Инструменты разработчика позволяют просматривать код веб-страницы, сетевую активность и некоторые другие параметры:
В правой части интерфейс модуля "Инструменты разработчика" в браузере. Вызываются разными комбинациями клавиш, в моём Яндекс-браузере это Ctrl+Shift+I.
Например, до сих пор ответы на некоторые онлайн-тесты можно узнать, изучив код веб-страницы через штатные средства браузера. Такие данные не должны храниться на стороне фронтенда, а только на стороне сервера. А если хранятся во фронте - это уязвимость.
Таким образом, опытный пентестер даже без хакерской Linux Kali и её инструментов может найти некоторые уязвимости.
4. Тест на проникновение интернет-магазина
Переходим к практике, используя инструментарий из предыдущей главы. Вся работа выполняется в Linux Kali, запущенной через виртуальную машину.
4.1. Запускаем сервер интернет-магазина
Запускаем скачанный ранее образ интернет магазина (см. выше) командой:
sudo docker run --rm -p 127.0.0.1:8080:3000 bkimminich/juice-shop
Единственно, чтобы не запутаться, я ввёл порт процесса докер-контейнера 8080, а виртуальный порт внутри контейнера - 3000, а не сделал их 3000 оба, как предлагается в документации интернет-магазина на гитхабе.
Теперь можно зайти в браузере на сайт и посмотреть, ввести как он работает:
Отлично, веб-приложение, запущенное из докера - работает. Посмотрим, как он работает.
Ну и IP-адрес 127.0.0.1 имеет алиас localhost, для информации, так что это идентичные значения.
4.2. Знакомимся с работой сайта
При тестировании на проникновение нужно сперва разобраться, какова штатная работа с веб-приложением. Мы не можем взломать сайт, не зная, как с ним предполагается взаимодействовать добропорядочным пользователям и что вообще сайт из себя представляет.
Первое, что я сделал - сменил язык на русский.
Затем открыл окно входа в учётную запись (которую не создавал ранее, да и интерфейс для создания учётной записи отсутствует):
Нажимаем "Войти в систему", появляется сообщение о неверном логине или пароле:
Протестировал штатную работу части функционала сайта. Теперь перейдём в BurpSuite и будем тестировать сценарии со входом в браузер.
4.3. Запускаем BurpSuite
Запускаем BurpSuite, переходим во вкладку Proxy. Открываем браузер BurpSuite через Open Browset, переходим в интернет-магазин командой:
localhost:8080
Возвращаемся в BurpSuite, запускаем Intersept и вновь возвращаемся в браузер: пробуем войти в систему, пишем произвольные логин и пароль и нажимаем "войти в систему".
Возвращаемся в BurpSuite, находим появившийся запрос. Intersept можно отключить. Отправляем HTTP-запрос в Intruder и Repeater.
С Repeater'ом всё просто: можем менять данные и отправлять запросы. Читать ответы:
В ответе в 15й строке видим информацию о некорректном email или пароле. По контексту понятно, что интернет-магазин сопоставил переданные в json-объекте запроса данные (строка 20 запроса), и не нашёл соответствия.
Наша задача через запросы проверить, можем ли мы получить подсказку от сервера интернет-магазина, какая у него там логика происходит. Нас будут интересовать в первую очередь ответы со статусом 5xx, например 500 - т.е., запрос корректный, доставлен до сервера, но он не смог обработать. Т.к. ответы 4xx вряд ли принесут полезную информацию.
4.4. Цель - получить HTTP-ответ со статусом 5xx
Чтобы продвинуться в атаке, пентестеру полезно каким-либо образом получить информацию об ошибках.
Чтобы постараться получить HTTP-ответ со статусом 500, воспользуемся SQL-инъекциями. Т.е. если на стороне сервера не позаботились о безопасности при обращении к БД с возможностью SQL-инъекций, то это уязвимость.
Переходим в Intruder - это намного более сложный модуль, чем Repeater. Здесь находим тело запроса, выделяем то, что в кавычках и нажимаем кнопку Add в верху - так мы указываем какие именно параметры будут подвергнуты атаке. Так поступаем и с содержимым поля email и с содержимым поля password.
Далее в правой области выбираем раздел Payloads, в типе указываем Simple list.
Загружаем подготовленный список sql-инъекций по стандартному пути:
После всех манипуляций окно должно выглядеть примерно так:
Тип Simple list означает, что подставляться инъекции буду в выбранные два параметра в теле запроса последовательно только в поле email, затем только в поле password. Не комбинируя их.
И начинаем атаку кнопкой "Start atack".
BurpSuite делает множество запросов. Можно посмотреть ответы:
В ответе виден SQL-запрос к БД. Это полезная информация для пентестера, т.к. у него уже складывается понимание, как устроен веб-сервер, а кроме того в ошибке мы видим тип СУБД - SQLite:
"code": "SQLITE_ERROR",
"sql": "SELECT * FROM Users WHERE email = ''%20or%20'x'%3d'x' AND password = 'd8578edf8458ce06fbc5bb76a58c5ca4' AND deletedAt IS NULL"
Зная тип СУБД, можно уже целенаправленно искать характерные для неё уязвимости. Об SQLite и отличии БД от СУБД можно почитать в этой публикации: *клик*
Далее мы можем скопировать полученный запрос и начать работать персонально с ним.
4.5. Взлом по SQL-запросу
У нас есть структура запроса к БД, используемая при входе в учётную запись:
SELECT * FROM Users WHERE email = 'какой-то эмейл' AND password = 'какой-то пароль'
Запрос возвращает все строки в которых есть заданный эмейл и заданный пароль.
Что произойдёт, если в проверяемом поле появится, скажем, одинарная кавычка?
В СУБД прописано, что значение прописано между двумя одинарными кавычками.
СУБД посмотрела, что поле email пустое, а дальше вновь одинарная кавычка:
SELECT * FROM Users WHERE email = ''' ...
Всё, запрос не соответствует синтаксису СУБД, запрос завершился с ошибкой. Нужно каким-то образом отбросить оставшуюся часть запроса.
Для этого можно воспользоваться лайфхаком, чтобы первая часть запроса оказалась истиной, а всё что правее нам не важно.
Таким лайфхаком может быть комбинация из трёх элементов:
- Ключевое слово OR;
- Простое математическое истинное сравнение, например 10=10;
- комментирование части SQL-запроса через двойной минус --.
Другими словами, SQL-запрос должен выглядеть так:
SELECT * FROM Users WHERE email = '' OR 10=10 --любой текст, для СУБД это не важно.
Соответственно, при входе в учётную запись мы можем указать любой пароль, а вот email должны указать таким: ' OR 10=10 --
Проверяем: переходим в Repeater и изменяем тело запроса:
Отправляем запрос, смотрим ответ:
Ого, да ведь это успешный вход в систему! Да ещё судя по всему, под админом. СУБД просто вернула первую запись из таблицы и отдала её нам тёпленькой.
Перейдём в браузер и введём запрос там, чтобы в браузере войти в аккаунт.
А перейдя на сайт я увидел окна, что я успешно нашёл две уязвимости на сайте - так разработчики этого сайта помогают в тренировках: первая была о найденном sql-запросе в теле ответа со статусом 500, ну а вторая - успешный вход в систему:
Пока на этом остановимся в поиске уязвимостей. Посмотрим, какие они бывают в принципе.
5. Топ 10 уязвимостей
Организация, разработавшая учебный интернет-магазинов соков для тестирования на проникновения, составляет список самых опасных типов уязвимостей веб-среды. Называется он OWASP Top 10.
Предыдущий такой список был разработан в 2021 г., следующий планируют в начале 2025. Вот этот список:
- Broken Access Control (Ошибка контроля доступа) - когда система неверно ограничивает доступ пользователей к ресурсам.
- Cryptographic Failures (Ошибки криптографии) - неверная реализация алгоритмов криптографии или их использование - может привести к раскрытию конфиденциальной информации или её изменениям.
- Injection (Инъекции) - инъекции sql (разобрали выше), no-sql, xss и др.
- Insecure Design (Небезопасный дизайн) - небезопасная структура приложения облегчает злоумышленникам проникновение.
- Security Misconfiguration (Неправильная конфигурация безопасности) - избыточные открытые порты, отсутствие защиты и т.д.
- Vulnerable and Outdated Components (Уязвимые и устаревшие компоненты) - использование библиотек или программ с известными уязвимостями.
- Identification and Authentication Failures (Ошибки идентификации и аутентификации) - недостаточная защита механизмов аутентификации.
- Software and Data Integrity Failures (Ошибки целостности программного обеспечения и данных) - недостаточная защита данных и ПО, позволяющая их подделывать.
- Security Logging and Monitoring Failures (Ошибки журналирования и мониторинга безопасности) - когда злоумышленники атакуют, это создаёт определённые сигналы. Недостаточность анализа и адекватного реагирования на такие сигналы даёт больше времени злоумышленникам на их действия.
- Server-Side Request Forgery (SSRF) (Подделка запросов на стороне сервера) - когда злоумышленник заставляет сервер выполнять несвойственный запрос и раскрывает какие-то данные, в т.ч. о конфигурации и принципе работы сервера.
В предыдущем параграфе мы воспользовались двумя уязвимостями:
- Сервер в ответе с кодом статуса 500 давал информацию об sql-запросе;
- Использовали SQL-инъекцию для входа в учётную запись.
Первую ошибку можно отнести к уязвимость №5 OWASP Top 10 - неправильная конфигурация безопасности.
Вторую - уязвимость №3 по OWASP Top 10 - инъекции.
В целом более-менее понятны все виды уязвимостей, по крайней мере в общих чертах. Хочу коснуться основ криптографии, т.к. слышал про неё, но представляю не очень хорошо.
6. Криптография
6.1. Введение
Начнём с интернет-мема:
В Российской Федерации действует предварительный стандарт на термины и определения криптографии: ПНСТ 799-2022 "Информационные технологии. Криптографическая защита информации". Приведу три первых термина:
Криптография (cryptography) - область теоретических и прикладных исследований и практической деятельности, которая связана с разработкой и применением методов криптографической защиты информации.
Определение через определение. Не очень хорошо, но что поделать.
Криптографическая система; криптосистема (cryptograthic system; cryptosystem) - структурированная совокупность конкретных способов решения поставленной задачи защиты информации на основе применения методов криптографической защиты информации.
Криптографическая защита информации - защита информации с помощью её криптографического преобразования.
С определениями закончили.
Криптография в целом предназначена для сохранения данных: конфиденциальность, их целостность, подтверждения подлинности данных.
Конфиденциальность - механизмы, позволяющие получить доступ к данным только для тех лиц, кому они предназначены.
Целостность - механизм невозможности изменить данные. В публикации о сетях, ссылку на которую давал выше, я говорил о механизме контрольных сумм в передаваемой единице данных по сети. Даже без вмешательства хакера, а из-за физических процессов, происходящих в сети, может возникнуть ошибка, маскирующаяся под корректную контрольную сумму. Что уж говорить о целенаправленных действиях. В таком случае целостность должна уже зависеть от чего-то более существенного, чем самих данных - а именно, от секретного ключа.
Подлинность делится на механизм подтверждения подлинности сторон от кого и к кому идёт информация, а также невозможность сменить или присвоить авторство создания информации; и второй механизм подлинности - подлинность самой информации.
Как в объектно-ориентированном программировании есть три столпа ООП (почитать об этом: *клик*), так в криптографии есть свои столпы или принципы, и их четыре. Такой, столик о четырёх ножках получается:
- Шифрование;
- Хеширование;
- Электронная подпись;
- Имитовставка - дополнительная информация фиксированного размера, создаваемая на основе передаваемых данных и секретного ключа, добавляемая в сами данные. Используется для контроля целостности данных.
Разберём только шифрование далее. Если кратко об остальных принципах, то можно сказать следующее:
Хеширование - преобразование данных произвольного размера без ключа в данные фиксированного размера - хеш. Хеш обычно целое число. Из хеша невозможно получить исходные данные.
Электронная подпись - механизм, позволяющий однозначно определить автора данных и целостность данных.
6.2. Шифрование
Шифрование обеспечивает конфиденциальность данных.
Шифр - это криптографические алгоритмы для зашифровывания данных, их расшифровывания и генерации ключей.
Шифротекст - зашифрованные шифром данные.
Зашифровывание - преобразование открытых данных в шифротекст.
Расшифровывание - преобразование шифротекста в исходные данные с помощью секретного ключа.
Ключ - это элемент данных криптосистемы.
Дешифровывание - преобразование шифротекста в исходные данные без секретного ключа.
Ещё есть термины кодирование и декодирование - это не относится к криптографии. Кодирование - преобразование одного типа данных в другой, удобный для передачи или отображения. Например, эта веб-страница написана с использованием языка разметки html, но закодирована в удобную для чтения информацию. Или когда биты информации для передачи по сети кодируются в оптические сигналы для оптоволокна или электрические импульсы с высоким или низким напряжением (да/нет).
6.2.1. Симметричное шифрование
При симметричной криптосистеме секретный ключ один для зашифровывания и расшифровывания. Типичный пример - архивирование в WinRAR с помощью пароля. Этот пароль должен быть известен только автору шифротекста и тем людям, для которых данные предназначены.
Для создания шифротекстов симметричной криптосистемой характерна высокая производительность и высокая стойкость к взлому, если конечно, ключ не скомпрометирован.
Современная криптография выделяет два вида шифров в симметричной криптосистеме:
- Блочное;
- Потоковое.
Блочные шифры работают с блоками данных минимальной длины двух типов - 64 бит (пример - алгоритм DES) или 128 бит (пример - алгоритм AES), в зависимости от алгоритма.
Потоковые шифры работают с каждым битом или байтом.
Если данные поступают непрерывно - используется поточное шифрование. Если данные поступают порциями с задержками или целиком (зашифровываем отдельный файл или каталог) - то полезнее использовать блочное шифрование.
Более стойкое к криптоанализу (в т.ч. дешифровке) - блочное шифрование.
Пример использования AES-шифра в Golang:
В строке 53 происходит проверка минимального размера блока, т.е. меньше 16 байт (128 бит) или нет.
Здесь в коде мы для зашифровывания и расшифровывания используем один ключ.
Пример вывода в терминал:
6.1.2. Ассиметричное шифрование
Для ассиметричного шифрования нужна ключевая пара: открытый и закрытый ключ.
Открытый ключ безопасно предоставлять всем желающим. Закрытый ключ хранится в тайне и известен только одной стороне.
Тема управления ключами сложна и обширна: как их хранить, передавать, согласовывать и т.д. На базовом уровне достаточно понимать, что ассиметричное шифрование позволяет передавать данные без секретного ключа, а с ключом открытым.
Ассиметричная криптография - трудозатратная для ЭВМ процедура.
Пример кода на Go, где используем ассиметричный алгоритм шифрования RSA:
В коде мы зашифровали данные открытым ключом, а расшифровываем закрытым ключом.
Пример вывода терминала:
На этом с шифрованием пока всё.
7. Выводы
Итак, в этой публикации мы познакомились с основами веб-безопасности, взглянули на веб-среду глазами хакеров, и это позволит нам стать более опытными программистами.
Для развития навыков могу порекомендовать запись вебинара Практикума на тему "Как веб-пентестеру правильно провести разведку": *клик*
Это всё основы основ тестирования на проникновения и информационной защиты. Но если мы будем хотя бы в общих чертах представлять себе эту сферу, то можем при желании развиваться в этом направлении или развиваться, оставаясь разработчиком, проектируя надёжные приложения.
Спасибо, что дочитали эту публикацию до конца. Успехов вам, верных друзей и крепкого здоровья. Будем на связи.
Бро, ты уже здесь? 👉 Подпишись на канал для начинающих IT-специалистов «Войти в IT» в Telegram, будем изучать IT вместе 👨💻👩💻👨💻