Fritzbox myfritz ddns

ma1

Neuer User
Mitglied seit
25 Jan 2013
Beiträge
17
Punkte für Reaktionen
0
Punkte
1
Hallo,

ich habe das Problem, das ich baldmöglichst meine Fritzbox tauschen muss und ich (leider) die myfritz-Adresse weiter brauche.
Wenn ich die alte Fritzbox hinter den neuen Router stecke, wird nur die lokale IP auf myfritz geupdatet.

Mein Idee war jetzt, das ich das Update über ein kleines Python-Script mache.

Aber, obwohl ich Benutzername und Passwort mit requests übertrage, bekomme ich ein "401 Unauthorized" zurück.
Kann mir da evtl jemand helfen?

Gruß Andreas
 
MyFritz ist doch nur ein DynDNS-Anbieter der von AVM bereitgestellt wird.
Wechsle doch einfach auf einen anderen, kostenlosen DynDNS-Anbieter wie z.B. diesen hier --> LINK
 
Wenn ich die alte Fritzbox hinter den neuen Router stecke, wird nur die lokale IP auf myfritz geupdatet.
Genau deshalb nutze ich myfritz auch nicht.
Wenn du das jetzt einmal änderst, kannst du danach die FB wechseln so oft du willst.
Ich nehme ddnss.de, der ist auch hier im Form ansprechbar.
 
obwohl ich Benutzername und Passwort mit requests übertrage
DAS müsste man dann vielleicht mal etwas genauer sehen - wie wäre es denn mind. mit einer "Beschreibung", welche Daten da verwendet werden und wie genau dieses Python-Skript aussieht?

Ich will ja nicht unken ... aber um einen Update-Request für die MyFRITZ!-Adresse nachzubilden, braucht es wohl schon den passenden SOAP-Call - das hat alles nichts mit irgendwelchen HTTP-Updates wie bei den meisten anderen DynDNS-Anbietern zu tun.

Und zum Reverse-Engineering, was da genau zwischen FRITZ!Box und MyFRITZ!-Server bei einem Update läuft, braucht es einen "man in the middle", weil die Kommunikation da TLS-verschlüsselt ist. Da muß man also erst mal mit Software für solche Fälle (also mit TLS-Proxies wie mitmproxy, SSLsplit oder SSLproxy) in diese Verbindungen hineinhorchen und damit man das überhaupt kann, muß man erst mal das Zertifikat der AVM-Root-CA in der Firmware gegen ein eigenes austauschen.

Das ist also schon ein deutlich komplexeres Vorhaben, diesen Traffic überhaupt (bis in alle Einzelheiten, die man für die "Nachbildung" mit einem eigenen Client braucht) zu analysieren ... und mal ganz ehrlich: Das Einzige, was man danach hat, ist ein besseres Verständnis, wie das funktioniert und eine (noch) engere Bindung an einen Anbieter, der das von sich aus nirgendwo publiziert hat und es obendrein jederzeit auch wieder ändern kann - da reicht es schon, eine "neue Version" dieser internen(!) Interfaces aus der Taufe zu heben.

Ich bin nicht mal sicher, ob man die dabei gewonnenen Erkenntnisse dann ohne weiteres (mit den benötigten Einzelheiten für das Nachbauen) publizieren dürfte ... denn da liegen dann zumindest technische Schutzmaßnahmen (in Gestalt der TLS-Verbindungen) vor, auch wenn diese hoffentlich mehr dem Schutz der Kundendaten dienen, als dem Schutz von AVM-IPs (intellectual properties).

Da muß/sollte man dann tatsächlich mal in den sauren Apfel beißen und all die Stellen, wo man (bisher, ggf. in "Unkenntnis" der Fesseln, die man sich damit auferlegt hat) mit MyFRITZ!-Adressen gearbeitet hat, noch einmal "nachbearbeiten" und dabei dann gleich auf "vernünftige" DynDNS-Services setzen.

