Sooo ... am 05.12.2017 hatte ich den Plan einer neuen Version angekündigt, dann kam (außer einem neuen Branch im Repository, wo der damalige Stand mit ersten Änderungen zu sehen war) erst mal eine Weile nichts.
Um das nun aber nicht auch noch als "guten Vorsatz" mit ins neue Jahr zu nehmen, habe ich den - für mich in dieser Runde auch finalen - Stand noch im vergangenen Jahr eingecheckt (die Korrekturen in diesem Jahr waren nur minimal) und am Ende auch das bisherige "tools/juis_check" durch einen Symlink auf das neue Verzeichnis "juis" und die dort dann enthaltene neue Version von "juis_check" ersetzt.
Aus knapp 400 Zeilen und ~ 25 KByte wurden jetzt mehr als 1350 Zeilen und mehr als 70 KByte - darunter hat sicherlich die Lesbarkeit gelitten, dafür ist am Ende der "Bedienkomfort" (hoffentlich jedenfalls) höher bzw. es gibt ein paar mehr Möglichkeiten, das Skript ohne weitere Änderungen für eigene Projekte zu nutzen.
---------------------------------------------------------------------------------------------------------------------
Wer die alte Version will, muß halt einen alten Stand auschecken, ansonsten wären die URLs für die aktuelle Version ab sofort die folgenden:
- das gesamte GitHub-Repository (z.B. für das Klonen, falls jemand mit "git" arbeiten möchte):
https://github.com/PeterPawn/YourFritz
- "juis_check" im GitHub-Repository, zur "Ansicht":
https://github.com/PeterPawn/YourFritz/blob/master/juis/juis_check
- direkter Download, diese Datei muß dann nur noch irgendwo gespeichert und ausführbar gemacht werden:
https://raw.githubusercontent.com/PeterPawn/YourFritz/master/juis/juis_check
---------------------------------------------------------------------------------------------------------------------
Was hat sich denn jetzt geändert und warum?
Gegenüber dem Vorgänger hat die neue Version folgende Vorteile (in meinen Augen zumindest):
- Sie ist sowohl mit der "dash" (oder irgendeiner anderen POSIX-kompatiblen Shell) als auch mit der "bash" (der wohl bekanntesten Shell unter Linux und BSD-Systemen) verwendbar und das Skript läuft auf fast jedem System, selbst in der "bash" unter Windows 10. Allerdings immer unter der Voraussetzung, daß ein paar Basiskommandos vorhanden sind, von denen "realpath" schon das exotischste wäre, wenn man mal "netcat" (bzw. "nc") nicht mitzählt, welches bei anderen Shells als der "bash" halt für die Netzwerkzugriffe benötigt würde. Es werden keine weiteren Dateien (z.B. aus meiner Skript-Bibliothek) benötigt, der komplette Shell-Code ist in der einzelnen Datei "juis_check" enthalten und an externen Kommandos und "Referenzen" werden nur die folgenden benötitigt:
Code:
cat
cmp
date
mkdir
mkfifo oder mknod
mktemp (das wird emuliert, wenn es nicht vorhanden sein sollte)
nc (also "netcat", was nur dann benötigt wird, wenn die Shell keine "bash" (mit Netzwerk-Support) ist - es sollten praktisch alle "netcat-Dialekte" funktionieren, da gar keine Optionen beim Aufruf verwendet werden)
realpath (wenn vorhanden, ansonsten bleiben Dateinamen halt ungekürzt und relativ)
rm
sed
touch
wc
/tmp (hier muß ein beschreibbares Dateisystem vorhanden sein, wenn nicht mit der Variablen "TMPDIR" ein anderer Pfad dafür festgelegt wurde)
Das Skript testet auch bereits am Beginn selbst, ob alle notwendigen Voraussetzungen vorhanden sind ... ist das nicht der Fall, sollte eine passende Fehlernachricht auf diesen Umstand aufmerksam machen und nicht erst der Fehler, der sich aus dem Fehlen irgendeiner Voraussetzung am Ende ergibt.
Läuft das Skript wegen des SheBang "/bin/sh" beim Aufruf nicht in einer "bash"-Instanz (das wird anhand von "$BASH_VERSION" entschieden), startet es sich selbst noch einmal neu unter einer solchen "bash", wenn diese dann gefunden wird. Will man das verhindern, kann man eine entsprechende Option angeben, welche das Skript auch selbst beim zweiten Aufruf verwendet, um sich nicht in eine Endlos-Schleife beim "respawning" zu stürzen, falls die vermeintliche "bash" auch keine "BASH_VERSION"-Variable bereitstellt.
- Das neue Skript ist wesentlich "geschwätziger", wenn man es mit der "debug"-Option aufruft. Die Protokollierung wurde massiv ausgebaut und sollte damit jedem Einzelnen die selbständige Fehlersuche deutlich einfacher machen und auch bei Fragen hier im Board sollte es selbstverständlich sein, daß man diese Debug-Ausgabe der eigenen Frage (möglichst unaufgefordert) hinzufügt (wenigstens künftig).
- Die neue Version ist mit englischen und deutschen Hilfetexten und Nachrichten ausgestattet. Die Auswahl erfolgt ausschließlich anhand der Variablen "LC_ALL" bzw. "LANG" (in dieser Reihenfolge) und der erste gesetzte Wert entscheidet. Ist dort kein "de" vorhanden im Wert, bleibt es bei der Standardeinstellung "en" und die Ausgaben erfolgen in Englisch. Andere Sprachen sind nicht implementiert. Wenn sich jemand betätigen will ... die Nachrichten sind alle an einer Stelle in der Datei versammelt und das Ergänzen weiterer Sprachen sollte mit wenig Zusatzaufwand (im Code) möglich sein.
- Die neue Version versucht zuerst, die notwendigen Daten aus der "juis_boxinfo.xml" zu lesen, diese Datei ist erst in neueren Firmware-Versionen verfügbar, enthält aber "passendere" Parameter für die Abfragen bei AVM. Wird diese Datei in älterer Firmware nicht gefunden, wird weiterhin die "jason_boxinfo.xml" verwendet.
- Beim Handling der Konfigurationsdatei geht die neue Version flexibler vor ... sie braucht nicht mehr unbedingt eine solche Datei (dann kommen "Standardkommandos" zum Einsatz, die der bisher bereitgestellten Konfigurationsdatei entsprechen), der Name der Konfigurationsdatei kann jetzt optional frei gewählt werden (über eine Environment-Variable - das "erspart" ggf. das Vorhalten mehrerer Symlinks für unterschiedliche Konfigurationen) und wenn man die notwendigen Parameter auf anderen Wegen zur Verfügung stellen will (z.B. vorneweg über das Environment), kann man mit einer Option auch komplett auf die Konfigurationsdatei verzichten.
- Die SOAP-Antwort von AVM (die letzte Zeile daraus, denn bisher steht das bei AVM alles in einer Zeile und wenn sich das ändern sollte, muß man auch im Skript noch einmal korrigieren) kann man sich jetzt abspeichern lassen und dann selbst irgendwie weiterverarbeiten (z.B. mit "xmllint", das damit aber eben keine Voraussetzung für dieses Skript sein muß).
Wie installiere ich das jetzt bei mir?
So etwas ist pauschal ja schlecht zu beantworten, aber zwei mögliche Wege greife ich mal heraus.
Das wäre als erstes der Download der Skript-Datei als "raw file" von GitHub - das ist dann eben der "Text" aus der Skript-Datei und da das Ganze ja nur aus dieser einen Text-Datei besteht, braucht es keine Kommandos zum Entpacken oder ähnlichem. Es reicht vollkommen, die gespeicherte Datei noch als "ausführbar" zu markieren und schon kann man sie aufrufen:
Code:
peh@Bragi:~$ wget https://raw.githubusercontent.com/PeterPawn/YourFritz/master/juis/juis_check
--2018-01-01 22:44:37-- https://raw.githubusercontent.com/PeterPawn/YourFritz/master/juis/juis_check
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.112.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.112.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 71298 (70K) [text/plain]
Saving to: ‘juis_check’
100%[===============================================================>] 71,298 --.-K/s in 0.05s
2018-01-01 22:44:37 (1.36 MB/s) - ‘juis_check’ saved [71298/71298]
peh@Bragi:~$ chmod u+x juis_check
peh@Bragi:~$ ./juis_check 192.168.178.1
juis_check: No newer version found, check was made with source version '153.06.92-47571'.
peh@Bragi:~$
- sollte sich das Verzeichnis, in dem man die Datei gespeichert hat, in der PATH-Variablen befinden, kann man das "./" vor dem Namen halt auslassen.
Die zweite Möglichkeit wäre das Klonen des kompletten Repos von GitHub, natürlich am besten in ein Dateisystem, welches native Linux-Zugriffsrechte unterstützt:
Code:
vidar:~ # cd /tmp
vidar:/tmp # git clone https://github.com/PeterPawn/YourFritz
Cloning into 'YourFritz'...
remote: Counting objects: 2240, done.
remote: Compressing objects: 100% (57/57), done.
remote: Total 2240 (delta 52), reused 102 (delta 47), pack-reused 2129
Receiving objects: 100% (2240/2240), 11.87 MiB | 6.10 MiB/s, done.
Resolving deltas: 100% (1389/1389), done.
vidar:/tmp # cd YourFritz/juis/
vidar:/tmp/YourFritz/juis # ./juis_check 192.168.178.1
juis_check: No newer version found, check was made with source version '153.06.92-47571'.
vidar:/tmp #
Da beim Klonen auch die Zugriffsrechte korrekt gesetzt werden, braucht es hier kein "chmod", nur den Wechsel in das richtige Unterverzeichnis, bevor man das Skript dann aufrufen kann.
Wer das auf anderen Wegen "installieren" will (das ist ja ohnehin viel zu hochtrabend für das Speichern einer Text-Datei und das Setzen von Zugriffsrechten), der wird sicherlich auch die notwendigen Schritte und Kommandos auf seinen eigenen System kennen, die er dafür braucht.
Wo kann ich das Skript überall benutzen?
Kurz gesagt ... das Skript sollte fast überall zum Laufen zu bewegen sein - manchmal muß man sich vielleicht erst noch eine passende(!) BusyBox mit allen benötigten Applets besorgen, wenn man ein sehr exotisches (und von sich aus sehr beschränktes) System verwenden möchte.
Wie verwende ich das Skript bei meiner eigenen Box?
Das Skript kann problemlos mit der Option "--help" (oder kurz auch "-h") aufgerufen werden, dann zeigt es einen (eher längeren) Text an, wie man es aufrufen kann und welche Angaben es versteht. Diese Hilfe-Seite(n) werden - wenn das Ausgabegerät ein Terminal ist und das Programm "less" (das ist ein "terminal pager", also ein Programm zur seitenweisen Anzeige einer Datei) vorhanden ist - auf dem Terminal mit genau diesem "less" angezeigt, ansonsten ohne "less". (Wer sich mit "less" nicht auskennt: Mit einem einfachen "q" kann man das Programm wieder verlassen.)
Dieselbe Information (nur etwas anders formatiert) findet man auch im Repository und zwar sowohl in Deutsch als auch in Englisch. Es wäre nett, wenn man sich einfach dort (GitHub oder Hilfetext) erst einmal informiert und dann - wenn man wirklich etwas nicht verstanden hat und auch mit (mehr oder weniger mutigem) Probieren nicht mehr weiterkommt (es kann ja absolut nichts passieren, hier wird nicht ein Bit an der Box wirklich geändert und eigene Erfahrungen sind meist durch nichts Gleichwertiges zu ersetzen), aber wirklich erst dann, mit einer eigenen Frage hier aufläuft - wobei man dann idealerweise auch noch ein paar Seiten in diesem Thread rückwärts gelesen hat, damit die eigene Frage nicht einfach auf der vorherigen Seite schon (möglichst noch mehrfach) beantwortet wurde.
Ansonsten reicht es tatsächlich aus, das (korrekt installierte) Skript mit der Angabe des Namens oder der IP-Adresse einer lokal erreichbaren FRITZ!Box aufzurufen:
Code:
vidar:~/GitHub/YourFritz/juis # ./juis_check 192.168.13X.1
juis_check: No newer version found, check was made with source version '113.06.92-47565'.
vidar:~/GitHub/YourFritz/juis # ./juis_check 192.168.13X.1
juis_check: Found newer version: 141.06.87
URL=http://download.avm.de/firmware/(...)/FRITZ.Box_6490_Cable.de-en-es-it-fr-pl.141.06.87.image
DelayDownload=1551
vidar:~/GitHub/YourFritz/juis # ./juis_check 192.168.178.1
juis_check: No newer version found, check was made with source version '153.06.92-47571'.
vidar:~/GitHub/YourFritz/juis #
So sähe das für drei verschiedene Boxen (eine 7490, eine 6490 und eine 7580 - die habe ich gerade herumstehen) aus ... alle spezifischen Angaben für die Abfrage bei AVM werden aus der jeweils angegebenen Box ausgelesen.
Wer das lieber etwas ausführlicher haben möchte, der gibt dann beim Aufruf noch die "debug"-Option mit an, das sieht dann etwa so aus:
Code:
vidar:~/GitHub/YourFritz/juis # ./juis_check -d 192.168.178.1
debug: -------------------------------------------------------
debug: Reading values from '192.168.178.1:80/juis_boxinfo.xml': .
debug: Read response from device:
debug: -------------------------------------------------------
HTTP/1.1 200 OK
Cache-Control: max-age=120
Connection: close
Content-Type: text/xml;charset=utf-8
Date: Mon, 01 Jan 2018 17:23:36 GMT
ETag: "274DB0DAB57462D8F"
Expires: Mon, 01 Jan 2018 17:25:36 GMT
Last-Modified: Thu, 01 Jan 1970 00:00:38 GMT
Mime-Version: 1.0
<e:BoxInfo xmlns:e="http://juis.avm.de/updateinfo" xmlns:q="http://juis.avm.de/request">
<q:Name>FRITZ!Box 7580 (UI)</q:Name>
<q:HW>225</q:HW>
<q:Major>153</q:Major>
<q:Minor>6</q:Minor>
<q:Patch>92</q:Patch>
<q:Buildnumber>47571</q:Buildnumber>
<q:Buildtype>1</q:Buildtype>
<q:Serial>E0286DCAFEDE</q:Serial>
<q:OEM>1und1</q:OEM>
<q:Lang>de</q:Lang>
<q:Country>049</q:Country>
<q:Annex>B</q:Annex>
<q:Flag></q:Flag>
<q:UpdateConfig>2</q:UpdateConfig>
<q:Provider></q:Provider></e:BoxInfo>
debug: Compound version number used for request: '153.06.92-47571'
debug: -------------------------------------------------------
debug: Variables set:
debug: -------------------------------------------------------
debug: Serial="E0286DCAFEDE"
debug: Name="FRITZ!Box 7580 (UI)"
debug: HW="225"
debug: OEM="1und1"
debug: Lang="de"
debug: Annex="B"
debug: Country="049"
debug: Major="153"
debug: Minor="6"
debug: Patch="92"
debug: Buildnumber="47571"
debug: Flag=""
debug: Public="1"
debug: type="1001"
debug: hostname="225.jws.avm.de"
debug: nonce="koZ6WAPqqtPwwvTvnVbrRQ=="
debug: -------------------------------------------------------
debug: Sent request:
debug: -------------------------------------------------------
POST /Jason/UpdateInfoService HTTP/1.1
Host: 225.jws.avm.de:80
Content-Length: 1175
Content-Type: text/xml; charset="utf-8"
Connection: close
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:e="http://juis.avm.de/updateinfo" xmlns:q="http://juis.avm.de/request">
<soap:Header/>
<soap:Body>
<e:BoxFirmwareUpdateCheck>
<e:RequestHeader>
<q:Nonce>koZ6WAPqqtPwwvTvnVbrRQ==</q:Nonce>
<q:UserAgent>Box</q:UserAgent>
<q:ManualRequest>true</q:ManualRequest>
</e:RequestHeader>
<e:BoxInfo>
<q:Name>FRITZ!Box 7580 (UI)</q:Name>
<q:HW>225</q:HW>
<q:Major>153</q:Major>
<q:Minor>6</q:Minor>
<q:Patch>92</q:Patch>
<q:Buildnumber>47571</q:Buildnumber>
<q:Buildtype>1001</q:Buildtype>
<q:Serial>E0286DCAFEDE</q:Serial>
<q:OEM>1und1</q:OEM>
<q:Lang>de</q:Lang>
<q:Country>049</q:Country>
<q:Annex>B</q:Annex>
<q:Flag></q:Flag>
<q:UpdateConfig>1</q:UpdateConfig>
<q:Provider>oma_lan</q:Provider>
</e:BoxInfo>
</e:BoxFirmwareUpdateCheck>
</soap:Body>
</soap:Envelope>
debug: -------------------------------------------------------
debug: Reading response from '225.jws.avm.de:80': .
debug: Received response:
debug: -------------------------------------------------------
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/xml;charset=UTF-8
Content-Length: 1949
Connection: close
Download-Delay: 3346
Date: Mon, 01 Jan 2018 17:23:39 GMT
Access-Control-Allow-Origin: http://scope.avm.de
Access-Control-Allow-Headers: content-type
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"></SOAP-ENV:Header><soap:Body ID="Body"><ns2:BoxFirmwareUpdateCheckResponse xmlns:ns2="http://juis.avm.de/updateinfo" xmlns:ns3="http://juis.avm.de/response" xmlns:ns4="http://juis.avm.de/request"><ns2:ResponseUpdateInfo><ns3:ResponseHeader><ns3:Nonce>koZ6WAPqqtPwwvTvnVbrRQ==</ns3:Nonce></ns3:ResponseHeader><ns3:UpdateInfo><ns3:CheckInterval>24</ns3:CheckInterval><ns3:Found>false</ns3:Found><ns3:Version></ns3:Version><ns3:DownloadURL></ns3:DownloadURL><ns3:InfoURL></ns3:InfoURL><ns3:InfoText></ns3:InfoText><ns3:HintURL></ns3:HintURL><ns3:Priority>1</ns3:Priority><ns3:AutoUpdateStartTime>0</ns3:AutoUpdateStartTime><ns3:AutoUpdateEndTime>0</ns3:AutoUpdateEndTime><ns3:AutoUpdateKeepServices>true</ns3:AutoUpdateKeepServices></ns3:UpdateInfo></ns2:ResponseUpdateInfo></ns2:BoxFirmwareUpdateCheckResponse><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></SignatureMethod><Reference URI="#Body"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod><DigestValue>rzkkfNmDW/9HSPiyMsflZX5QLL2ofhYJFgoiTa/Kwqc=</DigestValue></Reference></SignedInfo><SignatureValue>TsGD1IVmQIKBfEbuHoR+VU5iPR9s/yZJ3VpK4gXcnnuPVCfG4TsUBBCj4pADK7Bh0kvbsQs5P1G9rgkKJPFm8MkqGelNQEfR1XK/EWNwYWDrsIYzf0/d85P+fP1iA7XmVhOzffIvK0igqTWNxpXdeD4FMuKT2sYP1lteLes1hiDFfxrpqKd8d1OJjU/wQtH/FST6P4+LZDEVgq9sT4Upvex3hBodIedUcUYQW8xYjYx3YhjFRv4fhhMuulr3TC88m6e6EiXjUg+SBhy2SYnl0BNi/6ZyHOhFz58hDQMuIvskzcp+tbxq8CykrgLNQMNMokzog1h8/C7QSsONeXvoJQ==</SignatureValue></Signature></soap:Body></soap:Envelope>
debug: -------------------------------------------------------
juis_check: No newer version found, check was made with source version '153.06.92-47571'.
vidar:~/GitHub/YourFritz/juis #
Im einfachsten Fall fragt man aber auch bloß den Exit-Code des Skripts ab, bei "2" gibt es keine neue Firmware und bei "0" kriegt man auf STDOUT die URL geliefert, von der man die neue Firmware laden könnte.
Wie kann ich Firmware für eine andere FRITZ!Box finden, die ich vielleicht nicht einmal selbst besitze?
Was genau AVM jetzt an Parametern für eine Antwort auswertet, variiert (zumindest dem Anschein nach) wohl von Modell zu Modell und hängt u.a. auch davon ab, welche "Geschmacksrichtung" der Firmware man nun eigentlich sucht.
Was offensichtlich auf jeden Fall zum abgefragten Modell passen muß, ist der Wert von "HW", was als "HWRevision" im Gerät hinterlegt ist. Das ist deshalb so offensichtlich, weil der Servername bei AVM, an den man den SOAP-Request senden muß, diese Nummer als ersten Bestandteil enthält, danach folgt dann erst ".jws.avm.de" - für eine 7490 mit "HWRevision 185" ist dann der Servername bei AVM also "185.jws.avm.de".
Alle anderen Parameter werden bei einigen Modellen berücksichtigt und bei anderen wieder nicht ... eine echte Systematik scheint dort nicht zu existieren und wenn man mit nur wenigen passenden Angaben gar keine Antwort (sondern einen Server-Fehler) oder immer wieder eine "falsche Antwort" erhält, muß man eben so lange die Parameter variieren und mit den richtigen Angaben für die gewünschte Box ergänzen, bis die Abfrage dann doch mal klappt. Wer richtig schlau ist, merkt sich diese Parameter-Kombination dann für das nächste Mal ...
Für eine 6590 reicht es z.B. bereits aus, wenn man nur die richtige "HW"-Angabe verwendet und noch ein zusätzliches "Flag", was so auch nur bei den DOCSIS-Modellen existiert und bei der 6490 wieder ignoriert wird (Beispiele im nächsten Abschnitt).
Für eine 7490 wäre z.B. das die minimale Bestückung mit Parametern, bei der ich noch eine sinnvolle Antwort vom AVM-Service erhalten kann:
Code:
vidar:~/GitHub/YourFritz/juis # juis_check -d -i HW=185 Version=000.00.00-00000 Serial=12 Name=7490 OEM=avm Lang=empty Annex=empty Country=empty Flag=empty
debug: Skipping configuration file processing ...
debug: Setting 'HW' to '185' from command line parameter
debug: Setting 'Version' to '000.00.00-00000' from command line parameter
debug: Setting 'Serial' to '12' from command line parameter
debug: Setting 'Name' to '7490' from command line parameter
debug: Setting 'OEM' to 'avm' from command line parameter
debug: Setting 'Lang' to 'empty' from command line parameter
debug: Setting 'Annex' to 'empty' from command line parameter
debug: Setting 'Country' to 'empty' from command line parameter
debug: Setting 'Flag' to 'empty' from command line parameter
debug: Splitting compound version number '000.00.00-00000' to:
debug: Major=000
debug: Minor=00
debug: Patch=00
debug: Buildnumber=00000
debug: Compound version number used for request: '0.00.00-00000'
debug: -------------------------------------------------------
debug: Variables set:
debug: -------------------------------------------------------
debug: Serial="12"
debug: Name="7490"
debug: HW="185"
debug: OEM="avm"
debug: Lang=""
debug: Annex=""
debug: Country=""
debug: Major="000"
debug: Minor="00"
debug: Patch="00"
debug: Buildnumber="00000"
debug: Flag=""
debug: Public="1"
debug: type="1001"
debug: hostname="185.jws.avm.de"
debug: nonce="W4l61AWn8cB5XTlVGX9VtA=="
debug: -------------------------------------------------------
debug: Sent request:
debug: -------------------------------------------------------
POST /Jason/UpdateInfoService HTTP/1.1
Host: 185.jws.avm.de:80
Content-Length: 1143
Content-Type: text/xml; charset="utf-8"
Connection: close
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:e="http://juis.avm.de/updateinfo" xmlns:q="http://juis.avm.de/request">
<soap:Header/>
<soap:Body>
<e:BoxFirmwareUpdateCheck>
<e:RequestHeader>
<q:Nonce>W4l61AWn8cB5XTlVGX9VtA==</q:Nonce>
<q:UserAgent>Box</q:UserAgent>
<q:ManualRequest>true</q:ManualRequest>
</e:RequestHeader>
<e:BoxInfo>
<q:Name>7490</q:Name>
<q:HW>185</q:HW>
<q:Major>000</q:Major>
<q:Minor>00</q:Minor>
<q:Patch>00</q:Patch>
<q:Buildnumber>00000</q:Buildnumber>
<q:Buildtype>1001</q:Buildtype>
<q:Serial>12</q:Serial>
<q:OEM>avm</q:OEM>
<q:Lang></q:Lang>
<q:Country></q:Country>
<q:Annex></q:Annex>
<q:Flag></q:Flag>
<q:UpdateConfig>1</q:UpdateConfig>
<q:Provider>oma_lan</q:Provider>
</e:BoxInfo>
</e:BoxFirmwareUpdateCheck>
</soap:Body>
</soap:Envelope>
debug: -------------------------------------------------------
debug: Reading response from '185.jws.avm.de:80': .
debug: Received response:
debug: -------------------------------------------------------
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/xml;charset=UTF-8
Content-Length: 2251
Connection: close
Download-Delay: 343
Date: Wed, 03 Jan 2018 00:35:09 GMT
Access-Control-Allow-Origin: http://scope.avm.de
Access-Control-Allow-Headers: content-type
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"></SOAP-ENV:Header><soap:Body ID="Body"><ns2:BoxFirmwareUpdateCheckResponse xmlns:ns2="http://juis.avm.de/updateinfo" xmlns:ns3="http://juis.avm.de/response" xmlns:ns4="http://juis.avm.de/request"><ns2:ResponseUpdateInfo><ns3:ResponseHeader><ns3:Nonce>W4l61AWn8cB5XTlVGX9VtA==</ns3:Nonce></ns3:ResponseHeader><ns3:UpdateInfo><ns3:CheckInterval>48</ns3:CheckInterval><ns3:Found>true</ns3:Found><ns3:Name>_EXTERN Release IQ17p1 NL1+Produnktion</ns3:Name><ns3:Version>113.06.93</ns3:Version><ns3:Type>1</ns3:Type><ns3:DownloadURL>http://download.avm.de/fritzbox/fritzbox-7490/deutschland/fritz.os/FRITZ.Box_7490.113.06.93.image</ns3:DownloadURL><ns3:InfoURL>http://download.avm.de/fritzbox/fritzbox-7490/deutschland/fritz.os/info_de.txt</ns3:InfoURL><ns3:InfoText>RELEASE</ns3:InfoText><ns3:HintURL></ns3:HintURL><ns3:IconURL></ns3:IconURL><ns3:Priority>1</ns3:Priority><ns3:AutoUpdateStartTime>0</ns3:AutoUpdateStartTime><ns3:AutoUpdateEndTime>21600</ns3:AutoUpdateEndTime><ns3:AutoUpdateKeepServices>true</ns3:AutoUpdateKeepServices></ns3:UpdateInfo></ns2:ResponseUpdateInfo></ns2:BoxFirmwareUpdateCheckResponse><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></SignatureMethod><Reference URI="#Body"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod><DigestValue>qMEsGZSAdT71mSEaQRIIeSabbN1fWSKm/3T4+N6y1Z4=</DigestValue></Reference></SignedInfo><SignatureValue>n9czc2umgnAtxSiyBxuWM9MKYrTPxivJXtMhNmaJwULqubfWYiKb37BIMB+YvTlQQY0MBBPjI6IuNZ7BC4XcQo3hADPVrwkD/bSiC6hpablDpAtpHAd2KBh+0UOwcngywJtQupFIIrIhH3VyOI5xuO+/EW5Mf+0gOYb/3YCf+CrMPQBgz8ozsfZK0gb6UhqK0BSk0/Mv1IICO3R4mP1Hv6C17BUFuZ3KIEa5WbFOYmpNM0k6GsUq5Y5TeWmPy3Tv/hUwFJdkc3q0ApcrGw8jbF+UIA9hTpjui3B+wChf2ktDSlSLTW0Wr76RSlfAT7FfI4Vmw6PFwn5oM1X3jt7CNQ==</SignatureValue></Signature></soap:Body></soap:Envelope>
debug: -------------------------------------------------------
root/bin/juis_check: Found newer version: 113.06.93
URL=http://download.avm.de/fritzbox/fritzbox-7490/deutschland/fritz.os/FRITZ.Box_7490.113.06.93.image
DelayDownload=343
vidar:~/GitHub/YourFritz/juis #
Anhand der ansonsten in der Antwort sichtbaren Exceptions kann man beim Probieren ableiten, daß der Service dort auf der Angabe von "Name" besteht (dessen Länge muß größer als Null sein) und auch bei "Serial" will er irgendeinen Wert, der auf die Maske aus dieser Gültigkeitsprüfung paßt:
Code:
<faultstring>
cvc-pattern-valid: Value '' is not facet-valid with respect to pattern '[A-Za-z0-9]([A-Za-z0-9 ]*[A-Za-z0-9])?' for type '#AnonType_SerialBoxInfo'.
</faultstring>
was also auch noch nicht unbedingt der Maske nach eine MAC-Adresse sein muß - es reicht bereits, wenn es mind. ein alphanumerisches Zeichen ist ... dazwischen könnten sogar Leerzeichen auftauchen neben den alphanumerischen Zeichen, solange das letzte keines ist. Meine Angabe "12" oben paßt jedenfalls auf diese Maske.
Weiß man also nicht genau, welche Angaben AVM für die eigene Box erwartet und welche davon ggf. auch noch stimmen sollten, selbst wenn man ein Modell abfragen will, auf welches man selbst keinen Zugriff hat und damit auch die richtigen Werte weder von Hand nachschlagen noch von diesem Skript automatisch auslesen lassen kann, dann tastet man sich halt solange mit weiteren Angaben vor, bis einem die Antwort irgendwann mal gefällt.
Dabei darf man auch keine Scheuklappen aufhaben, weil nicht immer ein direkter Zusammenhang zwischen einem Parameter und einer "ablehnenden Antwort" ersichtlich ist ... die oben gezeigte Abfrage für die 7490 liefert z.B. die Information "keine neue Firmware", wenn man den OEM-Wert nicht angibt:
Code:
vidar:~/GitHub/YourFritz/juis # juis_check -i HW=185 Version=000.00.00-00000 Serial=12 Name=7490 OEM=empty Lang=empty Annex=empty Country=empty Flag=empty
root/bin/juis_check: No newer version found, check was made with source version '0.00.00-00000'.
vidar:~/GitHub/YourFritz/juis #
Es gibt also kein echtes "Rezept" dafür, was an Parametern jeweils passend sein muß ... es kann aber auch nichts passieren bei einem eigenen Test. Vielleicht springt AVM etwas im Dreieck, aber so ein öffentlich erreichbarer Service sollte auch gegen echte Angriffe gewappnet sein und da ist das, was wir hier machen, eher Kinderkram. Man darf also auch nicht zu schüchtern sein (die Debug-Ausgabe ist natürlich auch hilfreich, wenn man ein Problem finden will) - notfalls fragt man dann andere hier im IPPF, die so ein Gerät besitzen und die richtigen Werte auslesen lassen können.
Denn natürlich gilt auch hier die Regel, daß es kein Problem darstellt, wenn man einen von AVM nicht wirklich ausgewerteten Parameter trotzdem richtig und vollständig angibt - es gibt keine "Pflicht zur Lücke" und nicht einmal die Angabe der eigenen, korrekten MAC-Adresse der Box sollte ein Problem darstellen ... denn das, was das Skript hier macht, ist keinesfalls illegal oder sonst irgendwie "anrüchig".
Es gibt auf diesem AVM-Service keine weitere Zugangssicherung für eine Abfrage (nicht einmal eine "symbolische", die vermutlich auch nicht als rechtliche Handhabe ausreichen würde) - damit muß da auch nichts überwunden werden und man darf bei so einem Service tatsächlich erwarten, daß er auch gegen Fehl"eingaben" bestens gehärtet ist.
Solange jetzt also nicht Millionen von Abfragen in kurzer Folge stattfinden, die nicht von den FRITZ!Boxen stammen, sollte das bei AVM in den Server-Logs auch kaum auffallen. Ich würde aber auch darum bitten, daß man das Skript mit Sinn und Verstand anwendet ... wer regelmäßig nach neuer Firmware sucht, sollte das selbst in den Zeiten einer Labor-Reihe in einem vernünftigen Intervall machen (mind. 60 Minuten erscheinen mir angemessen). Wer das nur benutzt (und zwar mit sehr kleinen Intervallen), um immer mal wieder "Erster" zu sein beim Finden einer neuen Firmware, konterkariert meine eigenen Intentionen mit diesem Skript auf recht hässliche Weise.
Wie wäre es mal mit ein paar Beispielen?
Ausnahmsweise ... hier z.B. die Abfrage für die 6590, bei der alles auf der Kommandozeile angegeben wird:
Code:
vidar:~/GitHub/YourFritz/juis # juis_check -i HW=220 Version=000.00.00-00000 Serial=12 Name=6590 OEM=avm Lang=empty Annex=empty Country=empty Flag=cable_retail
root/bin/juis_check: Found newer version: 148.06.85
URL=http://download.avm.de/firmware/6590/(...)/FRITZ.Box_6590_Cable.de-en-es-it-fr-pl.148.06.85.image
DelayDownload=1049
vidar:~/GitHub/YourFritz/juis # juis_check -i HW=220 Version=000.00.00-00000 Serial=12 Name=6590 OEM=avm Lang=empty Annex=empty Country=empty Flag=empty
root/bin/juis_check: No newer version found, check was made with source version '0.00.00-00000'.
vidar:~/GitHub/YourFritz/juis #
Die funktioniert (wie schon mal erwähnt) eben ohne das "Flag=cable_retail" nicht, wie man oben sehen kann ... bei der 6490 ist das hingegen nicht erforderlich:
Code:
vidar:~/GitHub/YourFritz/juis # juis_check -i HW=213 Version=000.00.00-00000 Serial=12 Name=6490 OEM=avm Lang=empty Annex=empty Country=empty Flag=empty
root/bin/juis_check: No newer version found, check was made with source version '0.00.00-00000'.
vidar:~/GitHub/YourFritz/juis # juis_check -i HW=213 Version=141.06.00-00000 Serial=12 Name=6490 OEM=avm Lang=empty Annex=empty Country=empty Flag=empty
root/bin/juis_check: No newer version found, check was made with source version '141.06.00-00000'.
vidar:~/GitHub/YourFritz/juis # juis_check -i HW=213 Version=141.06.60-00000 Serial=12 Name=6490 OEM=avm Lang=empty Annex=empty Country=empty Flag=empty
root/bin/juis_check: Found newer version: 141.06.87
URL=http://download.avm.de/firmware/6490/(...)/FRITZ.Box_6490_Cable.de-en-es-it-fr-pl.141.06.87.image
DelayDownload=2459
Dafür muß man hier, wie man oben in den letzten beiden Aufrufen sehen kann, wenigstens die Versionsnummer bis zum Wert von "Patch" angeben, ansonsten ist die Antwort nicht die richtige.
Am bequemsten ist es natürlich, wenn man einfach nur die IP-Adresse der eigenen Box angeben muß - oder auch "fritz.box", wenn man den aktiven Router abfragen will. Der löst i.d.R. "fritz.box" als DNS-Server auf seine eigene Adresse auf. Das ist aber oben bei "eigene Box" ausreichend gezeigt.
Was hat es denn jetzt mit diesen "internen Versionen" auf sich?
Das ist auch schnell erklärt ... offenbar verwenden auch andere "externe Tester" (oder gar die AVM-Mitarbeiter selbst bei sich daheim) FRITZ!Boxen mit einer Firmware, die noch nicht offiziell verfügbar ist, also weder als Release- noch als offizielle Labor- oder Beta-Version. Auch diese muß ja irgendwie mal aktualisiert werden (es macht sicherlich wenig Sinn, wenn die AVM-Mitarbeiter zuhause mit Versionen arbeiten müssen, die gar nicht mehr dem aktuellen Stand entsprechen) und so suchen wohl auch diese Boxen über den AVM-Service nach Updates für ihre Firmware.
Diese ist dann auch gerne mal mit "Zusatzfunktionen" ausgestattet, z.B. mit einer Shell-In-A-Box-Version, die mit dem Box-Zertifikat über eine TLS-Verbindung sogar einen sicheren Shell-Zugang (sogar von der WAN-Seite) bereitstellen kann oder auch mit ein paar zusätzlichen Debug-Skripts und anderen Programmen, die von AVM in den offiziellen Versionen entsorgt wurden, weil sie ein Sicherheitsproblem darstellen.
Unter anderem deshalb sind diese Versionen eigentlich wirklich nichts zum Spielen und wer sie sich nur installiert, weil er es kann, möge sich hinterher weder darüber aufregen, wenn die Box gar nicht mehr geht und er sie irgendwie wieder zum Leben erwecken muß oder wenn durch diese Zusatzprogramme am Ende wieder Lücken gerissen werden, die in offizieller Firmware gar nicht vorhanden sind und er darüber irgendwie angegriffen wurde (für "webcm" braucht man nur eine gültige SID und die dazugehörige IP-Adresse - das geht notfalls auch im Browser über ein Advertising mit passendem JS-Code als Malware).
Wie auch immer ... man kann auch für diese Versionen mit dem Skript eine Abfrage an den AVM-Service richten und wenn AVM das wirklich in ernsthaftem Maße stören sollte, kann man dort ja problemlos den Service weiter abdichten - entweder auf der Serverseite, die nur noch bestimmte Abfragen beantwortet oder auf der Client-Seite, indem man einen anderen Server verwendet (also das "jws.avm.de" durch etwas anderes ersetzt). Insofern habe ich auch hier wenig "Herzdrücken" - wer so etwas nicht mit einer Zugangssicherung versieht, wird sich eher nicht wundern (bzw. darf sich nicht wundern), wenn es von anderen genutzt wird.
Jedenfalls kann man mit der Angabe von "Public=0" beim Aufruf auch versuchen, eine "nicht-öffentliche" Firmware-Version zu ergattern ... dabei werden aber (so zumindest meine bisherigen Ergebnisse) noch ein paar mehr Angaben berücksichtigt, die dann zur angeblichen Box passen müssen. Wer die Box tatsächlich besitzt, sollte aber wenig Probleme haben, von AVM eine sinnvolle Antwort zu erhalten ... aber es gibt diese "inhouse"-Versionen lange nicht für alle Modelle.
Code:
vidar:~/GitHub/YourFritz/juis # juis_check -d 192.168.13X.1 Public=0
debug: Setting 'Public' to '0' from command line parameter
debug: -------------------------------------------------------
debug: Reading values from '192.168.13X.1:80/juis_boxinfo.xml': .
debug: Read response from device:
debug: -------------------------------------------------------
HTTP/1.1 200 OK
Cache-Control: max-age=120
Connection: close
Content-Type: text/xml;charset=utf-8
Date: Wed, 03 Jan 2018 01:27:19 GMT
ETag: "FD5545BAFF7CCA002"
Expires: Wed, 03 Jan 2018 01:29:19 GMT
Last-Modified: Thu, 28 Dec 2017 17:44:40 GMT
Mime-Version: 1.0
<e:BoxInfo xmlns:e="http://juis.avm.de/updateinfo" xmlns:q="http://juis.avm.de/request">
<q:Name>FRITZ!Box 7490</q:Name>
<q:HW>185</q:HW>
<q:Major>113</q:Major>
<q:Minor>6</q:Minor>
<q:Patch>92</q:Patch>
<q:Buildnumber>47565</q:Buildnumber>
<q:Buildtype>0</q:Buildtype>
<q:Serial>0896D7CAFEDE</q:Serial>
<q:OEM>avm</q:OEM>
<q:Lang>de</q:Lang>
<q:Country>049</q:Country>
<q:Annex>B</q:Annex>
<q:Flag></q:Flag>
<q:UpdateConfig>1</q:UpdateConfig>
<q:Provider></q:Provider></e:BoxInfo>
debug: Compound version number used for request: '113.06.92-47565'
debug: -------------------------------------------------------
debug: Variables set:
debug: -------------------------------------------------------
debug: Serial="0896D7CAFEDE"
debug: Name="FRITZ!Box 7490"
debug: HW="185"
debug: OEM="avm"
debug: Lang="de"
debug: Annex="B"
debug: Country="049"
debug: Major="113"
debug: Minor="6"
debug: Patch="92"
debug: Buildnumber="47565"
debug: Flag=""
debug: Public="0"
debug: type="1000"
debug: hostname="185.jws.avm.de"
debug: nonce="m5JAxzPgw6VouS2ldA+1EQ=="
debug: -------------------------------------------------------
debug: Sent request:
debug: -------------------------------------------------------
POST /Jason/UpdateInfoService HTTP/1.1
Host: 185.jws.avm.de:80
Content-Length: 1168
Content-Type: text/xml; charset="utf-8"
Connection: close
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:e="http://juis.avm.de/updateinfo" xmlns:q="http://juis.avm.de/request">
<soap:Header/>
<soap:Body>
<e:BoxFirmwareUpdateCheck>
<e:RequestHeader>
<q:Nonce>m5JAxzPgw6VouS2ldA+1EQ==</q:Nonce>
<q:UserAgent>Box</q:UserAgent>
<q:ManualRequest>true</q:ManualRequest>
</e:RequestHeader>
<e:BoxInfo>
<q:Name>FRITZ!Box 7490</q:Name>
<q:HW>185</q:HW>
<q:Major>113</q:Major>
<q:Minor>6</q:Minor>
<q:Patch>92</q:Patch>
<q:Buildnumber>47565</q:Buildnumber>
<q:Buildtype>1000</q:Buildtype>
<q:Serial>0896D7CAFEDE</q:Serial>
<q:OEM>avm</q:OEM>
<q:Lang>de</q:Lang>
<q:Country>049</q:Country>
<q:Annex>B</q:Annex>
<q:Flag></q:Flag>
<q:UpdateConfig>1</q:UpdateConfig>
<q:Provider>oma_lan</q:Provider>
</e:BoxInfo>
</e:BoxFirmwareUpdateCheck>
</soap:Body>
</soap:Envelope>
debug: -------------------------------------------------------
debug: Reading response from '185.jws.avm.de:80': .
debug: Received response:
debug: -------------------------------------------------------
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/xml;charset=UTF-8
Content-Length: 2191
Connection: close
Download-Delay: 1084
Date: Wed, 03 Jan 2018 01:27:22 GMT
Access-Control-Allow-Origin: http://scope.avm.de
Access-Control-Allow-Headers: content-type
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"></SOAP-ENV:Header><soap:Body ID="Body"><ns2:BoxFirmwareUpdateCheckResponse xmlns:ns2="http://juis.avm.de/updateinfo" xmlns:ns3="http://juis.avm.de/response" xmlns:ns4="http://juis.avm.de/request"><ns2:ResponseUpdateInfo><ns3:ResponseHeader><ns3:Nonce>m5JAxzPgw6VouS2ldA+1EQ==</ns3:Nonce></ns3:ResponseHeader><ns3:UpdateInfo><ns3:CheckInterval>4</ns3:CheckInterval><ns3:Found>true</ns3:Found><ns3:Name>_INTERN Inhaustest IQ17p2</ns3:Name><ns3:Version>113.06.98-48590 Inhaus</ns3:Version><ns3:Type>1</ns3:Type><ns3:DownloadURL>ftp://(...)@update.avm.de/labor/(...)/FRITZ.Box_7490.113.06.98-48590.image</ns3:DownloadURL><ns3:InfoURL></ns3:InfoURL><ns3:InfoText>INTERN IQ17p2 Inhaustest</ns3:InfoText><ns3:HintURL></ns3:HintURL><ns3:IconURL></ns3:IconURL><ns3:Priority>1</ns3:Priority><ns3:AutoUpdateStartTime>7200</ns3:AutoUpdateStartTime><ns3:AutoUpdateEndTime>18000</ns3:AutoUpdateEndTime><ns3:AutoUpdateKeepServices>true</ns3:AutoUpdateKeepServices></ns3:UpdateInfo></ns2:ResponseUpdateInfo></ns2:BoxFirmwareUpdateCheckResponse><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></SignatureMethod><Reference URI="#Body"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod><DigestValue>FzHdhlZczlRWV0iOvAFodnGKnyh40X4E6jL8eWLG7Ks=</DigestValue></Reference></SignedInfo><SignatureValue>Cr99tL1KvmWrVUCATjOBVXz/YhBBlK2Xts7KqhFpZNr1objTG0VFJx465pHRKuM4x6wtIeg4Glnlu4ethp2MZgJDMfdoG3q13LGU7I4YXgyP2GREPsdk5yhwNWK+GFjZRgrDAHAvSYlH5ZzmVJKXjlonkug4WUCJkDmD0QmUxCaj8BdtCRetejNZ3ZpX83dRR4w18CtyoEWUWPeSAVq2qvb2UZH3AyBQ39zCc/w1DyL3yOOofaOJrEJAeDINnITDTPxr9mZsTpS6PjFOpRBv0lqq15SS7x8mJdUbhpv3iPcIgF9XLl4ashTVlPf0SjKmvw1xog6gNclYXeSJ6LRnXQ==</SignatureValue></Signature></soap:Body></soap:Envelope>
debug: -------------------------------------------------------
root/bin/juis_check: Found newer version: 113.06.98-48590 Inhaus
URL=ftp://(...)@update.avm.de/labor/(...)/FRITZ.Box_7490.113.06.98-48590.image
DelayDownload=1084
vidar:~/GitHub/YourFritz/juis #
Wie man sehen kann (zumindest wenn man sich damit auskennt), ist die Ausgangsversion auf der verwendeten Box eine ganz normale Release-Version 113.06.92, die bis gestern auch noch die aktuellste Version war. Trotzdem wird mit "Public=0" dann nicht die seit gestern aktuelle 113.06.93 gefunden (weiter oben in einem Beispiel hingegen schon), sondern eine vollkommen andere Version, die als Name dann "_INTERN Inhaustest IQ17p2" hat ("17p1" war sicherlich die 06.9x-Release, wenn man nach den URLs für die Online-Hilfe geht).
Was fehlt dem Skript noch?
Ganz klar: eine Überprüfung der Signatur der Antwort von AVM. Schließlich würde die Firmware (bei passenden Einstellungen zum automatischen Update) bei einer neuen Firmware jetzt hingehen und diese von der angegebenen Adresse laden. Das Laden an sich wäre ja noch nicht weiter schlimm ... aber die wird hinterher dann entpackt und wenn es ganz schlecht läuft, kann schon dieses Entpacken für einen Angriff benutzt werden.
Zwar wird wohl auch diese Firmware dem ganz normalen Signatur-Test unterzogen, der seit 06.5x auch für Firmware-Images beim Upload im GUI gilt, aber auch da gibt es schon mal die eine oder andere Lücke (auch wenn sie in aktueller Firmware hoffentlich alle dicht sind), über die man dann doch noch eine Attacke starten könnte. Klingt auch erst einmal wenig spektakulär, schließlich sind die in neuer Firmware ja abgedichtet ... das Problem ist nur, daß die Abfrage und der Download eben von der alten Firmware erledigt werden und da könnten eben noch einige Lücken vorhanden sein, je nachdem, wieviele "Zwischenupdates" der installierten Version am Ende fehlen.
Es ist mir aber absolut nicht gelungen, die Digest-Werte in der SOAP-Antwort von AVM irgendwie zu reproduzieren ... allerdings ist dieser ganze Vorgang der Signatur einer SOAP-Message (mit einer "embedded signature") alles andere als simpel.
Ich bin bisher eigentlich immer davon ausgegangen, daß die Antwort von AVM gar keine großartige "canonicalization" braucht (mit Ausnahme der Transformation, welche die eingeschlossene Signatur aus dem DOM entfernt - auch easy, weil die einfach bloß herausfallen sollte und nicht mal irgendwelche Zeilenumbrüche übrig bleiben), weil die nicht großartig formatiert ist (damit auch "whitespaces" eher kein Thema sind) und auch die leeren Entities in der Antwort bereits nach den Regeln für "xml-exc-c14n" normalisiert sind (mit getrenntem Start- und Ende-Tag).
Aber wie ich es auch anfange, ich bekomme für den "Body" der Antwort (das Reference-Element bezieht sich nur auf die URI "#Body" und das ist sinnigerweise auch die ID, welche das Body-Element hat) vom ersten "<" bis zum letzten ">" einfach nicht denselben SHA256-Hash heraus, der in "DigestValue" (in Base64-Kodierung) steht.
Damit kann ich eine wirklich simple Verifikation vergessen und daher habe ich es aufgegeben, diese in das Skript einzubauen. Das macht es auf der anderen Seite auch wieder leichter, auf weitere Abhängigkeiten zu verzichten (wie "xmllint" oder "openssl" oder "sha256sum"), die es ansonsten für eine Funktion bräuchte, die wohl ohnehin nur die wirklich Hartgesottenen jemals nutzen würden. Daher habe ich mich dann entschlossen, dem Skript einfach eine Option zu spendieren, mit der man die Server-Antwort (also nur die SOAP-Response, nicht die Header) abspeichern kann, damit man sie hinterher selbst irgendwie weiterverarbeiten kann. Was man damit dann macht, bleibt der eigenen Phantasie überlassen ... man kann z.B. mit "xmllint" und passender XPath-Abfrage noch weitere Daten extrahieren oder die ansonsten sehr unübersichtliche Antwort einfach mal sauber formatieren lassen:
Code:
vidar:~/GitHub/YourFritz/juis # juis_check -s 7490_answer.xml 192.168.130.1 Public=0
root/bin/juis_check: Found newer version: 113.06.98-48590 Inhaus
URL=ftp://(...)@update.avm.de/labor/(...)/FRITZ.Box_7490.113.06.98-48590.image
DelayDownload=1226
vidar:~/GitHub/YourFritz/juis # xmllint --format 7490_answer.xml
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
<soap:Body ID="Body">
<ns2:BoxFirmwareUpdateCheckResponse xmlns:ns2="http://juis.avm.de/updateinfo" xmlns:ns3="http://juis.avm.de/response" xmlns:ns4="http://juis.avm.de/request">
<ns2:ResponseUpdateInfo>
<ns3:ResponseHeader>
<ns3:Nonce>Ro9zrpGXvVafbWjdY8XNHw==</ns3:Nonce>
</ns3:ResponseHeader>
<ns3:UpdateInfo>
<ns3:CheckInterval>4</ns3:CheckInterval>
<ns3:Found>true</ns3:Found>
<ns3:Name>_INTERN Inhaustest IQ17p2</ns3:Name>
<ns3:Version>113.06.98-48590 Inhaus</ns3:Version>
<ns3:Type>1</ns3:Type>
<ns3:DownloadURL>ftp://(...)@update.avm.de/labor/(...)/FRITZ.Box_7490.113.06.98-48590.image</ns3:DownloadURL>
<ns3:InfoURL/>
<ns3:InfoText>INTERN IQ17p2 Inhaustest</ns3:InfoText>
<ns3:HintURL/>
<ns3:IconURL/>
<ns3:Priority>1</ns3:Priority>
<ns3:AutoUpdateStartTime>7200</ns3:AutoUpdateStartTime>
<ns3:AutoUpdateEndTime>18000</ns3:AutoUpdateEndTime>
<ns3:AutoUpdateKeepServices>true</ns3:AutoUpdateKeepServices>
</ns3:UpdateInfo>
</ns2:ResponseUpdateInfo>
</ns2:BoxFirmwareUpdateCheckResponse>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<Reference URI="#Body">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<DigestValue>zxk2MRF3klL0qtgt4Hi0ou/FhFtDtHMkEZL4mE+wq/U=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>GeCk1zTq1RvxnLAhlyuC1qIlbYDonphaKt/QkHUfllMQCj3t7yK++21k1LNusQKLpt/Us1tKk6WqUFSEskfgpE4o+jYInsRDSiZDDE7PEmqnKZGWVYOtYhm2cLoYTdEULWf+ziaTg1e0vtbOhu7y7OOrZFMmb/xeKmZuLMZ/fbcbF23NQ33xw6Hwah3p8JAfzaIHRjq7GoLlmB5Is+uHaqKKXsunBj3NstMLbgr0QZm3FCIM3kPW7bwdxWUfC7a5eTyqIUsd/SzRFL0BVjK2dzc4rINDv7QEjYXxqTrDSYNDpX+xj+nmi2oKFofLAWWw3TCLJkLamBGTsS5NC+W3Gw==</SignatureValue>
</Signature>
</soap:Body>
</soap:Envelope>
vidar:~/GitHub/YourFritz/juis #
Ob ich irgendwann noch mal zu einem passenden Skript "außen herum" komme, welches dann erfolgreich die Signatur prüfen kann, weiß ich nicht ... aber damit die Antwort von AVM tatsächlich jedesmal neu signiert werden muß, kann man ja beim Request eine "nonce" mitsenden, die dann in der Antwort enthalten ist (s.o.) und in die Berechnung des Hash-Wertes mit eingeht.
Da eine erfolgreiche Signaturprüfung natürlich nur möglich ist, wenn dieser "nonce"-Wert auch dem "Prüfer" bekannt ist, gibt es die Möglichkeit, den als Parameter beim Aufruf selbst anzugeben, mittels "Nonce=..." - wobei der Wert vom Skript nicht geprüft wird und auch AVM wohl den Wert nur 1:1 in die Antwort kopiert und gar nicht von Base64 in irgendeine Binärdarstellung überführt. Jedenfalls wird der Service auch nicht davon beeindruckt, wenn man da 32 Byte in Base64 angibt ... ab welcher Datengröße dann irgendwelche Puffer überlaufen bzw. ob das überhaupt passiert, habe ich nie getestet.
Da ich wieder mal an der max. Beitragsgröße von 50.000 Zeichen anschlage (einen Teil habe ich schon verworfen), reicht das nun auch ... vielleicht hätte es ein Beispiel weniger auch getan, aber die muß man ja auch nicht in Gänze bis zum letzten Zeichen lesen.