AWS - Lambda Enum

Tip

学习并练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

Lambda

Amazon Web Services (AWS) Lambda 被描述为一种 计算服务,使得代码的执行无需服务器的提供或管理。它的特点是能够 自动处理代码执行所需的资源分配,确保高可用性、可扩展性和安全性等特性。Lambda 的一个重要方面是其定价模型,费用仅基于所使用的计算时间,消除了初始投资或长期义务的需要。

要调用一个 lambda,可以 随时调用(使用 Cloudwatch),暴露一个 URL 端点并调用它,通过 API Gateway 调用它,或者基于 事件 进行调用,例如 S3 存储桶中的数据 更改DynamoDB 表的更新。

一个 lambda 的 代码 存储在 /var/task 中。

Lambda Aliases Weights

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

Resource Policies

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

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

Lambda Database Proxies

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

Lambda EFS Filesystems

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

Lambda Layers

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

每个函数最多可以包含 五个层。当你在一个函数中包含一个 layer 时,内容会被提取到 /opt 目录中。

默认情况下,你创建的 layers私有 的,属于你的 AWS 账户。你可以选择 与其他账户共享 一个 layer 或 该 layer 公开。如果你的函数使用了一个不同账户发布的 layer,你的函数可以 在该 layer 被删除后,或在你被撤销访问该 layer 的权限后继续使用该 layer 版本。然而,你不能使用已删除的 layer 版本创建新函数或更新函数。

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

Lambda Extensions

Lambda 扩展通过与各种 监控、可观察性、安全性和治理工具 集成来增强函数。这些扩展通过 .zip 归档使用 Lambda layers 或包含在 容器镜像部署中 进行操作,分为两种模式:内部外部

  • 内部扩展 与运行时进程合并,使用 特定语言的环境变量包装脚本 操作其启动。此自定义适用于多种运行时,包括 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>

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

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、名称和函数名称出现在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

权限提升

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

AWS - Lambda Privesc

未经身份验证的访问

AWS - Lambda Unauthenticated Access

后期利用

AWS - Lambda Post Exploitation

持久性

AWS - Lambda Persistence

参考文献

Tip

学习并练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks