Содержание статьи
info
О том, как можно эксплуатировать другие уязвимости AWS, читай в статье «Проверка ведер. Как искать уязвимости в бакетах AWS S3».
Теория
AWS Lambda
Как работает AWS Lambda? Если простыми словами: ты добавляешь свой скрипт и задаешь триггер или событие, при наступлении которого будет запускаться этот код. Больше делать ничего не нужно, потому что обо всем другом — администрировании, мониторинге работы, безопасности, журналах, логах — позаботится сервис AWS Lambda. Когда событий нет, лямбда не выполняется, соответственно, ресурсы не потребляются.
![Устройство лямбды Устройство лямбды](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28910/lambdabase.png)
Лямбда-функция
Лямбда‑функция — это часть кода, которая выполняется каждый раз, когда срабатывает триггер.
![Устройство лямбда-функции Устройство лямбда-функции](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28913/lambdastruct.png)
Существует три типа триггеров, отличаются они способом вызова:
- потоковый — срабатывает при изменениях в чем‑либо, например при добавлении данных в БД;
- синхронный — срабатывает при получении запроса на какой‑то конечной точке, которая вызывает лямбда‑функцию;
- асинхронный — происходит в случае какого‑либо события, например при загрузке файла на S3.
При этом вызов возможно выполнить и с помощью API Gateway.
API Gateway
Служба API Gateway упрощает разработчикам работу с API. Поддерживается REST, HTTP и WebSocket API.
![Состав API Gateway Состав API Gateway](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28889/apigtw.png)
Мы можем привязать API Gateway к какому‑то сервису, мобильному приложению, даже к IOT, — главное, чтобы у них был доступ в интернет. После этого оно будет стучать на API-шлюз, с которого и станут вызываться требуемые действия.
![Стандартное использование API Gateway Стандартное использование API Gateway](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28891/apigtw2.png)
Первоначальный доступ
Чаще всего через лямбду в облако не попадают. Но в случае обнаружения функции, гейтвея, создания полной ссылки и требуемого набора параметров можно все‑таки попробовать. Например, если лямбда‑функция принимает какую‑либо команду для запуска в cmd:
https://i8jee1mn2f.execute-api.us-east-2.amazonaws.com/prod/system?cmd=env
![Пример эксплуатации уязвимости Пример эксплуатации уязвимости](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28893/img00.png)
Разведка
Lambda Function
На первом этапе нужно хорошенько разведать обстановку и поискать уязвимые места. На помощь нам придет AWS CLI. Чтобы увидеть все лямбда‑функции, воспользуемся следующей командой:
aws lambda list-functions
Получить лямбда‑функции в отдельном регионе:
aws lambda list-functions --region us-east-1
![Поиск лямбда-функций Поиск лямбда-функций](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28894/img01.png)
![Изучение зависимостей Изучение зависимостей](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28895/img02.png)
-
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
![Смотрим определенную функцию Смотрим определенную функцию](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28896/img03.png)
В приведенном выше примере мы видим раздел Code
, а в нем — Location
. То есть код извлекается по этому пути, в данном случае это S3-бакет awslambda-us-west2-tasks
. Перейдя по указанной ссылке (либо порывшись в указанном бакете), мы сможем скачать код лямбда‑функции.
При этом в выводе данной команды есть огромная структура Configuration
, которую тоже стоит обязательно посмотреть. Во время пентестов мы часто обнаруживали здесь учетные данные.
![Учетные данные в переменных среды Учетные данные в переменных среды](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28897/img004.png)
Исходный код зависимости можно получить вот так:
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
![Объекты, способные вызывать синхронный триггер Объекты, способные вызывать синхронный триггер](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28898/img05.png)
-
Service
— кому разрешено дергать функцию; -
Action
— что может сделатьService
; -
Resource
— какие объекты могут быть вызваны.
В лямбда‑функциях иногда встречается раздел Condition
. Он отвечает за «фильтрацию» — каким методом и каким образом вызывается лямбда. Именно в нем всегда будет прятаться айдишник, по которому ты сможешь определить, к какому гейтвею привязана лямбда‑функция.
![Пример Condition Пример Condition](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28904/img11.png)
В данном случае uj3lq1cu8e
— REST API ID. При этом триггер может сработать и от изменений в чем‑либо. Для получения информации о подобных событиях существует вот такой командлет:
aws lambda list-event-source-mappings --function-name <function-name>
Пример:
aws lambda list-event-source-mappings --function-name PentestingForFun
![Что приведет к асинхронному/потоковому триггеру Что приведет к асинхронному/потоковому триггеру](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28899/img06.png)
В этом случае используется Amazon Simple Queue Service (SQS) — служба очереди сообщений.
API Gateway
После изучения доступных лямбда‑функций пора восстанавливать URL, который приведет к ее вызову. Чтобы увидеть все REST APIs (получить айдишник, так как Region зачастую схож с большинством регионов, в котором стоят ЕС2-инстансы), воспользуемся следующей командой:
aws apigateway get-rest-apis
![Обнаружение всех REST API Обнаружение всех REST API](https://static.xakep.ru/images/a5158dd02e5f84bbf0364e8ad8ed7957/28900/img7.png)
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»