Je nach Konstellation würde ich in den allermeisten Fällen sogar komplett auf die Verwendung eines MyFRITZ!-Accounts verzichten (und auch wenn man einen hat und mehrere Boxen besitzt, müssen die nicht alle in diesem Account hinterlegt sein) - denn es ist nicht nur so, daß man sich in Abhängigkeit von diesem Service begibt, wenn man ihn als DynDNS-Anbieter nutzt ... auch das "nach Hause telefonieren" einer Box, die mit einem MyFRITZ!-Konto verknüpft ist, ist ziemlich heftig und vom Besitzer nicht wirklich "fein granuliert" zu konfigurieren, sondern nur nach dem Motto "take it or leave it".

Ich wage sogar die These, daß man sich bei AVM dieses Umstands sehr bewußt ist und trotzdem immer mehr Anstrengungen unternimmt, die "Schäfchen" unter die eigenen Fittiche zu nehmen und den Kunden weniger Optionen zu bieten. Es dürfte jedenfalls z.B. Gründe geben, warum man dort den Client für das Erstellen von "Let's Encrypt"-Zertifikaten absichtlich so eingeschränkt hat (obwohl das von AVM selbst erstellte Programm das auch für andere Domain-Namen hergeben würde:
Rich (BBCode):
~ # letsencrypt -?
usage: letsencrypt [options]
options:
  -?                 - print this help
  -v                 - verbose. (NOTSET)
  -p                 - use production api (server) of letsencrypt.org. (NOTSET)
  -a STRING          - file with letsencrypt.org account info (may not exist). ("/var/tmp/letsencrypt.account")
  -d STRING          - domain dame (subject) for certificate. (NULL)
  -r                 - renew cert instead of initial generate. (NOTSET)
  -c STRING          - certificate PEM file. (NULL)
  -k STRING          - private key PEM file. (NULL)
  -D STRING          - switch debug logs on. (FUNC)
letsencrypt
~ #
), daß man es nur mit einem MyFRITZ!-Account auch benutzen kann. Das ist wie die berühmte Karotte vor der Nase des Kunden, der sich aber hoffentlich NICHT als Esel herausstellt.
 
Dass das mit der MyFritz-Adresse keine so gute Idee war, weiß ich ja jetzt auch :)
Hab mir bei den neuen Projekten auch einen eigenen "DDNS"-Zugang gemacht, so dass ich nicht mehr davon abhängig bin.
Hilft mir aber bei "alten" Verbindungen nicht mehr, weil ich da nicht mehr ran komme, um das nachträglich zu ändern.
Daher auch die Versuche, die Adresse noch so zu updaten.
Es ist eine Fritzbox 7390 und da ist die Übertragung noch mit http.
Daher konnte ich die Übertragung auch mit Wireshark ansehen.
Benutzername ist ja direkt lesbar: box<mac>-<datum>
Passwort konnte ich mit dem "decoder"-Script auch aus der export-Datei auslesen.
Neue IP wird als als Parameter in der Adresse mit übergeben.
Aber anscheinend fehlt da halt doch noch etwas.

Dachte, vielleicht hat ja schon jemand dahingehend was rausgefunden.
Und es muss ja auch nicht unbedingt Python sein. War halt ein Versuch damit.

Hier mein Test-Python-Script:

Python:
import requests

from requests.auth import HTTPDigestAuth

url = 'http://ddns.myfritz.net:888/update.php?ipv4=192.168.100.100&ipv6='

response = requests.get(url,auth=HTTPDigestAuth('boxc02500000000-1234567890123','XXXXXXXXXXXXXXXX'))
                                                                                
print ("Response Code:"+str(response.status_code))
if response.status_code == 200:
    print('Login successful : '+str(response))
 
