一级毛片免费不卡在线视频,国产日批视频免费在线观看,菠萝菠萝蜜在线视频免费视频,欧美日韩亚洲无线码在线观看,久久精品这里精品,国产成人综合手机在线播放,色噜噜狠狠狠综合曰曰曰,琪琪视频

推薦:冷眼Wins遠(yuǎn)程溢出漏洞 -電腦資料

電腦資料 時間:2019-01-01 我要投稿
【www.oriental01.com - 電腦資料】

    十一月底,Immunitysec公開了一個WINS的遠(yuǎn)程安全漏洞,入侵者可利用該漏洞完全控制運(yùn)行著WINS服務(wù)的系統(tǒng),

推薦:冷眼Wins遠(yuǎn)程溢出漏洞

。其實這個漏洞早就被發(fā)現(xiàn)而且在地下流傳已久,不過是最近才公布而已。就其公布的原因,估計是因為這個漏洞有趣,而且造成的影響不是很大吧。漏洞本身的特性決定了這個漏洞的利用可以有多種路子,讓攻擊者使用不同的方法來獲得遠(yuǎn)程控制權(quán),也許就是Immunitysec公開這個漏洞的初衷。不過微軟對這個漏洞很敏感,沒有發(fā)布補(bǔ)丁,因為說自己沒有收到攻擊報文,所以,本文只是詳細(xì)的分析了整個漏洞的構(gòu)造、利用,并未給出具體的利用程序和代碼,相信讀過我們系列文章“菜鳥版Expliot指南”的朋友應(yīng)該都有能力寫上一段自己的代碼吧?

    冷眼Wins遠(yuǎn)程溢出漏洞

    文/圖 馬木留克

    關(guān)于這個漏洞的描述,比較官方的描述是這樣的:WINS服務(wù)支持一個稱之為“WINS 復(fù)制”的特性,不同的WINS服務(wù)器可以靠這個功能交換信息。WINS復(fù)制使用的也是監(jiān)聽在TCP 42端口上的標(biāo)準(zhǔn)WINS協(xié)議。在WINS復(fù)制的會話過程中,服務(wù)器端會發(fā)送一個內(nèi)存指針給客戶端,客戶端用這個指針進(jìn)行后續(xù)的會話。如果客戶端在發(fā)送的數(shù)據(jù)中自己修改這個指針,使之指向用戶控制的數(shù)據(jù),最終就可以向任意地址寫入16個字節(jié)的數(shù)據(jù),通過覆蓋特殊地址可以執(zhí)行任意代碼。

    對于攻擊者而言,了解其中的細(xì)節(jié)非常必要。通過這一個描述,大致上我們已經(jīng)可以了解到,這不是一個典型的堆或者棧上的溢出,而是WINS用我們指定的一個數(shù)據(jù)作為指針,進(jìn)行了一些操作,最終導(dǎo)致可以寫16個字節(jié)的數(shù)據(jù)到任意地址——對于大多數(shù)情況而言,能寫16個字節(jié)的數(shù)據(jù)就已經(jīng)足夠了,典型的堆溢出甚至只需要寫4個字節(jié)的數(shù)據(jù),這個條件還是很寬松的。通過進(jìn)一步的分析,我們還可以知道,這里的“16個字節(jié)”是指連續(xù)的16個字節(jié),更為重要的是,WINS服務(wù)處理異常的機(jī)制非常的強(qiáng)勁,在你提交惡意的代碼造成漏洞利用之后,WINS服務(wù)不會掛掉,而是繼續(xù)的運(yùn)行,這就意味著我們可以反復(fù)地進(jìn)行“寫連續(xù)的16字節(jié)”。試想一下,我們可以反復(fù)的嘗試直到成功為止,這個過程中WINS服務(wù)不會因為我們的惡意攻擊而出現(xiàn)停止的情況。

    在反匯編WINS服務(wù)的守護(hù)進(jìn)程之前,我們可以想象一下各種可能的利用方式。按照Immunitysec的說法,惡意用戶提交的數(shù)據(jù)是在堆上的,這就非常類似于遠(yuǎn)程堆溢出,加上可以寫任意值到任意的地址,可以想象,幾乎所有的堆溢出利用方式都可以應(yīng)用到這上面來。最常用的,寫top seh,然后看能不能通過寄存器來定位;其次,我們可以嘗試寫Lookaside表,通過多次發(fā)包來強(qiáng)制定位自己的ShellCode地址,然后通過改寫RtlEnterCriticalSection(0x7ffdf020)等固定的函數(shù)指針來獲得控制權(quán);再直接一點,既然可以多次觸發(fā)而服務(wù)不崩潰,那反復(fù)利用這個漏洞,直接寫ShellCode到一塊固定的內(nèi)存(比如0x7ffdf222)去,繼而通過改寫固定的函數(shù)指針來獲得控制權(quán)也是一條路子。總之,漏洞本身的特性決定了這個漏洞的利用可以有多種路子,讓攻擊者使用不同的方法來獲得遠(yuǎn)程控制權(quán),也許就是Immunitysec公開這個漏洞的初衷吧。

    Immunity在公布漏洞的同時,公布了觸發(fā)漏洞的報文格式,如表1所示:

    報文長度(除頭部4字節(jié))

    XX XX FF XX

    四字節(jié)指針(絕對地址)

    …… …… …… ……

    (表1)

    其中報文的長度要小于0x2f87f8。報文本身沒有什么其它特殊的要求,滿足上述格式的都可以觸發(fā)漏洞。報文中的第三個DOWRD就是一個我們可以控制的指針,因此,我們可以設(shè)定這個指針指向我們發(fā)送的報文本身所在的地方,進(jìn)而控制隨后依據(jù)這個指針的內(nèi)存讀寫。

    在一臺Windows 2000 Server SP3 + MS04006補(bǔ)丁的機(jī)器上,反匯編Wins.exe可以得到如下的代碼:

    .text:0101FE34 sub_101FE34    proc near              ; CODE XREF: sub_101FD13+2A p

    .text:0101FE34

    .text:0101FE34 var_84         = dword ptr -84h

    ... ..

    .text:0101FE34 arg_4          = dword ptr 0Ch

    .text:0101FE34 arg_8          = dword ptr 10h

    .text:0101FE34 arg_C          = dword ptr 14h

    ... ...

    .text:0101FE64                mov    ebx, [ebp+arg_4]; 指向提交數(shù)據(jù)的指針

    .text:0101FE67                mov    al, [ebx+2]    ; Flag的第三個字節(jié)

    .text:0101FE6A                mov    cl, al

    .text:0101FE6C                and    cl, 78h

    .text:0101FE6F                cmp    cl, 78h       ; 和0x78與操作,這里必須跳轉(zhuǎn)

    .text:0101FE72                jz     loc_101FF07

    ... ...(中間三個跳轉(zhuǎn))

    .text:010200F6                push   eax            ; 可以控制的指針A

    .text:010200F7                lea    ecx, [eax+50h]

    .text:010200FA                push   ecx            ; 指針A + 50h

    .text:010200FB                push   dword ptr [eax+44h]

    .text:010200FE                push   [ebp+arg_8]    ; 數(shù)據(jù)的長度(報文頭)

    .text:01020101                push   [ebp+arg_4]    ; 指向提交數(shù)據(jù)的指針

    .text:01020104                call   sub_1020610

    ... ...

    .text:01020638                xor    ebx, ebx       ; ebx置零

    .text:01020640                mov    eax, [ebp+arg_10] ; 指針A

    .text:01020643                cmp    eax, ebx       ; 是否為合法地址(not NULL)

    .text:01020645                jnz    loc_10206CC    ; 合法

    ... ...

    .text:010206CC                mov    ecx, [eax+2Ch] ; 指針A+2C地址的內(nèi)容

    .text:010206CF                mov    [ebp+var_20], ecx

    .text:010206D2                lea    edi, [ecx+48h] ; 拷貝的源地址

    .text:010206D5                mov    esi, [ebp+arg_C]; 目的地址A+44地址的內(nèi)容

    .text:010206D8                movsd              ; 十六字節(jié)的寫操作,源/目的可控

    .text:010206D9                movsd

    .text:010206DA                movsd

    .text:010206DB                movsd

    可以看到提交報文中第三個DOWRD指針指向的內(nèi)容最終進(jìn)行了一系列的寫操作,

