tangled
alpha
login
or
join now
dunkirk.sh
/
paper-crown
0
fork
atom
this repo has no description
0
fork
atom
overview
issues
pulls
pipelines
feat: add the thing
dunkirk.sh
3 months ago
427867f5
7161b61e
verified
This commit was signed with the committer's
known signature
.
dunkirk.sh
SSH Key Fingerprint:
SHA256:DqcG0RXYExE26KiWo3VxJnsxswN1QNfTBvB+bdSpk80=
+215
-76
3 changed files
expand all
collapse all
unified
split
proxy
index.ts
roster-client.ts
server
docker-compose.yml
+100
-74
proxy/index.ts
···
1
-
import mc from 'minecraft-protocol';
2
3
const PROXY_PORT = 25565;
4
-
const TARGET_HOST = 'localhost';
5
-
const TARGET_PORT = 25566;
0
6
7
-
const SPOOFED_USERNAME = 'admin';
8
-
const SPOOFED_UUID = '36881d51-7477-3eb6-91a1-dfc11065590d';
9
10
const server = mc.createServer({
11
-
'online-mode': false,
12
-
port: PROXY_PORT,
13
-
keepAlive: false,
14
-
version: '1.20.4'
15
});
16
17
console.log(`Minecraft proxy listening on port ${PROXY_PORT}`);
18
console.log(`Forwarding to ${TARGET_HOST}:${TARGET_PORT}`);
19
20
-
server.on('login', (client) => {
21
-
console.log('\n=== NEW CLIENT CONNECTION ===');
22
-
console.log(`Original Player: ${client.username}`);
23
-
console.log(`Original UUID: ${client.uuid}`);
24
-
console.log(`IP: ${client.socket.remoteAddress}`);
25
-
console.log(`Spoofing as: ${SPOOFED_USERNAME} (${SPOOFED_UUID})`);
26
-
27
-
const target = mc.createClient({
28
-
host: TARGET_HOST,
29
-
port: TARGET_PORT,
30
-
username: SPOOFED_USERNAME,
31
-
keepAlive: false,
32
-
version: '1.20.4',
33
-
auth: 'offline'
34
-
});
0
0
35
36
-
target.on('connect', () => {
37
-
console.log(`Connected to target server for ${client.username}`);
38
-
});
0
0
0
39
40
-
target.on('error', (err) => {
41
-
console.error(`Target error for ${client.username}:`, err.message);
42
-
client.end('Connection to server failed');
43
-
});
44
45
-
client.on('packet', (data, meta) => {
46
-
if (meta.name.includes('auth') ||
47
-
meta.name.includes('login') ||
48
-
meta.name.includes('encryption') ||
49
-
meta.name.includes('session')) {
50
-
console.log('\n--- AUTH PACKET (Client -> Server) ---');
51
-
console.log(`Packet: ${meta.name}`);
52
-
console.log(`State: ${meta.state}`);
53
-
console.log('Data:', JSON.stringify(data, null, 2));
54
-
console.log('--------------------------------------');
55
-
}
56
57
-
if (target.state === mc.states.PLAY && meta.state === mc.states.PLAY) {
58
-
target.write(meta.name, data);
59
-
}
60
-
});
0
0
0
0
61
62
-
target.on('packet', (data, meta) => {
63
-
if (meta.name.includes('auth') ||
64
-
meta.name.includes('login') ||
65
-
meta.name.includes('encryption') ||
66
-
meta.name.includes('session') ||
67
-
meta.name.includes('compress')) {
68
-
console.log('\n--- AUTH PACKET (Server -> Client) ---');
69
-
console.log(`Packet: ${meta.name}`);
70
-
console.log(`State: ${meta.state}`);
71
-
console.log('Data:', JSON.stringify(data, null, 2));
72
-
console.log('--------------------------------------');
73
-
}
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
74
75
-
if (client.state === mc.states.PLAY && meta.state === mc.states.PLAY) {
76
-
client.write(meta.name, data);
77
-
}
78
-
});
79
80
-
client.on('end', () => {
81
-
console.log(`Client ${client.username} disconnected`);
82
-
target.end();
83
-
});
84
85
-
target.on('end', () => {
86
-
console.log(`Target server disconnected for ${client.username}`);
87
-
client.end('Server connection closed');
88
-
});
89
});
90
91
-
server.on('error', (err) => {
92
-
console.error('Server error:', err);
93
});
94
95
-
server.on('listening', () => {
96
-
console.log('Server ready for connections');
97
});
···
1
+
import mc from "minecraft-protocol";
2
3
const PROXY_PORT = 25565;
4
+
const TARGET_HOST = "one.strongcraft.org";
5
+
const TARGET_PORT = 25565;
6
+
const MINECRAFT_VERSION = "1.20.4";
7
8
+
const SPOOFED_USERNAME = "BobTheBomber917";
9
+
const SPOOFED_UUID = "4b5db0b0-3165-3ef2-956f-2ee9f25479aa";
10
11
const server = mc.createServer({
12
+
"online-mode": false,
13
+
port: PROXY_PORT,
14
+
keepAlive: false,
15
+
version: MINECRAFT_VERSION,
16
});
17
18
console.log(`Minecraft proxy listening on port ${PROXY_PORT}`);
19
console.log(`Forwarding to ${TARGET_HOST}:${TARGET_PORT}`);
20
21
+
mc.ping({
22
+
host: TARGET_HOST,
23
+
port: TARGET_PORT,
24
+
version: MINECRAFT_VERSION,
25
+
})
26
+
.then((res) => {
27
+
return res as mc.NewPingResult;
28
+
})
29
+
.then((res) => {
30
+
console.log("description:", res.description);
31
+
console.log("players:", res.players);
32
+
console.log("version:", res.version);
33
+
console.log("latency:", res.latency);
34
+
})
35
+
.catch((err) => {
36
+
console.error("Ping failed:", err);
37
+
});
38
39
+
server.on("login", (client) => {
40
+
console.log("\n=== NEW CLIENT CONNECTION ===");
41
+
console.log(`Original Player: ${client.username}`);
42
+
console.log(`Original UUID: ${client.uuid}`);
43
+
console.log(`IP: ${client.socket.remoteAddress}`);
44
+
console.log(`Spoofing as: ${SPOOFED_USERNAME} (${SPOOFED_UUID})`);
45
46
+
console.log("\n=== CONNECTED USERS ===");
47
+
console.log("=======================\n");
0
0
48
49
+
const target = mc.createClient({
50
+
host: TARGET_HOST,
51
+
port: TARGET_PORT,
52
+
username: SPOOFED_USERNAME,
53
+
keepAlive: false,
54
+
version: MINECRAFT_VERSION,
55
+
auth: "offline",
56
+
});
0
0
0
57
58
+
target.on("connect", () => {
59
+
console.log(`Connected to target server for ${client.username}`);
60
+
});
61
+
62
+
target.on("error", (err) => {
63
+
console.error(`Target error for ${client.username}:`, err.message);
64
+
client.end("Connection to server failed");
65
+
});
66
67
+
client.on("packet", (data, meta) => {
68
+
if (
69
+
meta.name.includes("auth") ||
70
+
meta.name.includes("login") ||
71
+
meta.name.includes("encryption") ||
72
+
meta.name.includes("session")
73
+
) {
74
+
console.log("\n--- AUTH PACKET (Client -> Server) ---");
75
+
console.log(`Packet: ${meta.name}`);
76
+
console.log(`State: ${meta.state}`);
77
+
console.log("Data:", JSON.stringify(data, null, 2));
78
+
console.log("--------------------------------------");
79
+
}
80
+
81
+
if (target.state === mc.states.PLAY && meta.state === mc.states.PLAY) {
82
+
target.write(meta.name, data);
83
+
}
84
+
});
85
+
86
+
target.on("packet", (data, meta) => {
87
+
if (
88
+
meta.name.includes("auth") ||
89
+
meta.name.includes("login") ||
90
+
meta.name.includes("encryption") ||
91
+
meta.name.includes("session") ||
92
+
meta.name.includes("compress")
93
+
) {
94
+
console.log("\n--- AUTH PACKET (Server -> Client) ---");
95
+
console.log(`Packet: ${meta.name}`);
96
+
console.log(`State: ${meta.state}`);
97
+
console.log("Data:", JSON.stringify(data, null, 2));
98
+
console.log("--------------------------------------");
99
+
}
100
101
+
if (client.state === mc.states.PLAY && meta.state === mc.states.PLAY) {
102
+
client.write(meta.name, data);
103
+
}
104
+
});
105
106
+
client.on("end", () => {
107
+
console.log(`Client ${client.username} disconnected`);
108
+
target.end();
109
+
});
110
111
+
target.on("end", () => {
112
+
console.log(`Target server disconnected for ${client.username}`);
113
+
client.end("Server connection closed");
114
+
});
115
});
116
117
+
server.on("error", (err) => {
118
+
console.error("Server error:", err);
119
});
120
121
+
server.on("listening", () => {
122
+
console.log("Server ready for connections");
123
});
+113
proxy/roster-client.ts
···
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
···
1
+
import mc from "minecraft-protocol";
2
+
3
+
type Player = {
4
+
uuid: string;
5
+
name: string;
6
+
properties?: Record<string, unknown>;
7
+
listed?: boolean;
8
+
latency?: number;
9
+
gameMode?: number;
10
+
};
11
+
12
+
const TARGET_HOST = "localhost";
13
+
const TARGET_PORT = 25566;
14
+
const MINECRAFT_VERSION = "1.20.4";
15
+
16
+
const roster = new Map<string, Player>();
17
+
18
+
const client = mc.createClient({
19
+
host: TARGET_HOST,
20
+
port: TARGET_PORT,
21
+
username: "hepticWarbler",
22
+
version: MINECRAFT_VERSION,
23
+
keepAlive: true,
24
+
auth: "offline",
25
+
});
26
+
27
+
client.on("login", () => {
28
+
console.log("✅ Joined server, tracking player list…");
29
+
});
30
+
31
+
client.on("packet", (data, meta) => {
32
+
if (meta.state !== "play") return;
33
+
34
+
switch (meta.name) {
35
+
case "player_info": {
36
+
const action = data.action;
37
+
for (const item of data.data) {
38
+
const uuid = item.UUID ?? item.uuid;
39
+
const name = item.name ?? item.username ?? "";
40
+
const entry = roster.get(uuid) ?? { uuid, name };
41
+
42
+
if (action === 0) {
43
+
roster.set(uuid, { ...entry, name });
44
+
console.log(`➕ join: ${name} (${uuid})`);
45
+
} else if (action === 1) {
46
+
roster.set(uuid, { ...entry, gameMode: item.gamemode });
47
+
} else if (action === 2) {
48
+
roster.set(uuid, { ...entry, latency: item.ping });
49
+
} else if (action === 4) {
50
+
roster.delete(uuid);
51
+
console.log(`➖ leave: ${name} (${uuid})`);
52
+
}
53
+
}
54
+
break;
55
+
}
56
+
case "player_info_update": {
57
+
const actions: string[] = data.actions;
58
+
for (const v of data.values) {
59
+
const uuid: string = v.uuid;
60
+
const prev = roster.get(uuid);
61
+
let name = prev?.name ?? v.name ?? v.profile?.name ?? "";
62
+
let listed = prev?.listed;
63
+
64
+
if (actions.includes("add_player")) {
65
+
name = v.name ?? name;
66
+
listed = true;
67
+
roster.set(uuid, {
68
+
uuid,
69
+
name,
70
+
listed,
71
+
properties: v.properties,
72
+
latency: v.latency,
73
+
gameMode: v.gamemode,
74
+
});
75
+
console.log(`➕ join: ${name} (${uuid})`);
76
+
}
77
+
if (actions.includes("update_latency")) {
78
+
roster.set(uuid, { ...(prev ?? { uuid, name }), latency: v.latency });
79
+
}
80
+
if (actions.includes("update_gamemode")) {
81
+
roster.set(uuid, {
82
+
...(prev ?? { uuid, name }),
83
+
gameMode: v.gamemode,
84
+
});
85
+
}
86
+
if (actions.includes("remove_player")) {
87
+
roster.delete(uuid);
88
+
console.log(`➖ leave: ${name} (${uuid})`);
89
+
}
90
+
}
91
+
break;
92
+
}
93
+
}
94
+
});
95
+
96
+
setInterval(() => {
97
+
const players = Array.from(roster.values());
98
+
console.log("\n📋 Current players:", players.length);
99
+
players.forEach((p) => {
100
+
console.log(
101
+
` - ${p.name} (${p.uuid}) | ping: ${p.latency}ms | mode: ${p.gameMode}`,
102
+
);
103
+
});
104
+
console.log("");
105
+
}, 10000);
106
+
107
+
client.on("error", (err) => {
108
+
console.error("❌ client error:", err);
109
+
});
110
+
111
+
client.on("end", (reason) => {
112
+
console.log("🔌 Disconnected:", reason);
113
+
});
+2
-2
server/docker-compose.yml
···
1
-
version: '3.8'
2
3
services:
4
minecraft:
···
12
VERSION: "1.20.4"
13
ONLINE_MODE: "FALSE"
14
ALLOW_FLIGHT: "TRUE"
15
-
MOTD: "Offline Minecraft Server"
16
DIFFICULTY: "easy"
17
MAX_PLAYERS: 20
18
VIEW_DISTANCE: 10
···
1
+
version: "3.8"
2
3
services:
4
minecraft:
···
12
VERSION: "1.20.4"
13
ONLINE_MODE: "FALSE"
14
ALLOW_FLIGHT: "TRUE"
15
+
MOTD: "where we do haxcy things"
16
DIFFICULTY: "easy"
17
MAX_PLAYERS: 20
18
VIEW_DISTANCE: 10