[Frage] Auslesen von Daten des aktuellen Telefonats möglich?

Es gibt noch eine weitere Möglichkeit, laufende (externe) Gespräche "von außen" (im LAN) zu erkennen, ohne dafür Telnet zu bemühen ... damit funktioniert diese Methode aber auch auf DOCSIS-Boxen.

Wenn man eine gültige SID hat, kann man unter der URL

http://fritz.box:49000/calllist.lua?sid=<sid>&days=<n>
bzw.
https://fritz.box:49443/calllist.lua?sid=<sid>&days=<n>

eine XML-formatierte Anrufliste abrufen. Ich würde natürlich immer HTTPS empfehlen, aber ich bin ja auch paranoid. Wenn man den "days"-Parameter in der URL wegläßt, erhält man alle gespeicherten Anrufe (max. 400), mit "days" kann man die Liste im Umfang auf die vergangenen 'n' Tage beschränken.

Der eigentliche Witz im Zusammenhang mit diesem Thread ist aber die Tatsache, daß diese Datei (am Ende) auch laufende Gespräche enthält, diese werden durch einen Wert > 8 im Type-Feld gekennzeichnet (11 ist dann z.B. ein aktiver ausgehender Anruf). Unschön ist halt die Notwendigkeit der SID, wenn man eigentlich nur wissen will, ob da gerade telefoniert wird (was ich nicht für eine sensitive Information halten würde ... da aber die Nummern auch angegeben sind, verstehe ich das schon als Notwendigkeit und würde natürlich auch Zeter und Mordio schreien, wenn das ohne Authentifizierung abzurufen wäre).

Da das die externe Anrufliste ist, sieht man interne Gespräche dort natürlich ebenfalls nicht.

EDIT: Wer sich für das Erzeugen dieser Liste interessiert, findet den Lua-Code in der Datei /etc/default.$CONFIG_PRODUKT/$OEM/calllist.lua zur Ansicht.
 
Zuletzt bearbeitet:
Naja, wenn für die SID eine ordentliche Routine eingebaut wird.
Also checken ob schon eine vorhanden, auch ob noch gültig, benutzen.
Wenn nicht, Neue anfordern, cachen, benutzen.
...aber irgendwann kann ich sowas auch noch. ;)
 
@koy:
Für die SID muß man gar keinen großen Aufstand machen. Man merkt sich einfach nur die letzte und kann dann mit login_sid.lua und dieser SID als Parameter ganz einfach testen, ob die vorhandene noch gültig ist. Ist sie es nicht, kriegt man als Antwort eine XML-Datei mit einer SID aus Nullen und muß dann halt durch die Authentifizierung. Das ist also fast "straightforward" mit einem kleinen Abstecher, wenn die SID nicht (mehr) gültig ist. Es ist halt ein zusätzlicher Aufruf von login_sid.lua ... aber einen Tod muß man sterben und die Erkennung einer ungültigen SID beim Aufruf irgendeiner beliebigen Seite ist wesentlich schwerer, weil i.d.R. direkt eine Umleitung auf die Login-Seite erfolgt.

Wenn man dann schon eine SID hat, kann man auch gleich noch auf das Telefonbuch wieder zugreifen. ;)

Das läuft zwar alles über die TR-064-Ports, aber da es keine SOAP-Requests sind, fehlt dafür die Service-Beschreibung, die man sonst für diese Schnittstelle kennt.
 
Zuletzt bearbeitet:
Ja, schon klar, die SID Prüfung ist für mich eh nicht sooo interessant.
Würde aber bei minütlicher Abfrage/n doch irgendwie sauberer aussehen,
als immer gnadenlos eine Neue, weil stures Login wo SID doch reicht.

Und mehrere Skripte mit gemerkter SID? Ohne Prüfung?
Code:
[URL="http://avm.de"]Anmeldung  an der FRITZ!Box Benutzeroberfläche von IP-Adresse  2003:45:XXXXXXXXXXXXXXXXXXXXX gescheitert (ungültige  Sitzungskennung).
Zur Sicherheit werden alle noch gültigen Sitzungen zur  IP-Adresse 2003:45:XXXXXXXXXXXXXXXXXXXX beendet.[/URL]

