[Frage] Aufgegeben: Zugriff auf FRITZ!Box 6360 Cable (kdg) mittels upnp

Snoopy17

Neuer User
Mitglied seit
5 Mrz 2015
Beiträge
4
Punkte für Reaktionen
0
Punkte
1
Eigentlich wollte ich auf die Fritz!Box mittels upnp zugreifen, wie es in einigen Beiträgen in diesem und anderen Foren beschreiben ist. Leider haben aber alle Versuche mit unterschiedlichen Scripts und Parametern keinen Erfolgt gebracht. Es scheint so, als ob die KDG-gebrandtete Box derartige Zugriffe nicht zulässt. Ich glaube, die Parameter
box:settings/upnp/activated: 1
box:settings/upnp/control_activated: 0
sagen alles. Eine Einstellmöglichkeit auf der Web-Oberfläche besteht KDG (jetzt: Vodafone) sei Dank nicht.

Man kann zwar die xml-Dokumente
tr64desc.xml
igdconnSCPD.xml
igddesc.xml
igddslSCPD.xml
igdicfgSCPD.xml
laden, aber mehr geht nicht.

Ich habe daher als "Plan B" den Zugriff über die Web-Oberfläche genutzt.
Fazit: wacklig - aber es geht.

Folgende Python-Skripte funktionieren (zumindest zur Zeit !?):

import sys
import requests
import xml.etree.ElementTree as ET
import json
import hashlib
# ------------------------------------------------------------
def GetSessionID(User, Pass):
"Autorisierung aller weiteren Zugriffe"
SID = ""
URL = "http://fritz.box/login_sid.lua"
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Web-Zugriff mittels requests")
return("")
root = ET.fromstring(r.text)
for x in root:
if x.tag == "SID": SID = x.text
elif x.tag == "Challenge": Challenge = x.text
if SID == "0000000000000000":
URL = "http://fritz.box/login_sid.lua?username="
URL += User + "&response=" + GetResponse(Challenge, Pass)
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Web-Zugriff mittels requests")
return("")
root = ET.fromstring(r.text)
for x in root:
if x.tag == "SID": SID = x.text
return(SID)
# ------------------------------------------------------------
def GetResponse(Challenge, Pass):
"Umrechnung Passwort in Reponse"
return(Challenge + "-" + GetMD5Hash(Challenge + "-" + Pass))
# ------------------------------------------------------------
def GetMD5Hash(Input):
m = hashlib.md5()
m.update(Input.encode('UTF-16LE'))
return(m.hexdigest())
# ------------------------------------------------------------
def KeyInQuotes(Text):
"Ersetzt Integer-Keys durch Strings durch Einfügen von Anführungszeichen"
OUT = ""
T = Text.split("\n")
for z in T:
i1 = z.find("[")
i2 = z.find("]")
if i1 >= 0 and i2 > 0:
Key = z[i1+1:i2]
if not '"' in Key:
OUT += z[0:i1] + '["' + Key + '"]' + z[i2+1:]
else:
OUT += z + "\n"
else:
OUT += z + "\n"
return(OUT)
# ------------------------------------------------------------
def GetTR064xml(File, SID):
"xml Konfigurationsdateien laden"
URL = "http://fritz.box:49000/" + File
URL += "?sid=" + SID
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Web-Zugriff mittels requests")
return("")
return(r.text)
# ------------------------------------------------------------
def FBreconnect(User, Pass):
"Erzeugt eine Neuverbindung der FritzBox"
URL = "http://fritz.box/internet/inetstat_monitor.lua?sid="
URL += GetSessionID(User, Pass)
URL += "&useajax=1&action=disconnect&xhr=1"
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Web-Zugriff mittels requests")
return("")
if r.text == "done:0":
return(0)
else:
return(r.text)
# ------------------------------------------------------------
def FBstatus(User, Pass):
"Bereitstellung der Statusinformation als Dictionary"
URL = "http://fritz.box/internet/inetstat_monitor.lua?sid="
URL += GetSessionID(User, Pass)
r = requests.get(URL)
if r.status_code != 200:
print("+++++ Fehler beim Holen der Statusinformation"))
return("")
Raw = r.text[r.text.find("<pre>")+5:r.text.find("</pre>")].strip()
while Raw.find("\n ") > 0:
Raw = Raw.replace("\n ", "\n")
i1 = Raw.find("\nQUERIES = ")
i2 = Raw.find("\nMQUERIES = ")
i3 = Raw.find("\nCONFIG = ")

