AWS - Lambda Enum

Support HackTricks

Lambda

Amazon Web Services (AWS) Lambda는 서버를 제공하거나 관리할 필요 없이 코드를 실행할 수 있는 컴퓨팅 서비스로 설명됩니다. 이는 코드 실행에 필요한 리소스 할당을 자동으로 처리하여 높은 가용성, 확장성 및 보안을 보장하는 기능을 갖추고 있습니다. Lambda의 중요한 측면 중 하나는 사용한 컴퓨팅 시간에만 요금이 부과되는 가격 모델로, 초기 투자나 장기적인 의무가 필요하지 않습니다.

Lambda를 호출하려면 원하는 만큼 자주 호출할 수 있으며 (Cloudwatch 사용), URL 엔드포인트를 노출하고 호출하거나, API Gateway를 통해 호출하거나, S3 버킷의 데이터 변경 또는 DynamoDB 테이블 업데이트와 같은 이벤트를 기반으로 호출할 수 있습니다.

Lambda의 코드는 **/var/task**에 저장됩니다.

Lambda Aliases Weights

Lambda는 여러 버전을 가질 수 있습니다. 그리고 별칭을 통해 1개 이상의 버전을 노출할 수 있습니다. 별칭 내에 노출된 각 버전의 가중치어느 별칭이 호출을 받을지 결정합니다 (예: 90%-10%). 별칭 중 하나의 코드가 취약하다면 취약한 버전이 익스플로잇을 받을 때까지 요청을 보낼 수 있습니다.

Resource Policies

Lambda 리소스 정책을 통해 다른 서비스/계정이 Lambda를 호출할 수 있도록 허용할 수 있습니다. 예를 들어, URL을 통해 노출된 Lambda에 누구나 접근할 수 있도록 허용하는 정책은 다음과 같습니다:

또는 API Gateway가 이를 호출할 수 있도록 허용하는 정책은 다음과 같습니다:

Lambda Database Proxies

수백 개의 동시 Lambda 요청이 있을 때, 각 요청이 데이터베이스에 연결하고 연결을 닫아야 한다면, 이는 작동하지 않습니다 (Lambda는 상태가 없으며, 연결을 유지할 수 없습니다). 따라서, Lambda 함수가 데이터베이스 인스턴스 대신 RDS Proxy와 상호작용하면, 이는 동시 Lambda 함수가 생성하는 많은 동시 연결을 확장하는 데 필요한 연결 풀링을 처리합니다. 이를 통해 Lambda 애플리케이션은 기존 연결을 재사용할 수 있으며, 각 함수 호출마다 새로운 연결을 생성할 필요가 없습니다.

Lambda EFS Filesystems

데이터를 보존하고 공유하기 위해 Lambda는 EFS에 접근하여 이를 마운트할 수 있으며, 이를 통해 Lambda는 이를 읽고 쓸 수 있습니다.

Lambda Layers

Lambda _layer_는 추가 코드를 포함할 수 있는 .zip 파일 아카이브입니다. 레이어는 라이브러리, 사용자 정의 런타임, 데이터 또는 구성 파일을 포함할 수 있습니다.

함수당 최대 다섯 개의 레이어를 포함할 수 있습니다. 함수를 레이어에 포함하면, 내용이 실행 환경의 /opt 디렉토리에 추출됩니다.

기본적으로, 생성한 레이어는 AWS 계정에 대해 비공개입니다. 다른 계정과 레이어를 공유하거나 레이어를 공개할 수 있습니다. 다른 계정이 게시한 레이어를 함수가 사용하는 경우, 해당 레이어 버전이 삭제되거나 레이어에 대한 접근 권한이 철회된 후에도 함수는 계속해서 레이어 버전을 사용할 수 있습니다. 그러나 삭제된 레이어 버전을 사용하여 새 함수를 생성하거나 함수를 업데이트할 수는 없습니다.

컨테이너 이미지로 배포된 함수는 레이어를 사용하지 않습니다. 대신, 컨테이너 이미지를 빌드할 때 선호하는 런타임, 라이브러리 및 기타 종속성을 컨테이너 이미지에 패키징합니다.

Lambda Extensions

Lambda 확장은 다양한 모니터링, 가시성, 보안 및 거버넌스 도구와 통합하여 기능을 향상시킵니다. 이러한 확장은 .zip 아카이브를 사용하여 Lambda 레이어로 추가하거나 컨테이너 이미지 배포에 포함됩니다. 두 가지 모드로 작동합니다: 내부외부.

  • 내부 확장은 런타임 프로세스와 병합되어 언어별 환경 변수래퍼 스크립트를 사용하여 시작을 조작합니다. 이 커스터마이징은 Java Correto 8 및 11, Node.js 10 및 12, .NET Core 3.1을 포함한 다양한 런타임에 적용됩니다.

  • 외부 확장은 별도의 프로세스로 실행되며, Lambda 함수의 라이프사이클과 운영을 일치시킵니다. 이는 Node.js 10 및 12, Python 3.7 및 3.8, Ruby 2.5 및 2.7, Java Corretto 8 및 11, .NET Core 3.1사용자 정의 런타임과 호환됩니다.