die Übertragung noch mit http.
Wenn das tatsächlich sicher ist (ich war bisher halt der Überzeugung, daß das Update da ebenso wie die Registrierung per SOAP mit TLS erfolgt (das habe ich vor sehr langer Zeit mal mitgeschnitten, gibt hier auch irgendwo eine Anmerkung in einem Thread dazu, wo jemand MyFRITZ! mit einem Gerät eines anderen Herstellers benutzen wollte, iirc) - einen HTTP-Request zur Aktualisierung kenne ich nur für die "Anmeldung" beim ACS von AVM, wenn man die Übertragung dieser Daten an den Provider zuläßt ... im lab-Abschnitt in der tr069.cfg) ... ist denn auch das Update da in dem von Dir beobachteten Fall tatsächlich mit "digest auth" (was ja wenigstens zwei Zugriffe braucht, denn beim ersten hat man ja noch keine Nonce) und was steht denn ansonsten noch in dem (gesamten) Request?

Denn wenn Du tatsächlich den passenden Request für ein Update (inkl. aller Request-Header und der zu erwartenden Antwort) kennst, frage ich mich natürlich auch, warum Du das dann nicht auch 1:1 nachbildest (damit es erst einmal funktioniert) und erst im Nachhinein dann nach und nach die Angaben eliminierst, die für ein erfolgreiches Update ohne Bedeutung sind.
 
Vielleicht habe ich das Problem nur noch nicht richtig verstanden .... .
Auch ich habe viele Jahre den myfritz-Dienst von AVM genutzt. Vor allem, weil er neben IPv4 das von mir schon lange priorisierte IPv6 nutzt.
Aber aus den bekannten und auch wieder von Peter erwähnten Gründen, bin ich schon lange von myfritz weg.

Da mein Setup auch nicht das kleinste ist (umfangreiches Wireguard-VPN ...) bin ich die Umstellung ganz langsam und vorsichtig angegangen, wollte mich ja nicht selbst abhängen. Also zuerst (bei weiterhin laufendem myfritz-Dienst) bei einem alternativen Anbieter (dynv6.com) einen Account angelegt und dort für alle meine eigenen und "außerhäusigen" Geräte je einen "Domainnamen" angelegt.
Dann in der eigenen F!B und auch remote (via WG-VPN) in den anderen beteiligten Routern den vorgesehenen DDNS-Zugang zum Laufen gebracht. Und dann in allen WG-Servern und sonstigen Geräten jeweils einen eigenen DDNS-Client mit den Zugangsdaten con dynv6.net eingetragen und intensiv getestet. Diese Geräte synchronisieren alle unabhängig von der F!B ihre IPv4 und auch ihre IPv6.
Und nach einer Woche "Zuschauen" habe ich dann myfritz deaktiviert.

Falls ich das Problem wirklich nicht verstanden haben sollte, dann bitte ich um eine nicht allzu strenge Rüge :)

MfG Peter
 
Auch, wenn es aktuell nicht hilft, kannst Du denn keinen Subdomain-Record mit Verweis auf irgendeinen DDNS.-Anbieter anlegen?
Dann hast Du - egal, welcher DDNS-Anbieter da gerade werkelt - immer den selben leicht merkbaren Namen für die eine oder andere Fritz. Umstellen von einer zur anderen Fritz kannst Du dann auch jederzeit von der Ferne, sofern du Deinen Subdomain-Namen von unterwegs aus administrieren kannst.
 
Dass das mit der MyFritz-Adresse keine so gute Idee war, weiß ich ja jetzt auch
BTW ... irre ich mich oder gab es das Problem (mit demselben Fragesteller, wenn auch anderem Account) schon mal vor Jahren?


Und auch eine parallele Verwendung von MyFRITZ! als DynDNS-Service und einem anderen, unabhängigen Dienst ist ohne weitere Kunststückchen jederzeit möglich (so daß man also tatsächlich schon länger eine "sanfte Migration" hätte initiieren können) und sogar die Benutzung von mehr als einem (unabhängigen) Service klappt (mit ein paar Änderungen an der exportierten ar7.cfg) - wenn auch mit ein paar Einschränkungen hinsichtlich der Sicherheit, weil dann tatsächlich nur einer von mehreren DynDNS-Accounts Updates mit TLS-Verschlüsselung machen kann (der, der dann den <userdefined>-Provider benutzt), nach dem, was ich bei früheren Tests gefunden habe (wobei ich selbst tatsächlich auch mehr als einen aktiven Account - ohne MyFRITZ!-Beteiligung - verwende).
 
