AWS - Lambda Enum

支持 HackTricks

Lambda

Amazon Web Services (AWS) Lambda 被描述为一种 计算服务,它允许在无需服务器配置或管理的情况下执行代码。其特点是能够 自动处理 代码执行所需的资源分配,确保高可用性、可扩展性和安全性。Lambda 的一个重要方面是其定价模式,仅根据使用的计算时间收费,无需初始投资或长期义务。

调用 lambda 可以通过 任意频率(使用 Cloudwatch)、暴露一个 URL 端点并调用它、通过 API Gateway 调用,甚至基于 事件(如 S3 存储桶中的数据更改或 DynamoDB 表的更新)来调用。

lambda 的 代码 存储在 /var/task

Lambda 别名权重

一个 Lambda 可以有 多个版本。 并且可以通过 别名 暴露 多个版本。别名中暴露的 每个版本权重 将决定 哪个别名接收调用(例如可以是 90%-10%)。 如果 某个 别名的代码 存在漏洞,你可以发送 请求直到漏洞版本接收到攻击

资源策略

Lambda 资源策略允许 授予其他服务/账户调用 lambda 的权限。 例如,这是允许 任何人访问通过 URL 暴露的 lambda 的策略:

或者这是允许 API Gateway 调用它的策略:

Lambda 数据库代理

当有 数百个并发 lambda 请求 时,如果每个请求都需要 连接和关闭数据库连接,这是行不通的(lambdas 是无状态的,无法保持连接打开)。 因此,如果你的 Lambda 函数与 RDS Proxy 交互 而不是与数据库实例交互,它会处理并发 Lambda 函数创建的许多同时连接所需的连接池。这允许你的 Lambda 应用程序 重用现有连接,而不是为每次函数调用创建新连接。

Lambda EFS 文件系统

为了保存甚至共享数据,Lambdas 可以访问 EFS 并挂载它们,这样 Lambda 就可以读取和写入其中的数据。

Lambda 层

Lambda 是一个 .zip 文件归档,可以包含额外的代码 或其他内容。层可以包含库、自定义运行时、数据或配置文件。

每个函数最多可以包含 五个层。当你在函数中包含一个层时,内容会被解压到执行环境中的 /opt 目录。

默认情况下,你创建的 私有 的,仅限于你的 AWS 账户。你可以选择 与其他账户共享 层或 公开 层。如果你的函数使用了其他账户发布的层,即使该层版本被删除或你的访问权限被撤销,你的函数仍然可以 继续使用该层版本。但是,你不能使用已删除的层版本创建新函数或更新函数。

作为容器镜像部署的函数不使用层。相反,你在构建镜像时将首选的运行时、库和其他依赖项打包到容器镜像中。

Lambda 扩展

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>

调用一个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

通过暴露的URL

https://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<path>

If the URL is exposed, it can be accessed directly. This can lead to unauthorized access if proper authentication and authorization are not implemented.

如果URL暴露,可以直接访问。如果没有实施适当的身份验证和授权,这可能导致未经授权的访问。

Via AWS CLI

aws lambda list-functions --region <region>

Using the AWS CLI, you can list all the Lambda functions in a specific region.

使用AWS CLI,你可以列出特定区域内的所有Lambda函数。

Via AWS SDK

import boto3

client = boto3.client('lambda', region_name='<region>')
response = client.list_functions()
print(response)

Using the AWS SDK for Python (boto3), you can programmatically list all the Lambda functions in a specific region.

使用AWS SDK for Python (boto3),你可以通过编程方式列出特定区域内的所有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

通过 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>

其他触发器

有很多其他来源可以触发lambda

Privesc

在以下页面中,你可以查看如何滥用Lambda权限来提升权限

AWS - Lambda Privesc

未经身份验证的访问

AWS - Lambda Unauthenticated Access

后期利用

AWS - Lambda Post Exploitation

持久性

AWS - Lambda Persistence

参考资料

支持HackTricks

Last updated