Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В экосистеме AWS имеется интереснейший механизм Lambda — это служба бессерверных вычислений, которая запускает код в ответ на определенное событие. Причем она умеет автоматически выделять для этого необходимые ресурсы. Сегодня мы поговорим о том, как использовать ее, чтобы проникнуть в облако AWS и повысить привилегии.
info
О том, как можно эксплуатировать другие уязвимости AWS, читай в статье «Проверка ведер. Как искать уязвимости в бакетах AWS S3».
Как работает AWS Lambda? Если простыми словами: ты добавляешь свой скрипт и задаешь триггер или событие, при наступлении которого будет запускаться этот код. Больше делать ничего не нужно, потому что обо всем другом — администрировании, мониторинге работы, безопасности, журналах, логах — позаботится сервис AWS Lambda. Когда событий нет, лямбда не выполняется, соответственно, ресурсы не потребляются.
Устройство лямбды
Лямбда‑функция — это часть кода, которая выполняется каждый раз, когда срабатывает триггер.
Устройство лямбда‑функции
Существует три типа триггеров, отличаются они способом вызова:
При этом вызов возможно выполнить и с помощью API Gateway.
Служба API Gateway упрощает разработчикам работу с API. Поддерживается REST, HTTP и WebSocket API.
Состав API Gateway
Мы можем привязать API Gateway к какому‑то сервису, мобильному приложению, даже к IOT, — главное, чтобы у них был доступ в интернет. После этого оно будет стучать на API-шлюз, с которого и станут вызываться требуемые действия.
Стандартное использование API Gateway
Чаще всего через лямбду в облако не попадают. Но в случае обнаружения функции, гейтвея, создания полной ссылки и требуемого набора параметров можно все‑таки попробовать. Например, если лямбда‑функция принимает какую‑либо команду для запуска в cmd:
https://i8jee1mn2f.execute-api.us-east-2.amazonaws.com/prod/system?cmd=env
Пример эксплуатации уязвимости
На первом этапе нужно хорошенько разведать обстановку и поискать уязвимые места. На помощь нам придет AWS CLI. Чтобы увидеть все лямбда‑функции, воспользуемся следующей командой:
aws lambda list-functions
Получить лямбда‑функции в отдельном регионе:
aws lambda list-functions --region us-east-1
Поиск лямбда‑функций
Изучение зависимостей
FunctionArn
— уникальный идентификатор функции;
Runtime
— язык, на котором написана функция;
Role
— роль, которую имеет лямбда‑функция. Возможно, определенная лямбда‑функция имеет доступ к другим службам. Соответственно, мы также можем определить политики, привязанные к лямбда‑функции;
Layers
— зависимости лямбда‑функции.
Получить информацию о конкретной лямбда‑функции (в том числе исходный код) можно следующим образом:
aws lambda get-function --function-name <function-name> [--region eu-west-1 --profile demo]
Пример:
aws lambda get-function --function-name PentestingForFun
Смотрим определенную функцию
В приведенном выше примере мы видим раздел Code
, а в нем — Location
. То есть код извлекается по этому пути, в данном случае это S3-бакет awslambda-us-west2-tasks
. Перейдя по указанной ссылке (либо порывшись в указанном бакете), мы сможем скачать код лямбда‑функции.
При этом в выводе данной команды есть огромная структура Configuration
, которую тоже стоит обязательно посмотреть. Во время пентестов мы часто обнаруживали здесь учетные данные.
Учетные данные в переменных среды
Исходный код зависимости можно получить вот так:
aws lambda get-layer-version --layer-name <LayerName> --version-number <VersionNumber>
Пример:
aws lambda get-layer-version --layer-name request-library --version-number 1
Теперь обрати внимание на способы вызова функции.
aws lambda get-policy --function-name <function-name>
Пример:
aws lambda get-policy --function-name PentestingForFun
Объекты, способные вызывать синхронный триггер
Service
— то, кому разрешено дергать функцию;
Action
— что может сделать Service
;
Resource
— какие объекты могут быть вызваны.
В лямбда‑функциях иногда встречается раздел Condition
. Он отвечает за «фильтрацию» — каким методом и каким образом вызывается лямбда. Именно в нем всегда будет прятаться айдишник, по которому ты сможешь определить, к какому гейтвею привязана лямбда‑функция.
Пример Condition
В данном случае uj3lq1cu8e
— REST API ID. При этом триггер может сработать и от изменений в чем‑либо. Для получения информации о подобных событиях существует вот такой командлет:
aws lambda list-event-source-mappings --function-name <function-name>
Пример:
aws lambda list-event-source-mappings --function-name PentestingForFun
Что приведет к асинхронному/потоковому триггеру
В этом случае используется Amazon Simple Queue Service (SQS) — служба очереди сообщений.
После изучения доступных лямбда‑функций пора восстанавливать URL, который приведет к ее вызову. Чтобы увидеть все REST APIs (получить айдишник, так как Region зачастую схож с большинством регионов, в котором стоят ЕС2-инстансы), воспользуемся следующей командой:
aws apigateway get-rest-apis
Обнаружение всех REST API
Источник: xakep.ru