Enumeration

aws lambda get-account-settings

# List functions and get extra config info
aws lambda list-functions
aws lambda get-function --function-name <function_name>
aws lambda get-function-configuration --function-name <function_name>
aws lambda list-function-event-invoke-configs --function-name <function_name>
## Check for creds in env vars
aws lambda list-functions | jq '.Functions[].Environment'
## Download & check the source code
aws lambda get-function --function-name "<func_name>" --query 'Code.Location'
wget -O lambda-function.zip <url-from-previous-query>

# Get Lambda URL (if any)
aws lambda list-function-url-configs --function-name <function_name>
aws lambda get-function-url-config --function-name <function_name>

# Get who has permissions to invoke the Lambda
aws lambda get-policy --function-name <function_name>

# Versions and Aliases
aws lambda list-versions-by-function --function-name <func_name>
aws lambda list-aliases --function-name <func_name>

# List layers
aws lambda list-layers
aws lambda list-layer-versions --layer-name <name>
aws lambda get-layer-version --layer-name <name> --version-number <ver>
aws lambda get-layer-version-by-arn --arn <name> #Get external ARNs

# List other metadata
aws lambda list-event-source-mappings
aws lambda list-code-signing-configs
aws lambda list-functions-by-code-signing-config --code-signing-config-arn <arn>

Invoke a lambda

Manual

Lambda 함수를 수동으로 호출하려면 다음 단계를 따르세요:

  1. AWS Management Console에 로그인합니다.

  2. Lambda 서비스를 선택합니다.

  3. 호출하려는 함수를 선택합니다.

  4. "Test" 버튼을 클릭합니다.

  5. 테스트 이벤트를 구성하고 "Create"를 클릭합니다.

  6. "Test" 버튼을 다시 클릭하여 함수를 호출합니다.

이렇게 하면 선택한 Lambda 함수가 수동으로 호출됩니다.

# Invoke function
aws lambda invoke --function-name FUNCTION_NAME /tmp/out
## Some functions will expect parameters, they will access them with something like:
## target_policys = event['policy_names']
## user_name = event['user_name']
aws lambda invoke --function-name <name> --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt

Via exposed URL

AWS Lambda 함수는 HTTP 엔드포인트로 노출될 수 있습니다. 이 경우, 공격자는 해당 URL을 통해 함수에 접근할 수 있습니다.

curl -X GET https://<lambda-url>

위 명령어를 사용하여 Lambda 함수의 URL에 GET 요청을 보낼 수 있습니다.

Via AWS CLI

AWS CLI를 사용하여 Lambda 함수를 나열할 수 있습니다.

aws lambda list-functions --region <region>

위 명령어를 사용하여 특정 지역의 Lambda 함수를 나열할 수 있습니다.

Via IAM Role

IAM Role을 통해 Lambda 함수에 접근할 수 있습니다.

aws lambda list-functions --region <region> --profile <profile>

위 명령어를 사용하여 특정 프로파일을 사용해 Lambda 함수를 나열할 수 있습니다.

aws lambda list-function-url-configs --function-name <function_name> #Get lambda URL
aws lambda get-function-url-config   --function-name <function_name> #Get lambda URL

Call Lambda function via URL

이제 실행할 수 있는 가능한 lambda 함수를 찾아볼 시간입니다:

aws --region us-west-2 --profile level6 lambda list-functions

"Level6"이라는 lambda 함수가 있습니다. 이를 호출하는 방법을 알아봅시다:

aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6

이제 이름과 ID를 알았으니 이름을 얻을 수 있습니다:

aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"

마지막으로 함수를 호출하여 접근합니다 (URL에 ID, Name 및 function-name이 나타나는 것을 확인하십시오): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

URL:https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>

Other Triggers

lambda를 트리거할 수 있는 다른 많은 소스가 있습니다.

Privesc

다음 페이지에서 Lambda 권한을 악용하여 권한을 상승시키는 방법을 확인할 수 있습니다:

AWS - Lambda Privesc

Unauthenticated Access

AWS - Lambda Unauthenticated Access

Post Exploitation

AWS - Lambda Post Exploitation

Persistence

AWS - Lambda Persistence

References

Support HackTricks

Last updated