第三方插件滲透攻擊之KingView

類別:堆溢出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天時間,仍是慢了點。

並且感受本身的大局觀還不太好,很容易沉溺於細節當中,不過這也無可厚非,畢竟仍是剛剛入門。下一次呢能夠嘗試爲調試過程分好步驟,最後再綜合起來總結思考。

相關文章
相關標籤/搜索