Annotation of embedaddon/libnet/sample/sebek.c, revision 1.1
1.1 ! misho 1: /*
! 2: *
! 3: * libnet 1.1
! 4: * Build a Sebek packet
! 5: *
! 6: * Copyright (c) 2004 Frederic Raynal <pappy@security-labs.org>
! 7: * All rights reserved.
! 8: *
! 9: * Redistribution and use in source and binary forms, with or without
! 10: * modification, are permitted provided that the following conditions
! 11: * are met:
! 12: * 1. Redistributions of source code must retain the above copyright
! 13: * notice, this list of conditions and the following disclaimer.
! 14: * 2. Redistributions in binary form must reproduce the above copyright
! 15: * notice, this list of conditions and the following disclaimer in the
! 16: * documentation and/or other materials provided with the distribution.
! 17: *
! 18: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
! 19: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 20: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 21: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
! 22: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 23: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 24: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 25: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 26: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 27: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 28: * SUCH DAMAGE.
! 29: *
! 30: */
! 31:
! 32: #if (HAVE_CONFIG_H)
! 33: #if ((_WIN32) && !(__CYGWIN__))
! 34: #include "../include/win32/config.h"
! 35: #else
! 36: #include "../include/config.h"
! 37: #endif
! 38: #endif
! 39: #include "./libnet_test.h"
! 40:
! 41: void usage(char *name)
! 42: {
! 43: fprintf(stderr,
! 44: "usage: %s [-D eth_dst] [-s source_ip] [-d destination_ip]"
! 45: "[-u UDP port] [-m magic] [-v version] [-t type] [-S sec] [-U usec] [-P PID] [-I UID] [-f FD] [-c cmd]"
! 46: " [-i iface] [-p payload]\n",
! 47: name);
! 48:
! 49: }
! 50:
! 51:
! 52: int
! 53: main(int argc, char *argv[])
! 54: {
! 55: int c, port = 1101;
! 56: libnet_t *l;
! 57: char *device = NULL;
! 58: char *eth_dst = "11:11:11:11:11:11";
! 59: char *dst = "2.2.2.2", *src = "1.1.1.1";
! 60: u_long src_ip, dst_ip;
! 61: char errbuf[LIBNET_ERRBUF_SIZE];
! 62: libnet_ptag_t ptag = 0;
! 63: u_char *payload = 0;
! 64: char payload_flag = 0;
! 65: u_long payload_s = 0;
! 66: unsigned int magic = 0x0defaced,
! 67: counter = 0x12345678,
! 68: sec = 0, usec = 0,
! 69: pid = 1,
! 70: uid = 666,
! 71: fd = 2;
! 72: char *cmd = "./h4ckw0r1D";
! 73: unsigned int length = strlen(cmd)+1;
! 74: unsigned short version = SEBEK_PROTO_VERSION, type = SEBEK_TYPE_READ;
! 75:
! 76: printf("libnet 1.1 packet shaping: Sebek[link]\n");
! 77:
! 78:
! 79: /*
! 80: * handle options
! 81: */
! 82: while ((c = getopt(argc, argv, "D:d:s:u:m:v:t:S:U:P:I:f:c:p:i:h")) != EOF)
! 83: {
! 84: switch (c)
! 85: {
! 86: case 'D':
! 87: eth_dst = optarg;
! 88: break;
! 89: case 'd':
! 90: dst = optarg;
! 91: break;
! 92:
! 93: case 's':
! 94: src = optarg;
! 95: break;
! 96:
! 97: case 'i':
! 98: device = optarg;
! 99: break;
! 100:
! 101: case 'u':
! 102: port = atoi(optarg);
! 103: break;
! 104:
! 105: case 'm':
! 106: magic = strtoul(optarg, NULL, 10);
! 107: break;
! 108:
! 109: case 'v':
! 110: version = (unsigned short) strtoul(optarg, NULL, 10);
! 111: break;
! 112:
! 113: case 't':
! 114: type = (unsigned short) strtoul(optarg, NULL, 10);
! 115: break;
! 116:
! 117: case 'S':
! 118: sec = strtoul(optarg, NULL, 10);
! 119: break;
! 120:
! 121: case 'U':
! 122: usec = strtoul(optarg, NULL, 10);
! 123: break;
! 124:
! 125: case 'P':
! 126: pid = strtoul(optarg, NULL, 10);
! 127: break;
! 128:
! 129: case 'I':
! 130: uid = strtoul(optarg, NULL, 10);
! 131: break;
! 132:
! 133: case 'f':
! 134: fd = strtoul(optarg, NULL, 10);
! 135: break;
! 136:
! 137: case 'c':
! 138: cmd = optarg;
! 139: length = strlen(cmd);
! 140: break;
! 141:
! 142:
! 143: case 'p':
! 144: payload_flag = 1;
! 145: payload = optarg;
! 146: payload_s = strlen(payload);
! 147: break;
! 148:
! 149: case 'h':
! 150: usage(argv[0]);
! 151: exit(EXIT_SUCCESS);
! 152:
! 153: default:
! 154: exit(EXIT_FAILURE);
! 155: }
! 156: }
! 157:
! 158:
! 159: /*
! 160: * Initialize the library. Root priviledges are required.
! 161: */
! 162: l = libnet_init(
! 163: LIBNET_LINK_ADV, /* injection type */
! 164: device, /* network interface */
! 165: errbuf); /* error buffer */
! 166:
! 167: if (l == NULL)
! 168: {
! 169: fprintf(stderr, "libnet_init() failed: %s", errbuf);
! 170: exit(EXIT_FAILURE);
! 171: }
! 172:
! 173: printf("Using device %s\n", l->device);
! 174:
! 175: if (payload_flag)
! 176: {
! 177: memset(cmd, 0, sizeof(cmd));
! 178: memcpy(cmd, payload, (payload_s < 12 ? payload_s : 12));
! 179: length = payload_s;
! 180: }
! 181:
! 182:
! 183: if ((dst_ip = libnet_name2addr4(l, dst, LIBNET_RESOLVE)) == -1)
! 184: {
! 185: fprintf(stderr, "Bad destination IP address: %s\n", dst);
! 186: exit(EXIT_FAILURE);
! 187: }
! 188:
! 189: if ((src_ip = libnet_name2addr4(l, src, LIBNET_RESOLVE)) == -1)
! 190: {
! 191: fprintf(stderr, "Bad source IP address: %s\n", src);
! 192: exit(EXIT_FAILURE);
! 193: }
! 194:
! 195: if (!payload)
! 196: {
! 197: payload = cmd;
! 198: payload_s = length;
! 199: }
! 200:
! 201:
! 202: ptag = libnet_build_sebek(
! 203: magic,
! 204: version,
! 205: type,
! 206: counter,
! 207: sec,
! 208: usec,
! 209: pid,
! 210: uid,
! 211: fd,
! 212: cmd,
! 213: /* LIBNET_ETH_H + LIBNET_IPV4_H + LIBNET_UDP_H + LIBNET_SEBEK_H +*/ length,
! 214: payload,
! 215: payload_s,
! 216: l,
! 217: 0
! 218: );
! 219:
! 220: if (ptag == -1)
! 221: {
! 222: fprintf(stderr, "Can't build Sebek header: %s\n", libnet_geterror(l));
! 223: goto bad;
! 224: }
! 225:
! 226: ptag = libnet_build_udp(
! 227: port, /* source port */
! 228: port, /* destination port */
! 229: LIBNET_UDP_H + LIBNET_SEBEK_H + payload_s, /* packet length */
! 230: 0, /* checksum */
! 231: NULL, /* payload */
! 232: 0, /* payload size */
! 233: l, /* libnet handle */
! 234: 0); /* libnet id */
! 235:
! 236: if (ptag == -1)
! 237: {
! 238: fprintf(stderr, "Can't build UDP header: %s\n", libnet_geterror(l));
! 239: goto bad;
! 240: }
! 241:
! 242: ptag = libnet_build_ipv4(
! 243: LIBNET_IPV4_H + LIBNET_UDP_H + LIBNET_SEBEK_H + payload_s,/* length */
! 244: 0, /* TOS */
! 245: 242, /* IP ID */
! 246: 0, /* IP Frag */
! 247: 64, /* TTL */
! 248: IPPROTO_UDP, /* protocol */
! 249: 0, /* checksum */
! 250: src_ip, /* source IP */
! 251: dst_ip, /* destination IP */
! 252: NULL, /* payload */
! 253: 0, /* payload size */
! 254: l, /* libnet handle */
! 255: 0); /* libnet id */
! 256:
! 257: if (ptag == -1)
! 258: {
! 259: fprintf(stderr, "Can't build IP header: %s\n", libnet_geterror(l));
! 260: exit(EXIT_FAILURE);
! 261: }
! 262:
! 263:
! 264: eth_dst = libnet_hex_aton(eth_dst, &c);
! 265: ptag = libnet_autobuild_ethernet(
! 266: eth_dst, /* ethernet destination */
! 267: ETHERTYPE_IP, /* protocol type */
! 268: l); /* libnet handle */
! 269:
! 270: free(eth_dst);
! 271: if (ptag == -1)
! 272: {
! 273: fprintf(stderr, "Can't build ethernet header: %s\n",
! 274: libnet_geterror(l));
! 275: goto bad;
! 276: }
! 277:
! 278:
! 279: /*
! 280: * write to the wire
! 281: */
! 282: c = libnet_write(l);
! 283: if (c == -1)
! 284: {
! 285: fprintf(stderr, "Write error: %s\n", libnet_geterror(l));
! 286: goto bad;
! 287: }
! 288: else
! 289: {
! 290: fprintf(stderr, "Wrote %d byte Sebek packet; check the wire.\n", c);
! 291: }
! 292: libnet_destroy(l);
! 293: return (EXIT_SUCCESS);
! 294: bad:
! 295: libnet_destroy(l);
! 296: return (EXIT_FAILURE);
! 297:
! 298: return 0;
! 299: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>