Skip to content

xtaci/grasshopper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ¦— grasshopper

GoDoc MIT licensed Created At Go Report Card Release

Grasshopper is a UDP packet forwarder that listens for incoming packets and forwards them to a configured destination. It optionally supports encryption for both incoming and outgoing packets, using different keys and cryptographic methods.

Architecture

Grasshopper functions as a chained relay system. For example, consider a chained DNS query:

                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                 
                      β”‚ ENCRYPTED  β”‚                 β”‚ RE-ENCRYPTION β”‚                                 
                      β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜                 β”‚ AES ───► 3DES β”‚                                 
                             β”‚                       β””β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                 
                             β”‚                           β”‚                                             
                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”β–Ό             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”                     
                <HOP0>   HOPS(AES)         β”‚  DECRYPTED β”‚β–Ό          <HOP5>      HOPS(FINAL)            
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β””       β”Œβ”€β”€β”€β”€β”           β””  DATA   HOPS(3DES)        β”‚       β”Œβ”€β”΄β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ dig xxx β”œβ”€β–Ί CLEAR TEXT  β”‚HOP1┼── CIPHER ──► PACKET  β”Œβ”€β”΄β”€β”€β”           β”” DNS   β”‚Hop6β”œβ”€β–Ί 8.8.8.8:53 β”‚
β”‚ @hop0   β”‚       β”Œ       β”‚Hop2β”‚   (AES)   β”Œ          β”‚Hop4β”œβ”€ CIPHER ──► QUERY β”‚Hop7β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚  β–²    β”‚HOP3β”‚         <HOP2>  β–²    β”‚Hop5β”‚  (3DES)   β”Œ       β””β”€β”¬β”€β”€β”˜                  
                  β”‚  β”‚    β””β”€β”€β”€β”€β”˜           β”‚     β”‚    β””β”€β”¬β”€β”€β”˜           β”‚         β”‚                     
                  β””β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                     
                     β”‚                           β”‚                                                     
                  β”Œβ”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”                  β”‚                                                     
                  β”‚           β”‚                  β”‚                                                     
                  β”‚ OPTIONAL  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                     
                  β”‚ PACKET    β”‚                                                                        
                  β”‚ PROCESSOR β”‚                                                                        
                  β”‚           β”‚                                                                        
                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                                        

Installation

To install the latest version of Grasshopper, use the following command:

go install  github.com/xtaci/grasshopper/cmd/grasshopper@latest     

Parameters

Grasshopper supports the following command-line parameters:

Grasshopper is a UDP packet forwarder that listens for incoming packets and forwards them to a configured destination. It optionally supports cryptography for both incoming and outgoing packets, using different keys and methods.  Optionally, the listener can be configured to apply cryptogrraphy on both the incoming and outgoing packets, with different keys and methods.

Usage:
  grasshopper [command]

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  start       Start a listener for UDP packet forwarding

Flags:
      --ci string          Cryptography method for incoming data. Available options: aes, aes-128, aes-192, qpp, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, sm4, none (default "qpp")
      --co string          Cryptography method for outgoing data. Available options: aes, aes-128, aes-192, qpp, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, sm4, none (default "qpp")
  -c, --config string      config file name
  -h, --help               help for grasshopper
      --ki string          Secret key to encrypt and decrypt for the last hop(client-side) (default "it's a secret")
      --ko string          Secret key to encrypt and decrypt for the next hops (default "it's a secret")
  -l, --listen string      Listener address, eg: "IP:1234" (default ":1234")
  -n, --nexthops strings   Servers to randomly forward to (default [127.0.0.1:3000])
      --sockbuf int        Socket buffer size for the listener (default 1048576)
      --timeout duration   Idle timeout duration for a UDP connection (default 1m0s)
  -t, --toggle             Help message for toggle
  -v, --version            version for grasshopper

Use "grasshopper [command] --help" for more information about a command.

Cryptography Support

Use Cases

Case I: Secure Echo

Step 1: Start a UDP Echo Server

Use ncat to start a UDP echo server on port 5000:

ncat -e /bin/cat -k -u -l 5000

Step 2: Start a Level-2 Relay to the Echo Server

Run the following command to start a relay:

./grasshopper start --ci aes --co none -l "127.0.0.1:4001" -n "127.0.0.1:5000"
  • --ci aes: Applies encryption to incoming packets.
  • --co none: Forwards plaintext to the ncat echo server.

Step 3: Start a Level-1 Relay to the Level-2 Relay

Run the following command to start another relay:

./grasshopper start --ci none --co aes -l "127.0.0.1:4000" -n "127.0.0.1:4001"
  • --ci none: No encryption is applied to incoming packets.
  • --co aes: Encrypts packets and forwards them to the next hop.

Step 4: Start a Demo Client

Use ncat to send UDP packets and interact with the relay chain:

ncat -u 127.0.0.1 2132

Case II: Secure DNS Query (Random Selection)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ YOUR─LAPTOP ──────────────┐           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ CLOUD─SERVER ───────────┐
β”‚                                       β”‚           β”‚                                   β”‚
β”‚                                       β”‚           β”‚                                   β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚           β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚ β”‚                   β”‚   β”‚          β”‚  β”‚           β”‚ β”‚          β”‚   β”‚               β”‚  β”‚
β”‚ β”‚ dig google.com    β”œβ”€β”€β”€β–Ί Level-1  β”‚  β”‚           β”‚ β”‚ Level-2  β”œβ”€β”€β”€β–Ί Google DNS:53 β”‚  β”‚
β”‚ β”‚ @127.0.0.1 -p 4000β”‚   β”‚ Relayer  ┼──┼ ENCRYPTED ┼─► Relayer  β”‚   β”‚ CloudFlare:53 β”‚  β”‚
β”‚ β”‚                   β”‚   β”‚          β”‚  β”‚    UDP    β”‚ β”‚          β”‚   β”‚               β”‚  β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚           β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                       β”‚           β”‚                                   β”‚
β”‚                                       β”‚           β”‚                                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Step 1: Start a Level-2 Relay to the DNS Server (On Your Cloud Server πŸ–₯️)

./grasshopper start --ci aes --co none -l "CLOUD_PUBLIC_IP:4000" -n "8.8.8.8:53,1.1.1.1:53"
  • --ci aes: Decrypts incoming packets from the Level-1 relay. (ci stands for cipher-in)
  • --co none: Forwards decrypted plaintext DNS query packets to the DNS server. (co stands for cipher-out)

Step 2: Start a Level-1 Relay to the Level-2 Relay (On Your Laptop πŸ’»)

./grasshopper start --ci none --co aes -l "127.0.0.1:4000" -n "CLOUD_PUBLIC_IP:4000"
  • --ci none: Since the dig command sends queries in plaintext, no decryption is needed for incoming packets.
  • --co aes: Encrypts and forwards packets to the Level-2 relay.

Step 3: Query the Level-1 Relay with dig (On Your Laptop πŸ’»)

dig google.com @127.0.0.1 -p 4000

About

A secure chained packet relayer for UDP

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •