Donnerstag, 13. September 2012

Blue Boxing 2.0

Was müssen das für aufregende Zeiten gewesen sein, als es dank "Security through Obscurity" sooo viel zu entdecken gab. Ich kann mich noch gut an das aufregende Gefühl bei meiner ersten (legitimen) Modem-Einwahl in einen Unix-Server erinnern, aber das war fast zehn Jahre nach War Games eigentlich nichts Besonderes mehr... für echtes Phreaking bin ich wahrscheinlich eine halbe Generation zu alt (und wahrscheinlich nicht talentiert genug).

Ein kleines Revival erfuhr das Phone Phreaking mit den innovativen Features der neuen Mobilfunkbetreiber (ViagIntercom - O2). Die angebotene Festnetznummer und kostenlose Rufumleitungen innerhalb des gleichen Netzbetreibers führten Anfang der 2000er Jahre zur Möglichkeit einer BWHZ (Bundesweite Home Zone) - d.h. man war Deutschlandweit unter der (damals kostengünstigeren) Festnetznummer erreichbar.

In Kombination mit den damals verfügbar werdenden VoIP-Festnetz Flatrates und einem Asterisk-Server haben wir unsere ganz eigene BWHZ gebaut, die in logischer Konsequenz auch kostenlose Anrufe ins O2-Netz ermöglichte.





Der Trick liegt in der dynamischen Umschaltung der Rufweiterleitung im Homezone-Handy.
Anfänglich musste das Handy immer in der Nähe eines aus dem Internet erreichbaren Servers liegen (an den es per seriellem Kabel angeschlossen war), später haben wir es einfach per USB an eine Fritz!Box gehängt und per Ser2Net dem gehosteten Asterisk-Server zugänglich gemacht.

Die Funktionsweise im Detail:

(Fall 1: VoIP Telefon nach Mobil)
  1. Der Anrufer wählt per VoIP eine Mobilnummer unseres Netzbetreibers.
  2. Die Asterisk ruft im Dialplan ein Umleitungsscript auf, mit der Nummer des Angerufenen als Ziel.
  3. Das Umleitungsscript verbindet sich per seriellem Terminal zum Handy in der Homezone und setzt die Umleitung per AT-Kommando
  4. Die Asterisk ruft (kostenlos durch VoIP-Flat) die Festnetznummer des Homezone-Handys - welches kostenlos auf die eingestellte Umleitung weiterleitet - und verbindet ein- und ausgehenden Ruf miteinander.

(Fall 2: Mobil nach Mobil mit Callback)

  1. Der Anrufer wählt eine, auf die Asterisk geschaltete Nummer.
  2. Die Asterisk erkennt die CallerID und quittiert den Ruf mit einem Besetztzeichen.
  3. Die Asterisk ruft im Dialplan ein Umleitungsscript auf, mit der Nummer des Anrufers als Ziel.
  4. Das Umleitungsscript verbindet sich per seriellem Terminal zum Handy in der Homezone und setzt die Umleitung per AT-Kommando
  5. Die Asterisk ruft die Festnetznummer des Homezone-Handys, welches auf den Anrufer weiterleitet.
  6. Der Anrufer kann sich nun über Kurzwahlen oder Nummerneingabe mit einer beliebigen Nummer verbinden lassen.
  7. Im Falle einer Mobilnummer ändert die Asterisk während des bestehenden Gesprächs die Umleitung im Homezone-Handy und baut so eine zweite Verbindung ins Mobilnetz auf.

Ein Asterisk Macro könnte so aussehen:

[macro-mobile]

exten => i,1,Playback(invalid)
exten => i,2,Hangup()

exten => s,1,Goto(${MACRO_EXTEN}|1)

exten => mobiledial,1,Set(ext=${MACRO_EXTEN})
exten => mobiledial,2,Set(ctxt=${MACRO_CONTEXT})
exten => mobiledial,3,AGI(gsm_divert.agi|${MACRO_EXTEN})
exten => mobiledial,4,Set(CDR(userfield)=${ext})
exten => mobiledial,5,Goto(${ctxt}|087654310|1) ; Weiterleitungshandy in HZ

include => forbidden_mobile
include => free_mobile
include => other_mobile

[forbidden_mobile]
exten => 01791234567890,1,Goto(i|1) ; bekannte Rufnummern, die zu einem
exten => 01791234567891,1,Goto(i|1) ; anderen Provider portiert wurden
exten => 01791234567892,1,Goto(i|1) ; und nicht mehr kostenlos sind

[other_mobile]
exten => _01X.,1,Goto(i|1) ; Standard-Context für Mobilnummern (z.B. SipGate)

[free_mobile]
exten => 015123456789,1,Goto(mobiledial|1) ; portierte Nummern, die
exten => 016223456789,1,Goto(mobiledial|1) ; inzwischen bei O2 sind
exten => _017[69].,1,Goto(mobiledial|1)    ; std. O2 nummern

Das AGI-Script ist optional, man könnte auch gleich das Umleitungsscript hernehmen:

#!/bin/bash
#
# wertet den ersten Parameter aus "AGI(gsm_divert.agi|param1)"
#
if [ -z "$1" ] ; then
        /usr/local/bin/gsm_divert.sh
        exit 0
else
        CHAN=$1
        if [ "${CHAN:0:4}"="0176" -o "${CHAN:0:4}"="0179" ] ; then
                CHAN=${CHAN/#0/+49}
                /usr/local/bin/gsm_divert.sh "${CHAN}"
        fi
fi

exit 0

Mein Umleitungsscript ist nicht gerade schön, aber es funktioniert...

#!/bin/bash

LOCK="/tmp/gsmdivert.lck"
EXITTEXT="Diversions cleared"
EXITSTATUS=0

C=0
while [ -e "$LOCK" -a $C -lt 20 ] ; do
        sleep 1
        C=$((C+1))
done

if [ $C -lt 20 ] ; then
        touch "$LOCK"
        if [ -n "$1" ] ; then
                DIVERSION="$1"
                DIVERSION=${DIVERSION/#0/+49}
                EXITTEXT="Diverted to $DIVERSION"
                `/usr/bin/socat SYSTEM:"/usr/sbin/chat -v -T \"$DIVERSION\" \
                  -f /usr/local/etc/gsm_divert.chat || \
                  echo \"Error diverting to $DIVERSION\" > \
                  \"$LOCK\"",pty,raw,echo=0 TCP:MEIN.SER2.NET:23231` || EXITSTATUS=1
        else
                `/usr/bin/socat SYSTEM:"/usr/sbin/chat -v \
                  -f /usr/local/etc/gsm_clear.chat || \ 
                  echo \"Error clearing diversions\"  > \
                  \"$LOCK\"",pty,raw,echo=0 TCP:MEIN.SER2.NET:23231` || EXITSTATUS=1
        fi

        if [ -f "$LOCK" ] ; then
                if [ $EXITSTATUS -ne 0 ] ; then
                        EXITTEXT="Communication error"
                else
                        if [ -n "`cat \"$LOCK\"`" ] ; then
                                EXITTEXT="`cat \"$LOCK\"`"
                                EXITSTATUS=3
                        fi
                fi
                rm -f "$LOCK"
        fi

else
        EXITTEXT="Could not access device"
        EXITSTATUS=2
fi

echo $EXITTEXT
exit $EXITSTATUS

... und die beiden "chat"-Scripts:

#/usr/local/etc/gsm_divert.chat
ABORT ERROR
TIMEOUT 20
'' ATZ OK at+CCFC=0,3,"\T",145 OK


#/usr/local/etc/gsm_clear.chat
ABORT ERROR
TIMEOUT 10
'' ATZ OK at+CCFC=0,4 OK

Für die Freetz-Version auf der Fritz!Box habe ich noch ein paar Änderungen vorgenommen, um das Nokia Homezone-Telefon einzubinden.