В этой статье мы перечислим различные уязвимости безопасности, которые можно использовать в инфраструктуре. Для этого мы будем играть в консультантов по ИТ-безопасности, которые должны провести аудит безопасности для полностью поддельной компании. Поэтому мы создали вымышленную инфраструктурную среду, состоящую из виртуальных машин, чтобы протестировать и предотвратить различные риски.

Предупреждение: в статье, которую вы собираетесь прочитать, говорится об использовании компьютерных недостатков в данной вымышленной инфраструктуре, если вы воспроизведете их без предварительного согласия целевого объекта и в рамках аудита безопасности, вам грозит суровое уголовное наказание. .

инструкции

Контекст

Компания FAKESHOP только что запустила свой новый сайт электронной коммерции. Эта компания состоит из 2000 сотрудников. Он предлагает продукты питания, доступные в супермаркетах, а также на своем новом сайте продавца. FAKESHOP связался с нами, чтобы провести аудит безопасности их внутренней инфраструктуры. Цель этого документа — представить проведенные нами тесты и оценить последствия, которые могут иметь различные уязвимости безопасности, которые мы перечислили, а также решения, которые могут быть предоставлены. Для этого компания предоставила нам 3 сервера.

Цель теста на проникновение

Тест на проникновение — это операция, заключающаяся в тестировании компьютерной системы, сети или веб-приложения с целью обнаружения уязвимостей. Для этого аудиторы, отвечающие за тесты, примут подход и позу злонамеренного злоумышленника, во всех отношениях аналогичные таковым у настоящего злоумышленника. Тест на проникновение с двумя целями:

  • Оценить риск взлома
  • Определите способы снижения этих рисков

Наша цель — определить службы, которые доступны на внутренних серверах компании. Это позволит нам получить обзор инфраструктуры FAKESHOP. А также составить список всех технических уязвимостей, которые нам удалось выявить на различных предоставленных нам серверах.
Мы также предоставим рекомендации и лучшие практики, чтобы FAKESHOP мог устранить различные уязвимости безопасности, обнаруженные по мере максимально быстро и эффективно.

Напоминание о периметре

Для проведения аудита безопасности компания FAKESHOP предоставила нам 3 сервера по следующим адресам:

  • 172.16.231.28 -> VM1: содержит сервер Apache.
  • 172.16.231.60: -> VM2: содержит сервер tomcat
  • 172.16.231.92: -> VM3: содержит сервер webmin.

Выявленные уязвимости

  • SSH-сервер 7.4p1 — «Человек посередине» (VM1)
  • FTP-сервер — корневой доступ (VM1)
  • HTTP-сервер — доступ пользователей и администраторов к учетным записям (VM1)
  • PHP-оболочка — фильтр (VM1)
  • Внедрение SQL — информация о пользователе (VM1)
  • Внедрение XML — XXE (VM1)
  • Сеанс NetBIOS — проникновение через SMB (VM1)
  • Общий доступ — Tomcat (VM2)
  • Внедрение JSP — Tomcat (VM2)
  • Webmin — корневой доступ (VM3)

SSH-сервер 7.4p1 — «Человек посередине» (VM1)

Описание уязвимости

Атака «человек посередине» приводит к перехвату третьей стороной данных, передаваемых между разными пользователями или особенно между сервером и пользователем.

Критическая оценка

Середина

Оценка патча

Слабый

Сценарий эксплуатации

Мы начали со сканирования открытых портов с помощью инструмента NMAP, мы обнаружили, что несколько портов были открыты, включая порт 22/tcp. Благодаря этому сканированию мы также заметили, что служба, работающая на этом порту, является сервером SSH и имеет версию 7.4p1. После некоторых исследований мы смогли увидеть, что эта версия уязвима для атак Man-In-Middle. Эта уязвимость была исправлена ​​в последующих выпусках.

Связанные рекомендации

Патч для этой версии недоступен, поэтому мы рекомендуем обновить версию OpenSSH 7.4p1. При использовании fail2ban это также обнаружит, пытается ли кто-то взломать SSH.

FTP-сервер — корневой доступ (VM1)

Описание уязвимости

При сканировании открытых портов на предоставленном сервере мы обнаружили, что порт 2121/tcp открыт и использует версию FTP ProFTPD 1.3.5b. Этот порт не является безопасным и поэтому открыт в анонимном режиме. Сервер предоставляет доступ к открытому и закрытому ключу корневого сервера и, следовательно, предоставляет доступ к незащищенным закрытым файлам.

