AWS - Lambda Enum

支持 HackTricks

Lambda

亚马逊网络服务 (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 请求 时,如果每个请求都需要 连接并关闭与数据库的连接,这根本行不通(Lambda 是无状态的,无法保持连接打开)。 因此,如果你的 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

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

参考文献

支持HackTricks

Last updated