Skip to content

Commit cc86738

Browse files
committed
Rewrite ping replies to remove port numbers
1 parent ec6c3ef commit cc86738

File tree

2 files changed

+97
-1
lines changed

2 files changed

+97
-1
lines changed

internal/proto/proto.go

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package proto
2+
3+
import (
4+
"bytes"
5+
"encoding/binary"
6+
)
7+
8+
var UnconnectedReplyID byte = 0x1C
9+
10+
type UnconnectedReply struct {
11+
PingTime []byte
12+
ID []byte
13+
Magic []byte
14+
ServerName string
15+
}
16+
17+
func ReadUnconnectedReply(in []byte) (reply *UnconnectedReply, err error) {
18+
reply = &UnconnectedReply{}
19+
buf := bytes.NewBuffer(in)
20+
21+
// Packet ID
22+
buf.ReadByte()
23+
24+
reply.PingTime = make([]byte, 8)
25+
if _, err := buf.Read(reply.PingTime); err != nil {
26+
return nil, err
27+
}
28+
29+
reply.ID = make([]byte, 8)
30+
if _, err := buf.Read(reply.ID); err != nil {
31+
return nil, err
32+
}
33+
34+
reply.Magic = make([]byte, 16)
35+
if _, err := buf.Read(reply.Magic); err != nil {
36+
return nil, err
37+
}
38+
39+
serverNameLenBytes := make([]byte, 2)
40+
if _, err := buf.Read(serverNameLenBytes); err != nil {
41+
return nil, err
42+
}
43+
44+
serverNameLen := binary.BigEndian.Uint16(serverNameLenBytes)
45+
46+
serverNameBytes := make([]byte, serverNameLen)
47+
if _, err := buf.Read(serverNameBytes); err != nil {
48+
return nil, err
49+
}
50+
51+
reply.ServerName = string(serverNameBytes)
52+
53+
return
54+
}
55+
56+
func (r UnconnectedReply) Build() bytes.Buffer {
57+
var outBuffer bytes.Buffer
58+
59+
outBuffer.WriteByte(UnconnectedReplyID)
60+
outBuffer.Write(r.PingTime)
61+
outBuffer.Write(r.ID)
62+
outBuffer.Write(r.Magic)
63+
64+
serverNameLen := uint16(len(r.ServerName))
65+
stringBuf := make([]byte, 2)
66+
binary.BigEndian.PutUint16(stringBuf, serverNameLen)
67+
68+
outBuffer.Write(stringBuf)
69+
outBuffer.WriteString(r.ServerName)
70+
71+
return outBuffer
72+
}

internal/proxy/proxy.go

+25-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
package proxy // import github.com/jhead/phantom/internal/proxy
1+
package proxy
22

33
import (
44
"fmt"
55
"log"
66
"math/rand"
77
"net"
88
"os"
9+
"strings"
910
"time"
1011

12+
"github.com/jhead/phantom/internal/proto"
13+
1114
reuse "github.com/libp2p/go-reuseport"
1215
)
1316

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

236+
// Read error
233237
if err != nil {
234238
fmt.Println(err)
235239
break
236240
}
237241

242+
// Empty read
243+
if read < 1 {
244+
continue
245+
}
246+
247+
// Resize data to byte count from 'read'
238248
data := buffer[:read]
249+
250+
// Rewrite Unconnected Reply packets
251+
if packetID := data[0]; packetID == proto.UnconnectedReplyID {
252+
if packet, err := proto.ReadUnconnectedReply(data); err == nil {
253+
// Rewrite server MOTD to remove ports
254+
truncServerName := strings.Split(packet.ServerName, ";")[:9]
255+
packet.ServerName = fmt.Sprintf("%v;", strings.Join(truncServerName, ";"))
256+
packetBuffer := packet.Build()
257+
data = packetBuffer.Bytes()
258+
} else {
259+
fmt.Printf("Failed to rewrite pong: %v\n", err)
260+
}
261+
}
262+
239263
proxy.server.WriteTo(data, client)
240264
}
241265
}

0 commit comments

Comments
 (0)