Exemple #1
0
/* This function expects to receive the proper length of data. */
static void handle_packet_out(driver_dns_t *driver, uint8_t *data, size_t length)
{
  size_t        i;
  dns_t        *dns;
  buffer_t     *buffer;
  uint8_t      *encoded_bytes;
  size_t        encoded_length;
  uint8_t      *dns_bytes;
  size_t        dns_length;
  size_t        section_length;

  assert(driver->s != -1); /* Make sure we have a valid socket. */
  assert(data); /* Make sure they aren't trying to send NULL. */
  assert(length > 0); /* Make sure they aren't trying to send 0 bytes. */
  assert(length <= MAX_DNSCAT_LENGTH(driver->domain));

  buffer = buffer_create(BO_BIG_ENDIAN);

  /* If no domain is set, add the wildcard prefix at the start. */
  if(!driver->domain)
  {
    buffer_add_bytes(buffer, (uint8_t*)WILDCARD_PREFIX, strlen(WILDCARD_PREFIX));
    buffer_add_int8(buffer, '.');
  }

  section_length = 0;
  /* TODO: I don't much care for this loop... */
  for(i = 0; i < length; i++)
  {
    char hex_buf[3];

#ifdef WIN32
    sprintf_s(hex_buf, 3, "%02x", data[i]);
#else
    sprintf(hex_buf, "%02x", data[i]);
#endif
    buffer_add_bytes(buffer, hex_buf, 2);

    /* Add periods when we need them. */
    section_length += 2;
    if(i + 1 != length && section_length + 2 >= MAX_FIELD_LENGTH)
    {
      section_length = 0;
      buffer_add_int8(buffer, '.');
    }
  }

  /* If a domain is set, instead of the wildcard prefix, add the domain to the end. */
  if(driver->domain)
  {
    buffer_add_int8(buffer, '.');
    buffer_add_bytes(buffer, driver->domain, strlen(driver->domain));
  }
  buffer_add_int8(buffer, '\0');

  /* Get the result out. */
  encoded_bytes = buffer_create_string_and_destroy(buffer, &encoded_length);

  /* Double-check we didn't mess up the length. */
  assert(encoded_length <= MAX_DNS_LENGTH);

  dns = dns_create(_DNS_OPCODE_QUERY, _DNS_FLAG_RD, _DNS_RCODE_SUCCESS);
  dns_add_question(dns, (char*)encoded_bytes, driver->type, _DNS_CLASS_IN);
  dns_bytes = dns_to_packet(dns, &dns_length);

  LOG_INFO("Sending DNS query for: %s to %s:%d", encoded_bytes, driver->dns_host, driver->dns_port);
  udp_send(driver->s, driver->dns_host, driver->dns_port, dns_bytes, dns_length);

  safe_free(dns_bytes);
  safe_free(encoded_bytes);
  dns_destroy(dns);
}
Exemple #2
0
int main(int argc, char *argv[])
{
	dnsPacket *dns, *dnsresponse;
	int iResult, iReceived;
	char *qdomain, *qserver, *response;
	unsigned short qtype = 1, qclass = 1;

	qdomain = ((qdomain = command_arg_get(0, '-', argc, argv)) != NULL) ? qdomain : DNS_DEFAULT_LOOKUP;
	qserver = ((qserver = command_arg_get(1, '-', argc, argv)) != NULL) ? qserver : DNS_LOOKUP_SERVER;

	// create our empty DNS packet
	dns = dns_create();

	// set the required header fields
	dns->base->id = DNS_IDENTIFIER;

	// use recursive query?
	if (command_opt_set("-r", argc, argv))
	{
		dns->base->flags |= DNS_FLAGS_RD;
		printf("+ Using recursive querying\n");
	}

	// use a different query type?
	if (command_opt_set("-cname", argc, argv))
	{
		qtype = DNS_TYPE_CNAME;
		printf("+ Using CNAME query type\n");
	}
	else if (command_opt_set("-ns", argc, argv))
	{
		qtype = DNS_TYPE_NS;
		printf("+ Using NS query type\n");
	}
	else if (command_opt_set("-mx", argc, argv))
	{
		qtype = DNS_TYPE_MX;
		printf("+ Using MX query type\n");
	}
	else if (command_opt_set("-ptr", argc, argv))
	{
		qtype = DNS_TYPE_PTR;
		printf("+ Using PTR query type\n");
	}
	else if (command_opt_set("-aaaa", argc, argv))
	{
		qtype = DNS_TYPE_AAAA;
		printf("+ Using AAAA query type\n");
	}

	// add our question section
	dns_add_question(dns, qdomain, strlen(qdomain), qtype, qclass);
	dns_hton(dns);

	// initialize the network
	network_init(qserver, DNS_PORT);
	network_connect_udp();

	// send the packet out
	printf("Looking up %s using %s...\n", qdomain, qserver);
	iResult = network_send((char *)dns->base, dns->size);
	assert(iResult > 0);
	
	// block until a response is ready
	response = network_receive(&iReceived);
	assert(iReceived > 0);

	// load up the response packet
	dnsresponse = dns_parse(response, iReceived);
	assert(dnsresponse->base->flags & DNS_FLAGS_RESPONSE && dnsresponse->base->id == DNS_IDENTIFIER);

	output_print_response(dnsresponse);
	output_print_sections(dnsresponse);
}