Annotation of embedaddon/libnet/sample/bgp4_open.c, revision 1.1.1.3

1.1       misho       1: /*
                      2:  *
                      3:  * libnet 1.1
                      4:  * Build a BGP4 open message with what you want as payload
                      5:  *
1.1.1.2   misho       6:  * Copyright (c) 2003 Frédéric Raynal <pappy@security-labs.org>
1.1       misho       7:  * All rights reserved.
                      8:  *
                      9:  * Examples:
                     10:  *
                     11:  *   minimal BGP OPEN message:
                     12:  *
                     13:  *   ./bgp4_open -s 1.1.1.1 -d 2.2.2.2
                     14:  *
                     15:  *   12:17:00.879139 1.1.1.1.26214 > 2.2.2.2.179: S [tcp sum ok] 
                     16:  *         16843009:16843038(29) win 32767: BGP (ttl 64, id 242, len 69)
                     17:  *   0x0000   4500 0045 00f2 0000 4006 73bc 0101 0101        E..E....@.s.....
                     18:  *   0x0010   0202 0202 6666 00b3 0101 0101 0202 0202        ....ff..........
                     19:  *   0x0020   5002 7fff ad2e 0000 0101 0101 0101 0101        P...............
                     20:  *   0x0030   0101 0101 0101 0101 001d 0104 1234 5678        .............4Vx
                     21:  *   0x0040   dead beef 00                                   .....
                     22:  *
                     23:  *   
                     24:  *   use payload as BGP option for authentication:
                     25:  * 
                     26:  *   ./bgp4_open -s 1.1.1.1 -d 2.2.2.2 -p `printf "\x01\x01\x00"` -S 3
                     27:  * 
                     28:  *   12:15:48.102808 1.1.1.1.26214 > 2.2.2.2.179: S [tcp sum ok] 
                     29:  *         16843009:16843041(32) win 32767: BGP (ttl 64, id 242, len 72)
                     30:  *   0x0000   4500 0048 00f2 0000 4006 73b9 0101 0101        E..H....@.s.....
                     31:  *   0x0010   0202 0202 6666 00b3 0101 0101 0202 0202        ....ff..........
                     32:  *   0x0020   5002 7fff a927 0000 0101 0101 0101 0101        P....'..........
                     33:  *   0x0030   0101 0101 0101 0101 0020 0104 1234 5678        .............4Vx
                     34:  *   0x0040   dead beef 0301 0100                            ........
                     35:  *
                     36:  *
                     37:  * Redistribution and use in source and binary forms, with or without
                     38:  * modification, are permitted provided that the following conditions
                     39:  * are met:
                     40:  * 1. Redistributions of source code must retain the above copyright
                     41:  *    notice, this list of conditions and the following disclaimer.
                     42:  * 2. Redistributions in binary form must reproduce the above copyright
                     43:  *    notice, this list of conditions and the following disclaimer in the
                     44:  *    documentation and/or other materials provided with the distribution.
                     45:  *
                     46:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     47:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     48:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     49:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     50:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     51:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     52:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     53:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     54:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     55:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     56:  * SUCH DAMAGE.
                     57:  *
                     58:  */
                     59: #if (HAVE_CONFIG_H)
                     60: #include "../include/config.h"
                     61: #endif
                     62: #include "./libnet_test.h"
                     63: 
                     64: int
                     65: main(int argc, char *argv[])
                     66: {
                     67:     int c;
                     68:     libnet_t *l;
                     69:     u_long src_ip, dst_ip, length;
                     70:     libnet_ptag_t t = 0;
                     71:     char errbuf[LIBNET_ERRBUF_SIZE];
                     72:     u_char *payload = NULL;
                     73:     u_long payload_s = 0;
                     74:     u_char marker[LIBNET_BGP4_MARKER_SIZE];
                     75: 
                     76:     printf("libnet 1.1 packet shaping: BGP4 open + payload[raw]\n");
                     77: 
                     78:     /*
                     79:      *  Initialize the library.  Root priviledges are required.
                     80:      */
                     81:     l = libnet_init(
                     82:             LIBNET_RAW4,                            /* injection type */
                     83:             NULL,                                   /* network interface */
                     84:             errbuf);                                /* error buffer */
                     85: 
                     86:     if (l == NULL)
                     87:     {
                     88:         fprintf(stderr, "libnet_init() failed: %s", errbuf);
                     89:         exit(EXIT_FAILURE); 
                     90:     }
                     91: 
                     92:     src_ip  = 0;
                     93:     dst_ip  = 0;
                     94:     memset(marker, 0x1, LIBNET_BGP4_MARKER_SIZE);
                     95: 
                     96:     while ((c = getopt(argc, argv, "d:s:t:m:p:S:")) != EOF)
                     97:     {
                     98:         switch (c)
                     99:         {
                    100:             /*
                    101:              *  We expect the input to be of the form `ip.ip.ip.ip.port`.  We
                    102:              *  point cp to the last dot of the IP address/port string and
                    103:              *  then seperate them with a NULL byte.  The optarg now points to
                    104:              *  just the IP address, and cp points to the port.
                    105:              */
                    106:             case 'd':
                    107:                 if ((dst_ip = libnet_name2addr4(l, optarg, LIBNET_RESOLVE)) == -1)
                    108:                 {
                    109:                     fprintf(stderr, "Bad destination IP address: %s\n", optarg);
                    110:                     exit(EXIT_FAILURE);
                    111:                 }
                    112:                 break;
                    113: 
                    114:             case 's':
                    115:                 if ((src_ip = libnet_name2addr4(l, optarg, LIBNET_RESOLVE)) == -1)
                    116:                 {
                    117:                     fprintf(stderr, "Bad source IP address: %s\n", optarg);
                    118:                     exit(EXIT_FAILURE);
                    119:                 }
                    120:                 break;
                    121: 
                    122:            case 'm':
                    123:                memcpy(marker, optarg, LIBNET_BGP4_MARKER_SIZE);
                    124:                break;
                    125: 
                    126:            case 'p':
1.1.1.3 ! misho     127:                payload = (u_char *)optarg;
1.1       misho     128:                break;
                    129: 
                    130:            case 'S':
                    131:                payload_s = atoi(optarg);
                    132:                break;
                    133: 
                    134:             default:
                    135:                 exit(EXIT_FAILURE);
                    136:         }
                    137:     }
                    138: 
                    139:     if (!src_ip || !dst_ip)
                    140:     {
                    141:         usage(argv[0]);
                    142:        goto bad;
                    143:     }
                    144: 
                    145:     if (payload_s && !payload)
                    146:     {
                    147:        payload = (u_char *)malloc(payload_s);
                    148:        if (!payload)
                    149:        {
                    150:            printf("memory allocation failed (%ld bytes requested)\n", payload_s); 
                    151:            goto bad;
                    152:        }
                    153:        memset(payload, 0x41, payload_s);
                    154:     }
                    155: 
                    156: 
                    157:     if (payload && !payload_s)
                    158:     {
1.1.1.3 ! misho     159:        payload_s = strlen((char *)payload);
1.1       misho     160:     }
                    161: 
                    162:     length = LIBNET_BGP4_OPEN_H + payload_s;
                    163:     t = libnet_build_bgp4_open(
                    164:        4,                                          /* version */   
                    165:        0x3412,                                     /* my AS */
                    166:        0x7856,                                     /* hold time */
                    167:        0xefbeadde,                                 /* BGP id */
                    168:        payload_s,                                  /* options length */
                    169:         payload,                                    /* payload */
                    170:         payload_s,                                  /* payload size */
                    171:         l,                                          /* libnet handle */
                    172:         0);                                         /* libnet id */
                    173:     if (t == -1)
                    174:     {
                    175:         fprintf(stderr, "Can't build BGP4 open header: %s\n", libnet_geterror(l));
                    176:         goto bad;
                    177:     }
                    178: 
                    179:     length+=LIBNET_BGP4_HEADER_H;
                    180:     t = libnet_build_bgp4_header(
                    181:        marker,                                     /* marker */   
                    182:        length,                                     /* length */
                    183:        LIBNET_BGP4_OPEN,                           /* message type */
                    184:         NULL,                                       /* payload */
                    185:         0,                                          /* payload size */
                    186:         l,                                          /* libnet handle */
                    187:         0);                                         /* libnet id */
                    188:     if (t == -1)
                    189:     {
                    190:         fprintf(stderr, "Can't build BGP4 header: %s\n", libnet_geterror(l));
                    191:         goto bad;
                    192:     }
                    193: 
                    194:     length+=LIBNET_TCP_H;
                    195:     t = libnet_build_tcp(
                    196:         0x6666,                                     /* source port */
                    197:         179,                                        /* destination port */
                    198:         0x01010101,                                 /* sequence number */
                    199:         0x02020202,                                 /* acknowledgement num */
                    200:         TH_SYN,                                     /* control flags */
                    201:         32767,                                      /* window size */
                    202:         0,                                          /* checksum */
                    203:         0,                                          /* urgent pointer */
                    204:        length,                                     /* TCP packet size */
                    205:         NULL,                                       /* payload */
                    206:         0,                                          /* payload size */
                    207:         l,                                          /* libnet handle */
                    208:         0);                                         /* libnet id */
                    209:     if (t == -1)
                    210:     {
                    211:         fprintf(stderr, "Can't build TCP header: %s\n", libnet_geterror(l));
                    212:         goto bad;
                    213:     }
                    214: 
                    215:     length+=LIBNET_IPV4_H;
                    216:     t = libnet_build_ipv4(
                    217:         length,                                     /* length */
                    218:         0,                                          /* TOS */
                    219:         242,                                        /* IP ID */
                    220:         0,                                          /* IP Frag */
                    221:         64,                                         /* TTL */
                    222:         IPPROTO_TCP,                                /* protocol */
                    223:         0,                                          /* checksum */
                    224:         src_ip,                                     /* source IP */
                    225:         dst_ip,                                     /* destination IP */
                    226:         NULL,                                       /* payload */
                    227:         0,                                          /* payload size */
                    228:         l,                                          /* libnet handle */
                    229:         0);                                         /* libnet id */
                    230:     if (t == -1)
                    231:     {
                    232:         fprintf(stderr, "Can't build IP header: %s\n", libnet_geterror(l));
                    233:         goto bad;
                    234:     }
                    235: 
                    236:     /*
                    237:      *  Write it to the wire.
                    238:      */
                    239:     c = libnet_write(l);
                    240:     if (c == -1)
                    241:     {
                    242:         fprintf(stderr, "Write error: %s\n", libnet_geterror(l));
                    243:         goto bad;
                    244:     }
                    245:     else
                    246:     {
                    247:         fprintf(stderr, "Wrote %d byte TCP packet; check the wire.\n", c);
                    248:     }
                    249: 
                    250:     libnet_destroy(l);
                    251:     return (EXIT_SUCCESS);
                    252: bad:
                    253:     libnet_destroy(l);
                    254:     return (EXIT_FAILURE);
                    255: }
                    256: 
                    257: void
                    258: usage(char *name)
                    259: {
                    260:     fprintf(stderr,
                    261:         "usage: %s -s source_ip -d destination_ip"
                    262:         " [-m marker] [-p payload] [-S payload size]\n",
                    263:         name);
                    264: }
                    265: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>