AWS - Lambda Enum
Reading time: 7 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
Lambda
Amazon Web Services (AWS) Lambda는 서버 제공 또는 관리의 필요 없이 코드를 실행할 수 있는 컴퓨트 서비스로 설명됩니다. 이는 코드 실행에 필요한 리소스 할당을 자동으로 처리하는 능력으로 특징지어지며, 높은 가용성, 확장성 및 보안과 같은 기능을 보장합니다. Lambda의 중요한 측면은 사용된 컴퓨트 시간에만 요금이 부과되는 가격 모델로, 초기 투자나 장기 의무가 필요하지 않습니다.
람다를 호출하려면 원하는 만큼 자주 (Cloudwatch 사용) 호출하거나, URL 엔드포인트를 노출하고 호출하거나, API Gateway를 통해 호출하거나, S3 버킷의 데이터 변경이나 DynamoDB 테이블 업데이트와 같은 이벤트에 따라 호출할 수 있습니다.
람다의 코드는 **/var/task
**에 저장됩니다.
Lambda Aliases Weights
람다는 여러 버전을 가질 수 있습니다.
그리고 1개 이상의 버전을 별칭을 통해 노출할 수 있습니다. 별칭 내에서 노출된 각 버전의 가중치는 어떤 별칭이 호출을 받을지 결정합니다 (예: 90%-10%일 수 있음).
하나의 별칭 코드가 취약한 경우, 취약한 버전이 익스플로잇을 받을 때까지 요청을 보낼 수 있습니다.
Resource Policies
Lambda 리소스 정책은 다른 서비스/계정이 람다를 호출할 수 있도록 접근을 허용합니다.
예를 들어, 이는 URL을 통해 노출된 람다에 누구나 접근할 수 있도록 허용하는 정책입니다:
또는 API Gateway가 이를 호출할 수 있도록 허용하는 정책입니다:
Lambda Database Proxies
수백 개의 동시 람다 요청이 있을 때, 각 요청이 데이터베이스에 연결하고 연결을 종료해야 한다면, 이는 작동하지 않을 것입니다 (람다는 상태가 없으며, 연결을 유지할 수 없습니다).
따라서, Lambda 함수가 데이터베이스 인스턴스 대신 RDS Proxy와 상호작용하도록 하면, 동시 Lambda 함수가 생성한 많은 동시 연결을 위한 연결 풀링을 처리합니다. 이는 Lambda 애플리케이션이 기존 연결을 재사용할 수 있게 하여, 각 함수 호출마다 새로운 연결을 생성할 필요가 없도록 합니다.
Lambda EFS Filesystems
데이터를 보존하고 공유하기 위해 Lambdas는 EFS에 접근하고 이를 마운트할 수 있어, Lambda가 이를 읽고 쓸 수 있게 됩니다.
Lambda Layers
람다 _레이어_는 추가 코드를 포함할 수 있는 .zip 파일 아카이브입니다. 레이어는 라이브러리, 사용자 정의 런타임, 데이터 또는 구성 파일을 포함할 수 있습니다.
함당 최대 다섯 개의 레이어를 포함할 수 있습니다. 함수에 레이어를 포함하면, 내용이 실행 환경의 /opt
디렉토리에 추출됩니다.
기본적으로, 생성한 레이어는 AWS 계정에 비공개입니다. 다른 계정과 레이어를 공유하거나 레이어를 공개할 수 있습니다. 다른 계정이 게시한 레이어를 사용하는 함수는 레이어가 삭제된 후에도 해당 레이어 버전을 계속 사용할 수 있으며, 레이어에 대한 접근 권한이 취소된 후에도 사용할 수 있습니다. 그러나 삭제된 레이어 버전을 사용하여 새 함수를 생성하거나 함수를 업데이트할 수는 없습니다.
컨테이너 이미지로 배포된 함수는 레이어를 사용하지 않습니다. 대신, 이미지를 빌드할 때 선호하는 런타임, 라이브러리 및 기타 종속성을 컨테이너 이미지에 패키징합니다.
Lambda Extensions
람다 확장은 다양한 모니터링, 가시성, 보안 및 거버넌스 도구와 통합하여 기능을 향상시킵니다. 이러한 확장은 .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 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
URL를 통해 Lambda 함수 호출
이제 실행할 수 있는 가능한 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"
마지막으로 함수를 호출하여 접근합니다 (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>
기타 트리거
람다를 트리거할 수 있는 다른 소스가 많이 있습니다.
.png)
권한 상승
다음 페이지에서 람다 권한을 남용하여 권한을 상승시키는 방법을 확인할 수 있습니다:
인증되지 않은 접근
AWS - Lambda Unauthenticated Access
포스트 익스플로잇
AWS - Lambda Post Exploitation
지속성
참고 문헌
- https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer
- https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.