Ein Open-Source-SMS-Gateway für Pentest-Projekte
Zugänge für mobile Anwendungen sind oft an Telefonnummern gebunden. Die Arbeit mit mehreren Personen an einem Projekt kann es irgendwann erfordern, Mobiltelefonnummern für den SMS-Empfang zu teilen. Beim Testen mobiler Anwendungen, die durch eine SMS-basierte Second-Factor-Authentisierung (2FA) geschützt sind, ist die gemeinsame Nutzung von Telefonnummern durch das Testteam manchmal notwendig und sicherheitstechnisch akzeptabel, wenn es sich nur um ein Testsystem handelt. Bei Pentagrid betreiben wir daher ein kleines SMS-Gateway, das wir hiermit als Open Source veröffentlichen.
Motivation
Mit SMS als zweitem Authentisierungsfaktor, sendet ein Zielsystem eine SMS an ein Mobiltelefon, und der Prüfer gibt das Token dann manuell in den Webbrowser ein. Während dies für die normale Arbeit noch einigermaßen praktikabel ist, ist es bei einem Penetrationstest ziemlich ineffizient. Insbesondere, wenn die Serverseite die Sitzung hin und wieder invalidiert, weil die getestete Anwendung die Eingabe nicht mag und lediglich die Ablehnung der HTTP-Anfrage von den Softwareentwicklern als nicht schmerzhaft genug erachtet wurde. Wenn ein System nicht dafür ausgelegt ist, mit halbautomatischen Tools wie dem Burp Proxy getestet zu werden, kann 2FA oft nicht einfach für bestimmte Testkonten deaktiviert werden. Um ein solches System dennoch testen zu können, ist es sinnvoll, den zweiten Faktor in den Burp Proxy einzubinden.
Es gibt viele kommerzielle SMS-Gateways, die eine API für den Versand und Empfang von SMS anbieten. Da der Token jedoch ein Authentisierungsfaktor ist, wenn auch nur ein Teil des gesamten Prozesses, ist die Weitergabe dieser sensiblen Informationen an Dritte keine Option, auch nicht für Testsysteme. Aus diesem Grund haben wir ein SMS-Gateway implementiert, um Drittanbieter-Infrastruktur zu vermeiden.
Ansatz
Es gibt ebenfalls einige Mobil-Applikationen für das Weiterleiten von SMS, die auf einem Mobiltelefon eingehende Kurznachrichtenan eine Ziel-E-Mail-Adresse weiterleiten. Das funktioniert, aber die Methode hat Nachteile. Sie erhöht Abhängigkeiten: Man muss zusätzlich dem Anwendungsentwickler, dem E-Mail-Anbieter (wenn man sich dabei auf einen Drittanbieter verlässt) und letztlich auch anderen Anwendungen auf dem Mobiltelefon vertrauen - zumindest zu einem gewissen Grad. Der Ansatz ist zudem nicht gut skalierbar. In der Regel kann ein Telefon bis zu zwei physische SIM-Karten aufnehmen. Für drei oder mehr SIM-Karten wären zusätzliche Telefone erforderlich. Außerdem wird Service-Monitoring kaum unterstützt. Um zu prüfen, ob die Weiterleitungsanwendung noch funktioniert, ist die fast einzige Möglichkeit eine Ende-zu-Ende-Prüfung, die das Senden einer SMS und den Empfang einer Mail umfasst.
Um diese Nachteile zu vermeiden, haben wir ein SMS-Gateway implementiert, dessen Hauptzweck der Empfang von SMS ist. Es ist außerdem möglich, SMS zu senden, was wir für den Versand von Alarmmeldungen bei der Serverüberwachung nutzen, aber das war nicht der Fokus.
In dieser ersten Version bietet der SMS-Gateway die folgenden Funktionen:
Verwalten eines Modempools
Empfangen und Senden von SMS
Weiterleiten empfangener SMS an eine Mailadresse
Senden und Abrufen von SMS über eine XMLRPC-Schnittstelle
Unterstützung für Unstructured Supplementary Service Data, also USSD-Codes für das Aufladen von Prepaid-SIM-Karten
Unterstützung von TLS
Integration von Icinga2/Nagios für die Prüfung des inneren Funktionszustandes
Integration von Munin für ein paar Statistiken
Implementation und Betriebsmodus
Der SMS-Gateway ist als Python-Programm für Linux implementiert. Das Modul python-gsmmodem bildet die Schnittstelle zum Modem und verarbeitet Modembefehle. Dazu läuft jedes Modem in seinem eigenen Thread. Mehrere Modems werden zu einem Modem-Pool zusammengefasst, der es uns ermöglicht, mehrere SIM-Karten parallel zu betreiben. Der Modem-Pool überwacht den Gesundheitszustand jedes Modems, einschließlich der seriellen Verbindung zum Modem, der Signalstärke und des Kontostandes bei Prepaid-SIM-Karten. Außerdem versucht der Modem-Pool, die Modems im Falle von Problemen neu zu initialisieren.
Wenn ein Modem eine SMS empfängt, wird sie in eine interne Queue eingetragen. Ein Client holt die SMS über die API eines integrierten XMLRPC-Servers ab, der auf der Netzwerk-Engine Twisted basiert. Alternativ ist das SMS-Gateway in der Lage, eingehende SMS über SMTPS an eine Ziel-Mailbox zuzustellen. Die SMS-Weiterleitung über SMTPS wird auch als Health-Check überwacht. Wenn es ein Problem mit der SMTPS-Verbindung gibt, schlägt der Health-Check folglich fehl.
Mit einem XMLRPC-Client kann man mit dem XMLRPC-Server interagieren. Ein XMLRPC-Client kann empfangene SMS abrufen. Die API dafür ist einfach gehalten. Es gibt keine Benutzerverwaltung. Stattdessen autorisiert der XMLRPC-Server Vorgänge mittels API-Token, welche der Client beim Aufruf von Remote-API-Funktionen als Parameter übergibt. Der Server speichert berechtigte API-Token als Hash in einer Konfigurationsdatei und prüft die Token bei Anfragen auf Gültigkeit. Dabei unterscheidet der XMLRPC-Server API-Token für den allgemeinen Abruf von SMS, für den Abruf von SMS für einzelne Modems, für den Versand von USSD-Codes, für den Versand von SMS, für die Abfrage des Zustellungsstatus von SMS und für Überwachungs- und Statistikzwecke.
Das SMS-Gateway wird mit einem Munin- und einem Icinga-/Nagios-Plugin ausgeliefert, um die Betriebsüberwachung zu unterstützen. Die Monitoring-Plugins sind als XMLRPC-Clients implementiert, die Zustandsinformationen bzw. Statistiken vom XMLRPC-Server abrufen.
Das SMS-Gateway unterstützt ebenfalls den Versand von SMS. Das birgt allerdings das Risiko, dass SMS an Premiumdienste versendet werden und erhebliche Kosten verursachen. Ebenfalls lassem sich eventuell Buchungsoptionen ändern. Daher kann das Versenden von SMS über eine Präfix-Liste für erlaubte Ziele eingeschränkt werden.
Betrieb einer eigenen Installation
Wir haben den Quellcode des SMS-Gateways auf Github veröffentlicht, zusammen mit weiterer Dokumentation, wie man ein solches Gateway einrichtet. Es sollte gängige 2G-/3G-/4G-/5G-Modems unterstützen. Im einfachsten Fall könnte man Plastik-USB-Modem-Sticks verwenden, die als "Surfstick" oder ähnlich gehandelt werden.
Wie man den SMS-Gateway automatisiert nutzen kann, um während des Testens mit der Portswigger Burp Suite keine 2FA-Tokens eingeben zu müssen, erfährt man in unserem englischen Blog-Post Burp Suite - solving E-mail and SMS TAN multi-factor authentication with Hackvertor custom tags.