ist denn auch das Update da in dem von Dir beobachteten Fall tatsächlich mit "digest auth" (was ja wenigstens zwei Zugriffe braucht, denn beim ersten hat man ja noch keine Nonce) und was steht denn ansonsten noch in dem (gesamten) Request?
Ja, es läuft sicher über http und es sind auch 2 Zugriffe. Einmal mit Fehler und einmal dann mit den Nonce, was dann erfolgreich ist.
Die neuen Fritzboxen scheinen das ja alle jetzt mit https zu machen.
Denn wenn Du tatsächlich den passenden Request für ein Update (inkl. aller Request-Header und der zu erwartenden Antwort) kennst, frage ich mich natürlich auch, warum Du das dann nicht auch 1:1 nachbildest (damit es erst einmal funktioniert) und erst im Nachhinein dann nach und nach die Angaben eliminierst, die für ein erfolgreiches Update ohne Bedeutung sind.
Weil ich eben nicht genau weiß, wie ist das 1:1 nachbilden kann.
So ein Problem hatte ich bisher noch nicht. Und wie ich das Wireshark-Paket 1:1 mit Python (oder was anderes) nachbilden kann, weiß ich halt (noch) nicht.
Vielleicht finde ich ja dazu noch was bei Google.

Vielleicht fehlt ja nur noch eine Kleinigkeit. Hätte halt gehofft, dass vielleicht schon mal einer das geschafft hat.
BTW ... irre ich mich oder gab es das Problem (mit demselben Fragesteller, wenn auch anderem Account) schon mal vor Jahren?
Ja, stimmt. Wusste gar nicht, dass ich hier noch einen zweiten Account habe. Sorry
Darum habe ich auch auch eine andere Lösung gefunden. Aber konnte meine Fritzbox bis jetzt benutzen. Da sie sich aber jetzt immer öfter aufhängt, muss ich sie austauschen.
Und ja, die "neuen" und auch die meisten der "alten" Zugriffe konnte ich umstellen. Aber leider hab ich auf einige eben keinen direkten Zugriff mehr, deshalb kann ich da nichts mehr umstellen.

Aber wenns nicht geht, dann ist es halt so.
 
Was würde man denn noch so testen, wenn man einen solchen Request erhält?

Ich würde z.B. mal nach einem User-Agent sehen ... wobei da ggf. auch noch weitere HTTP-Header vorhanden sind. Deshalb ja die (vielleicht zu "verklausulierte") Aufforderung, einfach mal den gesamten Request hier zu zeigen.

