Decrittografia dei dati JSON

5

Contesto

Sto cercando di saperne di più sulla sicurezza web esaminando in che modo le varie app native di iOS funzionano sotto il cofano. Ho utilizzato Burp Suite come strumento MITM per individuare il traffico di rete inviato e ricevuto dalle app, e su iPhone ho installato SSL Kill Switch 2 per bypassare qualsiasi blocco di certificato. È molto interessante e sorprendente vedere come tutto funzioni sotto il cofano, per un principiante come me.

Non ho avuto alcun problema con la maggior parte delle app, incluse alcune applicazioni che dovrebbero avere un'elevata sicurezza, come diverse app di mobile banking - non appena l'SSL viene rimosso, tutto è visibile in testo normale. È interessante notare che alcuni giochi per dispositivi mobili mi stanno dando problemi.

Challenge

Il traffico intercettato sembra essere un file JSON crittografato. Ad esempio,

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

Cosa ho fatto

Se ho capito bene, ora sono nel regno della decifrazione. Usando alcuni approcci analitici che ho trovato su Google, ecco alcuni dei miei risultati (alcuni possono sembrare molto ovvi e banali per gli esperti):

  1. Tutte le richieste inviate dall'app sono in questo preciso formato / struttura. I nomi delle chiavi crittografati sono sempre gli stessi, solo i valori differiscono.

  2. Il valore della chiave aV6cLn3v sembra corrispondere a una sorta di timestamp, in quanto è in costante aumento.

  3. I precedenti sospettavano che il valore corrispondente alla chiave Hhgi79M1 fosse qualche bit di controllo basato sul timestamp, ma non lo è. Eseguire la stessa azione nel gioco porterà allo stesso valore, nonostante i diversi timestamp. Tuttavia, diverse azioni produrranno valori diversi.

  4. Il valore per la chiave Kn51uR4Y è dove si trova il payload effettivo. Credo che sia un JSON al di sotto della crittografia, ma non ne sono sicuro.

  5. I segni / nel payload sembrano essere separatori per segmenti di dati. Il secondo segmento /6vy61RFO/ sembra essere il bit di controllo basato sul timestamp. Perché eseguire due azioni identiche nei risultati di gioco in due JSON quasi identici, ad eccezione del timestamp e di questa particolare sezione nel payload.

  6. La crittografia del payload ha qualcosa a che fare con Base64 o AES, a causa della firma trailing = ('s), e le lunghezze dei diversi payloads sono sempre multipli di 4. Non sono sicuro che quest'ultimo significhi qualcosa .

  7. La chiave di crittografia utilizzata sembra essere costante. Non cambia da sessioni diverse e su dispositivi diversi.

Domanda

Ho ragione nella mia analisi fino ad ora? Dove dovrei andare da qui? Con la mia conoscenza quasi nulla in questi campi, non sono sicuro di quale sia il prossimo passo da compiere. Penso che potrei aver bisogno di decompilare l'app e guardare nei binari per cercare di vedere se riesco a trovare la chiave / funzione di decrittografia che giace intorno. Ma non sono sicuro.

Sono consapevole che ci sarà un sacco di apprendimento in anticipo, ma non mi dispiace perché mi sto divertendo moltissimo e apprezzerei molto l'aiuto, anche se è solo una breve lista di argomenti e URL Dovrei esaminare.

Aggiornamento 2015/11/23

Ho scaricato i binari decifrati della app e ho eseguito un comando stringhe su di essi, quindi ho creato uno script Python per selezionare con successo la chiave di crittografia. Grazie a tutti quelli che hanno aiutato!

    
posta saulgoodman 13.11.2015 - 14:42
fonte

2 risposte

3

Direi che hai ragione finora, ma questo è solo indovinare fino ad ora (probabilmente però:)).

Sì, penso che il reverse engineering del binario dell'applicazione sia il tuo prossimo passo. Se si identifica la funzione di crittografia e la chiave, è possibile reimplementare le funzioni crittografiche in say, python e decodificare / crittografare i valori come desiderato.

  1. Metti le mani sul binario dell'applicazione. (estrailo dal telefono (potrebbe essere necessario eseguire il jailbreak) o scarica l'IPA da iTunes, ulteriori informazioni here )

  2. Esegui una "stringa" sull'applicazione. Può risultare in molte stringhe interessanti, potrebbe persino elencarti la chiave di crittografia o alcuni indizi su quale algoritmo utilizzare.

  3. Utilizza un debugger statico , come IDA Pro o Hopper (necessario per supportare ARM ) per sbirciare nel binario. Se sei fortunato ha i nomi delle funzioni, che potrebbero aiutarti molto a trovare ciò che stai cercando. In caso contrario, potresti provare a cercare costanti criptate conosciute in il binario. Controlla la mia risposta a proposito di qui . Controlla anche questo e this . Se hai trovato una costante utilizzata nella funzione di crittografia, puoi fare un riferimento incrociato a cui si accede / usa quella costante , e alla fine troverai la chiave come parametro o variabile statica utilizzata dalla funzione di crittografia.

  4. Se tutto il resto fallisce, dovrai utilizzare un debugger dinamico (come GDB) e collegarlo al processo in esecuzione sul telefono e lavorare da lì. Trova un dato che sai per certo che verrà crittografato e traccia la funzione chiama l'accesso a tali dati finché non viene crittografato .

Non dimenticare la Reverse Engineering e Crypto siti di stackexchange e ovviamente google molto! ;)

    
risposta data 13.11.2015 - 16:42
fonte
1

Penso che tu sia sulla strada giusta. Disimballare e analizzare i binari dell'app è sicuramente il passo successivo. Essendo uno sviluppatore di app, lancerò alcune teorie e forse ti aiuteranno.

Dato che questo assomiglia al metadata json che contiene una richiesta completamente crittografata, direi che il valore aV6cLn3v è forse una sorta di ID di transazione (riferito a una transazione precedente. Sembra troppo piccolo per essere utile timestamp, anche i timestamp possono essere nelle intestazioni HTTP che lo renderebbero ridondante da inserire nei metadati di richiesta JSON). L'altro campo potrebbe forse essere l'hash corrente generato dall'app per lo stato di particolari dati già presenti, utile per la richiesta di delta (salva l'utilizzo dei dati mobili) o potrebbe essere una sorta di identificatore di metodo.

Se dovessi fare una ipotesi selvaggia , direi che non cripterà almeno le chiavi in questo JSON:

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

Dare un'occhiata all'app non può ferire affatto, ma assicurati di non effettuare alcuna richiesta al server manualmente (a seconda delle leggi locali).

    
risposta data 13.11.2015 - 15:38
fonte

Leggi altre domande sui tag