Omitir el cifrado asimétrico del lado del cliente sin una clave privada

Omitir el cifrado asimétrico del lado del cliente sin una clave privada - Codelivly

 

Recientemente escribí un artículo sobre cómo podemos eludir el cifrado del lado del cliente. Con la ayuda de la extensión PyCript burp suite, podemos hacer que las pruebas manuales y automatizadas o la recompensa de errores sean mucho más fáciles en aplicaciones con cifrado del lado del cliente. El uso de la extensión PyCript falla cuando la aplicación usa cifrado asimétrico.

Dado que el cifrado asimétrico utiliza mecanismos de clave pública y privada. No es posible descifrar la solicitud sin tener ambas claves. La aplicación almacenará el público en el lado del cliente y utilizará la clave pública para cifrar la solicitud. Para descifrar necesitamos una clave privada y en la mayoría de los casos no tendremos la clave privada porque está almacenada en el lado del servidor.

Las únicas opciones que quedan para probar la aplicación con cifrado asimétrico es usar la consola del navegador con un punto de interrupción y, en el caso de una aplicación móvil, tenemos que usar Frida para guardar el texto sin formato.

Índice
  1. Solución
  2. Ejemplo
  3. Cifrado con PyCript

Solución

La única solución posible que pude encontrar fue usar la función de anulación de Chrome con PyCript configurado en Burp Suite. El navegador Chrome nos permite editar el archivo JavaScript y cargar el archivo JavaScript desde el sistema local. Podemos usarlo para modificar el archivo JavaScript de nuestra aplicación para enviar una solicitud de texto sin formato en lugar de una solicitud cifrada.

fuente del navegador

El flujo anterior es simple donde el código JavaScript enviará la solicitud HTTP para cada acción que realicemos en la interfaz de usuario del navegador. El mismo código llamará a otro código JavaScript para cifrar la solicitud y devolver el valor cifrado. El código principal ahora enviará la solicitud cifrada y lo mismo se verá en el proxy de Burp Suite.

corriente modificada

En lo anterior, cambiamos el código de cifrado usando la función de anulación de Chrome para devolver el texto sin formato original en lugar de la solicitud cifrada. En este caso, podemos ver la solicitud descifrada en el proxy de burp suite. Dado que el servidor estará esperando la solicitud cifrada, configuraremos PyCript para cifrar la solicitud utilizando la misma clave pública y lógica de cifrado que el código JavaScript de la aplicación.

Usando el enfoque anterior, tendremos una consulta de texto sin formato en el historial de proxy de Burp Suite y podemos usar la misma consulta de texto sin formato en todas partes, como para repetidor o intruso. La aplicación del lado del servidor recibirá la solicitud encriptada usando la extensión PyCript.

Ejemplo

Tengo la aplicación a continuación interceptando la solicitud en el proxy, puedo confirmar que la aplicación está usando algún tipo de encriptación.

Solicitud encriptada

Después de revisar el código JavaScript y buscar palabras clave como encrypt, key, encryption,decrypt etc. Tengo el código de encriptación.

código de encriptación

El código anterior parece bastante simple y fácil de entender. La función toma un argumento y serán los datos de texto sin formato. Luego, el código convierte la clave pública PEM y cifra los datos de texto sin formato usando la clave. Finalmente, el código base64 codifica los datos cifrados y los devuelve. Después de investigar un poco, descubrí que la aplicación usa la biblioteca de forja de nodos para el cifrado.

Depurar

Ahora, solo para confirmar que el mismo código es responsable del cifrado, agrego un punto de interrupción y envío la solicitud en el navegador. El navegador se detiene cuando se activa el código de punto de interrupción. Puedo confirmar que se usa el mismo código para el cifrado y la función toma un valor en texto sin formato.

Valores

Mantengo el punto de interrupción como está y llamo a las variables de la consola y obtuve la clave pública utilizada para el cifrado. Ahora queremos que la función devuelva el texto sin formato o el mismo valor en lugar del valor cifrado.

Pasar otra

Ahora, para modificar el código JavaScript, necesitamos usar el reemplazo del navegador Chrome. Selecciona el Overridesdesde la pestaña fuente. Clickea en el Select folder for overrides.

Pasar otra

Una vez que haya seleccionado la carpeta, debe aprobarla. Haga clic en permiso y le permitirá editar los archivos. Ahora ve al archivo que queremos editar.

Guardar reemplazo

Haga clic derecho en el archivo y seleccione Save for overrides. y ahora si volvemos a la pestaña de reemplazar, podemos ver que se agrega el mismo archivo, lo que nos permite modificar el código JavaScript.

