Ich möchte ein "Red Teaming"
Michael Schneider
Stellen Sie sich vor, Sie könnten dank einer App Kurzmitteilungen versenden, doch der Empfänger erhält das SMS mit einer anderen Absendernummer. Stellen Sie sich vor, Sie sind ein Anbieter von Spam und haben keinen Skrupel, Ihre ungebetene Werbung mit Kosten für Drittpersonen zu versehen. Innert kurzer Zeit habe ich hierzu einen Proof-of-Concept als Android App geschrieben. Googles Betriebssystem untersagte mir zwar einige meiner Wünsche. Wie überall im Leben gilt, es ist alles eine Frage der Optik.
Wir wollen eine App, welche…
Einschränkungen existieren jedoch auch (selbst- und fremdbestimmte):
Wie gesagt, die Anwendung ist innert kurzer Zeit erstellt. Auch wenn man wenig Entwicklungserfahrung im Android-Umfeld, dafür aber Java-Kenntnisse hat. Dennoch möchte ich hier nicht den kompletten Sourcecode abdrucken.
Relevant für uns sind drei Files: (1) Das AndroidManifest
, (2) eine Activity
, welche bei der Installation angezeigt wird, und (3) einen BroadcastReceiver
, der auf empfangene SMS triggert.
Wie im Szenario erwähnt, unterstützt Android in der neusten Version keine Apps mehr, welche direkt als Service gestartet werden können. Dies ist ein Schutzmechanismus für den Benutzer.
Wir benötigen daher eine Activity, welche ausgeführt wird, wenn die App installiert wurde. Diese Activity ist ziemlich simpel. Sie umfasst lediglich eine Methode, die wir um zwei Zeilen erweitern, welche die App im App-Launcher verschwinden lässt:
ComponentName cn = new ComponentName("com.example.smsproxy", "com.example.smsproxy.SMSProxyActivity"); getPackageManager().setComponentEnabledSetting(cn, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
Der BroadcastReceiver
ist eine Klasse, welche auf einen Event wartet und dann reagiert. In unserem Fall ist der Event android.provider.Telephony.SMS_RECEIVED
.
Die eingegangen SMS-Nachrichten erhalten wir in den Extras des zugehörigen Intents zurück:
Bundle intentBundle = intent.getExtras(); Object[] pdu = (Object[] intentBundle.get("pdus"); SmsMessage smsMsg = SmsMessage.createFromPdu((byte[]) pdu[0]); String[] message = smsMsg.getMessageBody().toString().split(";");
Damit nicht jede empfangene SMS weitergeleitet wird und auch nicht irgend jemand eine SMS zum Weiterleiten senden kann, überprüfen wir den Absender. Nach dem klar ist, dass unsere gewünschte Ursprungsnummer die SMS gesendet hat, wird der Event für weitere Handlungen ausserhalb unserer App unterdrückt. Das bedeutet, der Benutzer bekommt keine Benachrichtigung, dass eine SMS eingegangen ist. Die erhaltene Nachricht wird anschliessend weitergeleitet:
String smsSrc = SmsMessage.getOriginatingAddress(); if(smsSrc.equals($allowedSrc)){ this.abortBroadcast(); SmsManager smsMgr = SmsManager.getDefault(); smsMgr.sendTextMessage(message[0], null, message[1], null, null); }
Wir fügen der Standarddatei AndroidManifest.xml
zwei Berechtigungen zu, um das empfangen und senden von SMS zu ermöglichen:
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" />
Im application
-Tag wird noch die Activity und der BroadcastReceiver angemeldet. Im receiver
-Tag müssen wir noch die Priority setzten. Damit stellen wir sicher, dass jede eingehende SMS zuerst durch unsere App geht.
<receiver android:name="com.example.smsproxy.ProxyBroadcastReceiver"> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVER"/> </intent-filter> </receiver>
Die nachfolgende Grafik illustriert, wie die Applikation arbeitet (ähnlich dem Ansatz auf iOS). Nach dem die App auf einem Android Gerät installiert wurde, kann vom Angreifer Gerät – das OS ist egal, nur die Nummer muss mit jener in der App übereinstimmen – eine SMS an das manipulierte Gerät senden. Die Nachricht besteht zuerst aus zwei Teilen: (1) Als erstes die Telefonnummer des Zielgerätes, ein Semikolon als Separator und dann (2) die Nachricht für das Zielgerät.
Auf dem Zielgerät erscheint wie üblich eine SMS-Nachricht. Als Absender der SMS wird jedoch nicht die Nummer des Angreifers angezeigt, sondern jene des manipulierten Gerätes.
Die PoC-App zeigt, dass es nicht viel braucht und schon ist die Integrität des Mobiltelefons aufgebrochen. Die App kann den Besitzer des manipulierten Gerätes in ernste Probleme bringen:
Der verwendete Code ist so klein, dass sich die Funktionalität mit Leichtigkeit in eine unauffällige App integrieren liesse. So könnte eine App, welche eben unserer Berechtigungen für seine Kernfunktionen benötigt, die perfekte Ablenkung darstellen. Die benötigten Berechtigungen scheinen plausibel für die Funktion der trojanisierten App.
Mit wenigen Anpassungen wäre es auch möglich, jede Nachricht an den Angreifer weiterzuleiten. Jede SMS-basierte Authentisierung würde dann ihren geheimen Drittenfaktor preisgeben, was potentielle Man-in-the-Middle Attacken ermöglicht.
Keine Woche nach dem Erscheinen dieses Artikels wurde durch MELANI eine Meldung zum Thema veröffentlicht. Derzeit scheint eine Schadsoftware im Umlauf zu sein, welche auf die mTAN Authentisierung abzielt. Offenbar fangen dabei Angreifer die SMS zur Login- und Transaktions-Authentisierung der Bank ab und leiten sie zu sich um. Damit können sie unbehelligt Transaktionen vom Konto des Opfers ausführen.
Unsere Spezialisten kontaktieren Sie gern!
Michael Schneider
Marisa Tschopp
Michèle Trebo
Andrea Covello
Unsere Spezialisten kontaktieren Sie gern!