類別:堆溢出html
描述:本次滲透利用了KingView6.5.3 SCADA中的ActiveX插件中存在漏洞的方法調用target.ValidateUser(arg1, arg2),經過緩衝區溢出覆蓋了SEH,再利用堆噴射成功執行payload!shell
參考資料:《Metasploit魔鬼訓練營》p261-p269windows
因爲Metasploit沒有相應的模塊,因此能夠參考exploit-db上的漏洞詳情,本身編寫代碼:api
https://www.exploit-db.com/exploits/16936/瀏覽器
咱對ruby還不是太熟悉,就先偷下懶了。直接將下載的源代碼kingview_SCADA_activeX_validateuser.rb放到exploits/windows/browser目錄下去。安全
源碼下載地址:https://community.rapid7.com/thread/1446#commentsruby
看了一下做者的描述,大概是說按照棧溢出的方式沒能成功攻擊,因此這段代碼實際上使用了堆溢出。oracle
KingView ActiveX滲透攻擊過程:工具
因爲用到ActiveX控件,因此要如今靶機ie7瀏覽器上取消activeX的一些禁用設置。具體在「工具」菜單----》Internet選項----》選擇「安全」選項卡----》選擇「自定義級別」進行設置。佈局
而後exploit就能成功植入meterpreter啦!
KingView ActiveX漏洞機理分析:
使用漏洞發佈者的POC(Proof of Concept)代碼做爲樣本,保存爲本地html,使用OllyDbg打開IE再打開這個網頁。屢次中斷就一直按f9運行,最終中斷在這條指令
(這裏和書中的地址不同,我就是不太明白爲何以前ms06_087那裏的指令地址會同樣)
03C09238 880C02 mov byte ptr [edx+eax], cl
也就是指令在向0x00130000寫入數據時發生了異常。
按alt+m能夠查看內存佈局,可見上面指令的操做已經超出棧區了,所以引起異常。
我們能夠再觀察一下出錯處的完整代碼:
實際上就是一個循環,不斷把內容複製到棧區中,直到遇到NULL字符退出循環。
我們在上圖0x03c09238處下斷點,從新運行ie加載漏洞html。
咱們複製的目的地址從0x0012DB78開始,而ebp的值爲0x0012DE58。可知緩衝區的大小爲二者相減等於0x2E0。而咱們滲透代碼中構造超長參數的部分以下:
129 junk1="A"; 130 junk2="A"; 131 while (junk1.length<624){ junk1+=junk1;} 132 junk1=junk1.substring(0,624); 133 junk2=junk1; 134 while (junk2.length<8073){ junk2+=junk2;} 135 arg2=junk1+nse+seh+nops+shell+junk2; 136 arg1="Anything"; 137 vulnerable.ValidateUser(arg1 ,arg2);
可知參數的長度大於緩衝區大小,且其中不含NULL字符,一定會形成溢出。
而經過fs:[0]能夠知道seh(struct exception handler)指針在棧區中的地址是0x0012DDE8。
按F9運行後能夠看見開始以每次1字節的速度向內存中寫入一樣的數據"A"(0x41)。那咱們給這個斷點設置個條件,讓它直接跳到覆蓋seh指針的地方:
按f9運行,到達SEH處開始進行覆蓋。從這裏開始寫入的數據就再也不是無心義的「A」了,而是複製了8個字節的特地構造的數據(即上面代碼135行中arg2參數的nse+seh),後面再繼續用0x90(即arg2參數中的nops)填充,用做堆噴射。接着是shell這個載荷,最後再用junk2即"A"填充。
最後就像前面說的棧溢出引起了異常,程序將調用seh,也就是棧區中的se handler,地址爲0x72D1204E:
在0x72D1204E處下斷點,按shift+f9跳過異常。
來到一段pop/pop/ret指令處:
觀察棧可知第三條指令retn從棧中取出0x0012DDE8放入eip並轉到該地址執行。而那裏實際上就是剛剛的棧中SEH指針處:
也就是說程序會將數據(SEH地址)當成指令來運行!
而原本應該放置下一個SEH的地方被咱們的溢出覆蓋爲909006EB。那麼相應的指令就是:
EB 06使咱們跳過了SEH指針的地址,來到了第一個90(即nop)的位置處。而後就是激動人心的heap spraying啦,一直滑行到我們的shellcode處,大功告成!
總結:加深了對堆棧的理解,因爲上次oracle漏洞分析沒有作成功,因此經過此次實驗才比較瞭解了覆蓋SEH的滲透方法,其中較特別的一點是讓程序將數據當作代碼執行。除此以外,還學習使用了條件斷點,以及用shift+f7/f8/f9來跳過異常的技巧。花了大概2天時間,仍是慢了點。
並且感受本身的大局觀還不太好,很容易沉溺於細節當中,不過這也無可厚非,畢竟仍是剛剛入門。下一次呢能夠嘗試爲調試過程分好步驟,最後再綜合起來總結思考。