[TUTORIAL] WPE Pro - Captura, modifica y envia paquetes TCP (cheats, juegos...)

Publicado por D3M0N, 24 de Febrero de 2014, 03:18:18 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

D3M0N

Bueno, tras el éxito del tutorial sobre edición de memoria local usando Cheat Engine, os traigo una nueva herramienta que nos permitirá interceptar (sniffer) modificar y enviar packetes TCP entre un cliente y un servidor externo. El programa se llama WPE Pro y en éste tutorial usaremos la versión 0.9a mod.

Para hacerlo todo más fácil, os enseñaré a trabajar con WPE mostrando un caso real (programado por mí), para que podáis tocar, editar y probar con vuestras manos. Empecemos...

Primero de todo os dejo un link donde encontraréis el WPE Pro 0.9a mod y mi ejemplo práctico que usaremos para enseñar éste sistema:

You are not allowed to view links. Register or Login

En su interior encontraremos lo siguiente:


wpepro09mod = Carpeta que contiene el WPE
CLIENTE.exe = Mi ejemplo para poner en practica éste tutorial
SERVIDOR.exe = Mi ejemplo para poner en practica éste tutorial

En la carpeta de wpepro hay una carpeta filtros con mi ejemplo ya  resuelto. Por si lo quieres ver o por si te atascas.

TEORÍA Y EXPLICACIÓN DE LAS PARTES

Abrimos el WPE, estaréis en la ventana principal, a continuación os dejo un esquema y os explicaré las partes importantes. Por favor, anotad los nombres de los botones ya que me referiré a ellos durante todo el tutorial:


1) Target Program: Nos permite seleccionar el proceso (cliente) que queremos monitorizar.
2) Trace Controls: Nos permite iniciar, pausar y detener la captura (sniffer) de paquetes. Abajo en los contadores sale el número de paquetes capturados
3) Action Console: Nos permite crear filtros y enviar paquetes modificados.

A continuación os muestro una ventana con 4 paquetes capturados. Aún no he explicado como se captura, pero primero quiero que veáis que datos nos muestra y que significa cada cosa:


1) Contador: Muestra el número de paquetes capturados en una sesión
2) Paquetes: Indicador numérico de los paquetes recibidos
3) Source / Destination: Aparece la IP y puerto del cliente y del servidor
4) Tamaño: Indica el tamaño del paquete (número de offsets)
5) Tipo de paquete: Puede ser Send o Recv. Nos indica si es un paquete de entrada o salida
6) Datos: Nos muestra en HEX y ASCII los datos del paquete.

A modo de resumen, en la imagen de ejemplo se ven 4 paquetes capturados, 2 de Envío (send) y 2 de respuesta (Recv). Fácil, no? Ahora os enseñaré que pinta tiene el editor de paquetes (filtros), no os asustéis, es más sencillo de lo que parece:


1) Datos el filtro: Indicamos el patrón de offsets que buscamos y los offsets que modificamos
2) Tipo de filtro: En el ejemplo; Normal

Éste tipo de filtro (normal) no me gusta usarlo, a continuación os enseño el avanzado:


1) Datos el filtro: Indicamos el patrón de offsets que buscamos y los offsets que modificamos
2) Filtrar en: Indicamos que tipo de paquetes serán afectados por éste filtro (en el ejemplo; los de tipo Recv
3) Tipo de modificación: Indicamos si modificaremos todo el paquete o desde el offset encontrado

Bien, hasta aquí ya conocéis y podéis identificar las principales partes del programa, ahora vamos a practicar con un ejemplo, para ello ejecutamos el CLIENTE y SERVIDOR que hay en la carpeta (los he programado yo). Básicamente pretende ser un videojuego muy sencillo que permite abrir cofres y comprar objetos (items), aquí os dejo la ventana del CLIENTE y del SERVIDOR:



EMPEZAMOS CON EL TUTORIAL PRACTICO
CAPTURAR PAQUETES

Ejecutad el WPE, el CLIENTE y el SERVIDOR, seguid los siguientes pasos:

- Pulsar START SERVER en la ventana SERVIDOR
- Pulsar CONECTAR en la ventana CLIENTE

Si lo habéis hecho bien, os aparecerán los siguientes mensajes:


Bien, el ejemplo que he programado es sencillo. El CLIENTE se conecta al SERVIDOR y envía una serie de paquetes, el SERVIDOR los comprueba y devuelve una respuesta, así de sencillo. En la ventana del CLIENTE, pulsa el botón abrir cofre y comprar item:


Podrás observar como el cliente envía la petición de abrir un cofre y el servidor la procesa (genera entre 1 y 5 monedas) y las envía al cliente.

En el caso de comprar item... tenemos 500 monedas y el item cuesta 2300, así que el servidor nos deniega la compra :(

Bien, ya tenemos nuestro juego ejecutándose y ya sabes como funciona, ahora vamos a empezar con lo bueno: capturar paquetes y engañar al servidor jeje. Pulsamos en WPE el botón de TARGET y seleccionamos el proceso del CLIENTE:


Una vez hecho ésto, pulsamos el botón de PLAY del TRACE CONTROL, así iniciaremos la captura de paquetes. Mientras esté el botón de PLAY pulsado, WPE irá capturando todos los paquetes que se envíen y reciban.

Nos situamos en el CLIENTE y pulsamos 1 vez en abrir cofre y 1 vez en comprar item, debería ocurrir lo siguiente:


Si lo has hecho bien, habrás capturado 4 paquetes (fíjate en el contador de paquetes). Ahora pulsa en el botón STOP para detener el sniffer y automáticamente veremos la ventana de paquetes capturados:


Bieeeeen!! acabas de capturar tus primeros 4 paquetes!! Tómate tu tiempo para ver que has capturado, intenta entender el formato de los paquetes. Para éste tutorial lo he hecho MUY sencillo. Si te fijas, se trata de una comunicación entre el CLIENTE y el SERVIDOR; cuando has pulsado en abrir cofre, el cliente ha mandado (send) un paquete cuyo mensaje es OpenChest#1 y automáticamente el servidor ha devuelto un paquete cuyo mensaje es GetCoins#3 (en mi caso he obtenido 3, tu puedes obtener entre 1 y 5, en un número random).

Se entiende? Creo que es bastante sencillo.

ENVIAR PAQUETES CAPTURADOS

Ahora que tenemos capturado el paquete que indica la acción de abrir un cofre, lo añadiremos a WPE para poder enviarlo de forma abusiva jeje, hacemos lo siguiente:

Pulsamos botón derecho sobre el primer paquete (send) y seleccionamos Add to Send List:


Ahora vuelve a hacer click derecho y selecciona la última opción Set Send List with this socket ID:


Éste paso es importante, ya que le estaremos indicando a WPE que utilice el mismo ID de socket para mandar el paquete. Si lo hemos hecho bien, en nuestra Action Console aparecerá el paquete. Recuerda marcar la pestaña Send en la Action Console:


Marcamos el paquete tal y como se ve en la foto y pulsamos en el lápiz para editar el paquete:


Ésta ventana nos muestra el paquete, aparece el tamaño (11) y el contenido en HEX y ASCII. Pulsamos QUIT ya que no queremos modificar el paquete (solo os quería enseñar como ver el contenido de un paquete antes de ser enviado). Ahora indicaremos a WPE que envíe ese paquete como si lo estuviera haciendo el propio cliente de forma legítima.

Pulsamos el boton PLAY en la ACTION CONSOLE (el botón de abajo que hay lado del lápiz) y aparece la siguiente ventana:


Debería estar configurada tal y como se ve en la foto, es decir:

- Enviar 1 vez
- Utilizar el socket abierto
- Open Socket ID: Éste es el ID del socket, debería tener un número ya escrito.

Pulsamos PLAY en ésta ventana para enviar nuestro paquete 1 vez, si lo hemos hecho bien el cliente recibirá las monedas como si hubiera abierto el cofre:


Ves que fácil? Ahora vamos a investigar un poco más: Vuelve a enviar el paquete pero ésta vez ponlo en 5 (mira la foto):


Pulsa PLAY y observa que ocurre en el CLIENTE y en el SERVIDOR:


Puedes observar como WPE ha enviado 5 veces el paquete de abrir un cofre y el servidor nos ha obsequiado con 5 respuestas (y sus respectivas monedas) jajaja

Ahora, si has sido lo suficientemente curioso... te habrás preguntado porque el paquete que envía el cliente es OpenChest#1, no? Que pasaría si cambio el último número? Para ello pulsa el lápiz para editar el paquete y cambia el último offset:


Pon un nombre al paquete para que recuerdes que lo has modificado y envíalo 1 sola vez, observamos que ocurre:



CHAN!! Acabas de engañar al servidor haciendo creer que has abierto 5 cofres, el servidor recibe OpenChest#5 y te envía 5 veces el paquete de obtener monedas. GENIAL!!

Bien, acabamos de llegar al final de la explicación sobre como enviar paquetes, es muy sencillo.

FILTAR & MODIFICAR PAQUETES

Ahora os explicaré como modificar los paquetes entrantes (recv), capturando los que cumplan un filtro y modificar dichos paquetes antes de que el CLIENTE los reciba, volvemos a nuestra captura de paquetes y nos fijamos en el primer paquete de tipo Recv:


Ese paquete es la respuesta que nos devuelve el SERVER cuando le enviamos el comando OpenChest#1, es decir, lo podemos traducir de la siguiente forma:

CLIENTE dice OpenChest#1
SERVER responde GetCoins#0X (X puede ser cualquier número del 1 al 5)

No hay que ser un superdotado para descubrir que GetCoins es la función de dar monedas y los número de detrás del # son la cantidad de monedas... pues vamos a modificarlo para que el servidor nos devuelva SIEMPRE 99 monedas. Para ello seleccionamos el contenido Hexadecimal del paquete tal y como se ve en la foto anterior y hacemos click derecho y seleccionamos Copy.

Nos vamos a nuestra Action Console (pestaña Filters), seleccionamos el primer filtro y lo editamos con el botón del lápiz:


- En la ventana del filtro, cambiamos el modo a ADVANCED
- En la parte superior, en los offsets de SEARCH hacemos click derecho y seleccionamos PASTE para pegar los datos de nuestro paquete
- Hacemos lo mismo en los offsets de MODIFY (click derecho y PASTE)

En la foto veréis que he cambiado los offsets 10 y 11. Ahora os explicaré el motivo, de momento modificarlo también (igual que la foto). Ponerle un nombre al filtro y seleccionar el tipo Recv. Pulsamos Apply

Una vez hecho ésto, marcamos el filtro y pulsamos el botón ON:


En éste estado, WPE capturará todos los paquetes de tipo Recv y los comparará con los offsets que hemos puesto en SEARCH, es decir:

47 65 74 43 6F 69 6E 73 23 = GetCoins#

Si esa comparación se cumple, modificará el paquete por los offsets de MODIFY:

47 65 74 43 6F 69 6E 73 23 39 39 = GetCoins#99

Pulsamos varias veces sobre el botón de abrir cofre en el CLIENTE y observamos que ocurre:


Como puedes observar, el servidor recibe nuestro OpenChest#1, el servidor devuelve unas cuantas monedas (1, 2, 5, 3, etc...) pero en nuestro cliente obtenemos 99 monedas todo el rato jejeje

Bien, así de sencillo es aplicar filtros. Solo tenemos que tener muy claro que offsets buscamos y que offsets hay que modificar, luego WPE trabajará solo. Para desactivar el filtro hay que quitar el botón ON.

ENVIAR PAQUETES MODIFICADOS

Ahora explicaré como solventar el tema de comprar items. (Enviar un paquete modificado)

Ya has visto que el cliente envía BuyItem#500 y el servidor responde BuyDennied#0 (es decir, que no nos permite comprar porque nos falta dinero), vamos a engañar al servidor, jeje.

Nos vamos a nuestra captura y seleccionamos el paquete de comprar BuyItem#500, hacemos click derecho y lo enviamos a nuestro Send List:


Marcamos el nuevo paquete y lo editamos:


Vamos a cambiar el número 500 por el número 2800, verás que no lo puedes cambiar de golpe. Primero tienes que aumentar el tamaño a 12 y luego escribir el nuevo valor:


Guarda el paquete modificado y envíalo 1 vez usando el botón PLAY (ya deberías saber hacerlo), si lo has hecho bien obtendrás lo siguiente:


Ya tienes tu item gratis!! :)

RESUMEN FINAL

Bueno, por hoy me detengo ya. Espero que os animéis con WPE ya que es un programa muy divertido. Ésta teoría se puede aplicar en juegos multiplayer actuales para dupear items, recibir dinero/monedas/gold, hacer tradehacks y un sinfín de cosas más. Se puede utilizar para juegos tipo Starbound, Diablo II o para juegos Flash de navegador como PokerStar o cualquier juego tipo Ogame, etc...

La dificultad reside en que no hay una forma fija para capturar y modificar un paquete. Cada juego utiliza su protocolo y su sintaxis. Lo complicado es capturar el paquete deseado y saber modificarlo. Algunos paquetes estarán cifrados o con comprobaciones de CRC, pero eso ya lo veremos más adelante...

Saludos!! :D

TUTO By ||MadAntrax||