패킷만들기
글쓴이: sionchoi / 작성시간: 화, 2003/01/21 - 9:33오후
fragmentation overlap 공격에 사용할 패킷을 만들려고 합니다..
두번째 패킷의 오프셋을 변경하여 첫번째 패킷에 덮어쓰려고 하는데 이런 malformed packet을 만들려고 합니다..
아래의 소스에서 iphdr->offset 이런식으로 fragmentation과 관련된 부분을 추가하면 될까요..음..
제가 네트워크 프로그래밍 초보라서..
조언 부탁드립니다..
#include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netinet/in_systm.h> #include <netinet/ip.h> #include <netinet/ip_icmp.h> #if defined(SOLARIS_CKSUM_BUG) #include <netinet/tcp.h> #endif #include <strings.h> #include <unistd.h> #if !defined(HAVE_INCKSUM) #include <checksum.h> #endif #if !defined(IPVERSION) #define IPVERSION 4 /* Incase some system does not have this definition. */ #endif /* We'll always be using 4 as the version anyway. */ #if !defined(LINUX) #define BUFFSIZE (sizeof(struct icmp) + sizeof(struct ip)) #else #define BUFFSIZE (sizeof(struct icmphdr) + sizeof(struct iphdr)) #endif int main(int argc,char *argv[]) { #if !defined (LINUX) struct icmp *icmphdr; struct ip *iphdr; #else struct icmphdr *icmphdr; struct iphdr *iphdr; #endif unsigned char buff[BUFFSIZE]; int sockd; struct sockaddr_in mysocket; int on = 1; if(argc < 3) { fprintf(stderr,"usage: %s source-ip dest-ip\n",argv[0]); exit(-1); } if((sockd = socket(AF_INET,SOCK_RAW,IPPROTO_RAW)) < 0) { perror("socket"); exit(-1); } if(setsockopt(sockd,IPPROTO_IP,IP_HDRINCL,(char *)&on,sizeof(on)) < 0) { perror("setsockopt"); exit(-1); } #if !defined(LINUX) iphdr = (struct ip *)buff; bzero((char *)iphdr,sizeof(struct ip)); iphdr->ip_hl = 5; iphdr->ip_v = IPVERSION; #ifdef IP_LEN_HORDER iphdr->ip_len = (sizeof(struct ip) + sizeof(struct icmp)); #else iphdr->ip_len = htons(sizeof(struct ip) + sizeof(struct icmp)); #endif iphdr->ip_id = htons(getpid()); iphdr->ip_ttl = 60; iphdr->ip_p = IPPROTO_ICMP; iphdr->ip_src.s_addr = inet_addr(argv[1]); iphdr->ip_dst.s_addr = inet_addr(argv[2]); iphdr->ip_sum = (unsigned short)in_cksum((unsigned short *)iphdr, sizeof(struct ip)); icmphdr = (struct icmp *)(buff + sizeof(struct ip)); bzero((char *)icmphdr,sizeof(struct icmp)); icmphdr->icmp_type = ICMP_ECHO; icmphdr->icmp_seq = getpid(); icmphdr->icmp_id = getpid(); icmphdr->icmp_cksum = in_cksum((unsigned short *)icmphdr,sizeof(struct icmp)); #else iphdr = (struct iphdr *)buff; bzero((char *)iphdr,sizeof(struct iphdr)); iphdr->ihl = 5; iphdr->version = IPVERSION; #ifdef IP_LEN_HORDER iphdr->tot_len = (sizeof(struct iphdr) + sizeof(struct icmphdr)); #else iphdr->tot_len = htons(sizeof(struct iphdr) + sizeof(struct icmphdr)); #endif iphdr->id = htons(getpid()); iphdr->ttl = 60; iphdr->protocol = IPPROTO_ICMP; iphdr->saddr = inet_addr(argv[1]); iphdr->daddr = inet_addr(argv[2]); iphdr->check = in_cksum((unsigned short *)iphdr,sizeof(struct iphdr)); icmphdr = (struct icmphdr *)(buff +sizeof(struct iphdr)); bzero((char *)icmphdr,sizeof(struct icmphdr)); icmphdr->type = ICMP_ECHO; icmphdr->un.echo.sequence = getpid(); icmphdr->un.echo.id = getpid(); icmphdr->checksum = in_cksum((unsigned short *)icmphdr, sizeof(struct icmphdr)); #endif /* LINUX */ bzero((char *)&mysocket,sizeof(mysocket)); mysocket.sin_family = AF_INET; mysocket.sin_addr.s_addr = inet_addr(argv[2]); if(sendto(sockd,(char *)buff,sizeof(buff),0x0, (struct sockaddr *)&mysocket,sizeof(mysocket)) < 0) { perror("sendto"); exit(-1); } exit(0); }
Forums:
Fragmentation Overlap Attack
안녕하세요.
Fragmentation Overlap 공격은 Network 레벨에서 하나의 메시지가 두개정도로 쪼개져서 전송될 경우, 두번째 조각을 첫번째 조각의 바로 뒤가 아니라, 적당한 부위가 Overlap 되도록 붙여서 원하는 결과를 얻도록 하는 기법이죠.
일반적으로 첫번째 조각에는 합법한 포트 번호(ex 80)를 넣어 전송하고, 두번째 조각(여기에 대해선 포트번호 검사가 수행되지 않습니다. 수행될 수 없는거죠. TCP 헤더 정보는 첫번째 조각에 붙어서 전송되었으므로)
이 첫번째 조각의 포트 번호 위치부터 Overlap되어 파이어월이 불허하는 포트번호(ex 9900)로 접근할 수 있는 용도 등으로 사용하는 걸로 알고 있습니다.
이러한 것을 시뮬레이션하고자 한다면,
우선 RAW 소켓을 만들면 됩니다. 그리고 IP, TCP 헤더를 알맞게 채워넣습니다.
struct iphdr의 ip_id, ip_off 값이 중요합니다.
첫번째 조각을 만들때에는 ip_id = 1, ip_off = 0로 설정하고, ip_off |= IP_MF 식으로 More fragment bit를 킵니다.
그리고 TCP 헤더를 붙여야겠죠.
두번째 조각을 만들때에는 ip_id = 1 로 설정하고, ip_off 의 값은 첫번째 조각에서 IP 헤더를 제외한, TCP port 정보가 나오기 직전까지의 길이를 8 byte 단위로 표현한 값(예를 들어 길이가 56byte이면 ip_off는 56/8 = 7)이 저장되면 될 것입니다.
이렇게 하고, 나머지 데이터에는 TCP 헤더의 port 부터의 정보를 넣습니다.
자세한 내용은 TCP/IP Illustrated vol1, 2 를 참고하시면 원하는 정보를 거의다 찾아내실수 있을 듯. ^^; :lol:
[url]http://ldk.sarang.net [/url]
"꿈이 있는 자는 흔들리지 않는다! "
댓글 달기