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)
- 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
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.
- Reperire l'APK dal telefono
$ adb cp $(adb shell pm path posteitaliane.posteapp.appposteid | awk -F':' '{print $2}') posteid.apk
- Estrarre il file APK
$ apktool d posteid.apk
- I file estratti sono disponibili nella cartella
posteid/
. Entrare (cd posteid
) e modificare il fileAndroidManifest.xml
impostando la chiaveandroid:allowBackup
a"true"
, come indicato.
<application android:allowBackup="true" ...>
- Ritornare nella cartella superiore (
cd ..
) e riassemblare l'applicazione
$ apktool b posteid
- Copiare il file APK generato nella cartella di lavoro
$ cp posteid/dist/posteid.apk posteid_unsigned.apk
- 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
- Disinstallare l'app sul telefono e installare l'app nuova, ignorando i prompt di sicurezza:
$ adb install posteid_signed.apk
- Fai il login nell'app PosteID modificata
- 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
- 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 .
- Estrai il file
backup.ab
in un filebackup.tar
$ java -jar adp.jar unpack backup.ab backup.tar
- Estrai a sua volta il file
backup.tar
$ tar -xvf backup.tar
- 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 .
- Installa la libreria Python pyjks
$ python3 -m pip install --user pyjks
- 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)
- Esegui lo script che estrarrà il certificato X509 nel file
x509cert
$ python3 extract_keystore.py
- Leggi il certificato in esadecimale e copialo negli appunti:
$ xxd -p x509cert
-
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
". -
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'))
- Congratulazioni. Il risultato di questa espressione è la chiave TOTP. Copiala e procedi al prossimo step.
-
Apri il sito https://stefansundin.github.io/2fa-qr/
-
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.
-
Il QR code può essere scansionato in qualsiasi applicazione OTP (come AndOTP, Google Authenticator, Authy, ...), decisamente più pratico rispetto ad utilizzare l'app PosteID.
La guida è stata scritta grazie all'aiuto fondamentale dato dal messaggio di Marco Bonelli sul gruppo del Politecnico Open UNIX Labs.
Copyright (c) Marco Aceti, 2022. Some rights reserved.
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale 4.0 Internazionale.