descifrado de datos JSON

5

Context

Estoy tratando de aprender más acerca de la seguridad web a través de investigar cómo funcionan las diversas aplicaciones nativas de iOS. He estado utilizando Burp Suite como la herramienta MITM para detectar el tráfico de red enviado y recibido de las aplicaciones, y en el iPhone tengo SSL Kill Switch 2 instalado para omitir cualquier anclaje de certificado. Es muy interesante y sorprendente ver cómo funciona todo bajo el capó, para un principiante como yo.

No tuve ningún problema con la mayoría de las aplicaciones, esto incluye algunas aplicaciones que se supone que tienen alta seguridad, como varias aplicaciones de banca móvil, tan pronto como se levanta el SSL, todo es visible en texto plano. Curiosamente, algunos juegos móviles me están haciendo pasar un mal rato.

Desafío

El tráfico interceptado parece ser archivos JSON cifrados. Por ejemplo,

{
"F4q6i9xe":{"aV6cLn3v":"542668","Hhgi79M1":"ynB7X5P9"},
"a3vSYuq2: {"Kn51uR4Y":
"f3SQ5sySeaoDupGhGmCD9MKt0V4naBjXXR+jDEjqU1gmL32FgS8v1/6vy61RFO/rwmXwFYZHfTRgV2XujI6U7fESlcSZjMjdeiULExVg0uFmnSgiYA5040hBtuxfFqn+lP1ZCsvnua2IQHoYZDBagkr8I9VZVxQbzivc7rv5d17qscgnD2Jd4BBImn+ohuTpxPEC2H2sLBpAldLe/5EAbXUIkF8griS73lvjyWhmHubZguNUa9EzOCH8o0UPwo5BLB8Fz7xok1GE85/wwSzrlyapQw76/U/RJBF+/0YQ75BACuE4/SfIknim9XZk2EspKrCOu/Gi2K+7pHS+jytfXHR6zTjmeMyV2o967MUVXag="}
}

Lo que he hecho

Si entiendo correctamente, ahora estoy en los reinos de descifrado. Usando algunos enfoques analíticos que he encontrado en Google, aquí están algunos de mis hallazgos (algunos pueden parecer muy obvios y triviales para los experimentados):

  1. Todas las solicitudes enviadas desde la aplicación están en este formato / estructura exacta. Los nombres de clave cifrados son siempre los mismos, solo los valores difieren.

  2. El valor de la clave aV6cLn3v parece corresponder a algún tipo de marca de tiempo, ya que está en constante aumento.

  3. Anteriormente sospeché que el valor correspondiente a la clave Hhgi79M1 serían algunos bits de verificación según la marca de tiempo, pero no lo es. Realizar la misma acción en el juego llevará al mismo valor, a pesar de las diferentes marcas de tiempo. Sin embargo, diferentes acciones producirán valores diferentes.

  4. El valor para la clave Kn51uR4Y es donde está la carga útil real. Creo que es un JSON debajo del cifrado, pero no estoy seguro.

  5. Los signos / en la carga útil parecen ser separadores para segmentos de datos. El segundo segmento /6vy61RFO/ parece ser los bits de verificación según la marca de tiempo. Porque realizar dos acciones idénticas en los resultados del juego en dos JSON casi idénticos, excepto por la marca de tiempo y esta sección en particular en la carga útil.

  6. El cifrado de la carga útil tiene algo que ver con Base64 o AES, debido a la firma trailing = ('s), y las longitudes de las diferentes cargas útiles son siempre múltiplos de 4. No estoy seguro de que esto último signifique algo .

  7. La clave de cifrado utilizada parece ser constante. No cambia de diferentes sesiones y en diferentes dispositivos.

Pregunta

¿Estoy en mi análisis hasta ahora? ¿A dónde debo ir desde aquí? Con mi conocimiento casi nulo en estos campos, no estoy seguro de cuál es el próximo paso a seguir. Creo que debo descompilar la aplicación y mirar los binarios para tratar de ver si puedo encontrar la función / clave de descifrado por ahí. Pero no estoy seguro.

Soy consciente de que habrá mucho aprendizaje por delante, pero no me importa ya que lo estoy disfrutando mucho y apreciaría enormemente la ayuda, incluso si es solo una lista rápida de los temas y las URL. Debería mirar en.

Actualización 2015/11/23

Descarté los archivos binarios descifrados de la aplicación y ejecuté un comando cadenas en ellos, luego hice un script en Python para seleccionar con éxito la clave de cifrado. Gracias a todos los que han ayudado!

    
pregunta saulgoodman 13.11.2015 - 14:42
fuente

2 respuestas

3

Diría que tienes razón hasta ahora, pero esto es solo una suposición hasta ahora (aunque probablemente tenga razón :)).

