AWS - Lambda Enum

Support HackTricks

Lambda

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

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

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

Lambda Aliases Weights

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

Resource Policies

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

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

Lambda Database Proxies

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

Lambda EFS Filesystems

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

Lambda Layers

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

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

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

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

Lambda Extensions

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

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

  • 외부 확장은 별도의 프로세스로 실행되며, 람다 함수의 생명 주기와 운영 정렬을 유지합니다. 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 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

노출된 URL을 통해

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"이라는 이름의 람다 함수가 사용 가능합니다. 이를 호출하는 방법을 찾아봅시다:

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"

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

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

기타 트리거

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

권한 상승

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

AWS - Lambda Privesc

인증되지 않은 접근

AWS - Lambda Unauthenticated Access

포스트 익스플로잇

AWS - Lambda Post Exploitation

지속성

AWS - Lambda Persistence

참고 문헌

HackTricks 지원하기

Last updated