Creating the SYN Packet

Because SYNplescan works at the TCP layer, we can open the libnet context for raw sockets mode as follows:

l = libnet_init (LIBNET_RAW4, device, libnet_errbuf);

To create the outgoing SYN packet, we are going to start with the libnet_build_tcp() function, as this is the highest-level protocol in this example. This is shown in Example 11-7.

Example 11-7. Creating the TCP header

libnet_ptag_t tcp = 0;    /* libnet protocol block */

tcp = libnet_build_tcp (libnet_get_prand (LIBNET_PRu16),    /* src port */
                  ports[i],    /* destination port */
                  libnet_get_prand (LIBNET_PRu16),    /* sequence number */
                  0,    /* acknowledgement */
                  TH_SYN,    /* control flags */
                  7,    /* window */
                  0,    /* checksum - 0 = autofill */
                  0,    /* urgent */
                  LIBNET_TCP_H,    /* header length */
                  NULL,    /* payload */
                  0,    /* payload length */
                  l,    /* libnet context */
                  tcp);    /* protocol tag */

if (tcp == -1)
 {
   fprintf (stderr,
       "Unable to build TCP header: %s\n", libnet_geterror (l));
   exit (1);
 }

libnet_build_tcp( ) specifies the field values for the TCP header. In this case we are specifying that the TCP packet has the SYN flag set (using the TH_SYN value; this is a constant supplied in the tcp.h include file), that the TCP packet is empty (there is no pointer to a payload), and that the payload length is 0.

Also note that the value 0 has been provided as the checksum for the TCP header. By default, if 0 is provided as a value for a packet header’s checksum, libnet calculates the correct value and inserts it into the header for ...

Get Network Security Tools now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.