Queries = json.loads(Raw[i1+11:i2].replace("] = ", " : ").replace("\n[", "\n"))
MQueries = json.loads(KeyInQuotes(Raw[i2+12:i3]).replace("] = ", " : ").replace("\n[", "\n").replace("{[", "{"))
Config = json.loads(Raw[i3+10:].replace("] = ", " : ").replace("\n[", "\n"))

return({"Queries" : Queries, "MQueries" : MQueries, "Config" : Config})



Falls jemand noch (erfolgreiche) Erfahrungen mit dem upnp-Zugriff auf eine KDG-Fritz!Box hat, würde es mich freuen, davon zu hören.
 
Ich frage noch einmal ganz platt nach ... bei "Heimnetz / Netzwerkeinstellungen / Zugriff für Anwendungen zulassen" kannst Du bei Deiner 6360 (ich habe gerade nur eine 6490 zum Vergleich) nichts ändern oder wird das gar nicht erst angezeigt? Welche Firmware-Version ist das denn?

Die zuständige Datei "network_settings.lua" einer 06.05 (war glaube ich sogar aus einer KDG-Box, sollte also die aktuelle sein, wenn nicht ein 06.06-Security-Fix nachgeschoben wurde) zeigt da eigentlich keine so fürchterlichen Besonderheiten ... diese Checkbox für TR-064 ist halt nur in der "erweiterten Ansicht" zu sehen:
Code:
<div id="uiExpertFeatures" <?lua [COLOR="#FF0000"]if (not general.is_expert()) then box.out([[style="display:none"]]) end[/COLOR] ?>>
<div id="uiHomenetSharing">
<h4>
{?859:570?}
</h4>
<div>
<input type="checkbox" id="uiViewSetTr064" name="set_tr_064" <?lua if g_var.tr064_enabled then box.out('checked') end ?>>
<label for="uiViewSetTr064">{?859:511?}</label>
<p class="form_checkbox_explain">
{?859:2438?}
</p>
<p class="form_checkbox_explain">
{?859:144?}
</p>
</div>
, aber von einer Spezialbehandlung auf der Basis irgendeines Brandings sehe ich da nichts - zumindest nicht in dieser Version. Nach dem Einschalten der erweiterten Ansicht sollte sich da auch TR-064 aktivieren lassen, ansonsten wäre ein Screenshot oder auch HTML-Quelltext der betreffenden Seite, denn das "div"-Element wird ja ausgegeben und nur nicht angezeigt, nett und sicherlich hilfreich beim Eingrenzen der Ursache.

Die wenigen SCPD-Files, die Du da bei Dir im Moment abrufen kannst, gehören auch zum IGD-Interface und das nutzt zwar denselben Mechanismus wie TR-064, ist aber in der Regel gesondert und sogar ohne Authentifizierung zugänglich, die Spezifikation für TR-064 widmet der Koexistenz der beiden Interfaces einen gesonderten Punkt.
 
Hallo PeterPawn,
danke für die schnelle Antwort auf meinen Post

Firmware ist FRITZ!OS 06.06

Auf der Seite /net/network_settings.lua ist das Häkchen bei "Statusinformationen über UPnP übertragen" gesetzt. Ich vermute, dies bringt den Parameter "box:settings/upnp/activated: 1" in meiner Status-Liste. Auch das Häkchen bei "Zugriff für Anwendungen zulassen" ist gesetzt.

