В эко­сис­теме AWS име­ется инте­рес­ней­ший механизм Lambda — это служ­ба бес­сервер­ных вычис­лений, которая запус­кает код в ответ на опре­делен­ное событие. При­чем она уме­ет авто­мати­чес­ки выделять для это­го необ­ходимые ресур­сы. Сегод­ня мы погово­рим о том, как исполь­зовать ее, что­бы про­ник­нуть в обла­ко AWS и повысить при­виле­гии.

info

О том, как мож­но экс­плу­ати­ровать дру­гие уяз­вимос­ти AWS, читай в статье «Про­вер­ка ведер. Как искать уяз­вимос­ти в бакетах AWS S3».

 

Теория

 

AWS Lambda

Как работа­ет AWS Lambda? Если прос­тыми сло­вами: ты добав­ляешь свой скрипт и зада­ешь триг­гер или событие, при нас­тупле­нии которо­го будет запус­кать­ся этот код. Боль­ше делать ничего не нуж­но, потому что обо всем дру­гом — адми­нис­три­рова­нии, монито­рин­ге работы, безопас­ности, жур­налах, логах — позабо­тит­ся сер­вис AWS Lambda. Ког­да событий нет, лям­бда не выпол­няет­ся, соот­ветс­твен­но, ресур­сы не пот­ребля­ются.

Устройство лямбды
Ус­трой­ство лям­бды
 

Лямбда-функция

Лям­бда‑фун­кция — это часть кода, которая выпол­няет­ся каж­дый раз, ког­да сра­баты­вает триг­гер.

Устройство лямбда-функции
Ус­трой­ство лям­бда‑фун­кции

Су­щес­тву­ет три типа триг­геров, отли­чают­ся они спо­собом вызова:

  • по­токо­вый — сра­баты­вает при изме­нени­ях в чем‑либо, нап­ример при добав­лении дан­ных в БД;
  • син­хрон­ный — сра­баты­вает при получе­нии зап­роса на какой‑то конеч­ной точ­ке, которая вызыва­ет лям­бда‑фун­кцию;
  • асин­хрон­ный — про­исхо­дит в слу­чае какого‑либо события, нап­ример при заг­рузке фай­ла на S3.

При этом вызов воз­можно выпол­нить и с помощью API Gateway.

 

API Gateway

Служ­ба API Gateway упро­щает раз­работ­чикам работу с API. Под­держи­вает­ся REST, HTTP и WebSocket API.

Состав API Gateway
Сос­тав API Gateway

Мы можем при­вязать API Gateway к какому‑то сер­вису, мобиль­ному при­ложе­нию, даже к IOT, — глав­ное, что­бы у них был дос­туп в интернет. Пос­ле это­го оно будет сту­чать на API-шлюз, с которо­го и ста­нут вызывать­ся тре­буемые дей­ствия.

Стандартное использование API Gateway
Стан­дар­тное исполь­зование API Gateway
 

Первоначальный доступ

Ча­ще все­го через лям­бду в обла­ко не попада­ют. Но в слу­чае обна­руже­ния фун­кции, гей­твея, соз­дания пол­ной ссыл­ки и тре­буемо­го набора парамет­ров мож­но все‑таки поп­робовать. Нап­ример, если лям­бда‑фун­кция при­нима­ет какую‑либо коман­ду для запус­ка в cmd:

https://i8jee1mn2f.execute-api.us-east-2.amazonaws.com/prod/system?cmd=env
Пример эксплуатации уязвимости
При­мер экс­плу­ата­ции уяз­вимос­ти
 

Разведка

 

Lambda Function

На пер­вом эта­пе нуж­но хорошень­ко раз­ведать обста­нов­ку и поис­кать уяз­вимые мес­та. На помощь нам при­дет 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
При­мер 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) — служ­ба оче­реди сооб­щений.

 

API Gateway

Пос­ле изу­чения дос­тупных лям­бда‑фун­кций пора вос­ста­нав­ливать URL, который при­ведет к ее вызову. Что­бы уви­деть все REST APIs (получить айдиш­ник, так как Region зачас­тую схож с боль­шинс­твом реги­онов, в котором сто­ят ЕС2-инстан­сы), вос­поль­зуем­ся сле­дующей коман­дой:

aws apigateway get-rest-apis
Обнаружение всех REST API
Об­наруже­ние всех REST API

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    1 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии