В эко­сис­теме 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

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

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

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

Подписаться
Уведомить о
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии