24小时新闻关注

綦江在线,上证50,自贡天气预报-鸽着陆新闻平台

介绍

这篇文章将从一个Apache tika服务器的指令注入缝隙到彻底运用的进程。CVE是https://nvd.nist.gov/vuln/detail/CVE-2018-1335。由于Apache Tika是开源的,我能够经过剖析Apache Tika代码来承认问题。尽管指令注入缝隙一般很简略,但要完结完好的长途代码或指令履行需求战胜一些妨碍。这是由于Java处理履行操作系统指令的办法以及Apache Tika代码自身的一些特性。但在终究,咱们依然能够运用C.exe来履行操作。

什么是Apache Tika

Apache Tika™东西包可从超越一千种不同的文件类型(如PPT,XLS和PDF)中检测和提取元数据和文本。一切这些文件类型都能够经过一个接口进行解析,使得Tika对查找引擎索引,内容剖析,翻译等十分有用。(https://tika.apache.org/)

Apache Tika有几个不同的组件:Java库,指令行东西和自带REST API的独立服务器(tika-server)。此进犯特别针对独立服务器,它经过REST API揭露。样本可在找到。

Breaking Down The CVE

咱们首要需求阅览issue,看看能够从中获取哪些信息。

原始描绘:

在Tika 1.18之前,客户端能够将精心设计的标头发送到tika-server,该标头可用于将指令注入运转tika-server的服务器的指令行。此缝隙仅影响在对不受信赖的客户端敞开的服务器上运转tika-server的缝隙。

咱们能够从这个描绘中看到的工作:

1.版别1.18已修补;

2.版别1.17未修补;

3.该缝隙是指令注入;

4.缝隙的进口点是“headers”;

5.这会影响代码的tika-server部分。

有了这些信息,咱们现在有了一个辨认缝隙的起点。下一步将看看Tika补丁和未补丁版别的差异,特别是tika-server部分。为Java中已知的履行操作系统指令的函数编写Grepping代码是另一个不错的挑选。终究,查找tika-server代码的各个部分,咱们能够假定这些报头是某种HTTP恳求。

0×01

对tika-server 1.17与1.18源目录进行并行递归比较。只回来一个已修正的文件,如下部分。

由于方针是在头字段中找到指令注入,所以第一个结果是一个代码块,这个代码块现已增加到补丁版别“ALLOWABLE_HEADER_CHARS”中。这是一个十分好的开端,假定这是补丁企图过滤可用于将指令注入头字段的字符。

持续向下是一个名为“processHeaderConfig”的函数内部的代码,它已在1.18中删去。它运用一些变量来动态创立一个办法,该办法好像设置了某个目标的特点,并运用HTTP头来履行此操作。

以下是此功用的阐明:

截图显现了不同特点的前缀,并在此代码的最初界说为静态字符串。

因而,咱们有一些静态字符串能够作为HTTP头文件包括在恳求中,并用于设置目标的某些特点。终究header的示例看起来像“X-Tika-OCRsomeproperty:somevalue”,然后将“someproperty”转换为类似于“setSomeproperty”的函数,并将somevalue作为要设置的值传递给该函数。

能够看到这儿正在运用这个函数,而且在恳求中查看了前缀头以承认怎么调用该函数。然后,一切需求的参数都从HTTP恳求传递到“processHeaderConfig”函数。

查看运用“processHeaderConfig”函数的办法,能够看到正在“TesseractOCRConfig”目标上设置特点。查找或许运用咱们发现的“TesseractOCRConfig”目标的当地:tika-parsers/src/main/java/org/apache/tika/parser/ocr/TesseractOCRParser.java。

这是来自“TesseractOCRParser.java”的“doOCR”函数,它将装备特点从咱们刚刚发现的“TesseractOCRConfig”目标直接传递到一个字符串数组中,这些字符串用于结构“ProcessBuilder”的指令,然后该进程已开端。

这看起来很有期望,假如咱们将一切信息放在一同,咱们应该能够向服务器宣布某种HTTP恳求,设置一个看起来像“X-Tika-OCRTesseractPath:”的标题。并将此指令刺进cmd字符串并履行。仅有的问题是“config.getTesseractPath”前缀为另一个咱们无法操控的字符“getTesseractProg”,终究是一个静态字符串“tesseract.exe”。为了处理这个问题,咱们能够用双引号包装咱们想要履行的指令,Windows将疏忽引号后附加的任何内容,只履行咱们的注入的指令。

为了进行测验,咱们能够运用tika-server文档中的示例来检索有关文件的一些元数据。

由于OCR用于从图画中提取文本和内容,咱们将上传图画而不是docx,以期有望到达“doOCR”功用。

咱们终究得到:

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

在上传图画时,经过在PUT恳求中将一个指令用双引号括起来作为“X-Tika-OCRTesseractPath”HTTP头的值来标识指令注入。

0×02 不仅仅是弹个计算器

咱们直接更改正在履行的应用程序称号。由于该指令作为数组传递给Java ProcessBuilder,因而咱们实际上不能运转多个指令,也不能将参数作为单个字符串增加到指令中,不然履即将失利。这是由于将一组字符串传递给Java中的进程构建器或runtime.exec的工作办法如下:

一般像cmd.exe或/bin/sh这样的shell解说的字符(例如&,<,>,|,`等)不会被ProcessBuilder解说而且将被疏忽,因而您不能中止指令或增加任何将它作为单个字符串的参数。不像“X-Tika-OCRTesseractPath: \“cmd.exe /c some args\”这样简略。

回到“cmd”数组的结构,您能够看到咱们也操控了指令中的多个参数,这是每个看起来像“config.get*”的项,可是它被一些咱们不操控的其他项切割开了。

我的第一个主意是运转“cmd.exe”,然后将参数“/c”作为“config.getLanguage”传入,然后将“|| somecommand ||”作为“config.getPageSegMode”刺进,这尽管能够履行“somecommand”。可是在调用`“doOCR”`之前,还有另一个函数在`“config.getTesseractPath”`字符串上调用,该字符串只履行该指令(意图是查看是否被调用的应用程序是有用的应用程序)。这儿的问题是只运转没有参数的“cmd.exe”并一向挂起,由于“cmd.exe”永久不会退出并让履行持续履行“doOCR”功用。

0×03 处理方案

除了运转单个指令外,咱们能够更深化地了解“doOCR”函数运用Process Monitor发动进程时会发作什么。 查看进程的特点,当tika-server发动它时,会生成以下指令行,该指令行是运用inject指令结构的。

"calc.exe"tesseract.exe C:\Users\Test\AppData\Local\Temp\apache-tika-3299124493942985299.tmp C:\Users\Test\AppData\Local\Temp\apache-tika-7317860646082338953.tmp -l eng -psm 1 txt -c preserve_interword_spaces=0

咱们操控的指令部分以赤色杰出显现。咱们能够在指令中注入3个当地,1个指令和2个参数。另一个风趣的发现是Tika实际上创立了2个临时文件,其间一个作为第一个参数被传递。

经过一些进一步的查询后,我能够承认传递给指令的第一个临时文件是我上传的文件中的内容。这意味着我能够用一些代码或指令填充该文件并履行它。

现在我有必要找到一个原生的Windows应用程序,它将疏忽tika-server创立的一切随机杂散参数,并依然履行第一个文件内容作为某种指令或代码,即便它具有“.tmp”扩展名。找到一些能够做到这一切的工作起先对我来说听起来不太或许。终究我发现了C.exe,它看起来有点期望。咱们来看看C能够做些什么。

C正是咱们所需求的。它将第一个参数作为脚本,并答应您运用”//E:engine”标志来指定要运用的脚本引擎(或许是J或VBS),因而文件扩展名无关紧要。将它放入新指令现在看起来如下所示。

"c.exe"tesseract.exe C:\Users\Test\AppData\Local\Temp\apache-tika-3299124493942985299.tmp C:\Users\Test\AppData\Local\Temp\apache-tika-7317860646082338953.tmp -l //E:J -psm 1 txt -c preserve_interword_spaces=0

这能够经过设置以下HTTP标头来完结:

X-Tika-OCRTesseractPath: "c.exe"X-Tika-OCRLanguage: //E:J

将上传的“image”文件将包括一些J或VBS:

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

首要,上传失利,由于它不是有用图片,无法验证图画的戏法字节。然后我发现将内容类型设置为“image/jp2”迫使Tika不查看图画中的戏法字节,但依然经过OCR处理图画。这答应上载包括J的图画。

终究,将一切这些放在一同,咱们有完好的command/j/vbs脚本。

定论

尽管这是一个简略的指令注入,但为了运用,仍是需求测验各种办法的。Apache不主张在不受信赖的环境中运转Tika服务器或将其露出给不受信赖的用户。此过错也已修补,当时版别为1.20,因而假如您运用此服务,请保证更新。

*参阅来历:rhinosecuritylabs,FB小编周大涛编译,转载请注明来自FreeBuf.COM

声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间服务。

推荐新闻