GCP - Network Docker Escape
初始状态
在指定了这种技术的两篇文章中,攻击者成功在由 GCP 管理的 Docker 容器内获得了 root 访问权限,并具有对主机网络的访问权限(以及 CAP_NET_ADMIN
和 CAP_NET_RAW
的功能)。
攻击解释
在 Google Compute Engine 实例上,定期检查网络流量会显示大量对 169.254.169.254
上的 明文 HTTP 请求,这是元数据实例。Google Guest Agent 是一个开源服务,经常发出这样的请求。
该代理旨在监视元数据的更改。值得注意的是,元数据包括一个 SSH 公钥字段。当新的公共 SSH 密钥添加到元数据中时,代理会自动在 .authorized_key
文件中授权它。如果需要,它还可以创建一个新用户并将其添加到 sudoers。
代理通过发送请求来递归检索所有元数据值(GET /computeMetadata/v1/?recursive=true
)来监视更改。此请求旨在促使元数据服务器仅在自上次检索以来元数据发生任何更改时发送响应,由 Etag(wait_for_change=true&last_etag=
)标识。此外,还包括一个 超时 参数(timeout_sec=
)。如果在指定的超时时间内没有发生更改,服务器将以未更改的值响应。
这个过程允许 IMDS(实例元数据服务)在60秒后响应,如果没有发生配置更改,就会为向客户代理注入一个伪造的配置响应创造一个潜在的窗口。
攻击者可以利用这一点,执行中间人攻击(MitM 攻击),欺骗 IMDS 服务器的响应,并插入一个新的公钥。这可能会导致未经授权的 SSH 访问主机。
逃逸技术
虽然 ARP 欺骗在 Google Compute Engine 网络上无效,但由 Ezequiel 开发的 rshijack 的修改版本 可用于在通信中进行数据包注入以注入 SSH 用户。
这个版本的 rshijack 允许将 ACK 和 SEQ 数字作为命令行参数输入,从而在真实的 Metadata 服务器响应之前伪造响应。此外,使用一个小型 Shell 脚本 来返回一个特制的有效负载。这个有效负载触发 Google Guest Agent 创建一个名为 wouter
的用户,并在 .authorized_keys
文件中指定公钥。
该脚本使用相同的 ETag 来防止 Metadata 服务器立即通知 Google Guest Agent 不同的元数据值,从而延迟响应。
要执行欺骗,需要以下步骤:
使用 tcpdump 监视对 Metadata 服务器的请求:
寻找类似以下内容的行:
使用正确的ETAG向rshijack发送虚假元数据数据:
这一步授权公钥,启用与相应私钥的SSH连接。
参考
Last updated