...im Webinterface log ich mich gerne mal mit "gefälschter" SID aus. :mrgreen:
 
Zuletzt bearbeitet:
Deshalb ja der "Umweg" zur Anmeldung, wenn die SID nicht akzeptiert wird => immer erst mal mit der SID probieren (besser eben an der login_sid.lua als an einer anderen Seite) und das Ergebnis auswerten. Wenn die SID ungültig ist, eine gültige holen und künftig die verwenden. Läuft bei mir in dieser Form in diversen Diensten, da diese ansonsten von einem Box-Neustart o.ä. schon mal erheblich durcheinander gebracht werden können ... und wenn man stur immer die Login-Seite speichert, weil man der festen Überzeugung ist, die vorhandene SID wäre ja okay und das wären schon die richtigen Daten, die da als HTML-Antwort von der Box kommen, dann ist das auch nur sehr selten hilfreich.
 
PHP:
<?php

$fritzbox_Adresse = 'fritz.box';
//$fritzbox_Adresse = '192.168.178.1';
$fritzbox_Username = '';
$fritzbox_Password = '0000';

$client = new SoapClient(
    null,
    array(
        'location'   => 'http://'.$fritzbox_Adresse.':49000/upnp/control/x_contact',
        'uri'        => 'urn:dslforum-org:service:X_AVM-DE_OnTel:1',
    	'noroot'     => True,
        'login'      => $fritzbox_Username,
        'password'   => $fritzbox_Password,
        'trace'      => True,
        'exceptions' => 0
    )
);


$action = 'GetCallList';

$result = $client->{$action}();

if(is_soap_fault($result))
{
 print(" Fehlercode: $result->faultcode | Fehlerstring:
         $result->faultstring");
}
else
{
 print "{$result}\n";
}

var_dump ($result);


$currentUrl = $result.'&max=10&days=0';

$current = file_get_contents($currentUrl);

print_r($current);

?>

Ich weiss nicht ist doch einfach und sid ist schon dabei.


PHP:
<?php

$fritzbox_Adresse = 'fritz.box';
//$fritzbox_Adresse = '192.168.178.1';
$fritzbox_Username = '';
$fritzbox_Password = '0000';

$client = new SoapClient(
    null,
    array(
        'location'   => 'http://'.$fritzbox_Adresse.':49000/upnp/control/deviceconfig',
        'uri'        => 'urn:dslforum-org:service:DeviceConfig:1',
    	'noroot'     => True,
        'login'      => $fritzbox_Username,
        'password'   => $fritzbox_Password,
        'trace'      => True,
        'exceptions' => 0
    )
);

$result = $client->{"X_AVM-DE_CreateUrlSID"}();

print_r("{$result}\n");

/*
sid=28f039ff24e27b15
*/

?>

Nur die sid wenn man eine benötigt.
 
Zuletzt bearbeitet:
Ich weiss nicht ist doch einfach und sid ist schon dabei.
Das kann man so oder so sehen ... wenn Du mit dem vorstehenden PHP-Code 1x pro Minute eine Abfrage der FRITZ!Box machst, was steht denn dann in Deinem Eventlog?

Theroretisch sollte dort pro Aufruf eine "App-Anmeldung" protokolliert werden, wenn AVM da nicht schon wieder etwas geändert hat. Wenn das so sein sollte, müllt Dir diese Vorgehensweise das Eventlog mit unnötigen Einträgen zu und Du kannst Dir die tägliche Push-Mail gleich schenken.

Eigentlich sollte das bei jeder FRITZ!Box mit einer Firmware >= 06.20 protokolliert werden. Wenn das irgendwo nicht so ist, würde ich das gerne mit Angabe des Modells und der Firmware-Version wissen wollen, um es - wenn ich die Technik dazu beschaffen kann - zu überprüfen. Das wäre dann wieder eine Lücke in der neuen Sicherheitsstrategie, wenn da eine TR-064-Anmeldung ohne Protokollierung möglich wäre. Schlimm genug, daß offenbar im Moment die "normale" SID für das GUI und die tr064sid noch austauschbar sind, auch wenn die Box selbst sehr genau darüber Buch führt, auf welchem Weg eine Session initiiert wurde.

PS: PHP ist auch nicht überall verfügbar bzw. erwünscht ... es gibt zwar für viele Hochsprachen eine SOAP-Library, aber mach das mal in der "bash", weil Du nichts anderes zur Verfügung hast. Anstelle von PHP kann man dann genauso gut auf Python oder Perl zurückgreifen, das sind dann alles Schlachtschiffe, die man erst einmal installieren muß und - je nach Umgebung - lieber nicht haben möchte (jedenfalls geht mir das häufig so).
 
Zuletzt bearbeitet:
Vom Stil her ja völlig in Ordnung, aber trotzdem, genau was ich meine,
pro Skript ein Login, um an die SID zu kommen.
...ich denke da an ein Dutzend Skripte die einmal in der Minute Abfragen oder so, machen.
 
Die Scripte könnte man doch dann 'zusammenfassen'.
Also eine SID hohlen, und die dann nacheinander an jedes Script geben.
 
Wenn man eine gültige SID hat, kann man [...] eine XML-formatierte Anrufliste abrufen. [...]
Der eigentliche Witz im Zusammenhang mit diesem Thread ist aber die Tatsache, daß diese Datei (am Ende) auch laufende Gespräche enthält, diese werden durch einen Wert > 8 im Type-Feld gekennzeichnet

Ich hab mal gebastelt und das zurück bekommen:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<!-- days:1 -->
<!-- max:999 -->
<!-- id:nil -->
<!-- timestamp:nil -->
<!-- calls:0 -->
<timestamp>1411912180</timestamp>
<!-- calls:0 -->
</root>

(Stimmt so, aktuell hab ich keine Nummern gespeichert.)
Könnte jemand ein Beispiel posten für ein laufendes Gespräch, aktiv/passiv?
(Würd gern wissen, ob mein SID-Gebastel stimmt.)
 
So scheint's zu funktionieren! Ich hab weiter getestet und unterscheide 2 Type-Werte: 9 (eingehende Anrufe) und 11 (ausgehende Anrufe).
Der wichtige Teil der XML-Datei sieht so aus:
Code:
<!-- calls:17 -->
<Call><Id>695</Id><Type>3</Type><Called>01631737743</Called><Caller>SIP: 98765430</Caller><CallerNumber>98765430</CallerNumber><Name></Name><Numbertype>sip</Numbertype><Device>ISDN Gerät</Device><Port>4</Port><Date>19.02.15 20:07</Date><Duration>0:01</Duration><Count></Count><Path /></Call>
<Call><Id>694</Id><Type>1</Type><Caller>01631737743</Caller><Called>SIP: 98765430</Called><CalledNumber>98765430</CalledNumber><Name></Name><Numbertype>sip</Numbertype><Device>ISDN Gerät</Device><Port>4</Port><Date>18.02.15 19:54</Date><Duration>1:03</Duration><Count></Count><Path /></Call>
<!-- calls:1 -->
<Call><Id>696</Id><Type>9</Type><Caller>0140373839</Caller><Called>SIP: 98765430</Called><CalledNumber>98765430</CalledNumber><Name></Name><Numbertype>sip</Numbertype><Device>ISDN Gerät</Device><Port>4</Port><Date>20.02.15 17:57</Date><Duration>0:01</Duration><Count></Count><Path /></Call>
Prüfen muss man also immer den letzten Eintrag (nach der Zeile <!-- calls:1 -->), sein Type sollte 9 oder 11 sein.
Hat jemand eine Idee ob das in Batch geht? Also zu <!-- calls:1 --> springen und in der drauffolgenden Zeile nachschauen ob der Type-Wert passt?

Danke für eure Tipps!
 
Hat jemand eine Idee ob das in Batch geht?
Was heißt denn "in Batch"?

Mit einem XML-Interpreter (z.B. xmllint) ist es ja kein Problem, die gesamte XML-Datei nach Einträgen mit Type > 8 zu parsen. Oder Du nimmst einen sed und suchst nach "<Type>[9|10|11]</Type>" ... es gibt so viele verschiedene Möglichkeiten.
 
@z23
Hier mal zum testen eine WebIF Version meines Programms CheckTel

Das Programm liest die Übersichtseite der Fritzbox ein und prüft dort ob Gespräche geführt werden.

Getestet auf 7270 V3 OS 5.54
Sollte aber auch auf höheren OS Versionen funktionieren.
Abfrage im Silent Mode wie gehabt.
 

Anhänge

  • chktelw.zip
    8 KB · Aufrufe: 21
Hallo Rynah, hab deine neue Version getestet mit FRITZ!OS 06.23, damit funktioniert sie nicht.

@Peter Pawn
Ich hab momentan dieses Skript in Arbeit:
Code:
@echo off
Setlocal enableDelayedExpansion

Set/a count=0
Set	BHR=192.168.178.1
Set	Pwd=xxxxxxxxxx

For /f "tokens=4,7 delims=<>" %%i In ('curl "http://%BHR%/login_sid.lua"') Do (
	Set/a count=!count!+1
	Set dummy!count!=%%i
	Set/a count=!count!+1
	Set dummy!count!=%%j
)

Set SID=%dummy1%
Set challenge=%dummy2%

Rem Creating string <challenge>-<password>
Set md5=%challenge%-%Pwd%

For /f "tokens=2 delims=<>" %%i In ('md5_challenge.exe %md5%') Do (Set md5=%%i)

Rem Creating <response>
Set response=%challenge%-%md5%

Rem Using curl to request SID
For /f "tokens=4 delims=<>" %%i In ('curl "http://%BHR%/login_sid.lua?sid=0000000000000000&response=%response%"') Do (Set SID=%%i)

REM curl "http://%BHR%:49000/calllist.lua?sid=%SID%&days=1" > .\output.txt
>nul curl "http://%BHR%:49000/calllist.lua?sid=%SID%&days=1" | findstr /r /c:"\<!-- calls:1 --\>"
Echo Ergebnis Errorlevel: %Errorlevel%
Echo (1: Freie Leitung, 0: Aktives Gespraech)
Endlocal

(Es benötigt curl 7.39.0 sowie md5_challenge.exe.)

Was momentan noch fehlt ist die korrekte Auswertung am Ende: Die Unterscheidung zwischen 1
(d.h. <!-- calls:1 --> nicht gefunden) und 0 (somit wird aktuell telefoniert).
Irgendwo ist halt noch ein Denkfehler...

Für mich zählt nicht festzuhalten, ob rein- oder rausgerufen wird, ich will nur wissen: Leitung frei (j/n)?
Am Ende des Skripts soll statt des Echos eine Zeile Exit/b %Errorlevel% stehen, damit ich diese Info
an andere Skripte "vererben" kann.

Vorschläge?
 
Es ist sehr gefährlich, eine Variable mit dem Namen Pwd zu setzen.
Üblicherweise wird die Buchstabenkombination pwd zur Speicherung des aktuellen Pfades verwendet.
Wenn da irgend ein Interpreter deine Zeichenfolge in Kleinbuchstaben umwandelt ist das Chaos vorprogrammiert.

Joe
 
Einverstanden, ändre ich Pwd halt in Passwd ab.
 
Ja, aber ob er dir paßt?

Vergiss einfach "cmd-Batch" und nimm WPS, dann kannst Du Dir auch solche Sachen wie curl und md5_challenge schenken ... das geht dann alles in WPS.

Oder suche mit Deinem "findstr" und regulären Ausdrücken so, wie ich es in #52 vorgeschlagen habe ... was willst Du sonst noch für Vorschläge haben?
 
@Joe_57:
Er benutzt ja der Syntax in seinem Skript nach die cmd.exe von Windows. Da gibt es weder "pwd" noch "passwd", er ist ohnehin (setlocal) in einem eigenen Variablenkontext, das Äquivalent zu "$PWD" heißt "%CD%" und das Schreiben in das Environment des Parent-Prozesses ist auch nicht möglich. Die Gefahr, die von seiner Verwendung von "Pwd" für seine Passwort-Variable ausgeht, sollte also überschaubar (oder quasi nicht existent) sein.
 
@z23:
Ich weiß nicht, ob Du regelmäßig c't liest ... in jedem Falle solltest Du Dir die FRITZ!Box-bezogenen Artikel aus der aktuellen Ausgabe ansehen.

In einem davon geht es genau um den TR-064-Zugriff mit der WPS.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.