Die neuen Fritzboxen scheinen das ja alle jetzt mit https zu machen.
Da bin ich dann auch nicht mal sicher ... da ich üblicherweise keine MyFRITZ!-Accounts benutze, weiß ich tatsächlich nicht genau, WIE so ein Update in aktueller Firmware abläuft. Abseits von Deinem Problem würde mich dann tatsächlich auch mal (selbst) interessieren (insofern lohnt der Blick darauf dann vielleicht doch noch), wie das bei den "MyFRITZ!-Freigaben" für LAN-Clients so aussieht (das war damals bei meiner ersten "Untersuchung" noch nicht komplett implementiert - ob die alle auf einen Rutsch (mit einem anderen Request über SOAP) aktualisiert werden oder ob da tatsächlich für jede einzelne ein Request erfolgt oder ob die gar schon mit einem solchen HTTP-Update automatisch mit aktualisiert werden.

1:1 mit Python (oder was anderes) nachbilden
In der Python-KlasseLibrary "requests" (https://docs.python-requests.org/en/master/) kann man eigene Header ganz einfach als Dictionary beim Aufruf mit angeben - siehe verlinkte Dokumentation.

Und außer speziellen Header-Zeilen dürfte so ein Request dann auch nichts "Besonderes" mehr enthalten ... welche Header ggf. automatisch gesendet werden und damit mit eigenem Content überschrieben werden sollten, zeigt ja auch wieder ein Mitschnitt der Netzwerk-Kommunikation mit dem AVM-Server.
 
Zuletzt bearbeitet:
Und außer speziellen Header-Zeilen dürfte so ein Request dann auch nichts "Besonderes" mehr enthalten ... welche Header ggf. automatisch gesendet werden und damit mit eigenem Content überschrieben werden sollten, zeigt ja auch wieder ein Mitschnitt der Netzwerk-Kommunikation mit dem AVM-Server.
Da hast du recht. Der user-agent war noch anders. Aber damit kommt immer noch ein 401.
Einen Unterschied sehe ich noch.
Weil ich ja den Port angeben muss, rufe ich als Adresse
Code:
http://ddns.myfritz.net:888/update.php?...
auf.
Die Fritzbox aber
Code:
http://ddns.myfritz.ne/update.php?...

Könnte also sein, das noch die URL geprüft wird.

Finde aber in der Doku von requests keine andere Möglichkeit, den Port anders anzugeben.
 
Wie bzw. wo kommt denn die URL überhaupt in die "Rohdaten" der Kommunikation?

Wenn da automatisch die Port-Nummer mit in den Host-Header übernommen wird (ist nach RFC 2616 optional) und bei AVM im Original ein Host-Header ohne Portnummer verwendet wird (ich hoffe mal, daß Du Dir bei Port 888 auch sicher bist), dann würde ich es einfach mal versuchen, den Host-Header selbst zu setzen und damit ggf. den automatisch erzeugten zu überschreiben.
 
Super. Das mit dem Host-Header hat auch funktioniert.
Jetzt ist die 888 auch weg.
Aber weigert sich immer noch.
Vielleicht siehst du ja noch etwas.
Vielleicht das Accept-Encoding?

Hier mal die Netzwerkmitschnitte:

Update der Fritzbox:

Code:
Hypertext Transfer Protocol
    GET /update.php?ipv4=192.168.1.108&ipv6= HTTP/1.1\r\n
        [Expert Info (Chat/Sequence): GET /update.php?ipv4=192.168.1.108&ipv6= HTTP/1.1\r\n]
            [GET /update.php?ipv4=192.168.1.108&ipv6= HTTP/1.1\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Request Method: GET
        Request URI: /update.php?ipv4=192.168.1.108&ipv6=
            Request URI Path: /update.php
            Request URI Query: ipv4=192.168.1.108&ipv6=
                Request URI Query Parameter: ipv4=192.168.1.108
                Request URI Query Parameter: ipv6=
        Request Version: HTTP/1.1
    Host: ddns.myfritz.net\r\n
    User-Agent: Fritz!Box DDNS/1.0.1\r\n
     [truncated]Authorization: Digest username="boxc00000000000-0000000000000",realm="avm_dyndns_update_realm",nonce="AYw0eAAGhgGIlVNqJsS7p8Br21+5dBwuO/wBzXpcdVOEx35G3FWzkzBS9AY=",uri="/update.php?ipv4=192.168.1.108&ipv6=",qop=auth,nc=0000000
         username="boxc00000000000-0000000000000"
        realm="avm_dyndns_update_realm"
        nonce="AYw0eAAGhgGIlVNqJsS7p8Br21+5dBwuO/wBzXpcdVOEx35G3FWzkzBS9AY="
        uri="/update.php?ipv4=192.168.1.108&ipv6="
        qop=auth
        nc=00000001
        cnonce="a07424bc48c56cc6"
        response="196b1895e714bd6f8ec731fdc6f53083"
    \r\n
    [Full request URI: http://ddns.myfritz.net/update.php?ipv4=192.168.1.108&ipv6=]
    [HTTP request 1/1]
    [Response in frame: 139]

Antwort:
Code:
Hypertext Transfer Protocol
    HTTP/1.1 200 OK\r\n
        [Expert Info (Chat/Sequence): HTTP/1.1 200 OK\r\n]
            [HTTP/1.1 200 OK\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Response Version: HTTP/1.1
        Status Code: 200
        [Status Code Description: OK]
        Response Phrase: OK
    expires: 0\r\n
    cache-control: no-cache, no-store, must-revalidate\r\n
    pragma: no-cache\r\n
    content-length: 5\r\n
    date: Tue, 20 Apr 2021 12:32:44 GMT\r\n
    \r\n
    [HTTP response 1/1]
    [Time since request: 0.030161000 seconds]
    [Request in frame: 138]
    [Request URI: http://ddns.myfritz.net/update.php?ipv4=192.168.1.108&ipv6=]
    File Data: 5 bytes
    Data (5 bytes)

Python-Skript:
Code:
Hypertext Transfer Protocol
    GET /update.php?ipv4=192.168.10.10&ipv6= HTTP/1.1\r\n
        [Expert Info (Chat/Sequence): GET /update.php?ipv4=192.168.10.10&ipv6= HTTP/1.1\r\n]
            [GET /update.php?ipv4=192.168.10.10&ipv6= HTTP/1.1\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Request Method: GET
        Request URI: /update.php?ipv4=192.168.10.10&ipv6=
            Request URI Path: /update.php
            Request URI Query: ipv4=192.168.10.10&ipv6=
                Request URI Query Parameter: ipv4=192.168.10.10
                Request URI Query Parameter: ipv6=
        Request Version: HTTP/1.1
    user-agent: Fritz!Box DDNS/1.0.1\r\n
    Accept-Encoding: gzip, deflate\r\n
    Accept: */*\r\n
    Connection: keep-alive\r\n
    Host: ddns.myfritz.net\r\n
     [truncated]Authorization: Digest username="boxc00000000000-0000000000000", realm="avm_dyndns_update_realm", nonce="AbLQxgAHLfQf0BzdE9CupRmESXs6AE6HNlVl1dsSLfBxv3I7tV54BB67/rA=", uri="/update.php?ipv4=192.168.10.10&ipv6=", response="59614
         username="boxc00000000000-0000000000000"
         realm="avm_dyndns_update_realm"
         nonce="AbLQxgAHLfQf0BzdE9CupRmESXs6AE6HNlVl1dsSLfBxv3I7tV54BB67/rA="
         uri="/update.php?ipv4=192.168.10.10&ipv6="
         response="59614fb9f5bd6868a04ed0772812708b"
         opaque="00000000000000000000000000000000"
         algorithm="MD5"
         qop="auth"
         nc=00000001
    \r\n
    [Full request URI: http://ddns.myfritz.net/update.php?ipv4=192.168.10.10&ipv6=]
    [HTTP request 2/2]
    [Prev request in frame: 8]
    [Response in frame: 14]

Antwort:
Code:
Hypertext Transfer Protocol
    HTTP/1.1 401 Unauthorized\r\n
        [Expert Info (Chat/Sequence): HTTP/1.1 401 Unauthorized\r\n]
            [HTTP/1.1 401 Unauthorized\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Response Version: HTTP/1.1
        Status Code: 401
        [Status Code Description: Unauthorized]
        Response Phrase: Unauthorized
    expires: 0\r\n
    www-authenticate: Digest realm="avm_dyndns_update_realm", domain="/", nonce="AbLQxwAHLfQhWrDRVEHpSFna88RQhIPGm8yKgaPDR33t2sz5BLXBQssHIBg=", opaque="00000000000000000000000000000000", algorithm=MD5, qop=auth\r\n
    cache-control: no-cache, no-store, must-revalidate\r\n
    pragma: no-cache\r\n
    content-type: text/html;charset=UTF-8\r\n
    content-length: 71\r\n
    date: Thu, 22 Apr 2021 15:50:24 GMT\r\n
    \r\n
    [HTTP response 2/2]
    [Time since request: 0.024034296 seconds]
    [Prev request in frame: 8]
    [Prev response in frame: 10]
    [Request in frame: 12]
    [Request URI: http://ddns.myfritz.net/update.php?ipv4=192.168.10.10&ipv6=]
    File Data: 71 bytes
Line-based text data: text/html (1 lines)
 
1. Auch wenn Du das zielführend findest, reicht es eben genau bei Digest-Auth NICHT aus, wenn man nur den Teil NACH dem Empfang der Nonce (also NACH dem ersten Versuch, der mit 401 enden SOLL) vorzeigt. Denn in dieser Antwort stecken schon die ersten, entscheidenden Informationen, WIE der Client genau bei der nächsten Antwort vorgehen soll. Daher ist auch diese erste Antwort schon von immenser Bedeutung und der Dissector, den Du auf die Daten angesetzt hast, schneidet offenbar auch noch Daten vom Authorization-Header ab - jedenfalls sieht die "Liste" darunter dann deutlich länger aus, als die jeweilige Zeile und auch das "truncated" ist ja nicht zu übersehen.

2. Ich sehe durchaus heftige Unterschiede in den Authorization-Versuchen ... bei AVM ist da ja offensichtlich noch eine "client nonce" (cnonce) im Spiel. Was das ist, findet man im entsprechenden RFC (RFC 2617) und dann stellt sich auch heraus, daß dieser Wert in die Berechnung der response mit eingeht. Wenn der Server also ERWARTEN sollte, daß da ein entsprechender Wert für cnonce existiert und schon der fehlt, kann das leicht die nächste Hürde bei einer weiteren Verarbeitung sein.

3. Ich weiß nicht genau, wie exakt die Python-Library die RFC-Vorschriften befolgt ... ggf. gibt es ja irgendwo einen Parameter für die HTTPDigestAuth-Klasse, mit dem man die Verwendung einer cnonce erzwingen kann.

4. Aber auch dann gibt es noch Unterschiede im Authorization-Header ... bis hin zu Anführungszeichen, die bei AVM auch fehlen, wenn der Wert "simple" ist. Ob und wie das dann alles wieder in Python so nachzubauen ist (und erst recht, ob das alles erforderlich ist, denn niemand weiß ja, was AVM da für einen Parser für diesen Header verwendet), weiß ich aber auch nicht. Nur sehe ich dann schon noch GEWALTIGE Unterschiede zwischen dem originalen Request und Deinem Nachbau, selbst mit den (hier für mich unnützen) Dissectoren für das HTTP-Protokoll (da das alles "Text" ist, reichen da nach meiner Ansicht schon die "reinen Textzeilen" und die sind dann sogar wieder übersichtlicher in meinen Augen).

EDIT:
5. Ich glaube erst mal nicht, daß es an irgendwelchen anderen Header-Zeilen liegt (also auch nicht an einem Accept-Encoding o.ä.) ... ein 401 ist da schon ziemlich "genau" und wenn AVM da nicht gezielt Verwirrung stiften will, wird es wohl mit Authorization immer noch nicht klappen.

EDIT2:
Hmm ... ich war dann doch noch neugierig und habe mal in die Library gesehen. Nach dem, was ich dort lese (https://docs.python-requests.org/en/master/_modules/requests/auth/#HTTPDigestAuth), sollte eigentlich bei qop="auth" auch eine cnonce verwendet werden. Stellt sich die Frage, warum das bei Dir offenbar nicht der Fall ist - ich sehe auch keinen zusätzlichen Parameter o.ä. - ein qop=auth im WWW-Authenticate-Header der 401-Message (die ja fehlt) sollte das entsprechend triggern.
 
Zuletzt bearbeitet:
EDIT2:
Hmm ... ich war dann doch noch neugierig und habe mal in die Library gesehen. Nach dem, was ich dort lese (https://docs.python-requests.org/en/master/_modules/requests/auth/#HTTPDigestAuth), sollte eigentlich bei qop="auth" auch eine cnonce verwendet werden. Stellt sich die Frage, warum das bei Dir offenbar nicht der Fall ist - ich sehe auch keinen zusätzlichen Parameter o.ä. - ein qop=auth im WWW-Authenticate-Header der 401-Message (die ja fehlt) sollte das entsprechend triggern.

Stimmt. Das cnonce fehlt bei mir.
Das qop=auth in der ersten 401-Antwort ist aber vorhanden.

Hab den Mitschnitt von Python mal hier zum anschauen Link
 
Ich würde mir ja eher mal meine lokale Version der Python-Requests-Library ansehen. Wenn die erste 401-Antwort komplett ist und da qop=auth angegeben wurde, dann sollte ja auch die Antwort passend generiert werden. Obendrein kommt noch dazu, daß es in der von mir verlinkten Form der HTTPDigestAuth-Klasse eigentlich auch keinen Pfad gibt, bei dem diese "unvollständige" Ausgabe erzeugt werden könnte:
Python:
        if qop:
            base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce)
So sieht es "im Original" aus und da bei Dir die ersten zwei Parameter (bis inkl. nc) in der Response stehen, muß das cnonce ja irgendwo abgeblieben sein (dem Dissector oben zufolge, soll die Zeile ja mit \r\n beendet worden sein) und da das wenig wahrscheinlich ist, hast Du offensichtlich wohl eine andere Version dieser Datei - stellt sich die Frage, ob es eine neuere ist (was angesichts meiner "Quelle" eher unwahrscheinlich wäre) oder eine veraltete (ggf. sogar hoffnungslos).

Und nein ... ich lade mir garantiert keine Dateien von pastebin.com und packe die dann in einen Wireshark-Dissector, der auch nur ein Lua-Skript ist und erst mal interpretiert wird von einer ziemlich umfangreichen Engine. Die mit passend umformatierten Paketen zu Fehlern zu motivieren, hat auch in der Vergangenheit schon oft genug funktioniert (https://www.cvedetails.com/vulnerab...4861/product_id-8292/Wireshark-Wireshark.html) - zumal hier gar kein Erkenntnisgewinn durch die "kompletten Pakete" zu erwarten ist. Es interessiert ausschließlich die Kommunikation ab L5 - alles darunter hilft nicht weiter.

Daher ist das hier nun auch ÜBERHAUPT nicht notwendig und erscheint nicht logisch, nach einer "Ermahnung" nun einfach ALLES bereitzustellen. HTTP-Kommunikation ist nun mal (zumindest in der Control-Phase) textbasiert (#15, Punkt 4) und wenn man sich (hier am Beispiel von Wireshark unter Windows:

ws_follow_tcp_stream.PNG
) den entsprechenden TCP-Stream "zusammenstellen" läßt aus den einzelnen Paketen ("Kontext-Menü -> Follow > -> TCP Stream" oder auch "-> HTTP Stream"), dann kann man den auch direkt als ASCII (oder UTF-8) anzeigen lassen und ihn als Text speichern. Daraus kann man dann die passenden Zeilen kopieren und ggf. wieder "verfremden", wenn irgendetwas darin vertraulich ist. In der gespeicherten Datei sind sogar die zusätzlichen Zeilenumbrüche (die man im Screenshot beim CSP-Header sieht) wieder verschwunden. Vielleicht hilft's ja als Tipp für den nächsten Beitrag oder für andere Leser.
 
Zuletzt bearbeitet:
Danke für den Hinweis :)

Ich habe jetzt die Version überprüft. Aber es handelt sich um die aktuelle Version von requests (2.25.1).
Ich werde es nochmal auf einem anderen System testen. Schon seltsam...
 
Dann wird vielleicht nur eine andere Library/Klasse importiert ... denn ich bleibe dabei: In der von mir verlinkten Version gibt es gar keinen "path of execution", wo der Authorization-Header ein qop="auth" enthalten kann, ohne gleichzeitig auch nc (das ist ja da) und cnonce (das fehlt offensichtlich, zumindest in dem, was Du hier vom Mitschnitt gezeigt hast) hinzuzufügen.
 
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.