Skip to content

xtaci/grasshopper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

81 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ¦— grasshopper

GoDoc MIT licensed Created At Go Report Card

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.

Architecture

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

                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                 
                      β”‚ 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

Install the latest version of Grasshopper using the following command:

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

Parameters

Grasshopper supports the following 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, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, sm4, none (default "3des")
      --co string          Cryptography method for incoming data. Available options: aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, sm4, none (default "3des")
  -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

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

Cases-β…  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 Relayer to the Echo Server

Run the following command to start a relayer:

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

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

Run the following command to start another relayer:

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

Step 4: Start a Demo Client

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

ncat -u 127.0.0.1 2132

Case-β…‘ Secure DNS query

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

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

./grasshopper start --ci aes --co none -l "CLOUD_PUBLIC_IP:4000" -n "8.8.8.8:53"
  • --ci aes: Decrypts the packet from Level-1 Relayer.
  • --co none: Transfers decrypted plaintext DNS query packet to Google DNS.

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

./grasshopper start --ci none --co aes -l "127.0.0.1:4000" -n "CLOUD_PUBLIC_IP:4000"
  • --ci none: Since dig command queries in plaintext, we do not need to decrypt the packet.
  • --co aes: Decrypts and relays packets to Level-2 Relayer

Step 3: Query Level-1 Relayer with dig(On your LaptopπŸ’»)

dig google.com @127.0.0.1 -p 4000