0x0前言
一款用于 JNDI注入
利用的工具,大量参考/引用了 Rogue JNDI
项目的代码,支持直接植入内存shell
,并集成了常见的bypass 高版本JDK
的方式,适用于与自动化工具配合使用。打过log4j2的师傅应该都不陌生,这里先简单介绍一下。我这里使用的是https://github.com/WhiteHSBG/JNDIExploit (1.4版本)
0x1代码审计
问题出在下面这个类
src/main/java/com/feihong/ldap/HTTPServer.java
直接定位到
private static void handleFileRequest(HttpExchange exchange) throws Exception {
String path = exchange.getRequestURI().getPath();
String filename = cwd + File.separator + "data" + File.separator +path.substring(path.lastIndexOf("/") + 1);
File file = new File(filename);
if (file.exists()){
byte[] bytes = new byte[(int) file.length()];
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(bytes);
exchange.sendResponseHeaders(200, file.length() + 1);
exchange.getResponseBody().write(bytes);
}else {
System.out.println("[!] Response Code: " + 404);
exchange.sendResponseHeaders(404, 0);
}
exchange.close();
}
-
exchange.getRequestURI().getPath()
:从HTTP请求中获取请求的URI路径。 -
String filename = cwd + File.separator + "data" + File.separator +path.substring(path.lastIndexOf("/") + 1)
:构建文件的完整路径。它使用了当前工作目录 (cwd
),然后附加了固定的目录名称 "data",最后附加了从URI路径中提取的文件名部分(通过找到最后一个斜杠/
来获取文件名)。
请求中找到路径中的最后一个斜杠(/),然后把它和当前的工作目录拼接在一起。但在Windows系统中,文件路径一般是用反斜杠()来表示的。所以,在Windows上运行,存在文件读取漏洞。
0x2 poc
uri = '/..\..\..\..\..\1.txt'
target = "localhost:port"
r = requests.get(target+uri)
可以看到,我先是起了一个jndi服务,然后python访问,成功读取到了我F盘下的1.txt文件。
0x3总结
想必利用场景大家一下子就可以想到hvv中的溯源,与冰蝎的任意文件读取类似。不过利用场景有限,只支持windows。用这款工具的大部分都会在linux下部署,因此,利用场景应该没那么大。
原文始发于微信公众号(X安全实验室):遥遥领先! JNDIExploit反制
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论