Mich hat der Parameter "box:settings/upnp/control_activated: 0" verwundert, da ich nirgendwo auf der Web-Oberfläche eine weitere Einstellmöglichkeit upnp betreffend finden kann.

Interessanterweise geben die Seiten /net/network_settings.lua und internet/inetstat_monitor.lua unterschiedliche Sätze von Parametern zurück:

z.B. für den Block "box":
/net/network_settings.lua
["box:settings/ata_mode"] = "0",
["box:settings/ethernet_guest_enabled"] = "0",
["box:settings/expertmode/activated"] = "1",
["box:settings/guest_wlan_lan_separated"] = "0",
["box:settings/hostname"] = "~~~",
["box:settings/lan_guest_possible"] = "1",
["box:settings/opmode"] = "opmode_standard",
["box:settings/upnp/activated"] = "1",
["box:status/localtime"] = "11:18:39 25.10.2015",


internet/inetstat_monitor.lua
["box:settings/ata_mode"] = "0",
["box:settings/expertmode/activated"] = "1",
["box:settings/hostname"] = "~~~",
["box:settings/opmode"] = "opmode_standard",
["box:settings/upnp/activated"] = "1",
["box:settings/upnp/control_activated"] = "0",
["box:settings/usbtethering_mode"] = "0",
["box:status/hint_dsl_no_cable"] = "0",
["box:status/localtime"] = "11:30:54 25.10.2015",


Somit richtet sich mein Verdacht weiterhin auf den Parameter "box:settings/upnp/control_activated", für den ich bislang keinen Weg sehe, diesen zu ändern, und daher vermute, dass das kdg-Branding dafür verantwortlich ist.

Es würde mich schon sehr interessieren, ob jemand mit einer FRITZ!Box 6360 Cable (kdg) diese mittels upnp abfragen und steuern kann.
 
Mit dem Branding hat das trotzdem m.E. weniger bis nichts zu tun, der Unterschied in der 06.05 (die 06.06 habe ich leider nicht selbst, also müßtest Du die alleine auslesen aus der Box und den Inhalt vergleichen) zwischen den Brandings im Web-Interface besteht nur darin, daß es die "ipv6.lua" im kdg-Branding nicht gibt.

Hingegen gibt es in der erwähnten "network_settings.lua" eine Stelle, wo die von Dir ja auch verdächtigte Einstellung "upnp/control_activated" gesetzt wird, aber - egal was im HTML-Formular übermittelt wird - immer fix auf "0". In Lua sieht das dann so aus:
Code:
if (box.post.upnp_activ == nil and g_var.upnp_activ) or (box.post.upnp_activ and not(g_var.upnp_activ)) then
cmtable.save_checkbox(ctlmgr_save, "box:settings/upnp/activated" , "upnp_activ")
cmtable.add_var(ctlmgr_save, "box:settings/upnp/control_activated" , "0")
end
Das ist in allen Brandings (unity, kabelbw, kdg, avm) identisch ... ich würde auch nicht denken, daß es sich zur 06.06 hin geändert hat, aber das Nachsehen in der Firmware kann Dir niemand abnehmen, das mußt Du alleine machen - "ich habe gar keine 6360 (mehr), Senorita", um mal eine ältere "stehende Redewendung" aus der Werbung abzuwandeln und daher kann ich auch nicht mit aktuellen praktischen Erfahrungen dienen, schon gar nicht bei der 06.06, nur mit einer Analyse der mir vorliegenden Firmware 06.05.

Die Bedeutung der Variablen "upnp/control_activated" würde ich eher in der Richtung sehen, daß damit angezeigt wird, ob die Steuerung von Portfreigaben über UPnP (ist m.E. auch wieder die IGD-Schnittstelle und nicht mal unbedingt TR-064, wobei das nicht so einfach zu trennen ist) erlaubt ist oder nicht.

Das wäre dann die Seite internet/port_fw.lua, wo dann die dort enthaltene Checkbox den Namen "box_upnp_control_activated" trägt und der dort gesetzte Wert sollte auch bei KDG-Branding dann mit dem Inhalt von upnp/control_activated korrespondieren.

