Skip to content

Commit

Permalink
Rewrite ping replies to remove port numbers
Browse files Browse the repository at this point in the history
  • Loading branch information
jhead committed Oct 20, 2019
1 parent ec6c3ef commit cc86738
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 1 deletion.
72 changes: 72 additions & 0 deletions internal/proto/proto.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package proto

import (
"bytes"
"encoding/binary"
)

var UnconnectedReplyID byte = 0x1C

type UnconnectedReply struct {
PingTime []byte
ID []byte
Magic []byte
ServerName string
}

func ReadUnconnectedReply(in []byte) (reply *UnconnectedReply, err error) {
reply = &UnconnectedReply{}
buf := bytes.NewBuffer(in)

// Packet ID
buf.ReadByte()

reply.PingTime = make([]byte, 8)
if _, err := buf.Read(reply.PingTime); err != nil {
return nil, err
}

reply.ID = make([]byte, 8)
if _, err := buf.Read(reply.ID); err != nil {
return nil, err
}

reply.Magic = make([]byte, 16)
if _, err := buf.Read(reply.Magic); err != nil {
return nil, err
}

serverNameLenBytes := make([]byte, 2)
if _, err := buf.Read(serverNameLenBytes); err != nil {
return nil, err
}

serverNameLen := binary.BigEndian.Uint16(serverNameLenBytes)

serverNameBytes := make([]byte, serverNameLen)
if _, err := buf.Read(serverNameBytes); err != nil {
return nil, err
}

reply.ServerName = string(serverNameBytes)

return
}

func (r UnconnectedReply) Build() bytes.Buffer {
var outBuffer bytes.Buffer

outBuffer.WriteByte(UnconnectedReplyID)
outBuffer.Write(r.PingTime)
outBuffer.Write(r.ID)
outBuffer.Write(r.Magic)

serverNameLen := uint16(len(r.ServerName))
stringBuf := make([]byte, 2)
binary.BigEndian.PutUint16(stringBuf, serverNameLen)

outBuffer.Write(stringBuf)
outBuffer.WriteString(r.ServerName)

return outBuffer
}
26 changes: 25 additions & 1 deletion internal/proxy/proxy.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package proxy // import github.com/jhead/phantom/internal/proxy
package proxy

import (
"fmt"
"log"
"math/rand"
"net"
"os"
"strings"
"time"

"github.com/jhead/phantom/internal/proto"

reuse "github.com/libp2p/go-reuseport"
)

Expand Down Expand Up @@ -230,12 +233,33 @@ func (proxy *ProxyServer) processDataFromServer(remoteConn *net.UDPConn, client
for !proxy.dead {
read, _, err := remoteConn.ReadFrom(buffer)

// Read error
if err != nil {
fmt.Println(err)
break
}

// Empty read
if read < 1 {
continue
}

// Resize data to byte count from 'read'
data := buffer[:read]

// Rewrite Unconnected Reply packets
if packetID := data[0]; packetID == proto.UnconnectedReplyID {
if packet, err := proto.ReadUnconnectedReply(data); err == nil {
// Rewrite server MOTD to remove ports
truncServerName := strings.Split(packet.ServerName, ";")[:9]
packet.ServerName = fmt.Sprintf("%v;", strings.Join(truncServerName, ";"))
packetBuffer := packet.Build()
data = packetBuffer.Bytes()
} else {
fmt.Printf("Failed to rewrite pong: %v\n", err)
}
}

This comment has been minimized.

Copy link
@ali544t

ali544t Dec 15, 2019

Cp quirkybanjo8703


proxy.server.WriteTo(data, client)
}
}
Expand Down

0 comments on commit cc86738

Please # to comment.