来源
https://securitylab.github.com/advisories/GHSL-2022-012_Apache_Hadoop/
这个洞吧,你以为很厉害吧其实在我目前掌握的情况来看啥也不是,说要有hadoop
环境吧,后来发现根本不需要,还浪费我好多时间在windows
上安装hadoop
踩坑。
大概的一是就是将hadoop
的FileUtil.java
这个类的unTar
函数在调用unTarUsingJava
函数对tar
包进行解压的时候如果tar
包中的文件是个软链接,那么将可能导致目录穿越从而使得这个软链接链接到任意的位置。当然看到这里的函数命名为使用Java
解压,那么肯定还有使用命令解压的,当然这不是我们的讨论重点。而最终的核心逻辑则是在unpackEntries
这个函数中,下面我们一起来看看这个过程,这里我首先写了一个简单的利用脚本
毫无疑问,你需要一些依赖
注意到这里使用的版本是3.2.0,当然其实用不了这么多依赖的,最主要的是hdfs的依赖,我也懒得删了。然后我么来看看最新的补丁长啥样
很明显原始的存在漏洞的代码为途中红色区域,这段代码首先调用isSymbolicLink
函数判断entry是否为符号链接,如果是的话则调用createSymbolicLink
函数创建一个符号链接,该函数有两个参数,第一个参数为要创建的符号链接的位置,第二个为符号链接指向的文件,看看这两参数怎么赋值的,分别为FileSystems.getDefault().getPath(outputDir.getPath(), entry.getName())
与FileSystems.getDefault().getPath(entry.getLinkName())
这里面有三个重点的参数一个是outputDir.getPath
一个是entry.getName
另一个是entry.getLinkName
很明显第一个是获取unTar
传入的目标路径,第二是是获取tar包中软链接文件的文件名,第三个是获取软链接指向的文件名。这三个参数都有被控制的可能,主要看目标代码怎么写了。当然第一个参数一般不会有程序员写的让你可控的,那么能做手脚的就只剩下第二个和第三个参数了,如果我们需要将软链接创建到启动目录里面去,那么就要控制第二个参数,但是在windows环境中文件名是不能出现/类的特殊字符的,所以这条路也就被堵死了。那么就只能想办法搞定第三个参数,当然这个参数是可控的。我们只需要在创建软链接的时候使用相对路径就可以了
所以利用的方式也就很明显了,首先我们按照上面的方式创建一个软链接,然后使用打包工具将这个软链接打包为一个tar包,然后调用FileUtil.java#unTar函数对该tar包进行解压就好了。在对软链接进行打包的时候不要使用linux命令打包,遇到了坑,可以选用7zip,打包的时候注意选择压缩格式以及勾选保存符号链接复选框,不然是会失败的哦。
所以看到这里你还觉得这个漏洞很有用吗?
当然具体的调用过程,可以自己用IDEA调试一下,这里注意IDEA要使用管理员权限启动,不然是不能创建符号链接的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)