From 049a9a6d48249b1cc3ccce0d5439dec6980c99fa Mon Sep 17 00:00:00 2001 From: olebeck <31539311+olebeck@users.noreply.github.com> Date: Sat, 11 Mar 2023 17:18:55 +0100 Subject: [PATCH] add blind proxy --- subcommands/blind-proxy.go | 106 +++++++++++++++++++++++++++++++++++ subcommands/realm-address.go | 33 +++++++++++ 2 files changed, 139 insertions(+) create mode 100644 subcommands/blind-proxy.go create mode 100644 subcommands/realm-address.go diff --git a/subcommands/blind-proxy.go b/subcommands/blind-proxy.go new file mode 100644 index 0000000..366ff42 --- /dev/null +++ b/subcommands/blind-proxy.go @@ -0,0 +1,106 @@ +package subcommands + +import ( + "context" + "flag" + "fmt" + "net" + "sync" + + "github.com/bedrock-tool/bedrocktool/utils" + "github.com/sandertv/go-raknet" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/sirupsen/logrus" +) + +type BlindProxyCMD struct { + ServerAddress string +} + +func (*BlindProxyCMD) Name() string { return "blind-proxy" } +func (*BlindProxyCMD) Synopsis() string { return "raknet proxy" } +func (c *BlindProxyCMD) SetFlags(f *flag.FlagSet) { + f.StringVar(&c.ServerAddress, "address", "", "server address") +} + +func packet_forward(src, dst *raknet.Conn) error { + for { + data, err := src.ReadPacket() + if err != nil { + return err + } + _, err = dst.Write(data) + if err != nil { + return err + } + } +} + +func (c *BlindProxyCMD) Execute(ctx context.Context, ui utils.UI) error { + address, hostname, err := utils.ServerInput(ctx, c.ServerAddress) + if err != nil { + return err + } + + listener, err := raknet.Listen("0.0.0.0:19132") + if err != nil { + return err + } + defer listener.Close() + logrus.Info("Listening on 0.0.0.0:19132") + + listener.PongData([]byte(fmt.Sprintf("MCPE;%v;%v;%v;%v;%v;%v;Gophertunnel;%v;%v;%v;%v;", + "Proxy For "+hostname, protocol.CurrentProtocol, protocol.CurrentVersion, 0, 1, + listener.ID(), "Creative", 1, listener.Addr().(*net.UDPAddr).Port, listener.Addr().(*net.UDPAddr).Port, + ))) + + go func() { + <-ctx.Done() + listener.Close() + }() + + clientConn, err := listener.Accept() + if err != nil { + return err + } + defer clientConn.Close() + logrus.Info("Client Connected") + + serverConn, err := raknet.DialContext(ctx, address) + if err != nil { + return err + } + defer serverConn.Close() + logrus.Info("Server Connected") + + logrus.Info("Forwarding Packets") + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + _err := packet_forward(clientConn.(*raknet.Conn), serverConn) + if _err != nil { + err = _err + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + _err := packet_forward(serverConn, clientConn.(*raknet.Conn)) + if _err != nil { + err = _err + } + }() + + wg.Wait() + if err != nil { + return err + } + + return nil +} + +func init() { + utils.RegisterCommand(&BlindProxyCMD{}) +} diff --git a/subcommands/realm-address.go b/subcommands/realm-address.go new file mode 100644 index 0000000..020fa0c --- /dev/null +++ b/subcommands/realm-address.go @@ -0,0 +1,33 @@ +package subcommands + +import ( + "context" + "flag" + + "github.com/bedrock-tool/bedrocktool/utils" + "github.com/sirupsen/logrus" +) + +type RealmAddressCMD struct { + realm string +} + +func (*RealmAddressCMD) Name() string { return "realm-address" } +func (*RealmAddressCMD) Synopsis() string { return "gets realms address" } +func (c *RealmAddressCMD) SetFlags(f *flag.FlagSet) { + f.StringVar(&c.realm, "realm", "", "realm name or just name") +} + +func (c *RealmAddressCMD) Execute(ctx context.Context, ui utils.UI) error { + address, _, err := utils.ServerInput(ctx, "realm:"+c.realm) + if err != nil { + return err + } + + logrus.Infof("Address: %s", address) + return nil +} + +func init() { + utils.RegisterCommand(&RealmAddressCMD{}) +}