-------------------------------------------------------------------------- -----------------------Hacking Quake III by MazarD------------------------ -------------------------------------------------------------------------- 1- Pequeña história 2- El protocolo (negociación de conexión) 3- Low Memory y Congelar clientes 4- Comandos de información 5- Server Buffer Overflow 6- Usando el programa desde la consola del quake 7- Despedida |--------------------------------------------------------------------------| |--------------------->1-Pequeña história----------------------------------| |--------------------------------------------------------------------------| Dando la última calada de my fly al cerrar el divx de esa noche mi cursor fue a parar encima de tres barras rojas. "vaya el quake, si todavia está instalado, voy a echar una partidilla" Voy al server 1vs1 rail con el que tenia menos ping y que estaba vacío, como siempre a la espera de alguien que me diera una paliza, quando de pronto leo: "Im god and u r going to be owned" Pero el server está vacío ¿? El MOTD? es extraño pero comprobemoslo: "U r a fuckin idiot who r going to suck my dick" "Stfu, or i will hack u, im in ur pc" Alguien había sido capaz de atravesar mi router actualizado, el control de log no me habia avisado, se había saltado mi firewall, el antivirus, el control del registro, el antispyware y el largo etcétera de programas de seguridad. En lugar de mostrarme un msgbox esperó a que me conectara al quake para reirse. mmmmmmmm NO, estaba claro, el admin del server haciendo el idiota. Después de una larga y estúpida conversación le dije que se callara y me dejara jugar tranquilo que tenia 274 shells preparadas para DDosear. No me entendió confirmandome que no era mas que un crio ...otro largo etc de insultos... justo en ese momento muero sin ser disparado, y recibo un ban de porvida, como prefiero programar a jugar o DDosear me dije: "vamos a ver que hacemos". |--------------------------------------------------------------------------| |--------------------->2-El protocolo(negociación de conexión)-------------| |--------------------------------------------------------------------------| Empece ejecutando el quake y echandole un ojo al netview ví que usaba UDP, de sacarle la ip nada. Así que me puse a investigar el protocolo del quake a ver que sacabamos, al ser UDP lógicamente sería el cliente el que mandará el primer mensaje así que hice un netcat -lup 27960 y conecte desde el juego a 127.0.0.1:27960 recibiendo un "ÿÿÿÿGetChallenge". Ya tenemos algo, lo primero que vemos es que aparece delante del mensaje cuatro carácteres que serán el ascii 255. Qüestiones de protocolo, todo comando empezará por ellos. Cerré la conexión y conectando a un servidor envié un ÿÿÿÿGetChallenge recibiendo un ÿÿÿÿchallengeResponse 6542543. Vamos bien, esta es una técnica que se suele utilizar para evitar el spoofing, de este modo alguien que envie paquetes con una ip falsa no podrá pasar de aquí, ya que en los commandos posteriores seguro que nos piden el valor que nos ha dado el ChallengeResponse y logicamente este valor el atacante no lo conoce, él no recibe respuestas. Volviendo al papel de servidor y enviando los comandos anteriores llegamos al punto en el que el cliente nos envia: "ÿÿÿÿconnect " & Chr(34) & "\teamtask\0\cg_predictItems\1\sex\male\handicap\100\color\2 \team_headmodel\" & Chr(43) & "james\team_model\james\headmodel\sarge\model\sarge/sarge\ snaps\20\rate\25000\name\^1M^7azarD\protocol\43\qport\7557\challenge\6542543" Ahora se envia toda la información del cliente, echandole un ojo descubrimos algunas curiosidades como por ejemplo el nombre ^1M^0azarD. Vemos como un ^1 significa que el color del texto siguiente será el rojo, después con ^0 vemos que ahora el color de letra es negro. También podemos deducir que por ejemplo el punto de mira si estas espectando a alguien no te aparecerá el suyo sino el tuyo mismo, ya que no se envia esa información. (sé que és una chorrada pero me lo había preguntado muchas veces, por saber si los demás veían que yo juego sin punto de mira :P) Vemos como nos pide el challenge :D y el qport seguramente sera el puerto que tendremos que abrir para recibir datos del juego (esto ocurre en muchos protocolos). Repitiendo de nuevo todo el proceso recibimos un connectResponse y a partir de ahí tan sólo una serie de digitos que traduciendo a ascii resulta ser un contador, esperamos a que termine y lo que hace es desconectarnos, así que eso vendrá a ser el timeout. Volviendo a hacer todo ya no recibimos mas que el timeout :( Así que la negociación de conexión nos quedará así: cliente: ÿÿÿÿgetChallenge server: ÿÿÿÿchallengeResponse valor cliente: ÿÿÿÿconnect chr(10) \teamtask\valor\cg_predictitems\valor\sex\valor\handicap\ valor\color\valor\team_headmodel\james\team_model\james\headmodel\sarge\model \modelo\snaps\valor\rate\valor\name\nombre\protocol\proto\qport\puerto\ challenge\valor server: ÿÿÿÿconnectResponse Es bastante sencilla, haciendo todo esto y entrando al quake vemos como ya se nos conecta nuestro bot para al cabo de un rato desconectarse por timeout. |--------------------------------------------------------------------------| |--------------------->3-Low memory y congelar clientes--------------------| |--------------------------------------------------------------------------| En este mismo instante pensé "estamos yo y un bot, qual será el límite de bots?" Pues no hay limite! Tu insana y maligna mente ya habrá deducido que podemos llenar el servidor de bots y no podrá jugar nadie, lo único que deberemos hacer será tener un puerto local por bot y haciendo un bucle que vayan reconectando a medida que vayan cayendo. Pero joder, ahora que estoy viciado lo voy a dejar en que no juegue nadie? y si ya hay alguien dentro no puedo putear? Remirando nuestro bonito comando connect vemos que lo que mejor podemos aprovechar es el modelo del bot, para nosotros es sólo una pequeña cadena pero para el que esta jugando es cargar todo un objeto con sus texturas, colorines y demás mierda. Así que lo mejor es llenar el server con todos los modelos distintos, haciendo esto y como se van descargando y cargando bots lo que conseguimos es que se les vaya trabando el juego. Dependiendo de la memória que tengan se trabará más tiempo o menos. Después de cargar muchos bots llegamos al punto en el que el quake dice "low memory, using deferred model", vaya esto sí que lo tenian previsto, a partir de ese momento todo nuevo jugador que se conecte usara tu mismo modelo para no consumir mas memória, lástima. Pero haciendo pruebas descubrí algo muy interesante, si cargas unos 10 bots en el justo instante que ha terminado y está por empezar otra partida se les congela el quake a todos los jugadores! Ya sabes como echar a todos los jugadores de una partida.Esto supongo que será debido a que ademas de todos los modelos debe cargar de nuevo el mapa, las armas y el resto de items, y ahí ya si que clava. Ahún así el server sigue vivo, deberemos tirar de artilleria pesada... Sip, el ethereal :) |--------------------------------------------------------------------------| |--------------------->4-Comandos de información---------------------------| |--------------------------------------------------------------------------| Sólo arrancarlo vemos que el ethereal detecta los paquetes del quake, que bueno es, joder. Así que le metemos el filtro y vemos como además de todo lo anterior conecta a un server extraño. El server de autenticación, este supongo que será el que mira si el serial de nuestro quake es válido, pero ya que conectamos sin pasar por él pues mejor, pasamamos de él. Mirando por ahí vemos algunos comandos nuevos: getstatus y getinfo. ÿÿÿÿgetstatus nos dá mucha información acerca de la versión del servidor, el mod que utiliza, protocolo... y un detalle interesante, el nombre de todos los jugadores que estan en la partida. Podemos saber quien hay sin entrar, no tiene gran utilidad a menos que hagas un escanner para detectar donde está jugando cierto jugador. ÿÿÿÿgetinfo nos devuelve información como hostname, mapname y algo realmente útil: clients y maxclients Este comando lo usaremos para saber cuando hay que seguir metiendo bots y cuando debemos detenernos, ahorrando así el máximo de conexión. O simplemente para controlar el número de bots que quieres introducir. Ambos comandos usan el mismo formato de respuesta que connect: comando, chr(10), nombre, separador '\' y valor. Después del comando connectResponse vemos que el tipo de paquetes cambia de connectionless a game y parece que está todo encriptado en algun algoritmo que yo desconozco :( |--------------------------------------------------------------------------| |--------------------->5-Server Buffer Overflow----------------------------| |--------------------------------------------------------------------------| Nuestro servidor sigue vivo, podemos llenarlo, joder a los jugadores y hecharlos, pero él es mas duro. O no? Lo primero en lo que pensé para petar el servidor era salirme del rango en sus parámetros. Pero si metemos en el nombre del modelo uno inexistente simplemente nos aparecerá "cant load model" y nos asigna el modelo sarge\sarge; sin nombre de jugador nos asigna UnnamedPlayer; con el protocolo incorrecto no nos deja seguir... Quando los valores estan fuera de rango o bien nos asigna uno por defecto o nos desconecta. Había que probarlo. Los rangos los controla, y el tamaño? Como no sabemos el límite del tamaño del comando mejor probamos con alguno que nos permita enviarlo varias veces recibiendo siempre respuesta como el getinfo. Así que hacemos un bucle incrementando el tamaño con el carácter 'M' (ej: ÿÿÿÿgetinfoMMMMM), al hacerlo llegué a enviar 973 bytes en un comando cuando de pronto ya no recibia respuesta, tiene límite de consultas de getinfo? pues vamos a hacer un getstatus: NADA, voy al server de autenticación a ver si lo lista: NADA EL SERVER A PETADO, toma buffer overflow xD Al final a resultado bastante sencillo, ahora podemos llenar el server, joder a los clientes, echarlos o petar el servidor! :D |--------------------------------------------------------------------------| |--------------------->4-Usando el programa desde consola del quake--------| |--------------------------------------------------------------------------| Estas jugando al quake y quieres llenar el server de bots, pero tu quieres estar dentro para ver la reacción de los otros jugadores (sinó pierde gran parte de la diversión xD) como activas el programa? simple: Abres el archivo config.cfg de la carpeta baseq del quake y añades linias con los valores: seta Qhack "ko" seta Qhost "210.210.22.22:27960" seta Qmodel "doom\phobos" y todos los parametros que quieres poder modificar des del quake. Desde tu programa abres este archivo y lees estos valores cada cierto tiempo de tal modo que si, por ejemplo, Qhack es OK pues activa el llenado de server. Entonces desde consola (para los mas novatos aparece pulsando la tecla de arriba del tab en el quake) escribes /set qhack OK y este comando lo que hará será modificar el valor del parametro qhack del archivo config, tu programa lo detectará y ejecutará la función. |--------------------------------------------------------------------------| |--------------------->6-Despedida-----------------------------------------| |--------------------------------------------------------------------------| Después de un par de testeos al server del criajo ese terminó pidiendome perdón, aunque también le dí las gracias. Grácias a su estupidez pasé y voy a pasar algunas buenas noches al vicio del análisi y la programación. En este artículo he decidido no pasar el source del programa ni el exe por miedo a que terminaremos por no poder jugar al quake :/ desde mi punto de vista si sabes programar debes tener ventajas frente a cualquier gamer que te encuentres por ahí xD, además creo que está lo bastante claro como para que cualquiera con un nivel mínimo de programación y de sockets pueda hacerlo, si no és así no dudes en mandarme un email con tus dudas. Ahora estoy investigando sobre como sacar shell en el servidor, que no se caigan los bots y explotar el buffer overflow con una ip spoofeada. Si lo consigo nos vemos en otro artículo. :D Un saludo! ___ ___ _________ _______ ______ |_ \ / _| /\ /_____ _/ /\ |_ __ | |_ __ \ | \ / | / \ / / / \ | |__| | | | \ \ ____|_|\ \/ /|_|____/ /__\_______/_/_____/__\ \___|__ __|__|_|___\ \___ \_______\ /_______/ /__________//___________\ \_____\ \__________/ /__/ _| | \/ | |__/ /____\ \ _/ /_____/ /____\ \_| | \ \___| |__/ / |___| |___/__________\/________/__________\__| \___|______/ 11 No existe la verdad absoluta, cada uno elige su camino. MazarD [arroba] gmail [punto] com -----------------------------------------------------------------------------