Критическая оценка

Критический

Оценка патча

Середина

Сценарий эксплуатации

  • Мы просканировали ВМ1 с помощью NMAP
  • Мы обнаружили, что служба FTP открыта. Итак, мы решили подключиться по следующей ссылке к FTP-серверу с Firefox или Edge.
ftp://172.16.231.28:2121

  • Оказавшись на веб-странице, мы видим, что у нас есть доступ к открытым и закрытым ключам сервера как root. В настоящее время эта информация не защищена.
  • Затем мы загрузили найденные ключи id_rsa с помощью следующих команд:
wget ftp://172.16.231:2121/id_rsa 
wget ftp://172.16.231:2121/id_rsa.pub
  • С помощью программы JohnTheRipper мы попытались взломать приватный ключ, который мы восстановили. Мы начали с выполнения следующей команды.
python ssh2john.py id_rsa > id_rsa.hash
  • Мы создали файл id_rsa.hash, затем скопировали его в папку JohnTheRipper командой:
cp id_rsa.hash /opt/JohnTheRipper/run
  • Затем мы поискали в Интернете список наиболее часто используемых паролей за последние годы и создали файл test.txt, а затем поместили этот файл в папку /opt/JohnTheRipper/run с файлом id_rsa.
  • Затем мы выполнили следующие команды:
./john --wordlist=test.text id_rsa.hash 
./john --show id_rsa.hash
  • Нам удалось расшифровать пароль: футбол

  • Вернувшись в папку, в которую мы скачали файл id_rsa, выполняем следующую команду:
ssh -i id_rsa [email protected]

Теперь мы вошли в виртуальную машину как root.

Связанные рекомендации

Мы рекомендуем использовать SFTP-сервер для передачи SSH или сертификат SSL, такой как FTPS. Обновите свою версию Linux, в нашем случае Debian, чтобы обновить Proftpd новыми пакетами. Мы также рекомендуем вам использовать выделенную машину исключительно для FTP, потому что только она будет затронута во время атаки (сначала). Также было бы уместно создать журналы FTP на машине и продублировать их на другой машине, потому что в случае успешной атаки это позволит вам понять, что произошло.

HTTP-сервер — доступ пользователей и администраторов к учетным записям (VM1)

Описание уязвимости

При сканировании открытых портов предоставленных серверов мы обнаружили, что порт 80/tcp открыт и использует nginx версии 1.10.3. Эта версия имеет несколько недостатков, которые были исправлены.

Критическая оценка

Критический

Оценка патча

Середина

Сценарий эксплуатации

  • Проанализировав веб-проект, в каталоге /var/www/html виртуальной машины мы обнаружили файл info.php, поэтому решили искать его напрямую на веб-сайте, доступном по адресу «http://172.16.231.28/info.php», и у нас был доступ к конфигурации сервера и различным версиям php и phpmyadmin.

  • В веб-проекте мы также видели файл robot.txt. Поэтому мы решили проанализировать следующий путь в веб-браузере:
http://172.16.231.28/robot.txt

  • Мы нашли на этой странице следующие две ссылки на страницы:
/2375cf0c9b26748dff4abab5b154bf52 
/test.php
  • Мы решили сразу перейти по URL-адресу http://172.16.231.28/test.php, который возвращает ошибку 404. Поэтому мы пробуем второй URL-адрес "http://172.16.231.28/2375cf0c9b26748dff4abab5b154bf52" и попадаем на страницу, которая выглядит как панель администратора.
  • Мы решили оставить администратора панели в стороне, чтобы еще немного проанализировать каталог, к которому у нас есть доступ благодаря уязвимости FTP. Еще немного поискав, мы зашли в папку /var/www/html/include, нашли в этой папке файл config.php.
  • Проанализировав исходный код файла config.php, мы можем увидеть критическую уязвимость. Этот файл содержит информацию для подключения к базе данных в виде простого текста.

  • Продолжая анализировать исходный код, мы обнаруживаем и другие существенные недостатки.

  • Имея информацию для входа в базу данных, мы теперь можем войти в систему и получить всю информацию о пользователе. Итак, мы подключаемся к базе данных интернет-магазина, и очень скоро мы находим базу данных пользователей, называемых клиентами. Отображая эту таблицу, мы можем получить всю информацию о пользователе. Также отметим, что пароли не шифруются, что позволяет нам иметь в таблице необработанные пароли пользователей.

  • Поэтому мы вернулись на страницу входа на сайт, доступный нам, и с новой информацией, которую мы получили, мы пытаемся подключиться, узурпируя личность пользователя.

  • В базе данных интернет-магазина у нас также был доступ к таблице соавторов, которая представляет собой таблицу со всей информацией о людях, которые могут войти в панель администратора, которую мы нашли позже.
  • Итак, мы вернулись на страницу администратора панели и попытались войти в систему, выдав себя за администратора. Наша первая попытка не удалась, потому что в таблице соавторов пароли зашифрованы.
  • Поэтому мы попытались расшифровать пароль пользователя с помощью этого сайта.
  • Манипуляции были выполнены успешно, и с расшифрованным паролем мы смогли подключиться к панели администратора.

