NC(1) | User Commands | NC(1) |
nc
— arbitrary TCP
and UDP connections and listens
nc |
-h |
nc |
[-46dnrStuvz ] [-i
interval] [-M
ttl] [-m
minttl] [-P
proxy_username] [-p
port] [-s
source_ip_address] [-T
ToS] [-w
timeout] [-X
proxy_protocol] [-x
proxy_address[&: port]]
hostname port_list |
nc |
-l [-46DdnrStuvz ]
[-i interval]
[-M ttl]
[-m minttl]
[-T ToS]
[hostname] port |
nc |
-l [-46DdnrStuvz ]
[-i interval]
[-M ttl]
[-m minttl]
[-T ToS]
-p port |
nc |
-U [-Ddtvz ]
[-i interval]
[-w timeout]
-p path |
nc |
-Ul [-46Ddktv ]
[-i interval]
path |
The nc
(or netcat
)
utility is used for a variety of tasks associated with TCP or UDP.
nc
can open TCP connections, send UDP packets,
listen on arbitrary TCP and UDP ports, perform port scanning, and deal with
both IPv4 and IPv6. Unlike telnet(1),
nc
scripts nicely, and separates error messages onto
standard error instead of sending them to standard output.
The nc
command is often used for the
following tasks:
The following options are supported:
-4
nc
to use IPv4 addresses only.-6
nc
to use IPv6 addresses only.-D
-d
stdin
.-h
nc
help.-i
interval-k
nc
to listen for another connection after
its current connection is closed.
It is an error to use this option without the
-l
option.
-l
It is an error to use this option in conjunction with the
-s
or -z
options.
Additionally, any timeout specified with the
-w
option is ignored.
-M
IP_TTL
and
IPV6_UNICAST_HOPS
socket options.-m
IP_MINTTL
and
IPV6_MINHOPCOUNT
socket options.-n
Use of this option means that hostname and port arguments are restricted to numeric values.
If used with -v
option all addresses
and ports are printed in numeric form, in addition to the restriction
imposed on the arguments. This option does not have any effect when used
in conjunction with the -U
option.
-P
proxy_usernameIt is an error to use this option in conjunction with the
-l
option.
-p
port-l
option, specify the source
port nc
should use, subject to privilege
restrictions and availability. When used with the
-l
option, set the listen port.
This option can be used with -l
option
only provided global port argument is not specified.
-r
It is an error to use this option in conjunction with the
-l
option.
-S
In order for packets to be sent or received in conjunction with this option, a security association that matches the traffic must also be created using tcpkey(8).
-s
source_ip_addressIt is an error to use this option in conjunction with the
-l
option.
-T
ToSlowdelay
,
throughput
, reliability
,
or any decimal or hexadecimal integer between 0 and 255.-t
nc
to send RFC 854
“DON'T” and “WON'T” responses to
RFC 854 “DO” and
“WILL” requests. This makes it possible to use
nc
to script telnet sessions.-U
-l
, it becomes an AF_UNIX
client. If you specify this option with the -l
option, a AF_UNIX
server is created.
Use of this option requires that a single argument of a valid
Unix domain path has to be provided to nc
, not a
host name or port.
-u
-v
-w
timeoutstdin
are idle for more than
timeout seconds.
This option has no effect on the -l
option, that is, nc
listens forever for a
connection, with or without the -w
flag. The
default is no timeout.
-X
proxy_protocolIt is an error to use this option in conjunction with the
-l
option.
-x
proxy_address[&: port]It is an error to use this option in conjunction with the
-l
option.
-z
It is an error to use this option in conjunction with the
-l
option.
The following operands are supported:
hostname can be a numerical IP address
or a symbolic hostname (unless the -n
option is
specified).
In general, hostname must be specified,
unless the -l
option is given or
-U
is used (in which case the argument is a
path). If hostname argument is specified with
-l
option then port
argument must be given as well and nc
tries to
bind to that address and port. If hostname
argument is not specified with -l
option then
nc
tries to listen on a wildcard socket for
given port.
port_list can be specified as single integers, ranges or combinations of both. Specify ranges in the form of nn-mm. The port_list must have at least one member, but can have multiple ports/ranges separated by commas.
In general, a destination port must be specified, unless the
-U
option is given, in which case a Unix Domain
Socket path must be specified instead of
hostname.
It is quite simple to build a very basic client/server model using
nc
. On one console, start nc
listening on a specific port for a connection. For example, the command:
$ nc -l 1234
listens on port 1234 for a connection. On a second console (or a
second machine), connect to the machine and port to which
nc
is listening:
$ nc 127.0.0.1 1234
There should now be a connection between the ports. Anything typed
at the second console is concatenated to the first, and vice-versa. After
the connection has been set up, nc
does not really
care which side is being used as a server and which side is being used as a
client. The connection can be terminated using an EOF (Ctrl/d).
The example in the previous section can be expanded to build a basic data transfer model. Any information input into one end of the connection is output to the other end, and input and output can be easily captured in order to emulate file transfer.
Start by using nc
to listen on a specific
port, with output captured into a file:
$ nc -l 1234 >
filename.out
Using a second machine, connect to the listening
nc
process, feeding it the file which is to be
transferred:
$ nc host.example.com 1234 <
filename.in
After the file has been transferred, the connection closes automatically.
It is sometimes useful to talk to servers by hand rather than through a user interface. It can aid in troubleshooting, when it might be necessary to verify what data a server is sending in response to commands issued by the client.
For example, to retrieve the home page of a web site:
$ echo -n "GET /
HTTP/1.0\r\n\r\n" | nc host.example.com 80
This also displays the headers sent by the web server. They can be filtered, if necessary, by using a tool such as sed(1).
More complicated examples can be built up when the user knows the format of requests required by the server. As another example, an email can be submitted to an SMTP server using:
$ nc localhost 25 << EOF HELO host.example.com MAIL FROM: <user@host.example.com> RCPT TO: <user2@host.example.com> DATA Body of email. . QUIT EOF
It can be useful to know which ports are open and running services
on a target machine. The -z
flag can be used to tell
nc
to report open ports, rather than to initiate a
connection.
In this example:
$ nc -z host.example.com 20-30 Connection to host.example.com 22 port [tcp/ssh] succeeded! Connection to host.example.com 25 port [tcp/smtp] succeeded!
The port range was specified to limit the search to ports 20 - 30.
Alternatively, it might be useful to know which server software is
running, and which versions. This information is often contained within the
greeting banners. In order to retrieve these, it is necessary to first make
a connection, and then break the connection when the banner has been
retrieved. This can be accomplished by specifying a small timeout with the
-w
flag, or perhaps by issuing a QUIT command to the
server:
$ echo "QUIT" | nc host.example.com 20-30 SSH-2.0-Sun_SSH_1.1 Protocol mismatch. 220 host.example.com IMS SMTP Receiver Version 0.84 Ready
One of the possible uses is to create simple services by using inetd(8).
The following example creates a redirect from TCP port 8080 to port 80 on host realwww:
# cat << EOF >> /etc/services wwwredir 8080/tcp # WWW redirect EOF # cat << EOF > /tmp/wwwredir.conf wwwredir stream tcp nowait nobody /usr/bin/nc /usr/bin/nc -w 3 realwww 80 EOF # inetconv -i /tmp/wwwredir.conf wwwredir -> /var/svc/manifest/network/wwwredir-tcp.xml Importing wwwredir-tcp.xml ...Done # inetadm -l wwwredir/tcp SCOPE NAME=VALUE name="wwwredir" endpoint_type="stream" proto="tcp" isrpc=FALSE wait=FALSE exec="/usr/bin/nc -w 3 realwww 80" arg0="/usr/bin/nc" user="nobody" default bind_addr="" default bind_fail_max=-1 default bind_fail_interval=-1 default max_con_rate=-1 default max_copies=-1 default con_rate_offline=-1 default failrate_cnt=40 default failrate_interval=60 default inherit_env=TRUE default tcp_trace=TRUE default tcp_wrappers=FALSE
To bind to a privileged port number nc
needs to be granted the net_privaddr privilege. If Trusted
Extensions are configured and the port nc
should
listen on is configured as a multi-level port nc
also needs the
net_bindmlp
privilege.
Privileges can be assigned to the user or role directly, by
specifying them in the account's default privilege set in
user_attr(5). However, this means
that any application that this user or role starts have these additional
privileges. To only grant the
privileges(7) when
nc
is invoked, the recommended approach is to create
and assign an rbac(7) rights profile.
See EXAMPLES for additional
information.
Open a TCP connection to port 42 of host.example.com, using port 3141 as the source port, with a timeout of 5 seconds:
$ nc -p 3141 -w 5 host.example.com
42
Open a UDP connection to port 53 of host.example.com:
$ nc -u host.example.com
53
Open a TCP connection to port 42 of host.example.com using 10.1.2.3 as the IP for the local end of the connection:
$ nc -s 10.1.2.3 host.example.com
42
Use a list of ports and port ranges for a port scan on various ports:
$ nc -z host.example.com
21-25,53,80,110-120,443
Create and listen on a Unix Domain Socket:
$ nc -lU
/var/tmp/dsocket
Create and listen on a UDP socket with associated port 8888:
$ nc -u -l -p 8888
which is the same as:
$ nc -u -l 8888
Create and listen on a TCP socket with associated port 2222 and bind to address 127.0.0.1 only:
$ nc -l 127.0.0.1 2222
Connect to port 42 of host.example.com using an HTTP proxy at
10.2.3.4, port 8080. This example could also be used by
ssh(1). See the
ProxyCommand
directive in
ssh_config(5) for more
information.
$ nc -x10.2.3.4:8080 -Xconnect
host.example.com 42
The same example again, this time enabling proxy authentication with username ruser if the proxy requires it:
$ nc -x10.2.3.4:8080 -Xconnect
-Pruser host.example.com 42
To run nc
with the smallest possible set
of privileges as a user or role that has additional privileges (such as the
default root account) it can be invoked using
ppriv(1) as well. For example, limiting
it to only run with the privilege to bind to a privileged port:
$ ppriv -e -sA=basic,!file_link_any,!proc_exec,!proc_fork,\ !proc_info,!proc_session,net_privaddr nc -l 42
To allow a user or role to use only nc
with the net_privaddr privilege, a rights profile needs to
be created:
/etc/security/exec_attr:
Netcat
privileged:solaris:cmd:::/usr/bin/nc:privs=net_privaddr
Netcat privileged:::Allow nc to bind
to privileged ports:help=None.html
Assigning this rights profile using
user_attr(5) permits the user or
role to run nc
allowing it to listen on any port. To
permit a user or role to use nc
only to listen on
specific ports a wrapper script should be specified in the rights
profiles:
/etc/security/exec_attr
Netcat
restricted:solaris:cmd:::/usr/bin/nc-restricted:privs=net_privaddr
Netcat restricted:::Allow nc to bind
to privileged ports:help=None.html
and write a shell script that restricts the permissible options, for example, one that permits one to bind only on ports between 42 and 64 non-inclusive:
#!/bin/ksh (( $# == 1 )) || exit 1 (( $1 > 42 && $1 < 64 )) || exit 1 exec /usr/bin/nc -l -p "$1"
This grants the extra privileges when the user or role invokes
nc
using the wrapper script from a profile shell.
See pfsh(1),
pfksh(1),
pfcsh(1), and
pfexec(1).
Invoking nc
directly does not
run it with the additional privileges, and neither does invoking the script
without using
pfexec or a
profile shell.
The command line syntax is Committed for the
-4
, -6
,
-l
, -n
,
-p
, -u
, and
-w
options and their arguments (if any). The
name and port list arguments are
Committed. The port range syntax is
Uncommitted.
The interface stability level for all other command line options and their
arguments is
Uncommitted.
cat(1), pfcsh(1), pfexec(1), pfksh(1), pfsh(1), ppriv(1), sed(1), ssh(1), telnet(1), ssh_config(5), user_attr(5), attributes(7), privileges(7), rbac(7), inetadm(8), inetconv(8), inetd(8), tcpkey(8)
The original implementation of nc
was
written by Hobbit
<hobbit@avian.org>
nc
was rewritten with IPv6 support by
Eric Jackson
<ericj@monkey.org>
UDP port scans always succeed, that is, report the port as open,
rendering the -uz
combination of flags relatively
useless.
April 27, 2024 | OmniOS |