Meine Interpretation der o.a. Lua-Stelle wäre es, daß beim Einschalten Ändern von TR-064 (das ist "Zugriff für Anwendungen") implizit immer das IGD-Interface für Portweiterleitungen automatisch deaktiviert wird (über die möglichen Interferenzen habe ich ja schon geschrieben und auch auf die Spezifikation verwiesen).

Wenn Du also diese Variable mit dem Wert "1" sehen willst, müßtest Du nach meiner Interpretation "Zugriff für Anwendungen" deaktivieren und gleichzeitig (eher anschließend, weil die Reihenfolge entscheidend sein könnte) bei den Portfreigaben die "Änderung der Sicherheitseinstellungen" zulassen.

Das sagt allerdings immer noch nichts darüber, ob dann TR-064 ordentlich arbeitet, aber das kann ich ohne passende Box und identische Firmware eben nicht sagen. Ich will nur Deine Vermutungen in Bezug auf diese Variable - ja, was eigentlich, entkräften? - und gleichzeitig deutlich machen, daß ich (immer im Hinterkopf, daß ich über eine ältere Version der Firmware rede) keinen Unterschied zwischen den Brandings an dieser Stelle sehe. Das ist der falsche Baum zum Verbellen - allerdings nur nach meiner Ansicht, die ich versuche im "Trockentest" zu untermauern.

Was passiert denn genau, wenn Du auf eine TR-064-Schnittstellenfunktion versuchst zuzugreifen? Natürlich immer unter der Annahme, daß "upnp/activated" gesetzt ist ...

Wie genau versuchst Du dort zuzugreifen? (Code-Auszug oder "wget/curl/was auch immer"-Kommando hätte ich da gerne, keine verbale Beschreibung oder wenn eine solche, dann wirklich ausführlich - auch ob Linux oder Windows (PowerShell) nicht vergessen zu erwähnen, wenn es nicht aus anderen Stellen ersichtlich ist)

Die "GetSecurityPort"-Methode von "DeviceInfo" läßt sich (wenn ich mich recht erinnere) auch ohne Authentifizierung abrufen, es geht ja nur darum herauszufinden, welcher Port für TLS-gesichertes TR-064 zu verwenden ist.

EDIT: Beim Nachdenken dann noch festgestellt, daß es vermutlich gar nicht notwendig ist, TR-064 tatsächlich zu deaktivieren, um "control_activated" auf "1" zu bringen, aber die "Änderung von Sicherheitseinstellungen" (bei den Portfreigaben) nach jedem "Übernehmen" in der Seite "Netzwerkeinstellungen" auf's Neue gesetzt werden müßte ... aber immer noch "zu faul", das jetzt an einer anderen Box auszutesten - obwohl der Mechanismus wohl eher nicht spezifisch ist für eine 6360.
 
Zuletzt bearbeitet:

Hallo Snoppy und andere "LUA-Sachkundige",
Frage: wie kann ich so einen Block aus dem Browseroutput generieren ?

