COMpact 3000: Gesprächsdatenliste automatisch runterladen

In unserem Haus benutzen wir eine Auerswald COMpact 3000 ISDN als Telefonanlage. Sie hat unter anderem einen Netzwerkanschluss und ist VOIP-fähig, wenn man 40€ hinlegt und einen Freischaltcode kauft. (Defective by design?)

Die Anlage hat ein Webinterface, mit dem man alle Einstellungen machen kann, und welches mit dem Opera partiell nicht bedienbar ist - Rotz also. Alles läuft per Javascript; auch die Authentifizierung.

Heute suchte ich nach einem Weg, die Gesprächsdatenliste scriptgesteuert runterzuladen. Aufgrund der speziellen Authentifizierung sind schon andere daran gescheitert.

Was blieb mir also anderes übrig als Firebug anzuwerfen und mitzuloggen, was da alles an Daten ausgetauscht wird. Heraus kam, daß beim Einloggen im Hintergrund per XMLHTTPRequest eine URL per POST mit ein paar Parametern aufgerufen wird. Diese setzt in der Antwort zwei Cookies, die man bei weiteren Anfragen mitgeben muss. Was auch wichtig ist: Die Anlage trackt mit, wer eingeloggt ist und verweigert das Anmelden mit demselben Nutzernamen, bis der andere ausgeloggt ist - oder man die andere Session selbst beendet.

Technische Details

Die hier benutzten Befehle funktionieren mit der Firmwareversion 4.0G. Die 3er-Firmware hatte leicht andere URLs.

Der Einfachheit halber nehme ich curl, weil ich damit auskenne. wget geht bestimmt auch irgendwie. Weiter ist "telo" der DNS-Name der Anlage, Benutzername und Passwort sind die standardmäßig bei Auslieferung der Anlage eingestellten.

Zusammenfassung

Wer den Text unten nicht lesen möchte:

$ curl --cookie-jar cookie.txt -d "LOGIN_NAME=admin" -d "LOGIN_NOW=" -d "LOGIN_PASS=111111" http://telo/login_json
$ curl --cookie cookie.txt --location -o csv.gz http://telo/page_listgespr_export
$ curl --cookie cookie.txt 'http://telo/unlogAdmin?loginRechte=3&loginName=admin&tnId=0'

Anmelden

Der Browser ruft zum Login die URL http://telo/login_json per POST mit folgenden Daten auf, Typ application/x-www-form-urlencoded:

LOGIN_NAME=admin
LOGIN_NOW=
LOGIN_PASS=111111
eksname=
eksservernumber=

Die eks*-Parameter kann man irgnorieren, allerdings möchte die Anlage den leeren LOGIN_NOW-Parameter haben.

Zurück kommt bei Erfolg eine 1 und zwei Cookies: AUERSessionID und AUERWEB_COOKIE (Benutzername).

Besonders perfide: Im Fehlerfall kommt, wenn man z.B. das LOGIN_NOW vergisst, einfach ein

[{"finished":"true"}]

zurück. Das weist aber auf einen Fehler hin, trotz 200er Statuscode. Liebe Auerswaldprogrammierer: Das geht sauberer.

Möchte man das jetzt mit curl scripten, sollte man sich die Cookies merken:

$ curl --cookie-jar cookie.txt -d "LOGIN_NAME=admin" -d "LOGIN_NOW=" -d "LOGIN_PASS=111111" http://telo/login_json

Hier werden die Cookies zur weiteren Verwendung in der Datei cookie.txt gespeichert. Die Ausgabe sollte eine einfache "1" sein.

Liste herunterladen

Die Gesprächsdatenliste lässt sich im json-Format von http://telo/page_listgespr_state herunterladen. Da wir die Cookies bereits haben, ist das trivial:

$ curl --cookie cookie.txt -o gesprächsdatenliste.json http://telo/page_listgespr_state

Jetzt ist die komplette Liste in der Datei gesprächsdatenliste.json gespeichert.

CSV-Export

Da nicht jeder mit JSON arbeiten möchte, gibt es auch noch einen CSV-Export. Die Datei muss vor dem runterladen erstmal generiert werden, indem http://telo/page_listgespr_export aufgerufen wird. Dort wird eine temporäre Datei generiert und im tmp-Ordner des Webservers als http://telo/data_tmp/gespr_dat.csv.gz abgelegt. Dann kann man sich die ziehen - bzw. wird direkt per 302 weitergeleitet:

$ curl --cookie cookie.txt --location -o csv.gz http://telo/page_listgespr_export

Hier musste ich das --location benutzen, damit curl dem Location-Redirect folgt. Heraus kommt die Datei csv.gz, die jetzt ausgepackt und weiterverarbeitet werden kann.

Abmelden

Da sich die Anlage so zickig hat, wenn man sich nicht ausloggt, sollten wir das hier noch tun - zumindest, um beim nächsten Scriptaufruf keine Problem zu bekommen:

$ curl --cookie cookie.txt 'http://telo/unlogAdmin?loginRechte=3&loginName=admin&tnId=0'

Es wird lediglich mit [] geantwortet.

Sicherheitslücke: Benutzer abmelden

Die Anlage lässt es ja nicht zu, daß sich derselbe Benutzer gleichzeitig an unterschiedlichen Clients anmeldet. Passiert dies, so bekommt man eine Fehlermeldung inklusive der Möglichkeit, den anderen Benutzer abzumelden - so daß man sich selbst anmelden kann:

[
 {
  "type":"error",
  "text":"Fehler: Die von Ihnen angegebene PIN wird zur Zeit in der
          Tk-Anlage verwendet. Eine weitere zeitgleiche Anmeldung mit
          dieser PIN ist nicht möglich!",
  "showLogout":"unlogAdmin?loginRechte=3&loginName=admin&tnId=0"
 },
 {"finished":"true"}
]

Möchte man den Telefonanlagenadministrator jetzt nerven, braucht man diese URL einfach jede Sekunde aufzurufen. Macht man das alle 30-60 Sekunden, ist es noch nerviger :)

$ curl 'http://telo/unlogAdmin?loginRechte=3&loginName=admin&tnId=0'

Sicherheitsmäßig relevant ist hier, daß man keinen Sessioncookie braucht.

Andere Telefonanlagen

Im Forum wurde jetzt auch rausgefunden, wie man die Liste bei der COMmander Basic.2 und der COMpact 5010 runterladen kann - es sind genau die gleichen Befehle wie bei meiner 3000 :)

Written by Christian Weiske.

Comments? Please send an e-mail.