1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-10 09:49:05 +00:00

Support decimal integer representation of target addresses. Fixes #375

This commit is contained in:
dmiller
2022-09-21 01:53:19 +00:00
parent 758b6d1792
commit 04c4c70c77

View File

@@ -828,19 +828,29 @@ int main(int argc, char *argv[])
host_list_to_set(o.denyset, deny_host_list); host_list_to_set(o.denyset, deny_host_list);
host_list_free(deny_host_list); host_list_free(deny_host_list);
if (optind == argc) { int rc;
int num_ports = 0;
if (srcport != -1 && o.listen) {
/* Treat "ncat -l -p <port>" the same as "ncat -l <port>" for nc
compatibility. */
o.portno = (unsigned int) srcport;
num_ports++;
}
/* How many arguments are left? */
ncat_assert(optind <= argc);
switch (argc - optind) {
case 2:
#if HAVE_SYS_UN_H #if HAVE_SYS_UN_H
/* We do not use ports with Unix domain sockets. */
if (o.af == AF_UNIX) { if (o.af == AF_UNIX) {
if (!o.listen) bye("Using Unix domain sockets and specifying port doesn't make sense.");
bye("You have to specify path to a socket to connect to.");
else
bye("You have to specify path to a socket to listen on.");
} }
#endif #endif
/* Listen defaults to any address and DEFAULT_NCAT_PORT */ if (num_ports == 0)
if (!o.listen) o.portno = parseport(argv[optind + 1], max_port, "port");
bye("You must specify a host to connect to."); num_ports++;
} else { /* fall through: */
case 1:
#if HAVE_SYS_UN_H #if HAVE_SYS_UN_H
if (o.af == AF_UNIX) { if (o.af == AF_UNIX) {
memset(&targetaddrs->addr.storage, 0, sizeof(struct sockaddr_un)); memset(&targetaddrs->addr.storage, 0, sizeof(struct sockaddr_un));
@@ -848,67 +858,69 @@ int main(int argc, char *argv[])
strncpy(targetaddrs->addr.un.sun_path, argv[optind], sizeof(targetaddrs->addr.un.sun_path)); strncpy(targetaddrs->addr.un.sun_path, argv[optind], sizeof(targetaddrs->addr.un.sun_path));
targetaddrs->addrlen = SUN_LEN(&targetaddrs->addr.un); targetaddrs->addrlen = SUN_LEN(&targetaddrs->addr.un);
o.sslservername = o.target = argv[optind]; o.sslservername = o.target = argv[optind];
optind++; break;
} else }
#endif #endif
#if HAVE_LINUX_VM_SOCKETS_H #if HAVE_LINUX_VM_SOCKETS_H
if (o.af == AF_VSOCK) { if (o.af == AF_VSOCK) {
if (!o.listen || optind + 1 < argc) { long long_cid;
long long_cid;
memset(&targetaddrs->addr.storage, 0, sizeof(struct sockaddr_vm)); memset(&targetaddrs->addr.storage, 0, sizeof(struct sockaddr_vm));
targetaddrs->addr.vm.svm_family = AF_VSOCK; targetaddrs->addr.vm.svm_family = AF_VSOCK;
errno = 0; errno = 0;
long_cid = strtol(argv[optind], NULL, 10); long_cid = strtol(argv[optind], NULL, 10);
if (errno != 0 || long_cid <= 0 || long_cid > UINT32_MAX) if (errno != 0 || long_cid <= 0 || long_cid > UINT32_MAX)
bye("Invalid CID \"%s\".", argv[optind]); bye("Invalid CID \"%s\".", argv[optind]);
targetaddrs->addr.vm.svm_cid = long_cid; targetaddrs->addr.vm.svm_cid = long_cid;
targetaddrs->addrlen = sizeof(targetaddrs->addr.vm); targetaddrs->addrlen = sizeof(targetaddrs->addr.vm);
o.sslservername = o.target = argv[optind]; o.sslservername = o.target = argv[optind];
optind++; break;
} }
} else
#endif #endif
/* Resolve hostname if we're given one */ /* Support ncat -l <port>, but otherwise assume ncat <target> */
if (strspn(argv[optind], "0123456789") != strlen(argv[optind])) { if (num_ports == 0 && o.listen) {
int rc; o.portno = parseport(argv[optind], max_port, "port");
num_ports++;
o.target = argv[optind]; break;
/* resolve hostname only if o.proxytype == NULL }
* targetss contains data already and you don't want remove them o.target = argv[optind];
*/ /* resolve hostname only if o.proxytype == NULL
if( !o.proxytype * targetss contains data already and you don't want remove them
*/
if( !o.proxytype
&& (rc = resolve_multi(o.target, 0, targetaddrs, o.af)) != 0) && (rc = resolve_multi(o.target, 0, targetaddrs, o.af)) != 0)
bye("Could not resolve hostname \"%s\": %s.", o.target, gai_strerror(rc)); bye("Could not resolve hostname \"%s\": %s.", o.target, gai_strerror(rc));
if (!o.sslservername) if (!o.sslservername)
o.sslservername = o.target; o.sslservername = o.target;
optind++; break;
} else { case 0:
if (!o.listen) #if HAVE_SYS_UN_H
bye("You must specify a host to connect to."); if (o.af == AF_UNIX) {
bye("You must specify a path to a socket to %s.",
o.listen ? "listen on" : "connect to");
} }
#endif
/* Listen defaults to any address and DEFAULT_NCAT_PORT */
if (!o.listen)
bye("You must specify a host to connect to.");
break;
default:
if (num_ports == 0)
o.portno = parseport(argv[optind + 1], max_port, "port");
num_ports += argc - optind - 1;
break;
} }
/* Whatever's left is the port number; there should be at most one. */ if (num_ports > 1) {
#if HAVE_SYS_UN_H loguser("Got more than one port specification: %u", o.portno);
/* We do not use ports with Unix domain sockets. */ for (rc = argc - num_ports + 1; rc < argc; rc++)
if (o.af == AF_UNIX && optind > argc) loguser_noprefix(" %s", argv[rc]);
bye("Using Unix domain sockets and specifying port doesn't make sense.");
#endif
if (optind + 1 < argc || (o.listen && srcport != -1 && optind + 1 == argc)) {
loguser("Got more than one port specification:");
if (o.listen && srcport != -1)
loguser_noprefix(" %lld", srcport);
for (; optind < argc; optind++)
loguser_noprefix(" %s", argv[optind]);
loguser_noprefix(". QUITTING.\n"); loguser_noprefix(". QUITTING.\n");
exit(2); exit(2);
} else if (optind + 1 == argc) }
o.portno = parseport(argv[optind], max_port, "port");
if (o.proxytype && !o.listen) if (o.proxytype && !o.listen)
; /* Do nothing - port is already set to proxyport */ ; /* Do nothing - port is already set to proxyport */
@@ -939,12 +951,7 @@ int main(int argc, char *argv[])
} }
} }
if (srcport != -1) { if (srcport != -1 && !o.listen) {
if (o.listen) {
/* Treat "ncat -l -p <port>" the same as "ncat -l <port>" for nc
compatibility. */
o.portno = (unsigned int) srcport;
} else {
if (srcaddr.storage.ss_family == AF_UNSPEC) { if (srcaddr.storage.ss_family == AF_UNSPEC) {
/* We have a source port but not an explicit source address; /* We have a source port but not an explicit source address;
fill in an unspecified address of the same family as the fill in an unspecified address of the same family as the
@@ -965,7 +972,6 @@ int main(int argc, char *argv[])
else if (srcaddr.storage.ss_family == AF_VSOCK) else if (srcaddr.storage.ss_family == AF_VSOCK)
srcaddr.vm.svm_port = (unsigned int) srcport; srcaddr.vm.svm_port = (unsigned int) srcport;
#endif #endif
}
} }
if (o.proto == IPPROTO_UDP) { if (o.proto == IPPROTO_UDP) {