電腦資料

推薦:冷眼Wins遠(yuǎn)程溢出漏洞》(http://www.oriental01.com)。如果以Where表示寫操作的目的(esi),What表示寫操作的數(shù)值(edi),簡化后這個指針指向如下所示的結(jié)構(gòu)如表2所示:

    where – 48h (lea  edi, [ecx+48h])  offset:0h

    … … … … … … … … … … … …

    what * 4  (4個DOWRD)        offset:24h

    (表2)

    精心控制發(fā)送報文中的指針的值,最后可以寫四個DWORD。我們可以猜測我們發(fā)送的報文的大概位置,然后設(shè)定這個指針,那么,WINS就會把我們報文中的數(shù)字寫到報文中指定的位置去。提交報文的長度可以很長(前面說了,只要小于0x2f87f8都是可以的),所以我們猜測起來還是比較方便,關(guān)鍵是這個指針指向的內(nèi)容必須符合一定結(jié)構(gòu)(見上表),一個比較好的方式是按照如下的結(jié)構(gòu)指定我們發(fā)送報文中的內(nèi)容(如表3所示)。

    Where – 48h (DWORD) * 9

    What * 4 (4個DWORD) * 9

    (表3)

    這樣,我們只要大量的填充上述結(jié)構(gòu),就可以提高成功率——只要有一次猜測的指針指向數(shù)據(jù)塊的位置是Where(連續(xù)九個為一組)就算成功。內(nèi)存中大量的上述結(jié)構(gòu),加上這里堆分配的一些特性,最差情況下猜37次就可以猜到一個(連須36次都指針都猜到了What上),這個成功率還是可以接受的。從測試的情況來看,觸發(fā)這個漏洞后極有可能導(dǎo)致堆內(nèi)存沒有正確釋放,一個可能的利用辦法就是先發(fā)送由一個大量上述結(jié)構(gòu)填充的報文,設(shè)定指針指向一個會造成異常的地址(比如0xffffffff,但不能是0x0,WINS里面判斷過這種情況),讓這塊內(nèi)存不釋放,然后后面都發(fā)小包來暴力猜測地址,從而準(zhǔn)確的控制寫入的源和目的地址。

    好不容易才解決了寫16字節(jié)到任意地址的方式,那么要寫什么東西到哪里去呢?前面說過一些類似于堆利用的方法,可以去試試看,寫出來的東西通用性應(yīng)該很好,下面嘗試的是另外一種方法。

    要獲得控制權(quán)就要想辦法讓程序執(zhí)行到我們所指定的位置去。一般來說寫一個程序會調(diào)用的函數(shù)指針是最好,如果不行的話也可以考慮寫棧上的返回地址。上面的反匯編中,sub_1020610是導(dǎo)致寫16字節(jié)的函數(shù),這個函數(shù)并沒有異常,我們可以考慮在這個地方先下一個斷點,繼續(xù)跟蹤一直到有Ret的出現(xiàn)。Ret的意義在于把棧頂?shù)臄?shù)據(jù)作為返回值,也就是[ESP]->EIP,我們要是能夠找準(zhǔn)當(dāng)時棧頂?shù)奈恢萌缓蟾采w掉,就可以準(zhǔn)確地控制程序的流向。

    那么,讓程序流向何處呢?當(dāng)然是我們的ShellCode。我們的ShellCode可以隨報文一塊兒送過去,所以在堆上一定能找到一份拷貝。報文已經(jīng)有了大量的如表3所定義的結(jié)構(gòu),然后在報文的最后寫入ShellCode,中間可用大量的NOPs來填充。在猜指針的時候我們就大致的猜到了堆所在的地址,所以根據(jù)猜測的地址來定位ShellCode也是可以的。這樣子,把堆上ShellCode的地址寫到棧上函數(shù)的返回地址就可以獲得控制權(quán)了。這一步可能也需要暴力猜解,因為棧上的返回地址可能并不確定。

    在測試的過程中,我們發(fā)現(xiàn)棧上返回地址的位置幾乎是固定的,都是0x53df4c4,在對近70臺機(jī)器的測試中,約有半數(shù)以上這個地址都是有效的。所以如果不打算寫復(fù)雜的程序暴力猜測,這個地址就足夠了。測試中涉及到了中文版幾乎所有SP和MS04006補(bǔ)丁的情況,可見這個還是有一定的通用性的。倘若只是玩票性質(zhì)的寫寫EXP,可以直接設(shè)置Where的值為0x53df4c4 – 48h。

    同樣的,在上述的測試過程中,我們發(fā)現(xiàn)第一個發(fā)送過去的報文總是拷貝到一個固定的位置,如果用表三所示的數(shù)據(jù)結(jié)構(gòu)來填充報文,那么這個數(shù)據(jù)結(jié)構(gòu)第一次出現(xiàn)的位置幾乎都固定在0x05391eac。這個幾率大概是八成左右,偶爾的失敗情況不詳,但是有一點可以肯定的是,如果你造成了異常而導(dǎo)致堆沒有被正確釋放,那么后續(xù)報文被拷貝到的地址肯定在這之后。

    有了上述兩個地址,要寫一個成功率一般的利用程序已經(jīng)不難,按照上面的報文格式,設(shè)定四字節(jié)的指針為0x05391eac,然后填充一個圖三所示的結(jié)構(gòu),里面Where都填充為固定的棧上的函數(shù)返回地址0x53df4c4 – 48h,所有的What都填上我們猜測的一個大概的ShellCode的位置(比如0x05392000),接下來填充大約0x200個NOPs也就是0x90,然后加上一個任意的ShellCode,把這個報文發(fā)送到目標(biāo)主機(jī)的TCP 42口,就有很大的可能性獲得對方的控制權(quán)了。如果你的ShellCode不是以ExitProcess(0)結(jié)束的,那么你還可以反復(fù)的利用這個漏洞來獲得控制權(quán),只是每次的結(jié)果用的都是第一次發(fā)送的ShellCode——堆內(nèi)存沒有被釋放而且我們猜測的是第一次發(fā)送的地址,如果你用的是Bind port的,那還好,如果是Reverse過來的那就麻煩了,別人要是搶先一步,用這種方法就算成功了你也沒有機(jī)會的。

    至于其它的利用方式,說實話寫RtlEnterCriticalSection不太穩(wěn)定,暴力猜解可是可以,還是麻煩了一點,不知道有沒有其他的利用方式。表面上看起來難以利用的漏洞公布出來,沒有0day的利用方法怎么也說不過去,只有看看以后是否有好的方法公布出來了。

    關(guān)于這個漏洞的危害,報告也說明了,理論上來說對于所有開放了WINS服務(wù)(簡單的用TCP端口42來判斷)的Windows NT、Windows 2000、Windows 2003都有危險,在這個補(bǔ)丁沒有出來的時候,最好還是把WINS服務(wù)關(guān)掉,或者用防火墻一類濾掉所有指向TCP42的報文。也就是因為漏洞沒有出補(bǔ)丁就公開了這件事情,據(jù)說微軟搞得很惱火(微軟12月1日報告稱沒有收到受此漏洞攻擊的報告,這簡直是笑話,EXP是很容易寫的,至少可以弄個不怎么通用的出來,我才不相信沒有受到攻擊,最多是沒有報告罷了),頂著風(fēng)頭外面誰也不敢給出利用程序來。同樣的,老獨物WTF雖然也很期盼,但估計沒這個膽把利用程序放到光盤里面去,大家要爽估計只有等到微軟出了補(bǔ)丁后再放出利用程序來了,據(jù)說一月份就會出補(bǔ)丁,那么最快二月份可能就可以得到EXP。至于稍微懂行一點的朋友,想必都已經(jīng)寫出來了,有興趣的的朋友也可以按照上面說的方法來寫一個出來,我已經(jīng)說得很清楚很明顯了,不是么?

最新文章