패킷만들기

sionchoi의 이미지

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);
}
etourist의 이미지

안녕하세요.

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]
"꿈이 있는 자는 흔들리지 않는다! "

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.