Cambiar la lógica de cifrado

Ahora necesitamos editar el código JavaScript. Modificamos el código y eliminamos el código de cifrado y devolvemos el mismo valor de texto sin formato que se pasó a la función. Una vez realizada la edición, podemos guardarla con ctrl+s.

Una vez hecho esto, necesito comprobar si funciona como se esperaba. Vuelvo a la aplicación y realizo cualquier acción para que se envíe cualquier solicitud. En la suite burp, necesito verificar si la solicitud está en texto sin formato o no.

Reclamar la solicitud

Ahora puedo confirmar que pude modificar la lógica del lado del cliente y puedo ver los datos en formato de texto sin formato en el proxy de Burp Suite. La aplicación da un error porque esperaba los datos encriptados y enviamos los datos en texto sin formato. Ahora necesito implementar PyCript para cifrar automáticamente la solicitud antes de enviarla al servidor. pero antes de eso, necesitamos usar la misma lógica de encriptación para escribir el código de encriptación para PyCript.

Cifrado con PyCript

Como se mencionó, la aplicación usa la biblioteca de forja de nodos para el cifrado, necesito instalarla usando el comando proporcionado en el archivo Léame de forja de nodos.

var forge = require('node-forge');
const program = require("commander");
const { Buffer } = require('buffer');
program
.option("-d, --data <data>", "Data to process")
.parse(process.argv);

const options = program.opts();
const requestbody = Buffer.from(options.data, 'base64').toString('utf8');

var mypubkey = "-----BEGIN PUBLIC KEY-----MIIwYIYquwxIqzkgkI+oA9oyrbYQIDAQAB-----END PUBLIC KEY-----"
var m = forge.pki.publicKeyFromPem(mypubkey)

var encoutput = m.encrypt(requestbody)

console.log(forge.util.encode64(encoutput));


En el código anterior, uso el mismo formato requerido para PyCript y con node-forge cifre los datos y finalmente imprimo los datos codificados después de codificarlos con base64. El método y la lógica de encriptación son los mismos que usa la aplicación con algunas modificaciones basadas en los requisitos de PyCript.

PyCriptNombre

Dado que en mi caso la solicitud ya está en formato de texto plano y solo necesito encriptarla y no requiere desencriptación. No necesito escribir el código de descifrado, pero dado que la extensión requiere que ambos códigos funcionen, puedo proporcionar el mismo código para el cifrado y el descifrado solo para ignorar las restricciones. Una vez que cargue el script, puedo seleccionar el tipo de solicitud, en mi caso, solo los valores están encriptados en JSON, seleccionaré el tipo apropiado.

Finalmente tengo que seleccionar el tipo de herramienta, ya que todas las solicitudes vendrán desde el navegador, selecciono el proxy y activo el cifrado automático.

Texto sin formato

Vuelvo al navegador y realizo cualquier acción y verifico que el navegador volverá a enviar la solicitud en texto sin formato. Pero ahora no recibo ningún error como solicitud no válida y la aplicación está dando respuestas válidas a pesar de que mi solicitud está en formato de texto sin formato.

Solicitud encriptada

Si entro en el registrador de Burp Suite, puedo ver que la solicitud está cifrada aunque puedo ver la solicitud en texto sin formato en el proxy. Este enfoque mantendrá la solicitud en texto sin formato en el proxy burp para que pueda usarla más tarde y no requiera ninguna clave privada para descifrarla.

El enfoque no es el mejor, pero aún funciona y nos permite omitir el cifrado simétrico. También se puede utilizar un enfoque similar en la aplicación móvil. Para la aplicación móvil, debemos devolver el valor en texto sin formato en lugar del valor encriptado, como hicimos para la web. Pero en el caso del móvil, tenemos que usar Frida o modificar el código de la aplicación móvil.

Todas las herramientas se pueden encontrar a continuación.

github.com

www.npmjs.com

medio.com

Gorjeo- https://twitter.com/ano_f_

GitHub — https://github.com/Anof-cyber/

Linkedin: https://www.linkedin.com/in/sourav-kalal/

Si quieres conocer otros artículos parecidos a Omitir el cifrado asimétrico del lado del cliente sin una clave privada puedes visitar la categoría Tutoriales.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Esta página web utiliza cookies para analizar de forma anónima y estadística el uso que haces de la web, mejorar los contenidos y tu experiencia de navegación. Para más información accede a la Política de Cookies . Ver mas