Skip to content

Instantly share code, notes, and snippets.

@MarcoBuster
Created May 18, 2022 10:59
Show Gist options
  • Save MarcoBuster/8a5b8000e7d906cea88f3dc46c32a23a to your computer and use it in GitHub Desktop.
Save MarcoBuster/8a5b8000e7d906cea88f3dc46c32a23a to your computer and use it in GitHub Desktop.

PosteID OTP

Scopi

Lo SPID è uno strumento utile per poter autenticarsi a tutti i servizi della Pubblica Amministrazione, senza dover rinunciare alla sicurezza. Difatti, tutti i provider SPID devono implementare la MFA (Multi-Factor Authentication) per l'autenticazione di livello 2 e superiori.

Poste Italiane è un provider SPID e implementa la MFA con due modalità:

  • via SMS
  • via applicazione proprietaria "PosteID"

Trovo la verifica SMS anacronistica, quindi ho sempre utilizzato l'applicazione ufficiale per autenticarmi. L'applicazione è però lenta, bloat, contiene 2 traccianti (Google Crashlytics e Google Firebase Analytics) e chiede svariati permessi inutili.

Ispirato dal messaggio inviato da Marco Bonelli sul gruppo del POuL (vedi i ringraziamenti), ho deciso di provare a reperire il codice TOTP dall'applicazione per poter usare un'altra applicazione, o per importare la chiave nel mio gestore password Bitwarden. Ho deciso di scrivere una guida per cercare di documentare tutti i passi che ho seguito, includendo le soluzioni a tutti i problemi che ho trovato nel mio percorso.

Buon hacking! ~ Marco Aceti (GitHub)

Prerequisiti

  • Essere un utente esperto e avere familiarità con la linea di comando
  • Un telefono Android e un computer, con un emulatore di terminale UNIX-like
  • adb, apktool, keytool, openssl, python, java e una SDK di Android installati sulla propria macchina
  • Debug USB attivo e funzionante tra il telefono e il PC

A. Modificare l'app PosteID

Non è possibile accedere ai dati (/data) dell'applicazione PosteID senza root, quindi normalmente si utilizza il tool adb backup per scaricare i dati sul PC. PosteID, però, vieta la possibilità di fare backup per via dell'impostazione android:allowBackup nel AndroidManifest.xml contenuto nell'apk. È necessario quindi installare una APK modificata senza questa opzione nel manifesto.

  1. Reperire l'APK dal telefono
$ adb cp $(adb shell pm path posteitaliane.posteapp.appposteid | awk -F':' '{print $2}') posteid.apk
  1. Estrarre il file APK
$ apktool d posteid.apk
  1. I file estratti sono disponibili nella cartella posteid/. Entrare (cd posteid) e modificare il file AndroidManifest.xml impostando la chiave android:allowBackup a "true", come indicato.
<application android:allowBackup="true" ...>
  1. Ritornare nella cartella superiore (cd ..) e riassemblare l'applicazione
$ apktool b posteid
  1. Copiare il file APK generato nella cartella di lavoro
$ cp posteid/dist/posteid.apk posteid_unsigned.apk
  1. L'APK generata non è più firmata, quindi non può essere installata sul proprio telefono. È necessario firmarla con i seguenti comandi. È necessario utilizzare i tool nell'SDK di Android
$ keytool -genkey -v -keystore release-key.keystore -alias my_alias -keyalg RSA -keysize 2048 -validity 10000
$ cd ~/Android/Sdk  # path sdk Android
$ ./build-tools/29.0.2/apksigner sign -ks release-key.keystore posteid_signed.apk
  1. Disinstallare l'app sul telefono e installare l'app nuova, ignorando i prompt di sicurezza:
$ adb install posteid_signed.apk

B. Estrarre il keystore

  1. Fai il login nell'app PosteID modificata
  2. Fai un backup dell'applicazione con adb (sblocca lo schermo prima di eseguire il comando e conferma; NON cifrare il backup). Questo creerà un file backup.ab, che dovrà essere estratto successivamente.
$ adb backup -noapk posteitaliane.posteapp.appposteid
  1. Scarica android-backup-processor nella cartella di lavoro ed estrai il tool adp.jar
$ unzip android-backup-tookit-20210819.zip
$ cp android-backup-toolkit/android-backup-processor/executable/adp.jar .
  1. Estrai il file backup.ab in un file backup.tar
$ java -jar adp.jar unpack backup.ab backup.tar
  1. Estrai a sua volta il file backup.tar
$ tar -xvf backup.tar
  1. Nella cartella apps/posteitaliane.posteapp.appposteid sono presenti tutti i dati dell'app PosteID. Copia il keystore nella cartella di lavoro
$ cp apps/posteitaliane.posteapp.appposteid/f/SCA_HOLDER.ubr .
  1. Installa la libreria Python pyjks
$ python3 -m pip install --user pyjks
  1. Crea un file Python extract_keystore.py con il seguente codice:
import jks

ks = jks.bks.UberKeyStore.load('SCA_HOLDER.ubr', 'SCA_HOLDER') 
c = ks.entries['_APP_SECRET'].cert 
with open('x509cert', 'wb') as f: 
	f.write(c)
  1. Esegui lo script che estrarrà il certificato X509 nel file x509cert
$ python3 extract_keystore.py
  1. Leggi il certificato in esadecimale e copialo negli appunti:
$ xxd -p x509cert
  1. Incolla il certificato sul sito https://lapo.it/asn1js/ e premi decode. Copia la stringa lunga 32 caratteri dopo "OCTET STRING" subito dopo "OBJECT IDENTIFIER subjectKeyIdentifier".

  2. Apri la console python e scrivi:

>>> import base64
>>> ski = b"LA STRINGA CHE HAI COPIATO PRIMA QUI"
>>> print(base64.b32encode(ski).rstrip(b"=").decode('utf-8'))
  1. Congratulazioni. Il risultato di questa espressione è la chiave TOTP. Copiala e procedi al prossimo step.

C. Importa il codice TOTP in un'altra app

  1. Apri il sito https://stefansundin.github.io/2fa-qr/

  2. Come Secret imposta la chiave TOTP ricavata nello step precedente, mentre in Label puoi inserire del testo arbitrario, come "PosteID SPID" Abilita le Advanced Options e imposta l'algoritmo di codifica SHA1, il numero di cifre a 6 e il periodo di validità a 120.

  3. Il QR code può essere scansionato in qualsiasi applicazione OTP (come AndOTP, Google Authenticator, Authy, ...), decisamente più pratico rispetto ad utilizzare l'app PosteID.

Ringraziamenti

La guida è stata scritta grazie all'aiuto fondamentale dato dal messaggio di Marco Bonelli sul gruppo del Politecnico Open UNIX Labs.

Copyright

Copyright (c) Marco Aceti, 2022. Some rights reserved.

Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale 4.0 Internazionale. Licenza Creative Commons

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment