1Netcat 1.10 2=========== /\_/\ 3 / 0 0 \ 4Netcat is a simple Unix utility which reads and writes data ====v==== 5across network connections, using TCP or UDP protocol. \ W / 6It is designed to be a reliable "back-end" tool that can | | _ 7be used directly or easily driven by other programs and / ___ \ / 8scripts. At the same time, it is a feature-rich network / / \ \ | 9debugging and exploration tool, since it can create almost (((-----)))-' 10any kind of connection you would need and has several / 11interesting built-in capabilities. Netcat, or "nc" as the ( ___ 12actual program is named, should have been supplied long ago \__.=|___E 13as another one of those cryptic but standard Unix tools. / 14 15In the simplest usage, "nc host port" creates a TCP connection to the given 16port on the given target host. Your standard input is then sent to the host, 17and anything that comes back across the connection is sent to your standard 18output. This continues indefinitely, until the network side of the connection 19shuts down. Note that this behavior is different from most other applications 20which shut everything down and exit after an end-of-file on the standard input. 21 22Netcat can also function as a server, by listening for inbound connections 23on arbitrary ports and then doing the same reading and writing. With minor 24limitations, netcat doesn't really care if it runs in "client" or "server" 25mode -- it still shovels data back and forth until there isn't any more left. 26In either mode, shutdown can be forced after a configurable time of inactivity 27on the network side. 28 29And it can do this via UDP too, so netcat is possibly the "udp telnet-like" 30application you always wanted for testing your UDP-mode servers. UDP, as the 31"U" implies, gives less reliable data transmission than TCP connections and 32some systems may have trouble sending large amounts of data that way, but it's 33still a useful capability to have. 34 35You may be asking "why not just use telnet to connect to arbitrary ports?" 36Valid question, and here are some reasons. Telnet has the "standard input 37EOF" problem, so one must introduce calculated delays in driving scripts to 38allow network output to finish. This is the main reason netcat stays running 39until the *network* side closes. Telnet also will not transfer arbitrary 40binary data, because certain characters are interpreted as telnet options and 41are thus removed from the data stream. Telnet also emits some of its 42diagnostic messages to standard output, where netcat keeps such things 43religiously separated from its *output* and will never modify any of the real 44data in transit unless you *really* want it to. And of course telnet is 45incapable of listening for inbound connections, or using UDP instead. Netcat 46doesn't have any of these limitations, is much smaller and faster than telnet, 47and has many other advantages. 48 49Some of netcat's major features are: 50 51 Outbound or inbound connections, TCP or UDP, to or from any ports 52 Full DNS forward/reverse checking, with appropriate warnings 53 Ability to use any local source port 54 Ability to use any locally-configured network source address 55 Built-in port-scanning capabilities, with randomizer 56 Built-in loose source-routing capability 57 Can read command line arguments from standard input 58 Slow-send mode, one line every N seconds 59 Hex dump of transmitted and received data 60 Optional ability to let another program service established connections 61 Optional telnet-options responder 62 63Efforts have been made to have netcat "do the right thing" in all its various 64modes. If you believe that it is doing the wrong thing under whatever 65circumstances, please notify me and tell me how you think it should behave. 66If netcat is not able to do some task you think up, minor tweaks to the code 67will probably fix that. It provides a basic and easily-modified template for 68writing other network applications, and I certainly encourage people to make 69custom mods and send in any improvements they make to it. This is the second 70release; the overall differences from 1.00 are relatively minor and have mostly 71to do with portability and bugfixes. Many people provided greatly appreciated 72fixes and comments on the 1.00 release. Continued feedback from the Internet 73community is always welcome! 74 75Netcat is entirely my own creation, although plenty of other code was used as 76examples. It is freely given away to the Internet community in the hope that 77it will be useful, with no restrictions except giving credit where it is due. 78No GPLs, Berkeley copyrights or any of that nonsense. The author assumes NO 79responsibility for how anyone uses it. If netcat makes you rich somehow and 80you're feeling generous, mail me a check. If you are affiliated in any way 81with Microsoft Network, get a life. Always ski in control. Comments, 82questions, and patches to hobbit@avian.org. 83 84Building 85======== 86 87Compiling is fairly straightforward. Examine the Makefile for a SYSTYPE that 88matches yours, and do "make <systype>". The executable "nc" should appear. 89If there is no relevant SYSTYPE section, try "generic". If you create new 90sections for generic.h and Makefile to support another platform, please follow 91the given format and mail back the diffs. 92 93There are a couple of other settable #defines in netcat.c, which you can 94include as DFLAGS="-DTHIS -DTHAT" to your "make" invocation without having to 95edit the Makefile. See the following discussions for what they are and do. 96 97If you want to link against the resolver library on SunOS [recommended] and 98you have BIND 4.9.x, you may need to change XLIBS=-lresolv in the Makefile to 99XLIBS="-lresolv -l44bsd". 100 101Linux sys/time.h does not really support presetting of FD_SETSIZE; a harmless 102warning is issued. 103 104Some systems may warn about pointer types for signal(). No problem, though. 105 106Exploration of features 107======================= 108 109Where to begin? Netcat is at the same time so simple and versatile, it's like 110trying to describe everything you can do with your Swiss Army knife. This will 111go over the basics; you should also read the usage examples and notes later on 112which may give you even more ideas about what this sort of tool is good for. 113 114If no command arguments are given at all, netcat asks for them, reads a line 115from standard input, and breaks it up into arguments internally. This can be 116useful when driving netcat from certain types of scripts, with the side effect 117of hiding your command line arguments from "ps" displays. 118 119The host argument can be a name or IP address. If -n is specified, netcat 120will only accept numeric IP addresses and do no DNS lookups for anything. If 121-n is not given and -v is turned on, netcat will do a full forward and reverse 122name and address lookup for the host, and warn you about the all-too-common 123problem of mismatched names in the DNS. This often takes a little longer for 124connection setup, but is useful to know about. There are circumstances under 125which this can *save* time, such as when you want to know the name for some IP 126address and also connect there. Netcat will just tell you all about it, saving 127the manual steps of looking up the hostname yourself. Normally mismatch- 128checking is case-insensitive per the DNS spec, but you can define ANAL at 129compile time to make it case-sensitive -- sometimes useful for uncovering minor 130errors in your own DNS files while poking around your networks. 131 132A port argument is required for outbound connections, and can be numeric or a 133name as listed in /etc/services. If -n is specified, only numeric arguments 134are valid. Special syntax and/or more than one port argument cause different 135behavior -- see details below about port-scanning. 136 137The -v switch controls the verbosity level of messages sent to standard error. 138You will probably want to run netcat most of the time with -v turned on, so you 139can see info about the connections it is trying to make. You will probably 140also want to give a smallish -w argument, which limits the time spent trying to 141make a connection. I usually alias "nc" to "nc -v -w 3", which makes it 142function just about the same for things I would otherwise use telnet to do. 143The timeout is easily changed by a subsequent -w argument which overrides the 144earlier one. Specifying -v more than once makes diagnostic output MORE 145verbose. If -v is not specified at all, netcat silently does its work unless 146some error happens, whereupon it describes the error and exits with a nonzero 147status. Refused network connections are generally NOT considered to be errors, 148unless you only asked for a single TCP port and it was refused. 149 150Note that -w also sets the network inactivity timeout. This does not have any 151effect until standard input closes, but then if nothing further arrives from 152the network in the next <timeout> seconds, netcat tries to read the net once 153more for good measure, and then closes and exits. There are a lot of network 154services now that accept a small amount of input and return a large amount of 155output, such as Gopher and Web servers, which is the main reason netcat was 156written to "block" on the network staying open rather than standard input. 157Handling the timeout this way gives uniform behavior with network servers that 158*don't* close by themselves until told to. 159 160UDP connections are opened instead of TCP when -u is specified. These aren't 161really "connections" per se since UDP is a connectionless protocol, although 162netcat does internally use the "connected UDP socket" mechanism that most 163kernels support. Although netcat claims that an outgoing UDP connection is 164"open" immediately, no data is sent until something is read from standard 165input. Only thereafter is it possible to determine whether there really is a 166UDP server on the other end, and often you just can't tell. Most UDP protocols 167use timeouts and retries to do their thing and in many cases won't bother 168answering at all, so you should specify a timeout and hope for the best. You 169will get more out of UDP connections if standard input is fed from a source 170of data that looks like various kinds of server requests. 171 172To obtain a hex dump file of the data sent either way, use "-o logfile". The 173dump lines begin with "<" or ">" to respectively indicate "from the net" or 174"to the net", and contain the total count per direction, and hex and ascii 175representations of the traffic. Capturing a hex dump naturally slows netcat 176down a bit, so don't use it where speed is critical. 177 178Netcat can bind to any local port, subject to privilege restrictions and ports 179that are already in use. It is also possible to use a specific local network 180source address if it is that of a network interface on your machine. [Note: 181this does not work correctly on all platforms.] Use "-p portarg" to grab a 182specific local port, and "-s ip-addr" or "-s name" to have that be your source 183IP address. This is often referred to as "anchoring the socket". Root users 184can grab any unused source port including the "reserved" ones less than 1024. 185Absence of -p will bind to whatever unused port the system gives you, just like 186any other normal client connection, unless you use -r [see below]. 187 188Listen mode will cause netcat to wait for an inbound connection, and then the 189same data transfer happens. Thus, you can do "nc -l -p 1234 < filename" and 190when someone else connects to your port 1234, the file is sent to them whether 191they wanted it or not. Listen mode is generally used along with a local port 192argument -- this is required for UDP mode, while TCP mode can have the system 193assign one and tell you what it is if -v is turned on. If you specify a target 194host and optional port in listen mode, netcat will accept an inbound connection 195only from that host and if you specify one, only from that foreign source port. 196In verbose mode you'll be informed about the inbound connection, including what 197address and port it came from, and since listening on "any" applies to several 198possibilities, which address it came *to* on your end. If the system supports 199IP socket options, netcat will attempt to retrieve any such options from an 200inbound connection and print them out in hex. 201 202If netcat is compiled with -DGAPING_SECURITY_HOLE, the -e argument specifies 203a program to exec after making or receiving a successful connection. In the 204listening mode, this works similarly to "inetd" but only for a single instance. 205Use with GREAT CARE. This piece of the code is normally not enabled; if you 206know what you're doing, have fun. This hack also works in UDP mode. Note that 207you can only supply -e with the name of the program, but no arguments. If you 208want to launch something with an argument list, write a two-line wrapper script 209or just use inetd like always. 210 211If netcat is compiled with -DTELNET, the -t argument enables it to respond 212to telnet option negotiation [always in the negative, i.e. DONT or WONT]. 213This allows it to connect to a telnetd and get past the initial negotiation 214far enough to get a login prompt from the server. Since this feature has 215the potential to modify the data stream, it is not enabled by default. You 216have to understand why you might need this and turn on the #define yourself. 217 218Data from the network connection is always delivered to standard output as 219efficiently as possible, using large 8K reads and writes. Standard input is 220normally sent to the net the same way, but the -i switch specifies an "interval 221time" which slows this down considerably. Standard input is still read in 222large batches, but netcat then tries to find where line breaks exist and sends 223one line every interval time. Note that if standard input is a terminal, data 224is already read line by line, so unless you make the -i interval rather long, 225what you type will go out at a fairly normal rate. -i is really designed 226for use when you want to "measure out" what is read from files or pipes. 227 228Port-scanning is a popular method for exploring what's out there. Netcat 229accepts its commands with options first, then the target host, and everything 230thereafter is interpreted as port names or numbers, or ranges of ports in M-N 231syntax. CAVEAT: some port names in /etc/services contain hyphens -- netcat 232currently will not correctly parse those, so specify ranges using numbers if 233you can. If more than one port is thus specified, netcat connects to *all* of 234them, sending the same batch of data from standard input [up to 8K worth] to 235each one that is successfully connected to. Specifying multiple ports also 236suppresses diagnostic messages about refused connections, unless -v is 237specified twice for "more verbosity". This way you normally get notified only 238about genuinely open connections. Example: "nc -v -w 2 -z target 20-30" will 239try connecting to every port between 20 and 30 [inclusive] at the target, and 240will likely inform you about an FTP server, telnet server, and mailer along the 241way. The -z switch prevents sending any data to a TCP connection and very 242limited probe data to a UDP connection, and is thus useful as a fast scanning 243mode just to see what ports the target is listening on. To limit scanning 244speed if desired, -i will insert a delay between each port probe. There are 245some pitfalls with regard to UDP scanning, described later, but in general it 246works well. 247 248For each range of ports specified, scanning is normally done downward within 249that range. If the -r switch is used, scanning hops randomly around within 250that range and reports open ports as it finds them. [If you want them listed 251in order regardless, pipe standard error through "sort"...] In addition, if 252random mode is in effect, the local source ports are also randomized. This 253prevents netcat from exhibiting any kind of regular pattern in its scanning. 254You can exert fairly fine control over your scan by judicious use of -r and 255selected port ranges to cover. If you use -r for a single connection, the 256source port will have a random value above 8192, rather than the next one the 257kernel would have assigned you. Note that selecting a specific local port 258with -p overrides any local-port randomization. 259 260Many people are interested in testing network connectivity using IP source 261routing, even if it's only to make sure their own firewalls are blocking 262source-routed packets. On systems that support it, the -g switch can be used 263multiple times [up to 8] to construct a loose-source-routed path for your 264connection, and the -G argument positions the "hop pointer" within the list. 265If your network allows source-routed traffic in and out, you can test 266connectivity to your own services via remote points in the internet. Note that 267although newer BSD-flavor telnets also have source-routing capability, it isn't 268clearly documented and the command syntax is somewhat clumsy. Netcat's 269handling of "-g" is modeled after "traceroute". 270 271Netcat tries its best to behave just like "cat". It currently does nothing to 272terminal input modes, and does no end-of-line conversion. Standard input from 273a terminal is read line by line with normal editing characters in effect. You 274can freely suspend out of an interactive connection and resume. ^C or whatever 275your interrupt character is will make netcat close the network connection and 276exit. A switch to place the terminal in raw mode has been considered, but so 277far has not been necessary. You can send raw binary data by reading it out of 278a file or piping from another program, so more meaningful effort would be spent 279writing an appropriate front-end driver. 280 281Netcat is not an "arbitrary packet generator", but the ability to talk to raw 282sockets and/or nit/bpf/dlpi may appear at some point. Such things are clearly 283useful; I refer you to Darren Reed's excellent ip_filter package, which now 284includes a tool to construct and send raw packets with any contents you want. 285 286Example uses -- the light side 287============================== 288 289Again, this is a very partial list of possibilities, but it may get you to 290think up more applications for netcat. Driving netcat with simple shell or 291expect scripts is an easy and flexible way to do fairly complex tasks, 292especially if you're not into coding network tools in C. My coding isn't 293particularly strong either [although undoubtedly better after writing this 294thing!], so I tend to construct bare-metal tools like this that I can trivially 295plug into other applications. Netcat doubles as a teaching tool -- one can 296learn a great deal about more complex network protocols by trying to simulate 297them through raw connections! 298 299An example of netcat as a backend for something else is the shell-script 300Web browser, which simply asks for the relevant parts of a URL and pipes 301"GET /what/ever" into a netcat connection to the server. I used to do this 302with telnet, and had to use calculated sleep times and other stupidity to 303kludge around telnet's limitations. Netcat guarantees that I get the whole 304page, and since it transfers all the data unmodified, I can even pull down 305binary image files and display them elsewhere later. Some folks may find the 306idea of a shell-script web browser silly and strange, but it starts up and 307gets me my info a hell of a lot faster than a GUI browser and doesn't hide 308any contents of links and forms and such. This is included, as scripts/web, 309along with several other web-related examples. 310 311Netcat is an obvious replacement for telnet as a tool for talking to daemons. 312For example, it is easier to type "nc host 25", talk to someone's mailer, and 313just ^C out than having to type ^]c or QUIT as telnet would require you to do. 314You can quickly catalog the services on your network by telling netcat to 315connect to well-known services and collect greetings, or at least scan for open 316ports. You'll probably want to collect netcat's diagnostic messages in your 317output files, so be sure to include standard error in the output using 318`>& file' in *csh or `> file 2>&1' in bourne shell. 319 320A scanning example: "echo QUIT | nc -v -w 5 target 20-250 500-600 5990-7000" 321will inform you about a target's various well-known TCP servers, including 322r-services, X, IRC, and maybe a few you didn't expect. Sending in QUIT and 323using the timeout will almost guarantee that you see some kind of greeting or 324error from each service, which usually indicates what it is and what version. 325[Beware of the "chargen" port, though...] SATAN uses exactly this technique to 326collect host information, and indeed some of the ideas herein were taken from 327the SATAN backend tools. If you script this up to try every host in your 328subnet space and just let it run, you will not only see all the services, 329you'll find out about hosts that aren't correctly listed in your DNS. Then you 330can compare new snapshots against old snapshots to see changes. For going 331after particular services, a more intrusive example is in scripts/probe. 332 333Netcat can be used as a simple data transfer agent, and it doesn't really 334matter which end is the listener and which end is the client -- input at one 335side arrives at the other side as output. It is helpful to start the listener 336at the receiving side with no timeout specified, and then give the sending side 337a small timeout. That way the listener stays listening until you contact it, 338and after data stops flowing the client will time out, shut down, and take the 339listener with it. Unless the intervening network is fraught with problems, 340this should be completely reliable, and you can always increase the timeout. A 341typical example of something "rsh" is often used for: on one side, 342 343 nc -l -p 1234 | uncompress -c | tar xvfp - 344 345and then on the other side 346 347 tar cfp - /some/dir | compress -c | nc -w 3 othermachine 1234 348 349will transfer the contents of a directory from one machine to another, without 350having to worry about .rhosts files, user accounts, or inetd configurations 351at either end. Again, it matters not which is the listener or receiver; the 352"tarring" machine could just as easily be running the listener instead. One 353could conceivably use a scheme like this for backups, by having cron-jobs fire 354up listeners and backup handlers [which can be restricted to specific addresses 355and ports between each other] and pipe "dump" or "tar" on one machine to "dd 356of=/dev/tapedrive" on another as usual. Since netcat returns a nonzero exit 357status for a denied listener connection, scripts to handle such tasks could 358easily log and reject connect attempts from third parties, and then retry. 359 360Another simple data-transfer example: shipping things to a PC that doesn't have 361any network applications yet except a TCP stack and a web browser. Point the 362browser at an arbitrary port on a Unix server by telling it to download 363something like http://unixbox:4444/foo, and have a listener on the Unix side 364ready to ship out a file when the connect comes in. The browser may pervert 365binary data when told to save the URL, but you can dig the raw data out of 366the on-disk cache. 367 368If you build netcat with GAPING_SECURITY_HOLE defined, you can use it as an 369"inetd" substitute to test experimental network servers that would otherwise 370run under "inetd". A script or program will have its input and output hooked 371to the network the same way, perhaps sans some fancier signal handling. Given 372that most network services do not bind to a particular local address, whether 373they are under "inetd" or not, it is possible for netcat avoid the "address 374already in use" error by binding to a specific address. This lets you [as 375root, for low ports] place netcat "in the way" of a standard service, since 376inbound connections are generally sent to such specifically-bound listeners 377first and fall back to the ones bound to "any". This allows for a one-off 378experimental simulation of some service, without having to screw around with 379inetd.conf. Running with -v turned on and collecting a connection log from 380standard error is recommended. 381 382Netcat as well can make an outbound connection and then run a program or script 383on the originating end, with input and output connected to the same network 384port. This "inverse inetd" capability could enhance the backup-server concept 385described above or help facilitate things such as a "network dialback" concept. 386The possibilities are many and varied here; if such things are intended as 387security mechanisms, it may be best to modify netcat specifically for the 388purpose instead of wrapping such functions in scripts. 389 390Speaking of inetd, netcat will function perfectly well *under* inetd as a TCP 391connection redirector for inbound services, like a "plug-gw" without the 392authentication step. This is very useful for doing stuff like redirecting 393traffic through your firewall out to other places like web servers and mail 394hubs, while posing no risk to the firewall machine itself. Put netcat behind 395inetd and tcp_wrappers, perhaps thusly: 396 397 www stream tcp nowait nobody /etc/tcpd /bin/nc -w 3 realwww 80 398 399and you have a simple and effective "application relay" with access control 400and logging. Note use of the wait time as a "safety" in case realwww isn't 401reachable or the calling user aborts the connection -- otherwise the relay may 402hang there forever. 403 404You can use netcat to generate huge amounts of useless network data for 405various performance testing. For example, doing 406 407 yes AAAAAAAAAAAAAAAAAAAAAA | nc -v -v -l -p 2222 > /dev/null 408 409on one side and then hitting it with 410 411 yes BBBBBBBBBBBBBBBBBBBBBB | nc othermachine 2222 > /dev/null 412 413from another host will saturate your wires with A's and B's. The "very 414verbose" switch usage will tell you how many of each were sent and received 415after you interrupt either side. Using UDP mode produces tremendously MORE 416trash per unit time in the form of fragmented 8 Kbyte mobygrams -- enough to 417stress-test kernels and network interfaces. Firing random binary data into 418various network servers may help expose bugs in their input handling, which 419nowadays is a popular thing to explore. A simple example data-generator is 420given in data/data.c included in this package, along with a small collection 421of canned input files to generate various packet contents. This program is 422documented in its beginning comments, but of interest here is using "%r" to 423generate random bytes at well-chosen points in a data stream. If you can 424crash your daemon, you likely have a security problem. 425 426The hex dump feature may be useful for debugging odd network protocols, 427especially if you don't have any network monitoring equipment handy or aren't 428root where you'd need to run "tcpdump" or something. Bind a listening netcat 429to a local port, and have it run a script which in turn runs another netcat 430to the real service and captures the hex dump to a log file. This sets up a 431transparent relay between your local port and wherever the real service is. 432Be sure that the script-run netcat does *not* use -v, or the extra info it 433sends to standard error may confuse the protocol. Note also that you cannot 434have the "listen/exec" netcat do the data capture, since once the connection 435arrives it is no longer netcat that is running. 436 437Binding to an arbitrary local port allows you to simulate things like r-service 438clients, if you are root locally. For example, feeding "^@root^@joe^@pwd^@" 439[where ^@ is a null, and root/joe could be any other local/remote username 440pair] into a "rsh" or "rlogin" server, FROM your port 1023 for example, 441duplicates what the server expects to receive. Thus, you can test for insecure 442.rhosts files around your network without having to create new user accounts on 443your client machine. The program data/rservice.c can aid this process by 444constructing the "rcmd" protocol bytes. Doing this also prevents "rshd" from 445trying to create that separate standard-error socket and still gives you an 446input path, as opposed to the usual action of "rsh -n". Using netcat for 447things like this can be really useful sometimes, because rsh and rlogin 448generally want a host *name* as an argument and won't accept IP addresses. If 449your client-end DNS is hosed, as may be true when you're trying to extract 450backup sets on to a dumb client, "netcat -n" wins where normal rsh/rlogin is 451useless. 452 453If you are unsure that a remote syslogger is working, test it with netcat. 454Make a UDP connection to port 514 and type in "<0>message", which should 455correspond to "kern.emerg" and cause syslogd to scream into every file it has 456open [and possibly all over users' terminals]. You can tame this down by 457using a different number and use netcat inside routine scripts to send syslog 458messages to places that aren't configured in syslog.conf. For example, 459"echo '<38>message' | nc -w 1 -u loggerhost 514" should send to auth.notice 460on loggerhost. The exact number may vary; check against your syslog.h first. 461 462Netcat provides several ways for you to test your own packet filters. If you 463bind to a port normally protected against outside access and make a connection 464to somewhere outside your own network, the return traffic will be coming to 465your chosen port from the "outside" and should be blocked. TCP may get through 466if your filter passes all "ack syn", but it shouldn't be even doing that to low 467ports on your network. Remember to test with UDP traffic as well! If your 468filter passes at least outbound source-routed IP packets, bouncing a connection 469back to yourself via some gateway outside your network will create "incoming" 470traffic with your source address, which should get dropped by a correctly 471configured anti-spoofing filter. This is a "non-test" if you're also dropping 472source-routing, but it's good to be able to test for that too. Any packet 473filter worth its salt will be blocking source-routed packets in both 474directions, but you never know what interesting quirks you might turn up by 475playing around with source ports and addresses and watching the wires with a 476network monitor. 477 478You can use netcat to protect your own workstation's X server against outside 479access. X is stupid enough to listen for connections on "any" and never tell 480you when new connections arrive, which is one reason it is so vulnerable. Once 481you have all your various X windows up and running you can use netcat to bind 482just to your ethernet address and listen to port 6000. Any new connections 483from outside the machine will hit netcat instead your X server, and you get a 484log of who's trying. You can either tell netcat to drop the connection, or 485perhaps run another copy of itself to relay to your actual X server on 486"localhost". This may not work for dedicated X terminals, but it may be 487possible to authorize your X terminal only for its boot server, and run a relay 488netcat over on the server that will in turn talk to your X terminal. Since 489netcat only handles one listening connection per run, make sure that whatever 490way you rig it causes another one to run and listen on 6000 soon afterward, or 491your real X server will be reachable once again. A very minimal script just 492to protect yourself could be 493 494 while true ; do 495 nc -v -l -s <your-addr> -p 6000 localhost 2 496 done 497 498which causes netcat to accept and then close any inbound connection to your 499workstation's normal ethernet address, and another copy is immediately run by 500the script. Send standard error to a file for a log of connection attempts. 501If your system can't do the "specific bind" thing all is not lost; run your 502X server on display ":1" or port 6001, and netcat can still function as a probe 503alarm by listening on 6000. 504 505Does your shell-account provider allow personal Web pages, but not CGI scripts? 506You can have netcat listen on a particular port to execute a program or script 507of your choosing, and then just point to the port with a URL in your homepage. 508The listener could even exist on a completely different machine, avoiding the 509potential ire of the homepage-host administrators. Since the script will get 510the raw browser query as input it won't look like a typical CGI script, and 511since it's running under your UID you need to write it carefully. You may want 512to write a netcat-based script as a wrapper that reads a query and sets up 513environment variables for a regular CGI script. The possibilities for using 514netcat and scripts to handle Web stuff are almost endless. Again, see the 515examples under scripts/. 516 517Example uses -- the dark side 518============================= 519 520Equal time is deserved here, since a versatile tool like this can be useful 521to any Shade of Hat. I could use my Victorinox to either fix your car or 522disassemble it, right? You can clearly use something like netcat to attack 523or defend -- I don't try to govern anyone's social outlook, I just build tools. 524Regardless of your intentions, you should still be aware of these threats to 525your own systems. 526 527The first obvious thing is scanning someone *else's* network for vulnerable 528services. Files containing preconstructed data, be it exploratory or 529exploitive, can be fed in as standard input, including command-line arguments 530to netcat itself to keep "ps" ignorant of your doings. The more random the 531scanning, the less likelihood of detection by humans, scan-detectors, or 532dynamic filtering, and with -i you'll wait longer but avoid loading down the 533target's network. Some examples for crafting various standard UDP probes are 534given in data/*.d. 535 536Some configurations of packet filters attempt to solve the FTP-data problem by 537just allowing such connections from the outside. These come FROM port 20, TO 538high TCP ports inside -- if you locally bind to port 20, you may find yourself 539able to bypass filtering in some cases. Maybe not to low ports "inside", but 540perhaps to TCP NFS servers, X servers, Prospero, ciscos that listen on 200x 541and 400x... Similar bypassing may be possible for UDP [and maybe TCP too] if a 542connection comes from port 53; a filter may assume it's a nameserver response. 543 544Using -e in conjunction with binding to a specific address can enable "server 545takeover" by getting in ahead of the real ones, whereupon you can snarf data 546sent in and feed your own back out. At the very least you can log a hex dump 547of someone else's session. If you are root, you can certainly use -s and -e to 548run various hacked daemons without having to touch inetd.conf or the real 549daemons themselves. You may not always have the root access to deal with low 550ports, but what if you are on a machine that also happens to be an NFS server? 551You might be able to collect some interesting things from port 2049, including 552local file handles. There are several other servers that run on high ports 553that are likely candidates for takeover, including many of the RPC services on 554some platforms [yppasswdd, anyone?]. Kerberos tickets, X cookies, and IRC 555traffic also come to mind. RADIUS-based terminal servers connect incoming 556users to shell-account machines on a high port, usually 1642 or thereabouts. 557SOCKS servers run on 1080. Do "netstat -a" and get creative. 558 559There are some daemons that are well-written enough to bind separately to all 560the local interfaces, possibly with an eye toward heading off this sort of 561problem. Named from recent BIND releases, and NTP, are two that come to mind. 562Netstat will show these listening on address.53 instead of *.53. You won't 563be able to get in front of these on any of the real interface addresses, which 564of course is especially interesting in the case of named, but these servers 565sometimes forget about things like "alias" interface addresses or interfaces 566that appear later on such as dynamic PPP links. There are some hacked web 567servers and versions of "inetd" floating around that specifically bind as well, 568based on a configuration file -- these generally *are* bound to alias addresses 569to offer several different address-based services from one machine. 570 571Using -e to start a remote backdoor shell is another obvious sort of thing, 572easier than constructing a file for inetd to listen on "ingreslock" or 573something, and you can access-control it against other people by specifying a 574client host and port. Experience with this truly demonstrates how fragile the 575barrier between being "logged in" or not really is, and is further expressed by 576scripts/bsh. If you're already behind a firewall, it may be easier to make an 577*outbound* connection and then run a shell; a small wrapper script can 578periodically try connecting to a known place and port, you can later listen 579there until the inbound connection arrives, and there's your shell. Running 580a shell via UDP has several interesting features, although be aware that once 581"connected", the UDP stub sockets tend to show up in "netstat" just like TCP 582connections and may not be quite as subtle as you wanted. Packets may also be 583lost, so use TCP if you need reliable connections. But since UDP is 584connectionless, a hookup of this sort will stick around almost forever, even if 585you ^C out of netcat or do a reboot on your side, and you only need to remember 586the ports you used on both ends to reestablish. And outbound UDP-plus-exec 587connection creates the connected socket and starts the program immediately. On 588a listening UDP connection, the socket is created once a first packet is 589received. In either case, though, such a "connection" has the interesting side 590effect that only your client-side IP address and [chosen?] source port will 591thereafter be able to talk to it. Instant access control! A non-local third 592party would have to do ALL of the following to take over such a session: 593 594 forge UDP with your source address [trivial to do; see below] 595 guess the port numbers of BOTH ends, or sniff the wire for them 596 arrange to block ICMP or UDP return traffic between it and your real 597 source, so the session doesn't die with a network write error. 598 599The companion program data/rservice.c is helpful in scripting up any sort of 600r-service username or password guessing attack. The arguments to "rservice" 601are simply the strings that get null-terminated and passed over an "rcmd"-style 602connection, with the assumption that the client does not need a separate 603standard-error port. Brute-force password banging is best done via "rexec" if 604it is available since it is less likely to log failed attempts. Thus, doing 605"rservice joe joespass pwd | nc target exec" should return joe's home dir if 606the password is right, or "Permission denied." Plug in a dictionary and go to 607town. If you're attacking rsh/rlogin, remember to be root and bind to a port 608between 512 and 1023 on your end, and pipe in "rservice joe joe pwd" and such. 609 610Netcat can prevent inadvertently sending extra information over a telnet 611connection. Use "nc -t" in place of telnet, and daemons that try to ask for 612things like USER and TERM environment variables will get no useful answers, as 613they otherwise would from a more recent telnet program. Some telnetds actually 614try to collect this stuff and then plug the USER variable into "login" so that 615the caller is then just asked for a password! This mechanism could cause a 616login attempt as YOUR real username to be logged over there if you use a 617Borman-based telnet instead of "nc -t". 618 619Got an unused network interface configured in your kernel [e.g. SLIP], or 620support for alias addresses? Ifconfig one to be any address you like, and bind 621to it with -s to enable all sorts of shenanigans with bogus source addresses. 622The interface probably has to be UP before this works; some SLIP versions 623need a far-end address before this is true. Hammering on UDP services is then 624a no-brainer. What you can do to an unfiltered syslog daemon should be fairly 625obvious; trimming the conf file can help protect against it. Many routers out 626there still blindly believe what they receive via RIP and other routing 627protocols. Although most UDP echo and chargen servers check if an incoming 628packet was sent from *another* "internal" UDP server, there are many that still 629do not, any two of which [or many, for that matter] could keep each other 630entertained for hours at the expense of bandwidth. And you can always make 631someone wonder why she's being probed by nsa.gov. 632 633Your TCP spoofing possibilities are mostly limited to destinations you can 634source-route to while locally bound to your phony address. Many sites block 635source-routed packets these days for precisely this reason. If your kernel 636does oddball things when sending source-routed packets, try moving the pointer 637around with -G. You may also have to fiddle with the routing on your own 638machine before you start receiving packets back. Warning: some machines still 639send out traffic using the source address of the outbound interface, regardless 640of your binding, especially in the case of localhost. Check first. If you can 641open a connection but then get no data back from it, the target host is 642probably killing the IP options on its end [this is an option inside TCP 643wrappers and several other packages], which happens after the 3-way handshake 644is completed. If you send some data and observe the "send-q" side of "netstat" 645for that connection increasing but never getting sent, that's another symptom. 646Beware: if Sendmail 8.7.x detects a source-routed SMTP connection, it extracts 647the hop list and sticks it in the Received: header! 648 649SYN bombing [sometimes called "hosing"] can disable many TCP servers, and if 650you hit one often enough, you can keep it unreachable for days. As is true of 651many other denial-of-service attacks, there is currently no defense against it 652except maybe at the human level. Making kernel SOMAXCONN considerably larger 653than the default and the half-open timeout smaller can help, and indeed some 654people running large high-performance web servers have *had* to do that just to 655handle normal traffic. Taking out mailers and web servers is sociopathic, but 656on the other hand it is sometimes useful to be able to, say, disable a site's 657identd daemon for a few minutes. If someone realizes what is going on, 658backtracing will still be difficult since the packets have a phony source 659address, but calls to enough ISP NOCs might eventually pinpoint the source. 660It is also trivial for a clueful ISP to watch for or even block outgoing 661packets with obviously fake source addresses, but as we know many of them are 662not clueful or willing to get involved in such hassles. Besides, outbound 663packets with an [otherwise unreachable] source address in one of their net 664blocks would look fairly legitimate. 665 666Notes 667===== 668 669A discussion of various caveats, subtleties, and the design of the innards. 670 671As of version 1.07 you can construct a single file containing command arguments 672and then some data to transfer. Netcat is now smart enough to pick out the 673first line and build the argument list, and send any remaining data across the 674net to one or multiple ports. The first release of netcat had trouble with 675this -- it called fgets() for the command line argument, which behind the 676scenes does a large read() from standard input, perhaps 4096 bytes or so, and 677feeds that out to the fgets() library routine. By the time netcat 1.00 started 678directly read()ing stdin for more data, 4096 bytes of it were gone. It now 679uses raw read() everywhere and does the right thing whether reading from files, 680pipes, or ttys. If you use this for multiple-port connections, the single 681block of data will now be a maximum of 8K minus the first line. Improvements 682have been made to the logic in sending the saved chunk to each new port. Note 683that any command-line arguments hidden using this mechanism could still be 684extracted from a core dump. 685 686When netcat receives an inbound UDP connection, it creates a "connected socket" 687back to the source of the connection so that it can also send out data using 688normal write(). Using this mechanism instead of recvfrom/sendto has several 689advantages -- the read/write select loop is simplified, and ICMP errors can in 690effect be received by non-root users. However, it has the subtle side effect 691that if further UDP packets arrive from the caller but from different source 692ports, the listener will not receive them. UDP listen mode on a multihomed 693machine may have similar quirks unless you specifically bind to one of its 694addresses. It is not clear that kernel support for UDP connected sockets 695and/or my understanding of it is entirely complete here, so experiment... 696 697You should be aware of some subtleties concerning UDP scanning. If -z is on, 698netcat attempts to send a single null byte to the target port, twice, with a 699small time in between. You can either use the -w timeout, or netcat will try 700to make a "sideline" TCP connection to the target to introduce a small time 701delay equal to the round-trip time between you and the target. Note that if 702you have a -w timeout and -i timeout set, BOTH take effect and you wait twice 703as long. The TCP connection is to a normally refused port to minimize traffic, 704but if you notice a UDP fast-scan taking somewhat longer than it should, it 705could be that the target is actually listening on the TCP port. Either way, 706any ICMP port-unreachable messages from the target should have arrived in the 707meantime. The second single-byte UDP probe is then sent. Under BSD kernels, 708the ICMP error is delivered to the "connected socket" and the second write 709returns an error, which tells netcat that there is NOT a UDP service there. 710While Linux seems to be a fortunate exception, under many SYSV derived kernels 711the ICMP is not delivered, and netcat starts reporting that *all* the ports are 712"open" -- clearly wrong. [Some systems may not even *have* the "udp connected 713socket" concept, and netcat in its current form will not work for UDP at all.] 714If -z is specified and only one UDP port is probed, netcat's exit status 715reflects whether the connection was "open" or "refused" as with TCP. 716 717It may also be that UDP packets are being blocked by filters with no ICMP error 718returns, in which case everything will time out and return "open". This all 719sounds backwards, but that's how UDP works. If you're not sure, try "echo 720w00gumz | nc -u -w 2 target 7" to see if you can reach its UDP echo port at 721all. You should have no trouble using a BSD-flavor system to scan for UDP 722around your own network, although flooding a target with the high activity that 723-z generates will cause it to occasionally drop packets and indicate false 724"opens". A more "correct" way to do this is collect and analyze the ICMP 725errors, as does SATAN's "udp_scan" backend, but then again there's no guarantee 726that the ICMP gets back to you either. Udp_scan also does the zero-byte 727probes but is excruciatingly careful to calculate its own round-trip timing 728average and dynamically set its own response timeouts along with decoding any 729ICMP received. Netcat uses a much sleazier method which is nonetheless quite 730effective. Cisco routers are known to have a "dead time" in between ICMP 731responses about unreachable UDP ports, so a fast scan of a cisco will show 732almost everything "open". If you are looking for a specific UDP service, you 733can construct a file containing the right bytes to trigger a response from the 734other end and send that as standard input. Netcat will read up to 8K of the 735file and send the same data to every UDP port given. Note that you must use a 736timeout in this case [as would any other UDP client application] since the 737two-write probe only happens if -z is specified. 738 739Many telnet servers insist on a specific set of option negotiations before 740presenting a login banner. On a raw connection you will see this as small 741amount of binary gook. My attempts to create fixed input bytes to make a 742telnetd happy worked some places but failed against newer BSD-flavor ones, 743possibly due to timing problems, but there are a couple of much better 744workarounds. First, compile with -DTELNET and use -t if you just want to get 745past the option negotiation and talk to something on a telnet port. You will 746still see the binary gook -- in fact you'll see a lot more of it as the options 747are responded to behind the scenes. The telnet responder does NOT update the 748total byte count, or show up in the hex dump -- it just responds negatively to 749any options read from the incoming data stream. If you want to use a normal 750full-blown telnet to get to something but also want some of netcat's features 751involved like settable ports or timeouts, construct a tiny "foo" script: 752 753 #! /bin/sh 754 exec nc -otheroptions targethost 23 755 756and then do 757 758 nc -l -p someport -e foo localhost & 759 telnet localhost someport 760 761and your telnet should connect transparently through the exec'ed netcat to 762the target, using whatever options you supplied in the "foo" script. Don't 763use -t inside the script, or you'll wind up sending *two* option responses. 764 765I've observed inconsistent behavior under some Linuxes [perhaps just older 766ones?] when binding in listen mode. Sometimes netcat binds only to "localhost" 767if invoked with no address or port arguments, and sometimes it is unable to 768bind to a specific address for listening if something else is already listening 769on "any". The former problem can be worked around by specifying "-s 0.0.0.0", 770which will do the right thing despite netcat claiming that it's listening on 771[127.0.0.1]. This is a known problem -- for example, there's a mention of it 772in the makefile for SOCKS. On the flip side, binding to localhost and sending 773packets to some other machine doesn't work as you'd expect -- they go out with 774the source address of the sending interface instead. The Linux kernel contains 775a specific check to ensure that packets from 127.0.0.1 are never sent to the 776wire; other kernels may contain similar code. Linux, of course, *still* 777doesn't support source-routing, but they claim that it and many other network 778improvements are at least breathing hard. 779 780There are several possible errors associated with making TCP connections, but 781to specifically see anything other than "refused", one must wait the full 782kernel-defined timeout for a connection to fail. Netcat's mechanism of 783wrapping an alarm timer around the connect prevents the *real* network error 784from being returned -- "errno" at that point indicates "interrupted system 785call" since the connect attempt was interrupted. Some old 4.3 BSD kernels 786would actually return things like "host unreachable" immediately if that was 787the case, but most newer kernels seem to wait the full timeout and *then* pass 788back the real error. Go figure. In this case, I'd argue that the old way was 789better, despite those same kernels generally being the ones that tear down 790*established* TCP connections when ICMP-bombed. 791 792Incoming socket options are passed to applications by the kernel in the 793kernel's own internal format. The socket-options structure for source-routing 794contains the "first-hop" IP address first, followed by the rest of the real 795options list. The kernel uses this as is when sending reply packets -- the 796structure is therefore designed to be more useful to the kernel than to humans, 797but the hex dump of it that netcat produces is still useful to have. 798 799Kernels treat source-routing options somewhat oddly, but it sort of makes sense 800once one understands what's going on internally. The options list of addresses 801must contain hop1, hop2, ..., destination. When a source-routed packet is sent 802by the kernel [at least BSD], the actual destination address becomes irrelevant 803because it is replaced with "hop1", "hop1" is removed from the options list, 804and all the other addresses in the list are shifted up to fill the hole. Thus 805the outbound packet is sent from your chosen source address to the first 806*gateway*, and the options list now contains hop2, ..., destination. During 807all this address shuffling, the kernel does NOT change the pointer value, which 808is why it is useful to be able to set the pointer yourself -- you can construct 809some really bizarre return paths, and send your traffic fairly directly to the 810target but around some larger loop on the way back. Some Sun kernels seem to 811never flip the source-route around if it contains less than three hops, never 812reset the pointer anyway, and tries to send the packet [with options containing 813a "completed" source route!!] directly back to the source. This is way broken, 814of course. [Maybe ipforwarding has to be on? I haven't had an opportunity to 815beat on it thoroughly yet.] 816 817"Credits" section: The original idea for netcat fell out of a long-standing 818desire and fruitless search for a tool resembling it and having the same 819features. After reading some other network code and realizing just how many 820cool things about sockets could be controlled by the calling user, I started 821on the basics and the rest fell together pretty quickly. Some port-scanning 822ideas were taken from Venema/Farmer's SATAN tool kit, and Pluvius' "pscan" 823utility. Healthy amounts of BSD kernel source were perused in an attempt to 824dope out socket options and source-route handling; additional help was obtained 825from Dave Borman's telnet sources. The select loop is loosely based on fairly 826well-known code from "rsh" and Richard Stevens' "sock" program [which itself is 827sort of a "netcat" with more obscure features], with some more paranoid 828sanity-checking thrown in to guard against the distinct likelihood that there 829are subtleties about such things I still don't understand. I found the 830argument-hiding method cleanly implemented in Barrett's "deslogin"; reading the 831line as input allows greater versatility and is much less prone to cause 832bizarre problems than the more common trick of overwriting the argv array. 833After the first release, several people contributed portability fixes; they are 834credited in generic.h and the Makefile. Lauren Burka inspired the ascii art 835for this revised document. Dean Gaudet at Wired supplied a precursor to 836the hex-dump code, and mudge@l0pht.com originally experimented with and 837supplied code for the telnet-options responder. Outbound "-e <prog>" resulted 838from a need to quietly bypass a firewall installation. Other suggestions and 839patches have rolled in for which I am always grateful, but there are only 26 840hours per day and a discussion of feature creep near the end of this document. 841 842Netcat was written with the Russian railroad in mind -- conservatively built 843and solid, but it *will* get you there. While the coding style is fairly 844"tight", I have attempted to present it cleanly [keeping *my* lines under 80 845characters, dammit] and put in plenty of comments as to why certain things 846are done. Items I know to be questionable are clearly marked with "XXX". 847Source code was made to be modified, but determining where to start is 848difficult with some of the tangles of spaghetti code that are out there. 849Here are some of the major points I feel are worth mentioning about netcat's 850internal design, whether or not you agree with my approach. 851 852Except for generic.h, which changes to adapt more platforms, netcat is a single 853source file. This has the distinct advantage of only having to include headers 854once and not having to re-declare all my functions in a billion different 855places. I have attempted to contain all the gross who's-got-what-.h-file 856things in one small dumping ground. Functions are placed "dependencies-first", 857such that when the compiler runs into the calls later, it already knows the 858type and arguments and won't complain. No function prototyping -- not even the 859__P(()) crock -- is used, since it is more portable and a file of this size is 860easy enough to check manually. Each function has a standard-format comment 861ahead of it, which is easily found using the regexp " :$". I freely use gotos. 862Loops and if-clauses are made as small and non-nested as possible, and the ends 863of same *marked* for clarity [I wish everyone would do this!!]. 864 865Large structures and buffers are all malloc()ed up on the fly, slightly larger 866than the size asked for and zeroed out. This reduces the chances of damage 867from those "end of the buffer" fencepost errors or runaway pointers escaping 868off the end. These things are permanent per run, so nothing needs to be freed 869until the program exits. 870 871File descriptor zero is always expected to be standard input, even if it is 872closed. If a new network descriptor winds up being zero, a different one is 873asked for which will be nonzero, and fd zero is simply left kicking around 874for the rest of the run. Why? Because everything else assumes that stdin is 875always zero and "netfd" is always positive. This may seem silly, but it was a 876lot easier to code. The new fd is obtained directly as a new socket, because 877trying to simply dup() a new fd broke subsequent socket-style use of the new fd 878under Solaris' stupid streams handling in the socket library. 879 880The catch-all message and error handlers are implemented with an ample list of 881phoney arguments to get around various problems with varargs. Varargs seems 882like deliberate obfuscation in the first place, and using it would also 883require use of vfprintf() which not all platforms support. The trailing 884sleep in bail() is to allow output to flush, which is sometimes needed if 885netcat is already on the other end of a network connection. 886 887The reader may notice that the section that does DNS lookups seems much 888gnarlier and more confusing than other parts. This is NOT MY FAULT. The 889sockaddr and hostent abstractions are an abortion that forces the coder to 890deal with it. Then again, a lot of BSD kernel code looks like similar 891struct-pointer hell. I try to straighten it out somewhat by defining my own 892HINF structure, containing names, ascii-format IP addresses, and binary IP 893addresses. I fill this structure exactly once per host argument, and squirrel 894everything safely away and handy for whatever wants to reference it later. 895 896Where many other network apps use the FIONBIO ioctl to set non-blocking I/O 897on network sockets, netcat uses straightforward blocking I/O everywhere. 898This makes everything very lock-step, relying on the network and filesystem 899layers to feed in data when needed. Data read in is completely written out 900before any more is fetched. This may not be quite the right thing to do under 901some OSes that don't do timed select() right, but this remains to be seen. 902 903The hexdump routine is written to be as fast as possible, which is why it does 904so much work itself instead of just sprintf()ing everything together. Each 905dump line is built into a single buffer and atomically written out using the 906lowest level I/O calls. Further improvements could undoubtedly be made by 907using writev() and eliminating all sprintf()s, but it seems to fly right along 908as is. If both exec-a-prog mode and a hexdump file is asked for, the hexdump 909flag is deliberately turned off to avoid creating random zero-length files. 910Files are opened in "truncate" mode; if you want "append" mode instead, change 911the open flags in main(). 912 913main() may look a bit hairy, but that's only because it has to go down the 914argv list and handle multiple ports, random mode, and exit status. Efforts 915have been made to place a minimum of code inside the getopt() loop. Any real 916work is sent off to functions in what is hopefully a straightforward way. 917 918Obligatory vendor-bash: If "nc" had become a standard utility years ago, 919the commercial vendors would have likely packaged it setuid root and with 920-DGAPING_SECURITY_HOLE turned on but not documented. It is hoped that netcat 921will aid people in finding and fixing the no-brainer holes of this sort that 922keep appearing, by allowing easier experimentation with the "bare metal" of 923the network layer. 924 925It could be argued that netcat already has too many features. I have tried 926to avoid "feature creep" by limiting netcat's base functionality only to those 927things which are truly relevant to making network connections and the everyday 928associated DNS lossage we're used to. Option switches already have slightly 929overloaded functionality. Random port mode is sort of pushing it. The 930hex-dump feature went in later because it *is* genuinely useful. The 931telnet-responder code *almost* verges on the gratuitous, especially since it 932mucks with the data stream, and is left as an optional piece. Many people have 933asked for example "how 'bout adding encryption?" and my response is that such 934things should be separate entities that could pipe their data *through* netcat 935instead of having their own networking code. I am therefore not completely 936enthusiastic about adding any more features to this thing, although you are 937still free to send along any mods you think are useful. 938 939Nonetheless, at this point I think of netcat as my tcp/ip swiss army knife, 940and the numerous companion programs and scripts to go with it as duct tape. 941Duct tape of course has a light side and a dark side and binds the universe 942together, and if I wrap enough of it around what I'm trying to accomplish, 943it *will* work. Alternatively, if netcat is a large hammer, there are many 944network protocols that are increasingly looking like nails by now... 945 946_H* 960320 v1.10 RELEASE -- happy spring! 947