AWS - Lambda Enum

htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!

HackTricks를 지원하는 다른 방법:

Lambda

Amazon Web Services (AWS) Lambda는 서버 프로비저닝 또는 관리가 필요하지 않은 코드 실행을 가능케 하는 컴퓨팅 서비스로 설명됩니다. 코드 실행에 필요한 리소스 할당을 자동으로 처리하여 고가용성, 확장성 및 보안과 같은 기능을 보장합니다. Lambda의 중요한 측면 중 하나는 컴퓨팅 시간에만 기반한 요금 체계로, 초기 투자나 장기간의 의무가 필요하지 않습니다.

람다를 호출하는 방법은 Cloudwatch를 통해 원하는만큼 자주 호출하거나, URL 엔드포인트를 노출하고 호출하거나, API Gateway를 통해 호출하거나, S3 버킷의 데이터 변경 또는 DynamoDB 테이블 업데이트와 같은 이벤트에 기반하여 호출하는 것이 가능합니다.

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

Lambda Aliases Weights

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

리소스 정책

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

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

Lambda Database Proxies

수백 개의 동시 람다 요청이 있는 경우, 각각이 데이터베이스에 연결하고 연결을 닫아야 한다면 작동하지 않을 것입니다 (람다는 상태를 유지할 수 없으므로 연결을 열 수 없음). 그럴 때, Lambda 함수가 데이터베이스 인스턴스 대신 RDS Proxy와 상호 작용하도록 설정할 수 있습니다. 동시 람다 함수에 의해 생성된 많은 동시 연결에 필요한 연결 풀링을 처리합니다. 이를 통해 Lambda 애플리케이션은 기존 연결을 재사용할 수 있게 되며, 매 함수 호출마다 새 연결을 생성하는 대신 사용할 수 있습니다.

Lambda EFS Filesystems

데이터를 보존하고 공유하기 위해 람다가 EFS에 액세스하고 마운트할 수 있으므로 Lambda가 읽고 쓸 수 있습니다.

Lambda Layers

Lambda _레이어_는 추가 코드 또는 다른 콘텐츠를 포함할 수 있는 .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사용자 정의 런타임과 호환됩니다.

열거

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"이라는 람다 함수가 있습니다. 호출하는 방법을 알아보겠습니다:

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, 이름 및 함수 이름이 나타남을 주목하십시오): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

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

다른 트리거

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

권한 상승

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

pageAWS - Lambda Privesc

인증되지 않은 액세스

pageAWS - Lambda Unauthenticated Access

포스트 익스플로잇

pageAWS - Lambda Post Exploitation

지속성

pageAWS - Lambda Persistence

참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅까지 AWS 해킹을 배우세요!

HackTricks를 지원하는 다른 방법:

最終更新