"本故事纯虚构,如有雷同,纯属巧合"
忙活到晚上十点多,好多辛酸
正文
消息框闪烁,是领导丢过来一个exe
“审一下,只要RCE”
打开虚拟机,安装过程很傻瓜,下一步下一步就可,心想审完晚上就可以去吃很久以前了,很可惜,license过期了。按照之前的思路,尝试修改了服务器时间,还是不太行。
还好应用是运行在tomcat之上,tomcat报错日志很完整,可以准确定位到lincense校验逻辑
将jar放到本地idea,反编译后,做了一些混淆操作,看起来不太友好。因为是Tomcat的项目,先配置调试一波,by the way,因为是启动时做的license校验,需要使用LIsten to remote JVM的方式调试,且参数suspend需设置为y
set CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=10010
因为加了一些防反编译的措施,所以正常的调试也遇到了很多问题,行号不对应,断点只能下到方法上,凑活看吧,不过根据类名以及全局搜索License关键字,还是勉强可以定位到check逻辑
首先尝试直接将getLicense 全部清除,直接new 一个新的
太暴力了,Tomcat启动报错,访问哪个页面都是500
然后尝试构造License这个类,这里又遇到了混淆的坑,License类里面套了多个ilililililililll类,这个类不可读,放弃了。
再从头调试,虽然只能端到方法上,但是死盯着debugg框,发现了一组base64数据,解密出来长这个样子,毫无疑问就是那个过期的license解密出来的数据了
这时候我们换个思路,尝试调用加密逻辑伪造license
首先寻找license的源文件,在安装目录的conf下,找到了license.xml 长得样子很像license,里面有签名 有效实现等参数
然后再去代码中查找相关解密函数
我先将断点下到了解密函数中,尝试很多次都停不下来,直接停到解密后的数据
沉思.....将断点下到配置文件加载处,license.xml确实是被加载到jvm中....
只能硬着头皮本地直接调用了
将修改后的lincese.xml放到虚拟机中,还是无效.....陷入僵局.....
只能在从头跟代码了,期间注意到启动时加载了很多配置文件,一个个去翻,皇天不负有心人,翻到一个css文件夹下的文件时,突然兴奋了起来,里面是一串base64编码后的数据
直接解码后正是上述debug中的license,真狗,原来根本没调用加密解密逻辑。不过后面还跟了一串签名校验,此时已经跟了很多代码,代码比较熟悉了,直接就定位到了签名校验处:
注释掉校验逻辑,再改一下license,有效期到2099年,放上去,大功告成!