Skip to content

Commit

Permalink
Add IPv6 support, fix close of unitialized logfile
Browse files Browse the repository at this point in the history
  • Loading branch information
blechschmidt committed Jun 2, 2017
1 parent a0ab611 commit 2058969
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 12 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Clone the git repository and `cd` into the project root folder. Then run `make`
## Usage
```
Usage: ./bin/massdns [options] domainlist (- for stdin)
-6 Use IPv6.
-a --no-authority Omit records from the authority section of the response packets.
-c --resolve-count Number of resolves for a name before giving up. (Default: 50)
-e --additional Include response records within the additional section.
Expand Down Expand Up @@ -114,4 +115,4 @@ Please note that the module interfaces are not stable yet and are subject to cha
- Implement bandwidth limits
- Employ cross-resolver checks to detect DNS poisoning and DNS spam (e.g. [Level 3 DNS hijacking](https://web.archive.org/web/20140302064622/http://james.bertelson.me/blog/2014/01/level-3-are-now-hijacking-failed-dns-requests-for-ad-revenue-on-4-2-2-x/))
- Implement IO-multiplexing to prevent 100% usage of a single CPU core
- Support IPv6 resolvers
- Support parallel usage of IPv6 and IPv4 resolvers
42 changes: 31 additions & 11 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ void print_help(char *file)
{
fprintf(stderr, ""
"Usage: %s [options] domainlist (- for stdin) \n"
" -6 Use IPv6.\n"
" -a --no-authority Omit records from the authority section of the response packets.\n"
" -c --resolve-count Number of resolves for a name before giving up. (Default: 50)\n"
" -e --additional Include response records within the additional section.\n"
Expand Down Expand Up @@ -585,7 +586,6 @@ struct sockaddr_storage *str_to_addr(char *str)
}
else if (inet_pton(AF_INET6, str, &ip6addr->sin6_addr) == 1)
{
fprintf(stderr, "ip6\n");
ip6addr->sin6_port = htons(53);
ip6addr->sin6_family = AF_INET6;
free(ip4addr);
Expand Down Expand Up @@ -677,9 +677,9 @@ buffer_t massdns_resolvers_from_file(char *filename)
return resolvers;
}

sockaddr_in_t *massdns_get_resolver(size_t index, buffer_t *resolvers)
struct sockaddr_storage *massdns_get_resolver(size_t index, buffer_t *resolvers)
{
return ((sockaddr_in_t **) resolvers->data)[index % resolvers->len];
return ((struct sockaddr_storage **) resolvers->data)[index % resolvers->len];
}

bool handle_domain(void *k, void *l, void *c)
Expand Down Expand Up @@ -719,11 +719,14 @@ bool handle_domain(void *k, void *l, void *c)
}
ldns_pkt_free(packet);
packet = NULL;
sockaddr_in_t *resolver = massdns_get_resolver((size_t) rand(), &context->resolvers);
struct sockaddr_storage *resolver = massdns_get_resolver((size_t) rand(), &context->resolvers);
ssize_t n = -1;
while (n < 0)
{
errno = 0;
fwrite(resolver, sizeof(*resolver), 1, stdout);
n = sendto(context->sock, buf, packet_size, 0, (sockaddr_t *) resolver, sizeof(*resolver));
//if(n<1) perror("err sending");
#ifdef DEBUG
if(n<1) fprintf(stdout,"DEBUG: Sending for domain %s failed with ret code %zu, retrying... \n",lookup->domain,n);
#endif
Expand Down Expand Up @@ -771,7 +774,7 @@ void massdns_scan(massdns_context_t *context)
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = 0;
int sock = socket(AF_INET, SOCK_DGRAM, 0);
int sock = socket(context->cmd_args.ip6 ? AF_INET6 : AF_INET, SOCK_DGRAM, 0);
int socketbuf = 1024 * 1024 * 100;
if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &socketbuf, sizeof(socketbuf)) != 0)
{
Expand Down Expand Up @@ -946,12 +949,27 @@ void massdns_scan(massdns_context_t *context)
}
hashmapFree(context->map);
context->map = NULL;
fclose(f);
fclose(randomness);
fclose(context->outfile);
fclose(context->logfile);
if(f)
{
fclose(f);
}
if(randomness)
{
fclose(randomness);
}
if(context->outfile)
{
fclose(context->outfile);
}
if(context->logfile)
{
fclose(context->logfile);
}
}


massdns_context_t ctx;

int main(int argc, char **argv)
{
#ifdef DEBUG
Expand All @@ -964,9 +982,7 @@ int main(int argc, char **argv)
print_help(argc > 0 ? argv[0] : "massdns");
return 1;
}
massdns_context_t ctx;
massdns_context_t *context = &ctx;
memset(&context->cmd_args, 0, sizeof(context->cmd_args));
context->cmd_args.resolve_count = 50;
context->cmd_args.hashmap_size = 100000;
context->cmd_args.interval_ms = 200;
Expand Down Expand Up @@ -1115,6 +1131,10 @@ int main(int argc, char **argv)
{
context->cmd_args.quiet = true;
}
else if (strcmp(argv[i], "-6") == 0)
{
context->cmd_args.ip6 = true;
}
else if (strcmp(argv[i], "--resolve-count") == 0 || strcmp(argv[i], "-c") == 0)
{
if (i + 1 >= argc || atoi(argv[i + 1]) < 1 || atoi(argv[i + 1]) > 255)
Expand Down
1 change: 1 addition & 0 deletions massdns.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ typedef struct massdns_context
FILE *logfile;
struct cmd_args
{
bool ip6;
bool root;
char *resolvers;
char *domains;
Expand Down

0 comments on commit 2058969

Please sign in to comment.