Code:
[COLOR=#000000]z.B. für den Block "box":
/net/network_settings.lua
  ["box:settings/ata_mode"] = "0", 
  ["box:settings/ethernet_guest_enabled"] = "0", 
  ["box:settings/expertmode/activated"] = "1", 
  ["box:settings/guest_wlan_lan_separated"] = "0", 
  ["box:settings/hostname"] = "~~~", 
  ["box:settings/lan_guest_possible"] = "1", 
  ["box:settings/opmode"] = "opmode_standard", 
  ["box:settings/upnp/activated"] = "1", 
  ["box:status/localtime"] = "11:18:39 25.10.2015", 
[/COLOR]

könnte mir jemand hier helfen ?

LG Riverhopper
 
Steht in jeder HTML-Seite des AVM-GUI am Ende als JSON-Array.

Läßt sich auch gezielt über einen Aufruf der query.lua mit passenden Parametern für einzelne interessierende Parameter abfragen, aber seit der Abschaffung von "webcm" nicht mehr über einen entsprechenden Aufruf von außen setzen.

EDIT:
Hier mal der "Kopf" der query.lua von AVM, in dem die Benutzung erläutert wird:
Code:
--
-- query.lua
--
-- Liest Werte von Control-Manager Variablen aus und gibt diese in einer JSON Struktur zurück.
--
-- Jeder GET Parameter wird als <name>=<query> gedeutet. <name> kann dabei relativ frei gewählt werden. <query>
-- ist der Querystring für eine Control-Manager Variable.
--
-- Beispiel: http://fritz.box/query.lua?fw=logic:status/nspver&ld=landevice:settings/landevice/list(name,ip,mac)
--
-- Ja, normale Queries können mit Multiqueries gemischt werden.
--
-- Multiqueries werden am Vorhandensein von "list(...)" in der Query erkannt. Da alte emu-Module dieses Kommando
-- nicht kennen, kann alternativ der Präfix "mq_" vor den Namen der Query gesetzt werden. Beispiel:
-- http://fritz.box/query.lua?mq_log=logger:status/log
-- Nur bei einer "mq_" Liste wird der Knotennamen ("landevice0") mit ausgegeben.
--
-- Und nicht die Session-ID vergessen! Wenn die Box mit einem Passwort gesichert ist, sieht ein Request in
-- Wahrheit so aus:
-- http://fritz.box/query.lua?sid=bc0c3998a520f93c&fw=logic:status/nspver
--
-- Wenn auf der Box kein Passwort gesetzt ist, kann die Session-ID entfallen. Das Skript sorgt dann selbst für
-- eine gültige Session-ID.
--
 
Zuletzt bearbeitet:
hallo PeterPawn,
Danke für Feedback!

ich habe JSON-Array in Frame-Quelltext bei alter Fritzbox mit FW 06.05 gefunden;

Code:
script = /net/network_settings.lua
GET = {
}
POST = {
}
QUERIES = {
  ["box:settings/ata_mode"] = "0", 
  ["box:settings/hostname"] = "xxxx", 
  ["box:settings/upnp/activated"] = "1", 
SNIP

nun wollte ich bei FB7490 06.36-31656 auch die LUA-Queries anschauen;
leider konnte ich das JSON-Array mit den LUA-Queries nicht finden.
Frage: Gibt es bei FW 6.36 eine Möglichkeit die LUA-Queries analog zu FW 06.05 ebenfalls aus HTML-Code zu extrahieren ?

LG Riverhopper
 
Zuletzt bearbeitet:
Frage: Gibt es bei FW 6.36 eine Möglichkeit die LUA-Queries analog zu FW 06.05 ebenfalls aus HTML-Code zu extrahieren ?
Ist in der Form nicht mehr drin ... macht ja auch nur bedingt Sinn, so etwas noch in jeder asynchronen Antwort zu senden.

Wenn Du einen bestimmten Wert wissen willst, mußt Du eben die query.lua nehmen ... welchen "Mehrwert" versprichst Du Dir von einer "vorbereiteten" Liste an NVPs, wenn Du stattdessen eine eigene verwenden könntest? Willst Du den Wert einer Einstellung wissen, kannst Du sie abfragen ... ob durch einen eigenen Request oder durch das Parsen einer anderen Antwort macht doch keinen Unterschied. Eher ist das Parsen der Ausgabe der query.lua noch leichter, weil es eben nur ein JSON-Array ist. In einer HTML-Seite ist das Lokalisieren des richtigen Contents (auch wenn man die DIV als Anker heranziehen kann) ja etwas aufwändiger.

Wenn Du den Namen einer unbekannten Einstellung suchst, bist Du ab 06.35 nicht mehr dabei ... aber das ist ja ein einmaliger (manuell auszuführender) Vorgang, den man bei einer älteren Version ebenso durchführen kann (die Änderungen sind nicht so umfangreich zwischen 06.30 und 06.35).
 
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.