Signal Mesajlaşma Uygulamasının Veritabanı Nasıl Çözülür?

Signal Mesajlaşma Uygulamasının Veritabanı Nasıl Çözülür?

Giriş

Signal Messenger veritabanları, tüm işletim sistemlerinde (iOS, Android, Windows) farklı şekilde şifrelenir. En kolayı windows masaüstü uygulamasıdır, anahtarı sqlcipher ile kolayca çözebileceğiniz config.json dosyasında saklar ki şimdilik konumuz bu değil. Üstünde asıl çalışacağımız konu android versiyonudur. Bilindiği üzere adli bilişim süreçlerinde bu tarz gizli ve şifreli mesajlaşma uygulamalarının içeriğine erişmek, bir çok vakanın çözülmesine yardımcı olmaktadır.

Android cihazlarda, AES-GCM modunu kullanarak veritabanının şifresini çözmek için üç değer almamız gerekiyor, ilki USERKEY_SignalSecret anahtar deposu (keystore) olan anahtar değeridir. İkincisi, IV değerleri olan şifre metnidir.

Konumlar

Windows:

Database: C:\Users\AppData\Roaming\Signal\sql\db.sqlite

Key: C:\Users\Digisecure\AppData\Roaming\Signal\config.json

Android:

Database: /data/data/org.thoughtcrime.securesms/databases/signal.db

key: /data/keystore/user_0/10044_USRSKEY_SignalSecret

IV + authTag içeren şifreli metin: org.thoughtcrime.securesms\shared_prefs\org.thoughtcrime.securesms_preferences.xml

Konumuz Android olduğu için bu blogda sadece Android için Signal veri tabanının şifresinin nasıl çözüleceğine odaklanacağız.

Android Decryption

Signal, veritabanını sqlcipher kullanarak şifrelemek için AES-GCM Encryption modunu kullandığından bahsetmiştik. İlk olarak sql şifre anahtarını alır, ardından veritabanını şifrelemek için USERKEY + IV'ten AES-GCM anahtarını kullanır, bu değerler org.thinktcrime.securesms_preferences.xml içinde saklanır. Sql veritabanını çözebilmek için bu değerleri tersine çevirmemiz gerekiyor. Deyimi yerinde ise Reverse Engineering tekniklerini kullanmamız gerekiyor.

Şifreli veritabanını çözebilmek için üç değere ihtiyacımız var;

  1. "app-id”_USERKEY_SignalSecret dosyasını elimizde bulunan bir hex editör aracılığıyla 2D'den 3C'ye kadar olan 16 bitlik kısmını kopyalıyoruz ("app-id" kısmı sizde farklılık gösterebilir. Bende 10044, sizde başka bir id olabilir bundan dolayı tırnak içerisinde ayrı olarak belirtildi).

    Signal_Key_1.png

  2. Daha sonra org.thinktcrime.securesms_preferences.xml içerisinde base64 ile kodlanmış string name =pref_database_encrypted_secret kısmındaki base64 değerini alıyoruz.

    secure_xml_preferences.png

Ardından base64 veri değerini hex'e dönüştürüyoruz:864531f86b5b9dfad548f6e8c91712208d2d4477925240d586f1a3d825b545a2246baf3b35662f5eb825dd85c9e39166 (son 32 karakter auth etiketidir.) Not: Geliştirici çevrimiçi java AES-GCM kodunu kullanıyorsa, kimlik doğrulama etiketini şifre metninden ayırmaya gerek olmayabilir. Ama bu vakada cyberchef ile bunu parçalamamız gerekiyor.

CyberChef (2).png

  1. Şimdi Signal veri tabanının şifresi çözülmüş anahtarına sahibiz. Son adım ise sqlcipher ile nasıl açılacağıdır. Singal'in kaynak kodlarına baktığınızda şifreleme yapmak için bu yöntemi kullandıklarını görebilirsiniz.
public final class SqlCipherDatabaseHook implements SQLiteDatabaseHook {

@Override

public void preKey(SQLiteDatabase db) {

db.rawExecSQL("PRAGMA cipher\_default\_kdf\_iter = 1;");

db.rawExecSQL("PRAGMA cipher\_default\_page\_size = 4096;"); }

Seçeneklerden Passphrase seçip aldığımız kodu kopyalıyoruz ve daha sonra alt seçeneklerden custom'ı seçip gerekli alanları aşağıdaki gibi dolduruyoruz.

Deceypt_SignalDB.png

Ve işte tüm veritabanı karşımızda!

open_it.png

Bu araştırma yazısını hazırlayan Radhwan Alshammari'ye teşekkürler

Destek

Herhangi bir veri kaybı yaşadığınızda, bulunduğunuz konuma en yakın DrDisk Lab çözüm ortağı ile iletişime geçebilirsiniz...

Yukarı