免责声明
由于传播、利用本公众号藏剑安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号藏剑安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉,谢谢!
朋友们现在只对常读和星标的公众号才展示大图推送,建议大家把藏剑安全“设为星标”,否则可能就看不到了啦!
最近碰到了个万户OA,是存在GeneralWeb xxe漏洞的,同时可以搭配打axis部署service。
目前看到的主要是以下几个利用,可以自行搜索下。
org.apache.axis.handlers.LogHandler
org.apache.axis.client.ServiceFactory
com.sun.script.javascript.RhinoScriptEngine
freemarker.template.utility.Execute
万户新一些的通常都搞了rasp,且万户OA通常jdk都比较低,一般情况下是满足RhinoScriptEngine jdk <= 1.7 这个条件的。
此次我首先通过utility.Execute执行命令发现只能执行ipconfig命令,其他的会抛出SecurityException异常,推测存在rasp,满足RhinoScriptEngine的条件所以还是可以玩的。
可以看到使用JDOM解析器,但没有禁止外部实体,所以产生了xxe漏洞。
又发现AdminService的enableRemoteAdmin为false,所以思路就是xxe打ssrf axis。
首先这里部署了utility.Execute service。
执行ipconfig成功,但是执行其他命令都会抛出SecurityException。
测试发现RhinoScriptEngine可用,当时看了下jdk是1.6,没截图了。
通过任意代码执行ProcessBuild发现跟utility.Execute效果是一样的,也是会抛SecurityException。
查阅文章找到一个绕rasp的命令执行代码,通过落地class与urlclassloader的方式在目标机尝试了一下,但是报错了,没保留截图,总的意思就是create参数类型不匹配,于是对比了一下jdk1.8与1.6的定义。
jdk1.8 ProcessImpl.create方法。
jdk1.6 ProcessImpl.create方法。
修改后的支持jdk 1.6的代码。
本地搭建与目标相同的jdk版本,测试通过,但是create返回的是long类型无法回显,不太方便。
查阅了一下发现也可以通过start来命令执行,它的返回类型是Process是可以做回显的。
jdk1.8 ProcessImpl.start方法。
jdk1.6 ProcessImpl.start方法。
还是有一些区别的,修改之后的代码如下。
测试也是ok的。
在目标机加载可以绕过rasp hook,并回显结果。
期间想着直接jni加载dll来绕过rasp,试了下ClassLoader.loadLibrary,但是被rasp hook了,尝试NativeLibrary.load发现jdk1.6没有这个,当时也没仔细研究。
推荐阅读
渗透实战|记一次简单的Docker逃逸+反编译jar接管云主机