Sí, creo que la ingeniería inversa del binario de la aplicación es su próximo paso. Si identifica la función de cifrado y la clave, puede volver a implementar las funciones de cifrado en, por ejemplo, python y descifrar / cifrar sus valores como desee.

Entonces,

  1. Ponga sus manos en el binario de la aplicación. (extráigalo del teléfono (es posible que necesite jailbreak), o descargue la IPA de iTunes, más información here )

  2. Ejecuta "cadenas" en la aplicación. Puede dar lugar a muchas cadenas interesantes, e incluso puede enumerar la clave de cifrado o algunas pistas sobre qué algoritmo se utiliza.

  3. Use un depurador estático , como IDA Pro o Hopper (debe ser compatible con ARM ) para echar un vistazo en el binario. Si tiene suerte, tiene los nombres de funciones, lo que podría ayudarlo a encontrar lo que está buscando. Si no, puede intentar buscar constantes de criptografía conocidas en el binario Echa un vistazo a mi respuesta sobre eso aquí . También puedes ver this y this . Si encuentra una constante utilizada en la función de criptografía, puede hacer una referencia cruzada donde se accede / utiliza esa constante , y finalmente encontrará la clave como un parámetro o variable estática utilizada por la función de criptografía.

  4. Si todo lo demás falla, deberá usar un depurador dinámico (como GDB) y adjuntarse al proceso que se ejecuta en el teléfono y trabajar desde allí. Encuentre un dato que sepa con seguridad que finalmente se cifrará, y rastree las llamadas a la función que accede a esos datos hasta que estén encriptados .

No te olvides de la Ingeniería inversa y Crypto apilar sitios de intercambio, y por supuesto google mucho! ;)

    
respondido por el Dominik Antal 13.11.2015 - 16:42
fuente
1

Creo que estás en el camino correcto. Desempaquetar y analizar los binarios de la aplicación es definitivamente el siguiente paso. Al ser un desarrollador de aplicaciones, lanzaré algunas teorías y quizás te ayuden.

Debido al hecho de que se parece a un metadata json que contiene una solicitud totalmente encriptada, supongo que el valor aV6cLn3v es quizás algún tipo de ID de transacción (en referencia a una transacción anterior. Parece demasiado pequeño para ser útil marca de tiempo, también las marcas de tiempo pueden estar en los encabezados HTTP, lo que haría redundante colocar metadatos de solicitud JSON). El otro campo podría ser el hash generado actualmente por la aplicación para el estado de los datos particulares que ya tiene, lo que es útil para solicitar deltas (ahorra el uso de datos móviles), o podría ser algún tipo de identificador de método.

Si tuviera que hacer una suposición salvaje , diría que desencriptar al menos las claves de este JSON se vería así:

{
    "metadata" : {"transactionId" : "542668", "delta" : "ynB7X5P9"},
    "request" : {"body": "encrypted data goes here"}
}

Echar un vistazo a la aplicación no le hizo ningún daño, pero asegúrese de no realizar ninguna solicitud al servidor manualmente (según las leyes locales).

    
respondido por el Justin Beale 13.11.2015 - 15:38
fuente

Lea otras preguntas en las etiquetas