AWS - Lambda Layers Persistence
Last updated
Last updated
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
Lambda 层是一个 .zip 文件归档,可以包含额外的代码或其他内容。一个层可以包含库、自定义运行时、数据或配置文件。
每个函数最多可以包含 五个层。当你在一个函数中包含一个层时,内容会被提取到执行环境中的 /opt
目录。
默认情况下,你创建的 层 对你的 AWS 账户是 私有的。你可以选择 与其他账户共享 一个层或 将 该层 设为公共。如果你的函数使用了不同账户发布的层,即使该层被删除或你被撤销访问权限,你的函数仍然可以 继续使用该层版本。但是,你不能使用已删除的层版本创建新函数或更新函数。
作为容器镜像部署的函数不使用层。相反,当你构建镜像时,将你首选的运行时、库和其他依赖项打包到容器镜像中。
Python 在 lambda 中使用的加载路径如下:
检查 第二 和 第三 位置 是否被 lambda layers 解压其文件的目录占用: /opt/python/lib/python3.9/site-packages
和 /opt/python
如果攻击者成功地 后门 一个被使用的 lambda layer 或 添加一个 在加载常用库时会 执行任意代码 的 layer,他将能够在每次 lambda 调用时执行恶意代码。
因此,要求是:
检查 受害者代码 加载的库
创建一个 带有 lambda layers 的代理库,该库将 执行自定义代码 并 加载原始 库。
在滥用此技术时,我发现了一个困难:一些库在你的代码执行时已经在 python 运行时中 被加载。我原本期待找到像 os
或 sys
这样的库,但 甚至 json
库也被加载。
为了滥用这种持久性技术,代码需要 加载一个在代码执行时未加载的新库。
使用这样的 python 代码,可以获得 lambda 中 python 运行时 预加载的库列表:
这是列表(检查像os
或json
这样的库是否已经存在)
这是lambda 默认安装的库列表:https://gist.github.com/gene1wood/4a052f39490fae00e0c3
在这个例子中,假设目标代码正在导入**csv
。我们将对 csv
库的导入进行后门处理**。
为此,我们将创建目录 csv,并在其中放置文件**__init__.py
,路径为 lambda 加载的路径:/opt/python/lib/python3.9/site-packages
然后,当 lambda 执行并尝试加载csv时,我们的__init__.py
文件将被加载并执行**。
该文件必须:
执行我们的有效载荷
加载原始的 csv 库
我们可以通过以下方式同时完成这两项:
然后,创建一个 zip 文件,包含路径 python/lib/python3.9/site-packages/__init__.py
中的代码,并将其添加为 lambda 层。
您可以在 https://github.com/carlospolop/LambdaLayerBackdoor 找到此代码。
集成的有效载荷将在 首次调用或在 lambda 容器重置后(代码更改或冷 lambda)发送 IAM 凭证到服务器,但 其他技术(如以下内容)也可以集成:
AWS - Steal Lambda Requests请注意,可以使用 来自外部账户的 lambda 层。此外,即使没有权限,lambda 也可以使用来自外部账户的层。 还要注意,一个 lambda 最多可以有 5 个层。
因此,为了提高此技术的灵活性,攻击者可以:
在用户的现有层中植入后门(没有任何外部内容)
在 他的账户中创建一个层,给予受害者账户使用该层的访问权限,配置受害者的 Lambda 中的层并移除权限。
Lambda 仍然能够使用该层,而受害者将没有任何简单的方法来下载层代码(除了在 lambda 内部获取反向 shell)。
受害者不会看到使用 aws lambda list-layers
的外部层。
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)