Связанные рекомендации

Доступны исправления для устранения этой уязвимости в системе безопасности. Функция db_protect не разрешает все атаки типа SQLI.

PHP-оболочка — фильтр

Описание уязвимости

Проанализировав страницу info.php, мы обнаружили, что опция allow_url_fopen была открыта. Таким образом, предоставленный нам веб-сайт уязвим для атак-оболочек, таких как фильтры PHP. Благодаря фильтру PHP мы сможем восстановить исходный код файла PHP напрямую, изменив URL-адрес веб-сайта.

Критическая оценка

Середина

Оценка патча

Середина

Сценарий эксплуатации

  • Проанализировав веб-сайт, мы обнаружили в структуре URL-адреса, что он использует PHP Wrapper.

  • Изменив URL с помощью BURP, мы добавили php://. Поэтому мы изменяем URL следующим образом:
http://172.16.231.28/?page=php://filter/read=convert.base64-encode/resource=include/pages/login
  • Код отображается на сайте и закодирован в base64, мы восстанавливаем этот текст и попробуем его расшифровать.

  • Заходим на этот сайт и кладем восстановленный текст на сайт, позаботившись об удалении NOT_OK в начале текста.
  • После завершения расшифровки мы обнаруживаем, что у нас есть доступ к исходному коду веб-сайта. У нас также есть доступ к информации формы входа, а также к информации базы данных. Здесь мы находим таблицу клиентов.

Связанные рекомендации

В конфигурации PHP следует изменить открытые allow_url_fopen, allow_url_include, open_basedir, а также быть осторожным при вызове таких функций, как include (), require(), include_once() и require_once(). Передав для параметра allow_url_include значение Off, вы заблокируете выполнение функций file_exists, is_file и filesize. Это заблокирует сбой типа LFI.

SQL-инъекция — информация о пользователе

Описание уязвимости

На вашей веб-платформе мы поняли, что можно внедрить SQL в ваш URL-адрес на странице вашего сайта электронной коммерции. Таким образом, мы смогли восстановить информацию о пользователе.

Критическая оценка

Критический

Оценка патча

Середина

Сценарий эксплуатации

  • Посещая различные товары, продаваемые в веб-интерфейсе, мы заметили следующий URL.
“http://172.16.231.28/single.php?item_id=1”
  • Поэтому мы заменили «item_id=1» на «item_id=0». Итак, у нас есть следующий URL:
“http://172.16.231.28/single.php?item_id=0”

  • Мы перехватили эту страницу с помощью BURP и попытались выполнить SQL-инъекцию. Мы добавили UNION к URL-адресу страницы и после нескольких попыток смогли получить учетные данные пользователя.

  • С полученной информацией мы смогли подключиться, выдав себя за пользователя.

  • Точно так же мы смогли получить информацию об администраторе. Пароль шифруется для администраторов

  • Поэтому мы попытались расшифровать пароль пользователя с помощью этого сайта.
  • Манипуляции были выполнены успешно, и с расшифрованным паролем мы смогли подключиться к панели администратора.

Связанные рекомендации

Для предотвращения SQL-инъекций можно реализовать несколько методов. Во-первых, настоятельно рекомендуется использовать операторы при построении SQL, например PDO для PHP. Если первую рекомендацию невозможно реализовать, то, возможно, предпочтительнее написать хранимую процедуру. Это поможет предотвратить атаки SQL, поскольку злоумышленнику необходимо будет знать точный синтаксис и имя хранимой процедуры, прежде чем он сможет ее выполнить. И если процедура не позволяет ОБНОВИТЬ или УДАЛИТЬ, ваша база данных в безопасности. Наконец, последний пункт, необходимо провести проверку правильности ввода пользователем каждой формы. Это защитит вас от SQL-инъекций с помощью форм.

