原文链接:【新手入门系列】 一步一步教你漏洞挖掘之如何在半黑盒模式下挖掘RCE漏洞
引言
很久很久以前,在闲暇之余研究了一下某系统,通过下载客户端,在半黑盒模式下挖掘出一个JNDI注入漏洞。漏洞本身并不复杂,但是分析漏洞的过程可能对初学者有一定帮助,所以这里分享给大家,大佬请绕道。
客户端安装
通过访问服务端,可以下载到该系统的客户端软件UClient.exe,下载后直接进行安装。
在安装过程中,会自动下载安装JRE7u51的支撑环境,并在磁盘上创建一些文件夹。
漏洞分析
在分析客户端程序时,定位到启动配置文件`client.esc`,可以修改配置,加入jdwp远程调试。
客户端启动入口:
分析过程中,定位文件`\NCCACHE\CODE\resources\server.properties`:
通过尝试发现`JavaURLCommunicator`类主要用于向服务器发送HTTP请求。
关注下发送的封装对象`InvocationInfo`:
从类的参数中可以看出,该类可能用于封装与HTTP发包相关的过程。回到request函数:
重点看下这个地方:
客户端对封装的`InvocationInfo`对象进行序列化操作,然后发送给服务端。虽然没有拿到服务端代码,但是可以猜测在服务端应该存在一个反序列化操作。
研究了一会后,观察日志文件:
客户端通过lookup发送了大量JNDI请求。此时可以猜想服务端可能也存在同样操作,联想到前面分析的`JavaURLCommunicator`类`request`函数可以向服务端发送HTTP请求,其中两个参数分别是服务端URL以及`InvocationInfo`对象,尝试构造如下请求:
在处理来自服务端返回数据包的`result`处打下断点:
猜测服务端确实应该存在`lookup`操作,修改发包测试程序:
- import nc.bs.framework.common.InvocationInfo;
- import nc.bs.framework.comn.cli.JavaURLCommunicator;
- public class Test {
- public static void main(String[]args)throws Exception{
- InvocationInfo info=new InvocationInfo();
- info.setServiceName("test");
- JavaURLCommunicator com=new JavaURLCommunicator();
- String url="http://***/ServiceDispatcherServlet";
- com.request(info,url);
- }
- }
复制代码 结果如下:
更加证明了上面的猜想,继续构造JNDI服务:
漏洞验证成功。由于默认的JDK版本为JDK7u51,可利用LDAP方式实现RCE。
|