Внедрение XML — XEE (VM1)

Описание уязвимости

Атака XXE или инъекция XXE — это тип атаки на приложение, использующее XML. Эта атака происходит, когда ввод XML, содержащий ссылку на внешний объект, обрабатывается неправильно настроенным синтаксическим анализатором XML.

Критическая оценка

Критический

Оценка патча

Слабый

Сценарий эксплуатации

  • Мы зашли в «Забыли пароль?» страница.

  • Мы заполнили адрес электронной почты и отправили запрос, нажав на кнопку «Войти».
  • С помощью программного обеспечения BURP мы перехватили сделанный запрос и увидели, что там был код XML.

  • Мы изменили код XML со следующей информацией:
“<?xml version=”1.0” encoding=”UTF-8”> <!DOCTYPE foo [<!ENTITY xxe SYSTEM “file:///etc/passwd”>]> <document> <email> &xxe; </email> </document>”

  • Нам удалось получить всю информацию, которая находится в файле passwd.

Связанные рекомендации

Чтобы предотвратить внедрение файлов XML, можно принять действительно эффективную меру. Во-первых, убедитесь, что технология, которую вы используете для синтаксического анализа файлов XML, по умолчанию не разрешает доступ к внешним объектам. Если это так, то вам придется использовать функции, предусмотренные технологией, чтобы запретить их. В большинстве случаев эта функция принимает логическое значение, которое изменяет этот запрет.

Сеанс NetBIOS и проникновение SMB (VM1)

Описание уязвимости

Проанализировав вашу сеть с помощью NMAP, мы обнаружили, что порт 139/tcp открыт. Это соответствует сеансам Windows Netbios. Таким образом, мы смогли распознать машину, которая использовала совместное использование пакетов, и протестировали на ней вторжение.

Критическая оценка

Середина

Оценка патча

Середина

Сценарий эксплуатации

  • Мы устанавливаем пакет «nmblookup», который позволит нам сканировать различные открытые сеансы, доступные на данном IP-адресе. мы используем команду
nmblookup -A 172.16.231.28

  • После нескольких поисков в сети замечаем, что данные ‹20›. соответствует сеансу совместно используемых данных. Решаем воспользоваться этим. Для этого мы устанавливаем клиентский пакет nbm. Этот пакет позволяет нам подключиться к рабочему сеансу с компьютера Debian. Затем мы решили изменить файлы конфигурации Samba, чтобы иметь возможность преуспеть во вторжении.

  • Наконец, мы подключаемся к машине с помощью команды numclient:
sudo smbclient -L 172.16.231.28
  • Сервис сообщает нам пароль для вставки для идентификатора VM028\root, пароль не был установлен. Наконец, соединение успешно.

Связанные рекомендации

Мы советуем вам сначала защитить свои порты с помощью брандмауэра и, возможно, создать черный список уже известных злоумышленников. Вы также можете использовать VPN, которая позволит вам шифровать ваши данные или использовать пароли для обмена файлами. И, наконец, у вас также есть возможность использовать фильтрацию MAC-адресов, чтобы ваша система была безопасной и недоступной через сеть.

Общий доступ — Tomcat (VM2)

Описание уязвимости

Нам удалось получить публичный доступ к вашему серверу Tomcat, что позволило нам получить идентификатор, список текущих служб и информацию о сервере. Для этого мы использовали NMAP, который позволил нам обнаружить, что ваш http-порт 8080/tcp был открыт. Затем мы отправились туда и проанализировали архитектуру вашего сервера.

Критическая оценка

Середина

Оценка патча

Слабый

Сценарий эксплуатации

  • После NMAP и обнаружения открытого http-порта 8080/tcp мы решили перейти по соответствующему URL-адресу. Приходим на страницу завершения установки сервера Tomcat.

  • Затем пытаемся подключиться к менеджеру и/или хост-менеджеру по ссылкам в конце страницы установки. Откроется окно входа. После нескольких попыток и поиска в Интернете мы обнаруживаем идентификатор tomcat:tomcat. К сожалению, эти идентификаторы не дают доступа к менеджеру и/или хост-менеджеру.

  • Мы продолжаем анализировать архитектуру сервера, а также его сервис: менеджер и, наконец, находим два интересующих нас URL. URL-адрес 172.16.231.60:8080/manager/text/Serverinfo позволяет нам получить информацию о сервере.

  • URL-адрес 172.16.231.60:8080/manager/text/list позволяет нам получить идентификатор ROOT, а также службы, работающие на сервере.

Связанные рекомендации

Для устранения этой уязвимости мы рекомендуем вам определить новые пароли для доступа к вашему интерфейсу Tomcat, после чего мы рекомендуем вам правильно управлять правами доступа к различным запущенным службам Tomcat.

Внедрение JSP — Tomcat (VM2)

Описание уязвимости

После того, как ваша архитектура была проанализирована, мы решили попытаться проникнуть через JSP-страницу, написанную на JAVA. Эта страница JSP предназначена для развертывания веб-консоли на сервере Tomcat для выполнения команд UNIX. Чтобы развернуть его на сервере Tomcat, мы будем использовать найденные ранее идентификаторы, а также команду Curl.

Критическая оценка

Критический

Оценка патча

Середина

Сценарий эксплуатации

  • Сначала мы начинаем создавать веб-консоль, которая затем будет развернута на сервере. Для этого мы выполняем поиск в Интернете, а затем находим веб-оболочку, которую модифицируем по своему усмотрению.

  • После создания веб-консоли мы устанавливаем пакет JAVA sdk, чтобы мы могли создать манифест нашей страницы JSP. После установки пакета мы также устанавливаем Curl, чтобы иметь возможность развернуть наш JSP на сервере Tomcat. Затем приступаем к созданию манифеста.
mkdir webshell 
cp index.jsp webshell 
cd webshell 
jar -cvf ../webshell.war *

  • Как только манифест будет создан, мы загрузим его на сервер. Для этого мы используем Curl, а также идентификаторы, восстановленные во второй неисправности этой машины.
sudo curl --upload-file ../webshell.war “http://tomcat:[email protected]:8080/manager/text/deploy?path=/foo”
  • С помощью этой команды веб-консоль будет внедрена на сервер tomcat по этому URL-адресу: "172.16.231.60:8080/foo".

  • После исправления ошибок нашей веб-консоли мы переходим по URL-адресу, соответствующему загрузке файла JSP. Для нас это будет /foo. Таким образом, мы можем запускать команды UNIX. Начнем с поиска на сервере информации, которая может быть компрометирующей. Мы попадаем в папку /lib/discover/. Он содержит только XML-файлы потенциальных клиентов со списками. Папки /conf, /logs, /policy, /webapps и /work пусты.

Связанные рекомендации

Мы советуем вам взять на себя безопасность вашего сервера Tomcat, чтобы предотвратить вторжение JSP. Поэтому мы советуем вам защитить его с помощью SecurityManager, присутствующего в Tomcat 8.

Webmin — корневой доступ (VM3)

Описание уязвимости

После сканирования сервисов с помощью NMAP мы обнаружили, что порт 10000/tcp открыт сервисом webmin miniserv 1.953.

Критическая оценка

Середина

Оценка патча

Середина

Сценарий эксплуатации

  • Мы просканировали порты и службы, доступные на 3-й доступной нам машине, которая работает на IP 173.16.231.92. Мы находим службу HTTP, которую мы использовали.
  • Мы вошли по URL-адресу «https://172.16.231.91:10000/» и попали на страницу входа администратора Webmin.

  • После нескольких простых попыток подключения мы смогли подключиться к сайту, используя Логин: webmin и Пароль: webmin, которые являются идентификаторами Webmin по умолчанию.

  • Теперь у нас есть вся подробная информация о VM3, предоставленная Webmin.
  • Мы использовали панель администратора для создания нового пользователя с ролью Root. Мы также можем изменить пароль учетной записи root.

  • Теперь мы можем войти в систему как root в VM3.

Связанные рекомендации

Используйте надежный пароль со строчными и прописными буквами, специальными цифрами и символами, чтобы обезопасить сервер. Защитите свой порт, изменив, например, порт по умолчанию.

Заключение

Теперь мы закончили 👏

Если у вас, ребята, есть вопросы. Пожалуйста, оставьте отзыв, чтобы мы могли обсудить и улучшить друг друга.

Вы можете найти меня на Github